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 启动以后立即自动关闭,而且有可能不会报告任何的错误,表现出正常运行的状态。
- [Server] .../bin/mysqld: ready for connections. Version: '8.0.36' socket: '/tmp/mysql.sock' port: 10086 MySQL Community Server - GPL.
- [Server] Received SHUTDOWN from user <via user signal>. Shutting down mysqld (Version: 8.0.36).
- [Server] .../bin/mysqld: Shutdown complete (mysqld 8.0.36) MySQL Community Server - GPL.
复制代码 需要说明的是,这里安装 mysql server 服务的方式和 mysql 官方指引不同,不使用 mysql_safe 来启动 mysqld 进程。
首先初始化数据 生成 data 目录及数据库用户root的临时密码
- mysqld --initialize --user=mysql
复制代码 这里的 --user 指定的是运行 mysql 初始化任务的操作系统用户,如果 mysql 程序目录不是默认路径,也可以使用 --basedir 指定 mysql 程序根目录,这个目录通常是可执行文件 mysqld 所在 bin 目录的上级目录,如果你需要将 mysql 数据保存到非默认目录,可以使用 --datadir 参数,需要指定路径的时候最好指定绝对路径,否则可能出现预料以外的结果或者因为权限不够无法运行 mysql 或无法保存数据。- mysqld --initialize --user=mysql --basedir=/opt/mysql/8.0 --datadir=/opt/mysql/8.0/data
复制代码 完成数据初始化就可以开始配置以服务方式运行 mysql 了,后面的步骤就可以不按官方引导走了。
创建一个服务配置文件 mysql.service 中的 mysql 也可以是其它名字,通常是 mysql 或 mysqld,是配置完成以后的服务名。
- /etc/systemd/system/mysql.service
复制代码 mysql 8.0+ systemd service 配置文件内容如下
- [Unit]
- Description=mysql
- After=network.target
- After=syslog.target
- [Install]
- WantedBy=multi-user.target
- [Service]
- Type=notify
- User=mysql
- Group=database
- 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
- StartLimitInterval=3600
- StartLimitBurst=15
- Restart=always
- RestartSec=5
- 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 无法正常运行。
保存文件以后要记得启用服务
- systemctl daemon-reload
- systemctl enable mysql.service
复制代码 也可以马上运行服务,如果不手动运行,服务会在下次系统启动时运行。
- systemctl start mysql.service
复制代码 mysql 5.7 systemd service 配置文件内容如下
- [Unit]
- Description=mysql server 5.7
- After=network.target
- [Install]
- WantedBy=multi-user.target
- [Service]
- Type=forking
- 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
- User=mysql
- Group=database
- PrivateTmp=true
- StartLimitInterval=3600
- StartLimitBurst=15
- Restart=always
- RestartSec=5
复制代码 相关链接 mysql using systemd mysql data directory initialization |
|