Mysql

多個 MySQL 實例使用 systemd 升級安全/重啟安全?

  • November 6, 2021

我們在 Debian Buster 下使用多個實例執行 MySQL 5.7.36。

為此,我們使用https://dev.mysql.com/doc/refman/5.7/en/using-systemd.html中描述的 Systemd 的功能來使用argv$$ 0 $$. ( "@" - 如果可執行路徑以 “@” 為前綴,則第二個指定的標記將作為 “argv” 傳遞$$ 0 $$" 到執行的程序(而不是實際的文件名),然後是指定的進一步參數。 - 請參閱: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-server 時,我們總是必須先手動停止每個實例,如文件中所述:

在 Debian 平台上,MySQL 解除安裝的打包腳本目前無法處理 mysqld@ 實例。在刪除或升級軟體包之前,您必須先手動停止任何額外的實例。

現在讓我們檢查服務“ systemctl list-unit-files | grep mysql ”的自動啟動選項:

mysql.service                                     disabled
mysql@.service                                    indirect

如果我們現在在禁用 mysql.service 的情況下執行升級,則在包升級期間不會嘗試停止或重新啟動服務。

這個想法是創建一個包裝器以通過“ sudo systemctl edit mysql ”覆蓋正常的 mysql.service,這會觸發單個實例mysql@replica01mysql@replica02用於startstoprestart並解決升級問題。

這可能嗎?有人舉個例子嗎?

感謝 danblack 的回答讓我走上了正軌。根據文件和程式碼,我現在建構了以下設計,這似乎可行:

systemctl 編輯 mysql

[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 edit mysql@replica01 && systemctl edit mysql@replica02

[Unit]
PartOf=mysql.service
After=mysql.service

MariaDB(MDEV-23321)也有同樣的問題。

Debian Systemd 打包不利於打包獨立的模板實例 systemd 服務。但是,它確實在您考慮的領域提供了一個醜陋的解決方法。

我建議在你的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_installsystemd 程式碼

引用自:https://dba.stackexchange.com/questions/302112