问题的简短版本是,在启动时,默认的 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我有两个相关的启动脚本:mysql和mysqld_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 的正确方法吗无需破解流程?