目录
在某些情况下,您可能希望在一台计算机上运行多个MySQL实例。您可能想测试新的MySQL版本,同时保持现有的生产设置不变。或者,您可能希望授予不同的用户访问他们自己管理的不同mysqld服务器的权限 。(例如,您可能是一个Internet服务提供商,希望为不同的客户提供独立的MySQL安装。)
每个实例可以使用不同的MySQL服务器二进制文件,也可以对多个实例使用相同的二进制文件,或者两种方法的任意组合。例如,您可能从MySQL 5.6运行一台服务器,而从MySQL 5.7运行一台服务器,以查看不同版本如何处理给定的工作负载。或者,您可以运行当前生产版本的多个实例,每个实例管理一组不同的数据库。
无论是否使用不同的服务器二进制文件,必须为运行的每个实例配置几个操作参数的唯一值。这消除了实例之间发生冲突的可能性。可以在命令行,选项文件中或通过设置环境变量来设置参数。请参见 第4.2.2节“指定程序选项”。要查看给定实例使用的值,请连接到该实例并执行一条SHOW VARIABLES
语句。
MySQL实例管理的主要资源是数据目录。每个实例应使用不同的数据目录,该目录的位置使用 --datadir=
选项指定 。有关使用各自的数据目录配置每个实例的方法以及有关这样做的危险的警告,请参见 第5.7.1节“设置多个数据目录”。 dir_name
除了使用不同的数据目录外,其他几个选项对于每个服务器实例还必须具有不同的值:
--port
控制TCP / IP连接的端口号。或者,如果主机具有多个网络地址,则可以设置 bind_address
系统变量以使每个服务器侦听不同的地址。
--socket
控制Unix上的Unix套接字文件路径或Windows上的命名管道名称。在Windows上,仅需要为那些配置为允许命名管道连接的服务器指定不同的管道名称。
此选项仅在Windows上使用。它指定Windows服务器使用的共享内存名称,以允许客户端使用共享内存进行连接。仅对于配置为允许共享内存连接的那些服务器,才需要指定不同的共享内存名称。
此选项示意了服务器在把它的 process ID 写入文件的路径名。
如果使用以下 log 文件选项,则每个服务器的值必须不同:
有关 log 文件选项的进一步讨论,请参阅第 5.4 节,“MySQL 服务器日志”。
为了获得更好的性能,您可以为每个服务器指定不同的以下选项,以在多个物理磁盘之间分配负载:
拥有不同的临时目录还可以更容易地确定哪个 MySQL 服务器创建了任何给定的临时文件。
如果在不同位置安装了多个 MySQL,则可以使用--basedir=dirname选项为每个安装指定基本目录。
这会导致每个实例自动使用不同的数据目录, log files 和 PID 文件,因为每个参数的默认值都与基本目录相关。在这种情况下,您需要指定的唯一其他选项是--socket和--port选项。假设您使用tar
文件二进制分发安装不同版本的 MySQL。它们安装在不同的位置,因此您可以使用相应基目录下的命令bin/mysqld_safe为每个安装启动服务器。 mysqld_safe确定要传递给mysqld的正确--basedir选项,并且您只需要为mysqld_safe指定 --socket
和 --port
选项 。
如以下各节所述,可以通过指定适当的命令选项或通过设置环境变量来启动其他服务器。但是,如果您需要更长时间地运行多个服务器,则使用选项文件为每个服务器指定必须唯一的那些选项值会更方便。该 --defaults-file
选项可用于此目的。
设置多个数据目录
计算机上的每个 MySQL 实例都应该有自己的数据目录。使用--datadir=dirname选项指定位置。
为新实例设置数据目录有不同的方法:
-
创建一个新的数据目录。
-
复制现有数据目录。
以下讨论提供了有关每种方法的更多细节。
警告通常,您永远不应该有两个服务器来更新同一数据库中的数据。如果您的操作系统不支持无故障的系统锁定,则可能导致不愉快的意外。如果(尽管有此警告)您使用同一数据目录运行多个服务器并且启用了日志记录,则必须使用适当的选项来指定每个服务器唯一的日志文件名。否则,服务器将尝试登录到相同的文件。
即使遵守上述注意事项,这种设置也仅适用于
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.7节“在一台机器上运行多个MySQL实例”。
-
启动新实例,告诉它使用新选项文件。
在Windows上运行多个MySQL实例
您可以在Windows上运行多个服务器,方法是从命令行手动启动它们,每个服务器都具有适当的操作参数,或者通过将多个服务器安装为Windows服务并以此方式运行它们。第2.3节“在Microsoft Windows上安装MySQL”中给出了从命令行或作为服务运行MySQL的一般说明 。以下各节介绍如何为每个服务器必须唯一的那些选项(例如数据目录)使用不同的值启动每个服务器。第5.7节“在一台计算机上运行多个MySQL实例”中列出了这些选项 。
在Windows命令行中启动多个MySQL实例
第2.3.4.6节“从Windows命令行启动MySQL”中 介绍了从命令行手动启动单个MySQL服务器的过程 。要以这种方式启动多个服务器,可以在命令行或选项文件中指定适当的选项。将选项放置在选项文件中更为方便,但是必须确保每个服务器都有自己的选项集。为此,请为每台服务器创建一个选项文件,并在运行它时告诉服务器文件 name --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
每个服务器都在前台启动(在服务器退出之前不会出现新提示),因此您需要在单独的 console windows 中发出这两个命令。
要关闭服务器,请使用相应的 port 号码连接到每个服务器:
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 的 version 支持命名管道,并且您还希望允许 named-pipe 连接,请指定启用命名管道并指定其 name 的选项。每个支持 named-pipe 连接的服务器都必须使用唯一的管道 name。例如,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服务,除了每个实例必须唯一的其他参数之外,您还必须确保每个实例使用不同的服务名称。
对于以下说明,假设您要从分别安装在C:\mysql-5.5.9
和C:\mysql-5.7.29
的两个不同版本的 MySQL 中运行mysqld服务器。 (如果您将 5.5.9 作为 production 服务器运行,可能就是这种情况,但也希望使用 5.7.29.)进行测试
要将 MySQL 安装为 Windows 服务,请使用--install
或--install-manual
选项。有关这些选项的信息,请参阅第 2.3.4.8 节,“将 MySQL 作为 Windows 服务启动”。
根据上述信息,您可以通过多种方式设置多个服务。以下说明描述了一些示例。在尝试其中任何一个之前,请关闭并删除任何现有的 MySQL 服务。
方法1:在标准选项文件之一中为所有服务指定选项。
为此,请为每个服务器使用不同的服务 name。假设您要使用mysqld1
的服务 name 运行 5.5.9 mysqld,使用服务 name mysqld2
运行 5.7.29 mysqld。在这种情况下,您可以将[mysqld1]
group 用于 5.5.9,将[mysqld2]
group 用于 5.7.29. 您可以像这样设置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.29
port = 3308
enable-named-pipe
socket = mypipe2
使用完整服务器路径名安装以下服务,以确保 Windows 为每个服务注册正确的可执行程序:
C:\> C:\mysql-5.5.9\bin\mysqld --install mysqld1
C:\> C:\mysql-5.7.29\bin\mysqld --install mysqld2
要启动服务,请使用服务 manager,或NET START或SC START以及相应的服务名称:
C:\> SC START mysqld1
C:\> SC START mysqld2
要停止服务,请使用 services manager,或使用NET STOP或SC STOP以及相应的服务名称:
C:\> SC STOP mysqld1
C:\> SC STOP mysqld2
方法2:在单独的文件中为每个服务器指定选项,并在安装服务时使用--defaults-file告诉每个服务器使用哪个文件。在这种情况下,每个文件都应使用[mysqld]
group 列出选项。
使用此方法,要为 5.5.9 mysqld指定选项,请创建一个如下所示的文件C:\my-opts1.cnf
:
[mysqld]
basedir = C:/mysql-5.5.9
port = 3307
enable-named-pipe
socket = mypipe1
对于 5.7.29 mysqld,创建一个如下所示的文件C:\my-opts2.cnf
:
[mysqld]
basedir = C:/mysql-5.7.29
port = 3308
enable-named-pipe
socket = mypipe2
按如下方式安装服务(在单个 line 上输入每个命令):
C:\> C:\mysql-5.5.9\bin\mysqld --install mysqld1
--defaults-file=C:\my-opts1.cnf
C:\> C:\mysql-5.7.29\bin\mysqld --install mysqld2
--defaults-file=C:\my-opts2.cnf
当您将 MySQL 服务器作为服务安装并使用--defaults-file选项时,服务 name 必须位于该选项之前。
安装服务后,以与前面的 example 相同的方式启动和停止它们。
要删除多个服务,请为每个服务使用SC DELETE mysqld_servicename。或者,对每个使用mysqld --remove,在--remove选项后面指定服务 name。如果服务 name 是默认值(MySQL
),则可以在使用mysqld --remove时省略它。
在Unix上运行多个MySQL实例
注意此处的讨论使用mysqld_safe启动多个MySQL实例。对于使用RPM发行版的MySQL安装,服务器的启动和关闭由systemd在多个Linux平台上进行管理。在这些平台上, 未安装mysqld_safe,因为它是不必要的。有关使用systemd处理多个MySQL实例的信息,请参见第2.5.10节“使用systemd管理MySQL Server”。
一种方法是在Unix上运行多个MySQL实例,即使用不同的默认TCP / IP端口和Unix套接字文件编译不同的服务器,以便每个服务器侦听不同的网络接口。对于每个安装,在不同的基本目录中编译还会自动为每个服务器生成单独的,已编译的数据目录,日志文件和PID文件位置。
假定为默认的TCP / IP端口号(3306)和Unix套接字文件(/tmp/mysql.sock
)配置了一个现有的5.6服务器。要将新的5.7.29服务器配置为具有不同的操作参数,请使用CMake命令,如下所示:
shell> cmake . -DMYSQL_TCP_PORT=port_number \
-DMYSQL_UNIX_ADDR=file_name \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.29
这里,port_number
和file_name
必须与默认的 TCP/IP port 号和 Unix socket 文件路径名不同,并且该 CMAKE_INSTALL_PREFIX
值应指定与现有MySQL安装所在的安装目录不同的安装目录。
如果您有 MySQL 服务器侦听给定的 port 号,您可以使用以下命令找出它用于几个重要的可配置变量的操作参数,包括基本目录和 Unix socket 文件名:
shell> mysqladmin --host=host_name --port=port_number variables
使用该命令显示的信息,您可以确定在配置其他服务器时不使用哪些选项值。
如果指定localhost
作为 host name,则中 mysqladmin默认使用 Unix socket 文件连接而不是 TCP/IP。要显式指定连接协议,请使用--protocol ={TCP | SOCKET | PIPE | MEMORY }选项。
从不同的Unix socket 文件和 TCP/IP port 启动不需要编译新的MYSQL服务器,也可以使用相同的服务器二进制文件,并在运行时使用不同的参数值开始每次调用它。一种方法是使用 command-line 选项:
shell> mysqld_safe --socket=file_name --port=port_number
要启动第二个服务器,请提供不同的--socket和--port选项值,并将--datadir=dirname选项传递给mysqld_safe,以便服务器使用不同的数据目录。
或者,将每个服务器的选项放在不同的选项文件中,然后使用--defaults-file选项启动每个服务器,该选项指定相应选项文件的路径。例如,如果两个服务器实例的选项 files 命名为/usr/local/mysql/my.cnf
和/usr/local/mysql/my.cnf2
,则启动服务器,如下所示:command:
shell> mysqld_safe --defaults-file=/usr/local/mysql/my.cnf
shell> mysqld_safe --defaults-file=/usr/local/mysql/my.cnf2
实现类似效果的另一种方法是使用环境变量来设置 Unix socket 文件名 和 TCP/IP port 号:
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 调用的任何 client 程序。因此,这些客户端的连接会自动定向到第二个服务器。
第4.9节“ MySQL环境变量”,列出了可用于影响MySQL程序的其他环境变量。
在Unix上,mysqld_multi脚本提供了另一种启动多个服务器的方法。请参见 第4.3.4节“ mysqld_multi-管理多个MySQL服务器”。
在多服务器环境中使用客户端程序
要将客户端程序连接到正在侦听与编译到客户端的网络接口不同的网络接口的MySQL服务器,可以使用以下方法之一:
-
启动客户端 以使用
--host=
host_name
--port=
TCP / IP连接到远程服务器 , 使用port_number
--host=127.0.0.1
--port=
TCP / IP连接到本地服务器,或 使用port_number
--host=localhost
--socket=
Unix套接字文件或Windows命名管道连接到本地服务器。file_name
-
使用TCP / IP启动客户端
--protocol=TCP,
使用Unix套接字文件进行连接--protocol=SOCKET
进行连接,使用命名管道进行连接--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
文件中设置这些环境变量,以使它们在每次登录时都适用。请参见 第4.9节“ MySQL环境变量”。 -
在
[client]
选项文件的组中指定默认的Unix套接字文件和TCP / IP端口号。例如,可以C:\my.cnf
在Windows上使用,也可以.my.cnf
在Unix上的主目录中使用。请参见第4.2.2.2节“使用选项文件”。 -
在C程序中,可以在
mysql_real_connect()
调用中指定套接字文件或端口号参数 。您也可以通过调用程序mysql_options()
读取选项文件。请参见 第27.7.6节“ 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);
-
其他编程接口可以提供类似的功能来读取选项文件。