1.简介
某些场景下,也许想在一台物理机上运行多个实例。你也许想测试新发布的mysql版本,同时,保持已有的生产环境不被干扰。或者,你也许想让不同的用户去访问他们自己管理的mysql实例。(例如:你也许是inernet服务供应商,想为不同的客户提供独立的mysql安装。)
每个实例可以使用不同的mysql服务器二进制程序,或者,也可以多个实例共用同一份二进制程序,或者二者兼而有之的组合。例如:你也许通过mysql5.6运行一个服务器,而通过mysql5.7运行另外一个服务器,目的是为了看下不同版本如何处理同一个工作负载。或者,你也许运行目前生产环境版本的多个实例,每个管理不同的数据库。是否使用不同的服务器二进制程序,
你运行的实例必须配置几个操作参数的唯一值。这消除了不同实例间的潜在冲突。参数能通过命令行,参数文件,或环境变量进行设置。为了查看某个实例使用的参数值,连接到该实例并运行show variables语句即可。
mysql实例管理的主要资源为数据目录。每个实例将用不同的数据目录,其通过使用--datadir=dir_name选项进行指定。除了使用不同的数据目录,每个实例的几个其他选项必须配置不同的值。
具体如下所示:
• --port=port_num
--port控制TCP/IP连接的端口号。或者,如果主机有多个网络地址,你能用--bind-address使得每个服务器监听到不同的地址。
• --socket={file_name|pipe_name}
--socket控制unix上的套接字文件路径(socket file path)或windows上的命名管道名(named piped name)。windows上,必须为那些服务器确定唯一的管道名以便进行管道连接。
• --shared-memory-base-name=name
该选项仅用于windwos。其指定windows服务器允许客户端通过共享内存进行连接的共享内存名。必须为那些服务器指定唯一共享内存名来允许共享内存连接。
• --pid-file=file_name
该选项指定服务器向其中写进程ID的文件路径名。如果你用下列日志文件选项,每个服务器的该值必须是不同的:
• --general_log_file=file_name
• --log-bin[=file_name]
• --slow_query_log_file=file_name
• --log-error[=file_name]Setting Up Multiple Data Directories
为了获得较好的性能,你能为每个服务器的下列选项确定不同的值,以便将负载均衡到几个物理磁盘。
• --tmpdir=dir_name
不同的临时目录使得mysql服务器较容易创建临时文件。如果你在不同的位置安装了多个mysql,可以通过--basedir=dir_name选项为每个mysql安装指定基目录。这将使得每个实例自动使用不同的数据目录,日志文件,及PID文件,因为这些参数的默认值时和基目录相关的。其他需要指定的选项为--socket和--port。假设你使用tar文件二进制版本安装了不同的mysql版本。这些版本安装在不同的位置,因此,你可以用其相应基目录下的/bin/mysqld_safe启动每个安装的服务器。mysqld_safe决定正确的--basedir选项,并将其传送给mysqld,然后,你仅需为mysqld_safe确定--socket和--port选项。
如下所述,可以通过确定合适的命令选项或设置环境变量来启动其他服务器。然而,如果你需要更久的运行多个服务器,用选项文件确定每个服务器的唯一选项值也许更方便些。--default-file选项
可用于该目的。
2.设置多个数据目录
机器上的每个mysql实例应该有自己的数据目录。可以通过--datadir=dir_name选项来进行指定。有几种不同的方法为一个新实例设置数据目录。
1)创建一个新目录。
2)拷贝一个已存在的数据目录。
下述讨论每个方法的具体细节。
--警告
通常,永远不要用两个服务器更改同一个数据库中的数据。如果你的操作系统并不支持无故障(fault-free)系统锁,这将会导致不愉快的意外。如果(不管这个警告)你用同一个数据目录运行多个服务器,并且每个服务器都启用了日志,你必须用合适的选项为每个服务器指定唯一的日志文件名。否则,这些服务器将会将日志写入相同的文件。
甚至已经注意了先前的预警,这种设置也只对MyISAM和MERGE表能正常工作,而不是其他存储引擎。而且,这种服务器间共享数据目录的告警也总是适用于NFS环境。让多个mysql服务器通过NFS访问同一个目录是个很糟糕的想法。主要问题是NFS存在性能瓶颈。NFS并非用于这种用途。NFS的另一个风险是你必须设计出两个或多个服务器间不互相干扰的方法。通常,NFS文件锁通过lockd进程处理,但此时平台并不能保证锁定100%可靠。windwos上用这种方法运行多个实例时,数据目录将和你第一次安装mysql时状态相同。其将有一些默认的mysql账号但没用户数据。
Unix上,安装完成后需要初始化数据目录。windows上,数据目录被包含在mysql发布包中:
1)MySQL Zip archive distributions for Windows包含一个未被修改的数据目录。你能将这个安装包解压到临时位置,接着,将数据目录拷贝到为新实例设置的位置。
2)Windows MSI package installers创建和设置安装的服务器将使用的数据目录,但也在安装目录下创建一个名字为"data"的全新的“模板”数据目录。用MSI包完成一个安装完后,模板数据目录将被拷贝用于设置其他mysql实例。
拷贝一个已有数据目录
用这种方法,可以将该数据目录中任何mysql账号或用户数据挪到新的数据目录。
1)停掉目前正用该数据目录的mysql实例。必须干净的关闭实例,以便使得实例将任何改变都刷新到磁盘上。
2)将该数据目录拷贝到新数据目录的位置。
3)拷贝该实例使用的my.cnf或my.ini选项文件,这将是新实例的基础。
4)修改新的选项文件,以便参考之前原始数据目录的任何路径名指向新的数据目录。同时,也修改其他实例唯一的其他选项,像TCP/IP端口号和日志文件等。具体实例唯一的选项,可以参考相关文档。
5)启动新实例,并使其使用新的选项文件。
3.windows上运行多个mysql实例
通过命令行可以在window上手工启动多个mysql服务器,每个服务器有自己相应的操作参数,或通过将几个服务器安装成windwos服务且通过服务的方式运行。
3.1 windows上用命令行启动多个mysql实例
在windows上手工通过命令行启动多个mysql服务器,你可以通过命令行或选项文件确定合适的选项。将选项放于选项文件中更方便些,但是必须确保每个服务器有自己的一套选项。因此,为每个服务器创建一个选项文件,并且,需要通过--default-file选项告诉服务器相应的选项文件名。假如你想让一个实例使用3307端口和数据目录"c:\mydata1",而让另一个实例使用3308端口和数据目录“c:\mydata2”。那么,可以参考下面的步骤。
1)确信每个数据目录存在,包括包含授权表的mysql数据库在内。
2)创建两个选项文件。例如:像如下那样创建名字为“c:\my-opts1.cnf”的文件。
[mysqld]
datadir = C:/mydata1
port = 3307
像如下那样创建第二个名字为“c:\my-opts2.cnf”的文件。
[mysqld]
datadir = C:/mydata2
port = 3308
3)用--default-file选项告诉每个服务器用自己的选项文件启动。
C:\> C:\mysql\bin\mysqld --defaults-file=C:\my-opts1.cnf
C:\> C:\mysql\bin\mysqld --defaults-file=C:\my-opts2.cnf
每个服务器在前台启动(除非服务器后来结束,否则不会出现命令提示符),因此,需要通过单独的控制台窗口运行那两个命令。
为了关闭这些服务器,通过相应端口连接到每个服务器并运行如下命令。
C:\> C:\mysql\bin\mysqladmin --port=3307 --host=127.0.0.1 --user=root --password shutdown
C:\> C:\mysql\bin\mysqladmin --port=3308 --host=127.0.0.1 --user=root --password shutdown
如上配置的服务器允许客户端通过TCP/IP连接。如果你的windows版本支持命名管道(named pipes)且也想允许通过命名管道连接,则可以通过启用配置管道并确定其名字进行连接。每个支持命名管道连接的服务器必须使用唯一的管道名。例如,c:\my-opts1.cnf文件内容也许如下所示。
[mysqld]
datadir = C:/mydata1
port = 3307
enable-named-pipe
socket = mypipe1
对第二个服务器使用的“C:\my-opts2.cnf”选项文件进行类似修改。接着,用前述方法启动服务器。
允许共享内存(shared-memory)连接的步骤和前述类似。通过使用--shared-memory选项启用共享内存连接,且通过--shared-memory-base-name选项为每个服务器确定一个唯一的shared-memory名字。
3.2 以windows服务方式启动多个实例
windows上,一个mysql服务器可以windows服务方式运行。为了配置多个mysql服务,除了确认每个实例使用唯一值的一些选项外,还必须确认每个实例用不同的服务名。
下面的指示,假设你想从“C:\mysql-5.5.9”和“C:\mysql-5.7.24”启动不同版本的mysqld服务器。(假如你想用5.5.9版本作为生产库,用5.7.24做测试库。)为了将mysql安装为windows服务,需要使用--intall或--install-manual选项。基于前面的信息,有几个方式可以设置多个服务。下述内容将会讲解一些例子。测试这些例子前,请关闭和移除任何存在的mysql服务。
1)方法1:在一个标准选项文件中确定所有服务的选项。为每个服务起不同的名字。假设你想用mysqld1运行mysqld 5.5.9,用mysqld2运行mysqld 5.7.24。那么,你可以为5.5.9
采用[mysqld1]group,而为5.7.24采用[mysqld2]group。例如:你可以像如下那样设置c:\my.cnf选项文件。
# options for mysqld1 service
[mysqld1]
basedir = C:/mysql-5.5.9
port = 3307
enable-named-pipe
socket = mypipe1
# options for mysqld2 service
[mysqld2]
basedir = C:/mysql-5.7.24
port = 3308
enable-named-pipe
socket = mypipe2
像下面那样安装服务,用全路径名确保windows为每个服务注册正确的可执行程序。
C:\> C:\mysql-5.5.9\bin\mysqld --install mysqld1
C:\> C:\mysql-5.7.24\bin\mysqld --install mysqld2
为了启动服务,用服务管理器,或用net start跟相应的服务器名。
C:\> NET START mysqld1
C:\> NET START mysqld2
为了停止这些服务,用服务管理器,或者用net stop跟相应的服务名。
C:\> NET STOP mysqld1
C:\> NET STOP mysqld2
方法2:在单独选项文件中为每个服务确定选项,当安装服务时用--default-file告诉每个服务用哪个文件。这样,每个文件将用[mysqld]group列出相应服务的选项。
通过这种方法,为mysqld 5.5.9创建一个文件c:\my-opts1.cnf来确定相应选项,其内容如下所示。
[mysqld]
basedir = C:/mysql-5.5.9
port = 3307
enable-named-pipe
socket = mypipe1
对于mysqld 5.7.24,创建如下文件c:\my-opts2.cnf。
[mysqld]
basedir = C:/mysql-5.7.24
port = 3308
enable-named-pipe
socket = mypipe2
如下那样安装每个服务(在单独一行运行每个命令)。
Install the services as follows (enter each command on a single line):
C:\> C:\mysql-5.5.9\bin\mysqld --install mysqld1
--defaults-file=C:\my-opts1.cnf
C:\> C:\mysql-5.7.24\bin\mysqld --install mysqld2
--defaults-file=C:\my-opts2.cnf
当将mysql服务器安装为服务并用--default-file选项时,服务名必须在该选项前面。
安装服务后,像前述例子中一样启动和关闭这些服务。为了移除多个服务,可以用mysqld --remove每次一个的进行移除,并在--remove选项后跟一个要移除的服务名。如果要移除默认服务(mysql),服务名可以不写。
4.unix上运行多个mysql实例
--注意:
这里讨论用mysqld_safe启动多个mysql实例。对于通过RPM包安装的mysql,服务器启动和关闭在linux几个平台上则用systemd进行管理。这些平台上,因为不需要mysqld_safe,所以并没有进行安装。
unix上运行多个mysql实例的一个方法是编译时为不同的服务器指定不同的TCP/IP端口和unix套接字文件,以便每个实例分别监听在不同的网络接口。编译时为每个安装指定不同的基目录(base directory)也将自动导致它们使用单独的数据目录,日志文件,PID文件位置等。
假设一个已存在的mysql 5.6服务器配置为使用默认的3306端口和unix套接字文件(/tmp/mysql.sock)。为了配置一个全新的、使用不同操作参数的mysql 5.7.24服务器,使用如下CMake命令。
shell> cmake . -DMYSQL_TCP_PORT=port_number \
-DMYSQL_UNIX_ADDR=file_name \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.24
这里,port_numbser和file_name必须和默认的TCP/IP端口号和unix套接字文件路径名不同,且CMAKE_INSTALL_PREFIX应该确定一个已存在mysql安装不同的安装目录。
如果你有一个mysql服务器使用特定的端口号,那么,你能用下面的命令来发现其几个重要配置变量正使用什么值,包括基目录和unix套接字文件名。
shell> mysqladmin --host=host_name --port=port_number variables
通过该命令显式的信息,确定当配置另外一个服务器时应该选用什么值。
如果你确定localhost作为主机名,mysqladmin默认不是使用TCP/IP,而是使用unix套接字文件进行连接。为了显式的确定连接协议,用--protocol={TCP|SOCKET|PIPE|MEMORY}选项。
为了使用不同的unix套接字和TCP/IP端口号,不必编译一个新的mysql服务器。可以使用同样的二进制服务器并启动时使用不同的运行时参数值。其中的一个方法是使用命令行选项。
shell> mysqld_safe --socket=file_name --port=port_number
为了启动第二个服务器,为mysqld_safe提供不同的--socket和--port选项值,并为其传递一个--datadir=dir_name选项,以便服务器可以使用不同的数据目录。
另外,也可以将每个服务器的选项放于不同的选项文件,并在启动每个服务器时通过--default-file选项为其指定相应的选项文件路径。例如:如果两个服务器实例的选项文件分别为/usr/local/mysql/my.cnf和/usr/local/mysql/my.cnf2,则启动它们如下所示:
shell> mysqld_safe --defaults-file=/usr/local/mysql/my.cnf
shell> mysqld_safe --defaults-file=/usr/local/mysql/my.cnf2
另一个达到类似效果的方法,是用环境变量设置unix套接字和TCP/IP端口号。
shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock
shell> MYSQL_TCP_PORT=3307
shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
shell> mysqld --initialize --user=mysql
...set root password...
shell> mysqld_safe --datadir=/path/to/datadir &
这是启动第二个服务器用于测试的快速方法。这个方法的好处是设置的环境变量同样适用于你在同一个shell运行的任何客户端程序。因此,这些客户端程序的连接会自动连接到第二个服务器。unix上,mysqld_multi脚本为启动多个服务器提供了另外一种方法。
5.多服务器环境中用客户端程序
为了连接客户端程序到不同于编译时指定的网络端口,你可以用下列方法之一。
1)用--host=host_name --prot=port_number选项启动客户端,并将其通过TCP/IP连接至远端服务器,用--host=127.0.0.1 --port=port_number启动,并通过TCP/IP将其连接至本地服务器,或用--host=localhost --socket=file_name选项启动并通过unix套接字或windows命名管道将其连接至本地服务器。
2)用--protocol=TCP选项指定用TCP/IP连接,--protocol=SOCKET选项指定用unix套接字文件连接,--protocol=PIPE选项指定用命名管道连接,或--protocol=MEMORY选项指定用共享内存进行连接。对其他类型的连接,也许需要指定--socket选项用unix套接字文件或windows命名管道名,或--shared-memory-base-name选项来确定共享内存名。共享内存名仅有windows
才支持。
3)unix上,启动客户端前设置MYSQL_UNIX_PORT和MYSQL_TCP_PORT环境变量为unix套接字文件和TCP/IP端口号。如果通常使用套接字文件或端口号,可以将设置环境变量的命令放于.login文件,以便每次你登录时这些变量会自动设置。
4)在选项文件的[client]group指定默认的unix套接字文件和TCP/IP端口号。例如:windows上你可以用c:\my.cnf,unix上你可以用自己主目录的.my.cnf文件。
5)C程序中,可以在mysql_real_connect()调用中确定套接字文件或端口号参数。你也可以通过调用mysql_option()读取选项文件。
6)如果你正用Perl DBD::mysql模块,你可以从mysql选项文件读取选项。例如:
$dsn = "DBI:mysql:test;mysql_read_default_group=client;"
. "mysql_read_default_file=/usr/local/mysql/data/my.cnf";
$dbh = DBI->connect($dsn, $user, $password);
此外,其他编程接口也可以提供读取选项文件的类似能力。