用systemd管理GreatSQL服務詳解
1.GreatSQL服務文件
官網 greatsql.service
文件
[Unit]
Description=GreatSQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]# 本文省略some limitsUser=mysql
Group=mysql
Type=notify
TimeoutSec=10
PermissionsStartOnly=true
ExecStartPre=/usr/local/GreatSQL-8.0.32-27-Linux-glibc2.28-x86_64/bin/mysqld_pre_systemd
ExecStart=/usr/local/GreatSQL-8.0.32-27-Linux-glibc2.28-x86_64/bin/mysqld $MYSQLD_OPTS
EnvironmentFile=-/etc/sysconfig/mysql
Restart=on-failure
RestartPreventExitStatus=1
Environment=MYSQLD_PARENT_PID=1
PrivateTmp=false
上述服務文件中
MYSQLD_OPTS
、MYSQLD_PARENT_PID
的用途是什么?Type
和ExecStart
有什么關系?服務停止的邏輯是什么?TimeoutSec
超時會怎樣?
2.環境變量
[Service]
ExecStart=/data/svr/greatsql/bin/mysqld --defaults-file=/data/conf/greatsql4306.cnf $MYSQLD_OPTS
EnvironmentFile=-/data/conf/greatsql
2.1 MYSQLD_OPTS
MYSQLD_OPTS
是一個特殊的環境變量,用于在啟動時向 MYSQLD 進程傳遞額外的命令行參數。適合需要動態調整參數的場景。
可以通過以下方式設置 MYSQLD_OPTS
- systemctl,全局環境變量
# 設置
systemctl set-environment MYSQLD_OPTS="--general_log=1"
# 取消
systemctl unset-environment MYSQLD_OPTS
- 服務文件,單個服務環境變量
[Service]
Environment=MYSQLD_OPTS=--general_log=1
EnvironmentFile=-/data/conf/greatsql
2.2 Environment
- 服務文件中設置 Environment
[Service]
Environment=LD_PRELOAD=/usr/local/jemalloc-5.3.0/lib/libjemalloc.so
Environment=LD_PRELOAD=/data/svr/greatsql/lib/mysql/libjemalloc.so #覆蓋之前同名的變量
Environment= #清空所有環境變量
如果同一變量被重復設置,后續的賦值會覆蓋之前的值。如果將此選項賦值為空字符串,則會重置環境變量列表,之前的所有設置均失效。
- 服務文件中設置 EnvironmentFile
[Service]
EnvironmentFile=-/etc/sysconfig/mysql #-表示忽略文件不存在錯誤
EnvironmentFile=-/data/conf/greatsql
EnvironmentFile= #清空所有待讀取的文件$ cat /data/conf/greatsql
LD_PRELOAD=/data/svr/greatsql/lib/mysql/libjemalloc.so
LD_LIBRARY_PATH=/data/svr/greatsql/lib
TZ=CST
MYSQLD_OPTS=--general_log=1 --port=4307
EnvironmentFile 可以設置多次,所有匹配的文件均會被讀取。若將此選項賦值為空字符串,則會清空待讀取的文件列表,之前所有設置均失效。
EnvironmentFile 按順序依次讀取,后加載的變量會覆蓋之前的設定,且會覆蓋 Environment 中的同名變量。
Environment、EnvironmentFile 在服務啟動前解析,這些變量會被直接寫入服務的環境變量列表,對所有后續命令(ExecStartPre、ExecStart、ExecStartPost)可見。
如果 EnvironmentFile 指定的文件在運行時動態生成,systemd 會嘗試讀取它,如果文件在讀取時被修改,systemd 會使用最新的內容。
3.啟動
systemd 通過 fork-exec + cgroups 的機制創建并嚴格管理服務進程,確保所有進程均為其子進程。
- Uses fork() + execve() to spawn the new process:
- fork(): Creates a child process (a copy of the systemd parent).
- execve(): Overwrites the child process with the target binary.
- Assigns the process to a dedicated cgroup
- Ensures all child processes remain within the same cgroup.
- Enables resource limits and process tracking.
3.1 Type=simple
[Service]
Type=simple
ExecStart=/data/svr/greatsql/bin/mysqld --defaults-file=/data/conf/greatsql4306.cnf $MYSQLD_OPTS
3.1.1 行為
- 要求 ExecStart 啟動的是前臺命令**,**其將作為服務的主進程(Main Process)
- ExecStart 進程創建即啟動成功(即使進程還在初始化或監聽端口未就緒);如果進程崩潰或退出,systemd 會根據 Restart= 規則決定是否重啟
- 適用于不 fork() 且不依賴其他進程的服務
3.1.2 錯誤示例
如果 ExecStart 啟動的命令以 daemon 模式運行,daemon 進程有一個瞬間退出的中間父進程,對應就是子進程。在子進程退出時,systemd 會將其從監控隊列中踢掉,同時殺掉所有附屬進程(殺進程的方式由 KillMode 控制)。
# KillMode=control-group
$ systemctl start db-4306
$ systemctl status db-4306
● db-4306.service - db-4306 ServerLoaded: loaded (/usr/lib/systemd/system/db-4306.service; enabled; vendor preset: disabled)Active: inactive (dead) since Fri 2025-05-30 11:03:26 CST; 9s agoProcess: 1914 ExecStart=/data/svr/greatsql/bin/mysqld --defaults-file=/data/conf/greatsql4306.cnf --daemonize $MYSQLD_OPTS (code=exited, status=0/SUCCESS)Main PID: 1914 (code=exited, status=0/SUCCESS)Jun 05 11:03:22 dbcluster-165 systemd[1]: Started db-4306 Server.
$ ps aux |grep 4306 |grep -v grep
Type=simple,執行 daemon 命令,默認啟動后馬上會停止。
3.2 Type=forking
[Service]
Type=forking
PIDFile=/data/dbdata/data4306/data/mysql.pid
ExecStart=/data/svr/greatsql/bin/mysqld --defaults-file=/data/conf/greatsql4306.cnf --daemonize $MYSQLD_OPTS
3.2.1 行為
- 要求 ExecStart 啟動的命令以 daemon 模式運行,服務預期自行 fork() 并退出
- ExecStart 進程 fork() 出的進程將作為服務的主進程(Main Process),推薦設置 PIDFile 用以正確監控服務主進程,否則通過 cgroup 跟蹤
- PIDFile 只適合在 Type=forking 模式下使用,如果有設置 PIDFile,systemd 會在 ExecStart 進程退出后立即讀取這個 PIDFile,讀取成功后就認為該服務已經啟動成功,讀取失敗就認為該服務啟動失敗
- 適用于傳統 Unix 守護進程
以下是 forking 模式下正常啟動的服務
$ systemctl status db-4306
● db-4306.service - db-4306 ServerLoaded: loaded (/usr/lib/systemd/system/db-4306.service; enabled; vendor preset: disabled)Active: active (running) since Thu 2025-05-29 22:28:03 CST; 11s agoProcess: 24262 ExecStart=/data/svr/greatsql/bin/mysqld --defaults-file=/data/conf/greatsql4306.cnf --daemonize $MYSQLD_OPTS (code=exited, status=0/SUCCESS)Main PID: 24342 (mysqld)Tasks: 54CGroup: /system.slice/db-4306.service└─24342 /data/svr/greatsql/bin/mysqld --defaults-file=/data/conf/greatsql4306.cnf --daemonizeMay 29 22:28:01 dbcluster-165 systemd[1]: Starting db-4306 Server...
May 29 22:28:03 dbcluster-165 systemd[1]: Started db-4306 Server.
ExecStart 啟動的進程 PID=24262,且該進程的狀態是已退出,退出狀態碼為0,這個進程是 daemon 類進程創建過程中瞬間退出的中間父進程。Main PID: 24342 (mysqld),這是 systemd 真正監控的服務主進程。
3.2.2 錯誤示例
如果 ExecStart 是一個前臺命令,systemd 會一直等待 ExecStart 啟動的進程作為中間父進程退出,在等待過程中,systemctl start 會一直卡住,直到等待超時而失敗。
$ systemctl status db-4306
● db-4306.service - db-4306 ServerLoaded: loaded (/usr/lib/systemd/system/db-4306.service; enabled; vendor preset: disabled)Active: activating (start) since Fri 2025-05-30 17:25:01 CST; 52s agoMain PID: 27683 (code=exited, status=0/SUCCESS); : 12646 (mysqld)Tasks: 54CGroup: /system.slice/db-4306.service└─12646 /data/svr/greatsql/bin/mysqld --defaults-file=/data/conf/greatsql4306.cnfMay 30 17:25:01 dbcluster-165 systemd[1]: Starting db-4306 Server...
$ ps axj |grep 4306 |grep -v grep
18266 12640 12640 18266 pts/1 12640 S+ 0 0:00 systemctl start db-43061 12646 12646 12646 ? -1 Ssl 986 0:02 /data/svr/greatsql/bin/mysqld --defaults-file=/data/conf/greatsql4306.cnf$ tailf /var/log/messages |grep db-4306
May 30 17:25:01 dbcluster-165 systemd: Starting db-4306 Server...
May 30 17:26:31 dbcluster-165 systemd: db-4306.service start operation timed out. Terminating.
May 30 17:26:32 dbcluster-165 systemd: Failed to start db-4306 Server.
May 30 17:26:32 dbcluster-165 systemd: Unit db-4306.service entered failed state.
May 30 17:26:32 dbcluster-165 systemd: db-4306.service failed.
May 30 17:26:32 dbcluster-165 systemd: db-4306.service holdoff time over, scheduling restart.
May 30 17:26:32 dbcluster-165 systemd: Stopped db-4306 Server.
May 30 17:26:32 dbcluster-165 systemd: Starting db-4306 Server...
Type=forking,執行前臺命令,在Restart=on-failure場景,啟動超時導致服務反復重啟。
3.3 Type=notify
[Service]
Type=notify
ExecStart=/data/svr/greatsql/bin/mysqld --defaults-file=/data/conf/greatsql4306.cnf $MYSQLD_OPTS
3.3.1 行為
- 類似 simple,要求 ExecStart 啟動的是前臺命令**,**其將作為服務的主進程(Main Process)
- 進程支持 sd_notify(),必須正確配置 NotifyAccess 和超時時間
- 進程在啟動完成、狀態更新、停止通知后必需主動通過 sd_notify() 向 systemd 發送通知
- 適用于實現更精確的啟動、運行和停止管理服務
3.4 mysqld顯示更多變量
當使用 mysqld_safe 啟動數據庫時,ps 可以看到 mysqld 進程帶有很多變量
$ ps aux |grep 4306
mysql 8787 0.0 0.0 113316 1640 pts/1 S 08:59 0:00 /bin/sh /data/svr/greatsql/bin/mysqld_safe --defaults-file=/data/conf/greatsql4306.cnf
mysql 10424 0.6 3.0 1251912 499724 pts/1 Sl 08:59 0:16 /data/svr/greatsql/bin/mysqld --defaults-file=/data/conf/greatsql4306.cnf --basedir=/data/svr/greatsql --datadir=/data/dbdata/data4306/data --plugin-dir=/data/svr/greatsql/lib/plugin --log-error=/data/logs/error4306.log --open-files-limit=65535 --pid-file=/data/dbdata/data4306/data/mysql.pid --socket=/data/dbdata/data4306/data/mysql.sock --port=4306
$
mysqld_safe 處理邏輯如下
cmd="`mysqld_ld_preload_text`$NOHUP_NICENESS"for i in "$ledir/$MYSQLD" "$defaults" "--basedir=$MY_BASEDIR_VERSION" \"--datadir=$DATADIR" "--plugin-dir=$plugin_dir" "$USER_OPTION"
docmd="$cmd "`shell_quote_string "$i"`
done
cmd="$cmd $args"
# Avoid 'nohup: ignoring input' warning
test -n "$NOHUP_NICENESS" && cmd="$cmd < /dev/null"log_notice "Starting $MYSQLD daemon with databases from $DATADIR"
對于 systemd service,可以添加 ExecStartPre,從 --defaults-file
中獲取需要顯示的變量
[Service]
Type=notify
ExecStartPre=-/bin/bash -c "sed 's/_/-/g; s/ //g; s/#.*//' /data/conf/greatsql4306.cnf |grep -E '^(basedir|datadir|log-error|socket|port)=' |sed 's/^/--/' |tr '\n' ' ' |sed 's/^/MYSQLD_OPTS=/' > /data/conf/greatsql4306.env"
ExecStart=/data/svr/greatsql/bin/mysqld --defaults-file=/data/conf/greatsql4306.cnf $MYSQLD_OPTS
EnvironmentFile=-/data/conf/greatsql4306.env# 啟動后的效果
$ systemctl -l status db-4306
● db-4306.service - db-4306 ServerLoaded: loaded (/usr/lib/systemd/system/db-4306.service; enabled; vendor preset: disabled)Active: active (running) since Fri 2025-06-06 10:27:16 CST; 7h agoMain PID: 12020 (mysqld)Status: "Server is operational"Tasks: 53CGroup: /system.slice/db-4306.service└─12020 /data/svr/greatsql/bin/mysqld --defaults-file=/data/conf/greatsql4306.cnf --port=4306 --basedir=/data/svr/greatsql --datadir=/data/dbdata/data4306/data --pid-file=/data/dbdata/data4306/data/mysql.pid --socket=/data/dbdata/data4306/data/mysql.sock --log-error=/data/logs/error4306.logJun 06 10:27:14 dbcluster-165 systemd[1]: Starting db-4306 Server...
Jun 06 10:27:16 dbcluster-165 systemd[1]: Started db-4306 Server.
3.5 mysqld先于磁盤掛載啟動
對于開機自動啟動,如果磁盤掛載服務啟動較慢,數據庫服務可能會報錯,可以配置數據庫服務延遲啟動
[Unit]
Description=GreatSQL Server
After=network.target local-fs.target #部分環境After、Requires=local-fs.target無效
Requires=local-fs.target[Service]
Type=notify
Environment=LD_PRELOAD=/usr/local/jemalloc-5.3.0/lib/libjemalloc.so
ExecStartPre=-/usr/bin/sleep 5 #本節采用
ExecStart=/data/svr/greatsql/bin/mysqld --defaults-file=/data/conf/greatsql4306.cnf $MYSQLD_OPTS
服務日志如下
$ systemctl start db-4306
$ systemctl -l status db-4306
● db-4306.service - db-4306 ServerLoaded: loaded (/usr/lib/systemd/system/db-4306.service; enabled; vendor preset: disabled)Active: active (running) since Fri 2025-06-13 23:16:09 CST; 15s agoProcess: 3920 ExecStartPre=/usr/bin/sleep 5 (code=exited, status=0/SUCCESS)Main PID: 4004 (mysqld)Status: "Server is operational"Tasks: 54CGroup: /system.slice/db-4306.service└─4004 /data/svr/greatsql/bin/mysqld --defaults-file=/data/conf/greatsql4306.cnfJun 13 23:16:02 dbcluster-165 systemd[1]: Starting db-4306 Server...
Jun 13 23:16:02 dbcluster-165 sleep[3920]: ERROR: ld.so: object '/usr/local/jemalloc-5.3.0/lib/libjemalloc.so' from LD_PRELOAD cannot be preloaded: ignored.
Jun 13 23:16:09 dbcluster-165 systemd[1]: Started db-4306 Server.
$ lsof -p 4004 |grep -i jem
mysqld 4004 mysql mem REG 8,2 10479400 846986 /usr/local/jemalloc-5.3.0/lib/libjemalloc.so.2
systemctl status
中 ERROR 的原因:執行 ExecStartPre 會加載服務的環境變量,此時由于磁盤掛載暫未完成,導致 so 文件無法加載(這一條 ERROR 可以忽略)。只要延遲足夠,在磁盤掛載完成后再執行 ExecStart,就能正常加載配置的 so 文件。
4.停止
4.1 systemctl stop 邏輯
- 執行 ExecStop (設置了才執行,否則進入第2步)
- ExecStop 成功終止進程,systemd 檢測到進程已退出,不再發送 SIGTERM
- ExecStop 未終止進程,例如 ExecStop 超時(TimeoutStopSec),ExecStop 命令與停止進程無關,進入第2步
- 發送 SIGTERM(默認,KillSignal=SIGTERM),優雅退出
- SIGTERM 成功終止進程,服務退出
- SIGTERM 未終止進程,例如 SIGTERM 超時(TimeoutStopSec),進入第3步
- 發送 SIGKILL(默認,SendSIGKILL=yes),強制終止
4.2 systemctl stop 執行超時
對于版本升級等場景,通常會設置 innodb_fast_shutdown=0,此時關閉數據庫會比較慢,如果 TimeoutStopSec 過小,可能導致 ExecStop、SIGTERM 超時,觸發 SIGKILL。
- 數據庫以 systemd 服務運行
[Service]
Type=notify
ExecStart=/data/svr/greatsql/bin/mysqld --defaults-file=/data/conf/greatsql4306.cnf
Restart=on-failure
- ExecStop 超時,SIGTERM 超時,對應的服務日志
$ date;systemctl stop db-4306
Tue Jun 3 15:37:19 CST 2025
$ systemctl status db-4306
● db-4306.service - db-4306 ServerLoaded: loaded (/usr/lib/systemd/system/db-4306.service; enabled; vendor preset: disabled)Active: failed (Result: signal) since Tue 2025-06-03 15:37:21 CST; 36s agoProcess: 26645 ExecStop=/usr/bin/sleep 60 (code=killed, signal=TERM)Process: 26322 ExecStart=/data/svr/greatsql/bin/mysqld --defaults-file=/data/conf/greatsql4306.cnf (code=killed, signal=KILL)Main PID: 26322 (code=killed, signal=KILL)Status: "Server shutdown in progress"Jun 03 15:37:01 dbcluster-165 systemd[1]: Starting db-4306 Server...
Jun 03 15:37:03 dbcluster-165 systemd[1]: Started db-4306 Server.
Jun 03 15:37:19 dbcluster-165 systemd[1]: Stopping db-4306 Server...
Jun 03 15:37:20 dbcluster-165 systemd[1]: db-4306.service stopping timed out. Terminating.
Jun 03 15:37:21 dbcluster-165 systemd[1]: db-4306.service stop-sigterm timed out. Killing.
Jun 03 15:37:21 dbcluster-165 systemd[1]: db-4306.service: main process exited, code=killed, status=9/KILL
Jun 03 15:37:21 dbcluster-165 systemd[1]: Stopped db-4306 Server.
Jun 03 15:37:21 dbcluster-165 systemd[1]: Unit db-4306.service entered failed state.
Jun 03 15:37:21 dbcluster-165 systemd[1]: db-4306.service failed.
systemctl stop 超時(ExecStop、SIGTERM),服務會被 SIGKILL。systemd 認為是一個預期的行為,不會觸發重啟。
4.3 命令行執行 shutdown 超時
- 數據庫以 systemd 服務運行(同上)
- 命令行執行 shutdown
greatsql> shutdown;
systemd 對所有通過它管理的服務都實施完整的生命周期控制。當執行 shutdown 時,信號傳遞鏈:shutdown --> 數據庫服務 --> systemd 服務管理器。systemd 會監控整個停止過程。
- 對應服務日志
Jun 3 17:32:23 dbcluster-165 systemd: db-4306.service stop-sigterm timed out. Killing.
Jun 3 17:32:24 dbcluster-165 systemd: db-4306.service: main process exited, code=killed, status=9/KILL
Jun 3 17:32:24 dbcluster-165 systemd: Unit db-4306.service entered failed state.
Jun 3 17:32:24 dbcluster-165 systemd: db-4306.service failed.
Jun 3 17:32:24 dbcluster-165 systemd: db-4306.service holdoff time over, scheduling restart.
Jun 3 17:32:24 dbcluster-165 systemd: Stopped db-4306 Server.
Jun 3 17:32:24 dbcluster-165 systemd: Starting db-4306 Server...
Jun 3 17:32:25 dbcluster-165 systemd: Started db-4306 Server.
SIGTERM 超時,發送 SIGKILL 強制終止,進程退出原因是 Unclean signal。在 Restart=on-failure 場景,等待 RestartSec(默認100ms)后重啟。
命令行 shutdown 超時(SIGTERM),服務會被 SIGKILL,之后會觸發重啟。
4.4 禁用 systemd 的默認信號
如果要禁用 systemd 的默認停止行為,可以參考如下設置
[Service]
ExecStop=/path/to/your-stop-script # 必須確保此腳本終止所有進程
KillMode=none # 禁用systemd的默認終止行為
TimeoutStopSec=0 # 避免超時干預
5.重啟
Configures whether the service shall be restarted when the service process exits, is killed, or a timeout is reached. The service process may be the main service process, but it may also be one of the processes specified with ExecStartPre=, ExecStartPost=, ExecStop=, ExecStopPost=, or ExecReload=. When the death of the process is a result of systemd operation (e.g. service stop or restart), the service will not be restarted. Timeouts include missing the watchdog “keep-alive ping” deadline and a service start, reload, and stop operation timeouts.
5.1 Restart 的取值
Restart settings/Exit causes | no | always | on-success | on-failure | on-abnormal | on-abort | on-watchdog |
---|---|---|---|---|---|---|---|
Clean exit code or signal | X | X | |||||
Unclean exit code | X | X | |||||
Unclean signal | X | X | X | X | |||
Timeout | X | X | X | ||||
Watchdog | X | X | X | X |
A clean exit means an exit code of 0, or one of the signals SIGHUP, SIGINT, SIGTERM or SIGPIPE, and additionally, exit statuses and signals specified in SuccessExitStatus=.
5.2 命令行執行 restart 無法重啟
- 數據庫以 systemd 服務運行(同上)
- 命令行執行 restart
greatsql> restart;
ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).
原因:沒有設置相關的監控進程(https://dev.mysql.com/doc/refman/8.0/en/restart.html)
- 查看運行中數據庫進程的 MYSQLD_PARENT_PID
$ ps aux |grep 4306 |grep -v grep
mysql 21055 0.5 3.1 2635940 505712 ? Ssl Jun03 7:31 /data/svr/greatsql/bin/mysqld --defaults-file=/data/conf/greatsql4306.cnf
$ cat /proc/21055/environ |tr '\0' '\n'
LANG=en_US.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
NOTIFY_SOCKET=/run/systemd/notify
HOME=/home/mysql
LOGNAME=mysql
USER=mysql
SHELL=/bin/bash
- 設置 MYSQLD_PARENT_PID
- mysqld_safe,默認將 mysqld_safe 的PID設置為監控進程
#echo "Running mysqld: [$cmd]"cmd="env MYSQLD_PARENT_PID=$$ $cmd"eval "$cmd"
- systemd,需在服務文件添加
[Service]
Environment=MYSQLD_PARENT_PID=1
- 重啟數據庫生效
$ systemctl restart db-4306
$ ps aux |grep 4306 |grep -v grep
mysql 11050 0.9 3.0 2635676 500004 ? Ssl 15:53 0:04 /data/svr/greatsql/bin/mysqld --defaults-file=/data/conf/greatsql4306.cnf
$ cat /proc/11050/environ |tr '\0' '\n' |grep MYSQLD_PARENT_PID
MYSQLD_PARENT_PID=1greatsql> restart;
Query OK, 0 rows affected (0.00 sec)
如果要求不重啟數據庫就能執行 restart 命令,可通過 gdb 動態修改環境變量,gdb 會短時間阻塞數據庫
$ gdb -p 21055(gdb) call putenv("MYSQLD_PARENT_PID=1") $2 = 0 (gdb) detach Detaching from program: /data/svr/GreatSQL-8.0.32-26-Linux-glibc2.17-x86_64/bin/mysqld, process 21055 (gdb) quitgreatsql> restart; Query OK, 0 rows affected (0.00 sec)
clone 同樣需要設置 MYSQLD_PARENT_PID,才能自動重啟。
5.3相關參數
ReStartSec:重啟條件滿足后等多久自動重啟
StartLimitInterval、StartLimitBurst:限制指定時間內(StartLimitInterval)重啟的次數(StartLimitBurst)
RestartPreventExitStatus:指定某些退出狀態碼或信號不重啟。GreatSQL服務建議設置為1,在遇到嚴重錯誤時不重啟實例,需人工介入處理
RestartForceExitStatus:強制將某些退出狀態碼或信號重啟。比如 Restart=no,RestartForceExitStatus=16,則不依賴自動重啟,但命令行執行 restart 可正常重啟實例
6.總結
- 合理設置 Type 和 ExecStart
- 建議設置一個較大的 TimeoutStopSec,避免 ExecStop 或者 SIGTERM 超時
- Clone 和命令行 restart 需要設置 MYSQLD_PARENT_PID
- 建議設置 ReStartSec、StartLimitInterval 和 StartLimitBurst 限制重啟頻率
- 可以設置 ExecStartPre和EnvironmentFile,添加 ps 需要顯示的變量