多個 MySQL 實例使用 systemd 升級安全/重啟安全?
我們在 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@replica01和mysql@replica02用於start、stop、restart並解決升級問題。
這可能嗎?有人舉個例子嗎?
感謝 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 啟動新實例,不會失敗,並且不會在列表實例中看起來具有誤導性。