在某些情况下,您可能希望在一台计算机上运行多个MySQL实例。您可能想测试新的MySQL版本,同时保持现有的生产设置不变。或者,您可能希望授予不同的用户访问他们自己管理的不同mysqld服务器的权限 。(例如,您可能是一个Internet服务提供商,希望为不同的客户提供独立的MySQL安装。)

每个实例可以使用不同的MySQL服务器二进制文件,也可以对多个实例使用相同的二进制文件,或者两种方法的任意组合。例如,您可能从MySQL 5.7运行服务器,而从MySQL 8.0运行服务器,以查看不同版本如何处理给定的工作负载。或者,您可以运行当前生产版本的多个实例,每个实例管理一组不同的数据库。

无论是否使用不同的服务器二进制文件,必须为运行的每个实例配置几个操作参数的唯一值。这消除了实例之间发生冲突的可能性。可以在命令行,选项文件中或通过设置环境变量来设置参数。请参见 第4.2.2节“指定程序选项”。要查看给定实例使用的值,请连接到该实例并执行一条SHOW VARIABLES语句。

MySQL实例管理的主要资源是数据目录。每个实例应使用不同的数据目录,该目录的位置使用 选项指定 。有关使用各自的数据目录配置每个实例的方法以及有关这样做的危险的警告,请参见 第5.8.1节“设置多个数据目录”。 --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]

为了获得更好的性能,可以为每个服务器不同地指定以下选项,以在多个物理磁盘之间分散负载:

--tmpdir=dir_name

使用不同的临时目录还可以更轻松地确定哪个MySQL服务器创建了任何给定的临时文件。

如果在不同位置有多个MySQL安装,则可以使用 选项为每个安装指定基本目录 。这将导致每个实例自动使用不同的数据目录,日志文件和PID文件,因为每个参数的默认值都是相对于基本目录而言的。在这种情况下,您需要指定的唯一其他选项是 and 选项。假设您使用 文件二进制分发版安装了不同版本的MySQL 。它们安装在不同的位置,因此您可以使用命令bin / mysqld_safe在其对应的基本目录下启动每次安装的服务器 。mysqld_safe 确定正确--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上,初始化数据目录。请参见 第2.10节“安装后的设置和测试”。
在Windows上,数据目录包含在MySQL发行版中:
Windows的MySQL Zip存档发行版包含未修改的数据目录。您可以将这样的发行版解压缩到一个临时位置,然后将其复制 data到要设置新实例的目录中。
Windows MSI软件包安装程序会创建并设置已安装服务器将使用的数据目录,还会创建一个在安装目录下命名的原始“ 模板 ”数据 data目录。使用MSI软件包执行安装后,可以复制模板数据目录以设置其他MySQL实例。

复制现有数据目录
使用这种方法,数据目录中存在的任何MySQL帐户或用户数据都将被转移到新的数据目录中。
使用数据目录停止现有的MySQL实例。这必须是干净关闭,以便实例刷新对磁盘的所有未决更改。
将数据目录复制到新数据目录应位于的位置。
复制现有实例使用的my.cnf或 my.ini选项文件。这是新实例的基础。
修改新的选项文件,以便任何引用原始数据目录的路径名都引用新的数据目录。此外,修改每个实例必须唯一的其他任何选项,例如TCP / IP端口号和日志文件。有关每个实例必须唯一的参数列表,请参见 第5.8节“在一台机器上运行多个MySQL实例”。
启动新实例,告诉它使用新选项文件。

您可以在Windows上运行多个服务器,方法是从命令行手动启动它们,每个服务器都具有适当的操作参数,或者通过将多个服务器安装为Windows服务并以这种方式运行它们。

在Windows命令行中启动多个MySQL实例
第2.3.4.6节“从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服务运行。第2.3.4.8节“将MySQL作为Windows服务启动”中介绍了安装,控制和删除单个MySQL服务的过程 。

要设置多个MySQL服务,除了每个实例必须唯一的其他参数之外,您还必须确保每个实例使用不同的服务名称。

对于以下说明,假设您要从分别安装在 和的两个不同版本的MySQL 运行 mysqld服务器。(如果您将5.5.9作为生产服务器运行,但又想使用8.0.20进行测试,则可能是这种情况。) C:\mysql-5.5.9C:\mysql-8.0.20

要将MySQL作为Windows服务安装,请使用 --install或--install-manual 选项。有关这些选项的信息,请参见 第2.3.4.8节“作为Windows服务启动MySQL”。

根据上述信息,您可以通过多种方法来设置多个服务。以下说明描述了一些示例。在尝试使用它们之前,请关闭并删除任何现有的MySQL服务。

方法1:在标准选项文件之一中为所有服务指定选项。为此,请为每个服务器使用不同的服务名称。假设你要运行5.5.9 的mysqld使用的服务名称 mysqld1和8.0.20 的mysqld使用的服务名称 mysqld2。在这种情况下,您可以将 [mysqld1]组用于5.5.9,将 [mysqld2]组用于8.0.20。例如,您可以这样设置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.20
port = 3308
enable-named-pipe
socket = mypipe2

使用完整的服务器路径名,如下安装服务,以确保Windows为每个服务注册正确的可执行程序:

C:\> C:\mysql-5.5.9\bin\mysqld --install mysqld1
C:\> C:\mysql-8.0.20\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.20 mysqld,创建一个如下所示的文件C:\my-opts2.cnf:

[mysqld]
basedir = C:/mysql-8.0.20
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.20\bin\mysqld --install mysqld2
           --defaults-file=C:\my-opts2.cnf

当您将MySQL服务器安装为服务并使用 --defaults-file选件时,服务名称必须在选件之前。

安装服务后,以与前面的示例相同的方式启动和停止它们。

要删除多个服务,请为每个服务使用SC DELETE mysqld_service_name。或者, 对每一个使用mysqld --remove,在--remove选项之后指定服务名称 。如果服务名称是默认名称(MySQL),则可以在使用mysqld --remove时将其忽略。