我刚刚安装了 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 文件并未像我找到的每个文档中所述的那样创建。