我们使用几个实例在Debian下运行MySQL 5.7.36。
为此,我们使用https://dev.mysql.com/doc/refman/5.7/en/using-systemd.html中描述的Systemd的特性来使用argv0。("@“-如果可执行路径以"@”为前缀,则第二个指定的令牌将作为"argv0“传递到执行的进程(而不是实际的文件名),然后是指定的进一步参数。-见:https://manpages.debian.org/testing/systemd/systemd.service.5.en.html)。
/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
管理实例:
systemctl start mysql@replica01
systemctl start mysql@replica02
启用自动启动:
systemctl enable mysql@replica01
systemctl enable mysql@replica02
我们已经禁用了通用MySQL服务的默认自动启动:
systemctl disable mysql
但是,当通过包管理升级mysql-服务器时,我们总是必须首先手动停止每个实例,如文档中所述:
在Debian平台上,用于MySQL卸载的打包脚本目前无法处理mysqld@实例。在删除或升级包之前,必须先手动停止任何额外的实例。
现在,让我们检查服务的自动启动选项"systemctl list-unit-files grep mysql":
mysql.service disabled
mysql@.service indirect
如果我们现在执行禁用mysql.service的升级,则不会尝试在包升级期间停止或重新启动服务。
这样做的目的是创建一个包装器,通过“systemctl编辑mysql”覆盖普通的mysql.service,这将触发启动、停止、重新启动和解决升级问题的单个实例mysql@mysql.service 01和mysql@mysql.service 02。
发布于 2021-11-05 12:00:55
感谢丹布莱克的回答让我走上正轨。基于文档和代码,我现在构建了以下设计,该设计似乎有效:
[Unit]
Description=MySQL Wrapper
Wants=mysql@replica01.service
Wants=mysql@replica02.service
[Service]
Restart=no
Type=oneshot
ExecStartPre=
RemainAfterExit=true
ExecStart=
ExecStart=/bin/true
对于每个实例: systemctl编辑mysql@replica02 01 && systemctl编辑mysql@replica02 02
[Unit]
PartOf=mysql.service
After=mysql.service
发布于 2021-11-04 22:31:22
我在MariaDB (MDEV 23321)上也遇到了同样的麻烦。
Debian系统封装不利于打包独立的模板实例系统服务。但是,在你所考虑的领域,它确实提供了一个丑陋的解决方案。
我建议在你的systemctl edit mysql.service
里
[Unit]
PartOf=mysql@replica01
PartOf=mysql@replica01
[Service]
Type=oneshot
ExecStart=
ExecStart=/usr/bin/systemctl disable mysql.service
需要ExecStart=
(空白)重新设置列表。
这应该足以触发重新启动,并防止mysql.service启动一个新实例,不会失败,并且不会在列表实例中出现误导。
参考文献:dh_分期付款系统代码
https://dba.stackexchange.com/questions/302112
复制相似问题