在Linux平台,由于职责划分与权限管控,一般来说,数据库管理员只有操作系统的mysql用户的权限,没有root用户的权限,在mysql用户下,我们可以使用命令启动mysql,但是,如果我们想配置MySQL服务的话,以服务的方式启动MySQL的话,那么需要怎么配置呢?默认情况下,mysql用户是没有权限启动MySQL服务的,需要系统管理员配置/etc/sudoers文件,才能给mysql用户授权。下面简单介绍一下如何配置MySQL服务,以及如何给mysql用户授予启动、关闭mysql服务的权限。
配置MySQL服务
下面命令操作使用root账号。
cd /usr/lib/systemd/system
touch mysqld.service
chmod 644 mysqld.service
编辑mysqld.service,在其中输入如下信息,修改其中一些配置(有些内容,请根据实际情况设置/调整)
[Unit]
Description=MySQL 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]
User=mysql
Group=mysql
# Have mysqld write its state to the systemd notify socket
Type=notify
# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0
# Start main service
ExecStart=/opt/mysql/mysql8/bin/mysqld --defaults-file=/data/mysql/conf/my.cnf $MYSQLD_OPTS
# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql
# Sets open_files_limit
LimitNOFILE = 10000
Restart=on-failure
RestartPreventExitStatus=1
# Set environment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1
PrivateTmp=false
配置systemd服务
systemctl daemon-reload
systemctl enable mysqld.service
systemctl is-enabled mysqld
systemctl start mysqld.service
如果没有设置sudo权限的话,默认情况下使用mysql账号启动MySQL服务的话,会遇到类似下面这样的问题:
$ systemctl stop mysqld
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to manage system services or units.
Authenticating as: root
Password:
$ sudo systemctl status mysqld
[sudo] password for mysql:
mysql is not in the sudoers file. This incident will be reported.
此时需要系统管理员给mysql用户授权,一般有下面两种方式:
方法1:
在/etc/sudoers中添加下面配置
mysql ALL=(ALL) NOPASSWD: /usr/bin/systemctl start mysqld.service, /usr/bin/systemctl stop mysqld.service, /usr/bin/systemctl status mysqld.service
方法2:
将mysql用户加入wheel组
# usermod -aG wheel mysql
# id mysql
uid=598(mysql) gid=5003(mysql) groups=5003(mysql),10(wheel)
然后修改/etc/sudoers中的配置,取消## Services下的别名注释,设置Services别名,

## Services
Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig, /usr/bin/systemctl start, /usr/bin/systemctl stop, /usr/bin/systemctl reload
, /usr/bin/systemctl restart, /usr/bin/systemctl status, /usr/bin/systemctl enable, /usr/bin/systemctl disable
然后添加下面配置后,切换到mysql用户下就可以使用systemctl命令启动mysql服务了
mysql ALL=(ALL) NOPASSWD: SERVICES
按照上面任意一种方法配置后,你在mysql用户下面,就可以通过下面命令启动、关闭MySQL实例了。
sudo systemctl start mysqld.service
sudo systemctl status mysqld.service
sudo systemctl stop mysqld.service
总结
对于两种方法来说,方法1很好的控制了权限,mysql用户只能启动mysqld服务,而不能启动任何其它服务,而第二种方法虽然放宽了限制,但是无意中放大了mysql用户的权限。所以从安全角度来说,一般还是推荐使用方法1,而不是方法2.因为方法2可能带来一些安全隐患。
文章转载自DBA闲思杂想录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




