如何防止使用 mysqld_multi 时启动默认 MySQL 实例?

如何防止使用 mysqld_multi 时启动默认 MySQL 实例?

问题的简短版本是,在启动时,默认的 mysql 启动脚本使用默认设置启动服务器的不需要的通用实例,然后 mysqld_multi 正确启动所需的实例,导致服务器实例过多。

我在 Ubuntu 14.04 上。刚刚将 MySQL 服务器升级到版本 5.7。我打算运行 MySQL 服务器的两个实例,一个主服务器和一个从服务器,使用相同的二进制文件,但其他设置不同。

这种设置的目的是从复制过程中过滤掉一些表。在复制到由第三方控制的第三个外部实例之前,我想确保只有某些表出现在二进制日志中。多年来,我一直成功地使用这种方法。

升级到 MySQL 5.7 后,我的设置如下所示:

[mysqld_multi]
mysqld                  = /usr/bin/mysqld_safe
mysqladmin              = /usr/bin/mysqladmin
user                    = multi_admin
password                = multipass

[mysqld1]
server-id               = 1
port                    = 3306
user                    = mysql
pid-file                = /var/run/mysqld/mysqld.pid
socket                  = /var/run/mysqld/mysqld.sock
datadir                 = /var/lib/mysql
log-error               = /var/log/mysql/error.log
...

[mysqld2]
basedir = /usr
server-id               = 2
port                    = 3307
user                    = mysql
pid-file                = /var/run/mysqld/mysqld_blackhole_slave.pid
socket                  = /var/run/mysqld/mysqld_blackhole_slave.sock
datadir                 = /var/lib/mysql_blackhole_slave
log-error               = /var/log/mysql_blackhole_slave/error.log
...

值得注意的是,MySQL 在服务器启动时创建 /var/run/mysqld 目录,并在服务器关闭时(且没有其他进程使用它)删除该目录。

在我的/etc/init.d我有两个相关的启动脚本:mysqlmysqld_multi

当 mysql 脚本运行时,它会检查 my.cnf 文件,发现没有 [mysqld] 组,因此会使用默认设置启动一个服务器实例。它会创建 /var/run/mysqld 目录(如上所述),然后一切开始运行。此时,我有一个使用我未指定的默认值运行的服务器实例。

然后是 mysqld_multi 脚本。它查找 [mysqld],并相应地启动服务器实例。这将根据我的指定启动另外两个实例。此时,我有三个服务器实例正在运行,而不是我在配置文件中请求的两个。

如果我从 /etc/init.d 中删除 mysql 脚本,默认实例将不会启动,但其他两个实例也不会启动,因为:

mysqld_safe UNIX 套接字文件的目录“/var/run/mysqld”不存在。(原文如此)

请注意,它并没有说无法创建目录。它似乎假设此时目录应该存在,但由于删除了 mysql 启动脚本,它永远不会被创建。我相信此过程不会尝试创建目录。如果它确实尝试过,人们会认为存在权限问题。我已禁用 apparmor,并尝试以 root 身份运行这些进程以排除权限相关问题。

我当然可以这样做:

sudo mkdir /var/run/mysqld
sudo chown mysql:mysql /var/run/mysqld

然后启动 mysqld_multi。这工作正常,但是一种非常不正统的系统启动方式。

所以我想知道,当前系统上没有启动 mysqld_multi 的正确方法吗无需破解流程?

相关内容