MySQL:使用 systemd 的多个实例

MySQL:使用 systemd 的多个实例

我刚刚安装了 Ubuntu 17.10,我想运行多个实例的 MySQL。我已阅读有关此内容的 MySQL 文档 (https://dev.mysql.com/doc/refman/5.7/en/using-systemd.html),但我还是不明白。

我已禁用 mysql 的 apparmor 配置文件,并将这些行添加到 /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld@replica01]
datadir=/var/lib/mysql-replica01
socket=/var/lib/mysql-replica01/mysql.sock
port=3307
log-error=/var/log/mysql/replica01.log

[mysqld@replica02]
datadir=/var/lib/mysql-replica02
socket=/var/lib/mysql-replica02/mysql.sock
port=3308
log-error=/var/log/mysql/replica02.log

复制就够了吗/lib/systemd/system/mysql.service/lib/systemd/系统/[电子邮件保护]或者我需要以某种方式修改它吗?因为如果我只是复制它并运行

systemctl start mysql@replica01

它只会在端口 3306 上启动默认的 MySQL 实例。如果我启动 mysql@replica02,它将无法启动,因为它会尝试启动同一个实例,而我只会收到一堆

无法锁定 ./ibdata1 错误:11

我在这里遗漏了什么?我在网上能找到的唯一关于此内容的信息是 .deb 文件中支持此功能之前的旧帖子。但从版本 5.7.19 开始,这应该可以工作,截至撰写本文时,版本是从 Ubuntus repo 安装的 5.7.21。

我在 Debian 机器上有一个旧安装,它使用mysqld_multi但如果我理解文档正确的话,那就不再受支持了。

答案1

上述解决方案工作正常,但为了使其与 MySQL 参考手册解决方案兼容(单个选项文件和 --defaults-group-suffix)/lib/systemd/system/[电子邮件保护]看起来应该是这样的:

# MySQL systemd service file

[Unit]
Description=MySQL Community Server
After=network.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
PermissionsStartOnly=true
ExecStart=/usr/sbin/mysqld --defaults-group-suffix=@%I
TimeoutSec=600
Restart=on-failure
RuntimeDirectory=mysqld
RuntimeDirectoryMode=755

顺便说一句,没有 /lib/systemd/system/[电子邮件保护]在 Ubuntu 中默认安装,因此必须手动添加(如果你只是将 /lib/systemd/system/mysql.service 复制到 /lib/systemd/system/,则不起作用)[电子邮件保护])。

答案2

我不知道这是否正确,但这就是我的做法。如果这里有什么错误,请留言。

我的/lib/systemd/系统/[电子邮件保护]看起来像这样:

[Unit]
Description=Multi Instance MySQL Community Server
After=network.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
PermissionsStartOnly=true
ExecStart=/usr/sbin/mysqld --defaults-file=/etc/mysql/mysql.conf.d/my_%I.cnf
TimeoutSec=600
Restart=on-failure
RuntimeDirectory=mysqld
RuntimeDirectoryMode=755

然后我为每个实例创建了一个单独的配置文件/etc/mysql/mysql.conf.d名字my_replica01.cnf等等。我只是从 MySQL 复制了主配置文件并更改了路径和端口号。然后我为每个实例创建了数据文件夹,如下所示:

mkdir /var/lib/mysql-replica01
mkdir /var/lib/mysql-replica02
chown -R mysql:mysql /var/lib/mysql-replica*

ETC。

然后我使用以下命令初始化实例:

mysqld --user=mysql --initialize --datadir=/var/lib/mysql-replica01

然后我必须在添加后重新加载systemd[电子邮件保护]-文件

systemctl daemon-reload

然后只需使用以下命令启用实例:

systemctl enable mysql@replica01
systemctl enable mysql@replica02

现在实例会在服务器启动时自动启动。要手动启动它们,只需运行:

systemctl start mysql@replica01

编辑:

补充一下,我必须像这样使用套接字连接到实例:

mysql -S /var/lib/mysql-replica01/mysql.sock -p

然后更改 root 帐户的密码等。出于某种原因,.mysql_secret 文件并未像我找到的每个文档中所述的那样创建。

相关内容