找回密码
 新建账号

Linux systemd mysql service 自定义服务运行

[复制链接]
php 发表于 2024/4/10 13:43 | 显示全部楼层 |阅读模式
Ubuntu CentOS Debian RedHat Linux systemd service mysql 8.0+ 自定义系统服务运行 mysql server,和 mysql 5.7 5.6 有很大的差异,按 mysql 5.7 systemd service 自定义服务方式配置 mysql 8.0+ 会出现异常,导致 mysql (mysqld) 服务不能正常运行,可能出现一种很诡异的情形,就是 mysql server 启动以后立即自动关闭,而且有可能不会报告任何的错误,表现出正常运行的状态。
  1. [Server] .../bin/mysqld: ready for connections. Version: '8.0.36'  socket: '/tmp/mysql.sock'  port: 10086  MySQL Community Server - GPL.
  2. [Server] Received SHUTDOWN from user <via user signal>. Shutting down mysqld (Version: 8.0.36).
  3. [Server] .../bin/mysqld: Shutdown complete (mysqld 8.0.36)  MySQL Community Server - GPL.
复制代码
需要说明的是,这里安装 mysql server 服务的方式和 mysql 官方指引不同,不使用 mysql_safe 来启动 mysqld 进程。

首先初始化数据 生成 data 目录及数据库用户root的临时密码
  1. mysqld --initialize --user=mysql
复制代码
这里的 --user 指定的是运行 mysql 初始化任务的操作系统用户,如果 mysql 程序目录不是默认路径,也可以使用 --basedir 指定 mysql 程序根目录,这个目录通常是可执行文件 mysqld 所在 bin 目录的上级目录,如果你需要将 mysql 数据保存到非默认目录,可以使用 --datadir 参数,需要指定路径的时候最好指定绝对路径,否则可能出现预料以外的结果或者因为权限不够无法运行 mysql 或无法保存数据。
  1. mysqld --initialize --user=mysql --basedir=/opt/mysql/8.0 --datadir=/opt/mysql/8.0/data
复制代码
完成数据初始化就可以开始配置以服务方式运行 mysql 了,后面的步骤就可以不按官方引导走了。
创建一个服务配置文件 mysql.service 中的 mysql 也可以是其它名字,通常是 mysql 或 mysqld,是配置完成以后的服务名。
  1. /etc/systemd/system/mysql.service
复制代码
mysql 8.0+ systemd service 配置文件内容如下
  1. [Unit]
  2. Description=mysql
  3. After=network.target
  4. After=syslog.target
  5. [Install]
  6. WantedBy=multi-user.target
  7. [Service]
  8. Type=notify
  9. User=mysql
  10. Group=database
  11. ExecStart=/opt/mysql/8.0/bin/mysqld --defaults-file=/opt/mysql/8.0/my.cnf --basedir=/opt/mysql/8.0 --datadir=/opt/mysql/8.0/data
  12. StartLimitInterval=3600
  13. StartLimitBurst=15
  14. Restart=always
  15. RestartSec=5
  16. PrivateTmp=true
复制代码
--defaults-file 让 mysqld 只从它指定的文件中读取服务器配置,可以有效避免从系统其它的目录搜索配置文件,对于在一台服务器上运行多个 mysql 服务器尤其有用,需要注意的是,如果有这个参数,它必须是第一个参数。

最关键的配置参数是 Type=notify,mysql 8.0 Type=notify 是必须配置的,Type 如果不配置,默认值是 Type=simple,服务运行时运行 ExecStart 指定的命令,如果 Type=forking,systemd 会认为 ExecStart 指定这个进程在启动以后会启动一些子进程来干活,子进程启动以后父进程会结束运行,systemd 会等待这个父进程结束,Type=notify 时,systemd 在服务启动时自动创建一个环境变量 NOTIFY_SOCKET,然后创建一个 unix socket,它的路径保存在 NOTIFY_SOCKET 中,服务进程通过 unix socket 和 systemd 交互,实现更加精准的服务管理。网上能找到的配置全部是基于 mysql 5.7,而 mysql 5.7 Type=forking,mysql 8.0+ 改变了 Type 类型,不使用 Type=notify 会出现各种灵异现象,导致 mysqld 无法正常运行。

保存文件以后要记得启用服务
  1. systemctl daemon-reload
  2. systemctl enable mysql.service
复制代码
也可以马上运行服务,如果不手动运行,服务会在下次系统启动时运行。
  1. systemctl start mysql.service
复制代码
mysql 5.7 systemd service 配置文件内容如下
  1. [Unit]
  2. Description=mysql server 5.7
  3. After=network.target
  4. [Install]
  5. WantedBy=multi-user.target
  6. [Service]
  7. Type=forking
  8. ExecStart=/opt/mysql/5.7/bin/mysqld --defaults-file=/opt/mysql/5.7/my.cnf --basedir=/opt/mysql/5.7 --datadir=/opt/mysql/5.7/data --daemonize
  9. User=mysql
  10. Group=database
  11. PrivateTmp=true
  12. StartLimitInterval=3600
  13. StartLimitBurst=15
  14. Restart=always
  15. RestartSec=5
复制代码
相关链接 mysql using systemd mysql data directory initialization

手机版|轻松E站

GMT+8, 2024/5/19 06:54

快速回复 返回顶部 返回列表