在一台机器上运行多个MySQL实例
在某些情况下,您可能希望在一台计算机上运行多个MySQL实例。您可能想测试新的MySQL版本,同时保持现有的生产设置不变。或者,您可能希望授予不同的用户访问他们自己管理的不同mysqld服务器的权限。(例如,您可能是一个Internet服务提供商,希望为不同的客户提供独立的MySQL安装。)
每个实例可以使用不同的MySQL服务器二进制文件,也可以对多个实例使用相同的二进制文件,或者两种方法的任意组合。例如,您可能从MySQL 5.7运行一台服务器,而从MySQL 8.0运行一台服务器,以参见不同版本如何处理给定的工作负载。或者,您可以运行当前生产版本的多个实例,每个实例管理一组不同的数据库。
无论是否使用不同的服务器二进制文件,必须为运行的每个实例配置几个操作参数的唯一值。这消除了实例之间发生冲突的可能性。可以在命令行,选项文件中或通过设置环境变量来设置参数。请参见“指定程序选项”。要参见给定实例使用的值,请连接到该实例并执行一条SHOW VARIABLES
语句。
MySQL实例管理的主要资源是数据目录。每个实例应使用不同的数据目录,该目录的位置使用选项指定。有关使用各自的数据目录配置每个实例的方法以及有关这样做的危险的警告,--datadir=dir_name
除了使用不同的数据目录外,其他几个选项对于每个服务器实例还必须具有不同的值:
--port=port_num
--port
控制TCP / IP连接的端口号。或者,如果主机具有多个网络地址,则可以设置bind_address
系统变量以使每个服务器侦听不同的地址。--socket={file_name|pipe_name}
--socket
控制Unix上的Unix套接字文件路径或Windows上的命名管道名称。在Windows上,仅需要为那些配置为允许命名管道连接的服务器指定不同的管道名称。--shared-memory-base-name=name
此选项仅在Windows上使用。它指定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]
有关日志文件选项的更多讨论,请参见“ MySQL服务器日志”。
为了获得更好的性能,可以为每个服务器不同地指定以下选项,以在多个物理磁盘之间分散负载:
--tmpdir=dir_name
使用不同的临时目录还可以更轻松地确定哪个MySQL服务器创建了任何给定的临时文件。
如果在不同位置有多个MySQL安装,则可以使用选项为每个安装指定基本目录。这将导致每个实例自动使用不同的数据目录,日志文件和PID文件,因为每个参数的默认值都是相对于基本目录而言的。在这种情况下,您需要指定的唯一其他选项是 nd 选项。假设您使用文件二进制分发版安装了不同版本的MySQL 。它们安装在不同的位置,因此您可以使用命令bin / mysqld_safe在其对应的基本目录下启动每次安装的服务器。mysqld_safe--basedir=dir_name
--socket
--port
tar
确定--basedir
传递给mysqld的正确选项,您只需要为mysqld_safe指定--socket
和--port
选项。
如以下各节所述,可以通过指定适当的命令选项或通过设置环境变量来启动其他服务器。但是,如果您需要更长时间地运行多个服务器,则使用选项文件为每个服务器指定必须唯一的选项值更为方便。该--defaults-file
选项可用于此目的。
设置多个数据目录
一台机器上的每个MySQL实例都应该有自己的数据目录。使用选项指定位置。--datadir=dir_name
为新实例设置数据目录有多种方法:
- 创建一个新的数据目录。
- 复制现有数据目录。
以下讨论提供了有关每种方法的更多详细信息。
警告通常,您永远不会有两台服务器更新同一数据库中的数据。如果您的操作系统不支持无故障的系统锁定,则可能导致不愉快的意外。如果(尽管有此警告)您使用同一数据目录运行多个服务器并且启用了日志记录,则必须使用适当的选项来指定每个服务器唯一的日志文件名。否则,服务器将尝试登录到相同的文件。
即使遵守上述注意事项,这种设置也仅适用于
MyISAM
和MERGE
表,而不适用于任何其他存储引擎。同样,这种禁止在服务器之间共享数据目录的警告始终适用于NFS环境。允许多个MySQL服务器通过NFS访问公共数据目录是一个非常糟糕的主意。主要问题是NFS是速度瓶颈。它不打算用于这种用途。NFS的另一个风险是,您必须设计一种方法来确保两个或更多服务器不会相互干扰。通常,NFS文件锁定由lockd
守护程序,但目前没有任何平台可以在每种情况下可靠地100%锁定。
创建一个新的数据目录
使用这种方法,数据目录将与您首次安装MySQL时的状态相同。它将具有默认的MySQL帐户集,并且没有用户数据。
在Unix上,初始化数据目录。
在Windows上,数据目录包含在MySQL发行版中:
- Windows的MySQL Zip存档发行版包含未修改的数据目录。您可以将此类发行版解压缩到一个临时位置,然后将其复制
dat
到要设置新实例的目录中。 - Windows MSI软件包安装程序会创建并设置已安装服务器将使用的数据目录,还会创建一个在安装目录下命名的原始“模板”数据
dat
目录。使用MSI软件包执行安装后,可以复制模板数据目录以设置其他MySQL实例。
复制现有数据目录
使用这种方法,数据目录中存在的任何MySQL帐户或用户数据都将被转移到新的数据目录中。
- 使用数据目录停止现有的MySQL实例。这必须是干净的关机,以便实例刷新磁盘上所有未决的更改。
- 将数据目录复制到新数据目录应位于的位置。
- 复制现有实例使用的
my.cnf
或my.ini
选项文件。这是新实例的基础。 - 修改新的选项文件,以便任何引用原始数据目录的路径名都引用新的数据目录。另外,修改每个实例必须唯一的其他任何选项,例如TCP / IP端口号和日志文件。有关每个实例必须唯一的参数列表,请参见“在一台机器上运行多个MySQL实例”。
- 启动新实例,告诉它使用新选项文件。
在Windows上运行多个MySQL实例
您可以在Windows上运行多个服务器,方法是从命令行手动启动它们,每个服务器都具有适当的操作参数,或者通过将多个服务器安装为Windows服务并以此方式运行它们。“在Microsoft Windows上安装MySQL”中给出了从命令行或作为服务运行MySQL的一般说明。以下各节描述如何为每个服务器必须唯一的那些选项(例如数据目录)使用不同的值启动每个服务器。“在一台计算机上运行多个MySQL实例”中列出了这些选项。
在Windows命令行中启动多个MySQL实例
“从Windows命令行启动MySQL”中介绍了从命令行手动启动单个MySQL服务器的过程。要以这种方式启动多个服务器,可以在命令行或选项文件中指定适当的选项。将选项放置在选项文件中更为方便,但是必须确保每个服务器都有自己的选项集。为此,请为每台服务器创建一个选项文件,并--defaults-file
在运行时告诉服务器该文件的名称和选项。
假设您要在端口3307上使用数据目录运行一个mysqld实例C:\mydata1
,并在端口3308上使用数据目录运行一个实例C:\mydata2
。使用此过程:
- 确保每个数据目录都存在,包括
mysql
包含授权表的数据库自己的副本。 创建两个选项文件。例如,创建一个名称
C:\my-opts1.cnf
如下的文件:[mysqld] datadir = C:/mydata1 port = 3307
创建另一个名为的文件
C:\my-opts2.cnf
,如下所示:[mysqld] datadir = C:/mydata2 port = 3308
使用该
--defaults-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版本支持命名管道,并且您还希望允许命名管道连接,请指定启用命名管道的选项并指定其名称。每个支持命名管道连接的服务器都必须使用唯一的管道名称。例如,C:\my-opts1.cnf
文件可能是这样写的:
[mysqld] datadir = C:/mydata1 port = 3307 enable-named-pipe socket = mypipe1
进行C:\my-opts2.cnf
类似的修改以供第二台服务器使用。然后如前所述启动服务器。
类似的过程适用于您要允许共享内存连接的服务器。通过在shared_memory
启用系统变量的情况下启动服务器来启用此类连接,并通过设置shared_memory_base_name
系统变量为每个服务器指定唯一的共享内存名称。
将多个MySQL实例作为Windows服务启动
在Windows上,MySQL服务器可以作为Windows服务运行。“将MySQL作为Windows服务启动”中介绍了安装,控制和删除单个MySQL服务的过程。
要设置多个MySQL服务,除了每个实例必须唯一的其他参数之外,您还必须确保每个实例使用不同的服务名称。
对于以下说明,假设您要从分别安装在和的两个不同版本的MySQL 运行mysqld服务器。(如果您将5.5.9作为生产服务器运行,但又想使用8.0.21进行测试,则可能是这种情况。)C:\mysql-5.5.9
C:\mysql-8.0.21
要将MySQL安装为Windows服务,请使用--install
或--install-manual
选项。有关这些选项的信息,请参见“将MySQL作为Windows服务启动”。
根据上述信息,您可以通过多种方法来设置多个服务。以下说明描述了一些示例。在尝试使用它们之前,请关闭并删除任何现有的MySQL服务。
方法1:在一个标准选项文件中为所有服务指定选项。为此,请为每个服务器使用不同的服务名称。假设你要运行5.5.9 的mysqld使用的服务名称
mysqld1
和8.0.21 的mysqld使用的服务名称mysqld2
。在这种情况下,可以将[mysqld1]
组用于5.5.9,将[mysqld2]
组用于8.0.21。例如,您可以这样设置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-8.0.21 port = 3308 enable-named-pipe socket = mypipe2
使用完整的服务器路径名,如下安装服务,以确保Windows为每个服务注册正确的可执行程序:
C:\>
C:\mysql-5.5.9\bin\mysqld --install mysqld1 C:\>C:\mysql-8.0.21\bin\mysqld --install mysqld2要启动服务,请使用服务管理器,或者使用具有适当服务名称的NET START或SC START:
C:\>
SC START mysqld1 C:\>SC START mysqld2要停止服务,请使用服务管理器,或使用具有适当服务名称的NET STOP或SC STOP:
C:\>
SC STOP mysqld1 C:\>SC STOP mysqld2方法2:在单独的文件中为每个服务器指定选项,并
--defaults-file
在安装服务时使用以告知每个服务器要使用的文件。在这种情况下,每个文件都应使用[mysqld]
组列出选项。使用这种方法,可以为5.5.9 mysqld指定选项,创建一个如下所示的文件
C:\my-opts1.cnf
:[mysqld] basedir = C:/mysql-5.5.9 port = 3307 enable-named-pipe socket = mypipe1
对于8.0.21 mysqld,创建一个如下所示的文件
C:\my-opts2.cnf
:[mysqld] basedir = C:/mysql-8.0.21 port = 3308 enable-named-pipe socket = mypipe2
如下安装服务(在一行中输入每个命令):
C:\>
C:\mysql-5.5.9\bin\mysqld --install mysqld1 --defaults-file=C:\my-opts1.cnf C:\>C:\mysql-8.0.21\bin\mysqld --install mysqld2 --defaults-file=C:\my-opts2.cnf当您将MySQL服务器安装为服务并使用
--defaults-file
选件时,服务名称必须在选件之前。安装服务后,以与前面的示例相同的方式启动和停止它们。
要删除多个服务,请为每个服务使用SC DELETE mysqld_service_name
。或者,对每一个使用mysqld --remove,在--remove
选项之后指定服务名称。如果服务名称是默认名称(MySQL
),则可以在使用mysqld --remove时将其忽略。
在Unix上运行多个MySQL实例
注意这里的讨论使用mysqld_safe启动多个MySQL实例。对于使用RPM发行版的MySQL安装,服务器的启动和关闭由几个Linux平台上的systemd管理。在这些平台上,未安装mysqld_safe,因为它是不必要的。有关使用systemd处理多个MySQL实例的信息,
一种方法是在Unix上运行多个MySQL实例,即使用不同的默认TCP / IP端口和Unix套接字文件编译不同的服务器,以便每个服务器侦听不同的网络接口。对于每个安装,在不同的基本目录中编译还会自动为每个服务器生成单独的,已编译的数据目录,日志文件和PID文件位置。
假定为默认的TCP / IP端口号(3306)和Unix套接字文件(/tmp/mysql.sock
)配置了一个现有的5.7服务器。要将新的8.0.21服务器配置为具有不同的操作参数,请使用CMake命令,如下所示:
shell>cmake . -DMYSQL_TCP_PORT=port_number \ -DMYSQL_UNIX_ADDR=file_name \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-8.0.21
在此,port_number
并且file_name
必须与默认的TCP / IP端口号和Unix套接字文件路径名不同,并且该CMAKE_INSTALL_PREFIX
值应指定与现有MySQL安装所在的安装目录不同的安装目录。
如果您有一个正在侦听给定端口号的MySQL服务器,则可以使用以下命令找出该服务器用于几个重要的可配置变量的操作参数,包括基本目录和Unix套接字文件名:
shell>mysqladmin --host=host_name --port=port_number variables
使用该命令显示的信息,您可以知道在配置其他服务器时不使用哪些选项值。
如果指定localhost
为主机名,则mysqladmin默认使用Unix套接字文件连接而不是TCP / IP。要显式指定连接协议,请使用--protocol={TCP|SOCKET|PIPE|MEMORY}
选项。
您无需仅以不同的Unix套接字文件和TCP / IP端口号开始就编译新的MySQL服务器。也可以使用相同的服务器二进制文件,并在运行时以不同的参数值开始对其的每次调用。一种方法是使用命令行选项:
shell>mysqld_safe --socket=file_name --port=port_number
要启动第二台服务器,请提供不同的值--socket
和--port
选项值,并将选项传递给mysqld_safe,以便服务器使用其他数据目录。--datadir=dir_name
或者,将每个服务器的选项放在不同的选项文件中,然后使用一个--defaults-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>bin/mysqld --initialize --user=mysql shell>mysqld_safe --datadir=/path/to/datadir &
这是启动第二台服务器进行测试的快速方法。关于此方法的好处是,环境变量设置适用于您从同一shell调用的任何客户端程序。因此,这些客户端的连接将自动定向到第二台服务器。
“环境变量”,列出了可用于影响MySQL程序的其他环境变量。
在Unix上,mysqld_multi脚本提供了另一种启动多个服务器的方法。请参见“mysqld_multi-管理多个MySQL服务器”。
在多服务器环境中使用客户端程序
要将客户端程序连接到正在侦听与编译到客户端的网络接口不同的网络接口的MySQL服务器,可以使用以下方法之一:
- 启动客户端以使用TCP / IP连接到远程服务器,使用TCP / IP连接到本地服务器,或使用Unix套接字文件或Windows命名管道连接到本地服务器。
--host=host_name
--port=port_number
--host=127.0.0.1
--port=port_number
--host=localhost
--socket=file_name
- 启动客户端
--protocol=TCP
以使用TCP / IP--protocol=SOCKET
进行连接,使用Unix套接字文件--protocol=PIPE
进行连接,使用命名管道--protocol=MEMORY
进行连接或使用共享内存进行连接。对于TCP / IP连接,您可能还需要指定--host
和--port
选项。对于其他类型的连接,可能需要指定一个--socket
选项来指定Unix套接字文件或Windows命名管道名称,或者一个--shared-memory-base-name
选项来指定共享内存名称。共享内存连接仅在Windows上受支持。 - 在Unix上,在启动客户端之前,将
MYSQL_UNIX_PORT
和MYSQL_TCP_PORT
环境变量设置为指向Unix套接字文件和TCP / IP端口号。如果通常使用特定的套接字文件或端口号,则可以放置命令以在.login
文件中设置这些环境变量,以便它们在每次登录时都适用。请参见“命令行工具环境变量”。 - 在
[client]
选项文件的组中指定默认的Unix套接字文件和TCP / IP端口号。例如,可以C:\my.cnf
在Windows上使用,也可以.my.cnf
在Unix上的主目录中使用。请参见“使用选项文件”。 - 在C程序中,可以在
mysql_real_connect()
调用中指定套接字文件或端口号参数。您也可以通过调用使程序读取选项文件mysql_options()
。请参见“ C API函数描述”。 如果使用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);
请参见“ MySQL Perl API”。
其他编程接口可以提供类似的功能来读取选项文件。