第3章 MySQL基础管理
MySQL服务管理
1. 启动与关闭
启动方式
常规启动
service mysqld start
systemctl start mysqld
/etc/init.d/mysqld start
前台启动(用于调试,日志输出到屏幕)
mysqld
mysqld_safe
mysqld与mysqld_safe
mysqld是MySQL的核心程序,负责管理数据库文件和处理用户请求,读取配置文件中的[mysqld]部分。
mysqld_safe是mysqld的守护进程包装器,提供以下功能:
- 启动并监控mysqld进程,发生异常时自动重启
- 将错误日志重定向到数据目录的host_name.err文件
- 读取配置文件的[mysqld]、[server]、[mysqld_safe]和[safe_mysqld]部分
- 支持通过--mysqld或--mysqld-version参数指定mysqld版本
调试启动
用于故障排查或临时参数测试:
mysqld_safe --defaults-file=/etc/my.cnf &
mysqld --defaults-file=/etc/my.cnf &
关闭方式
常规关闭
service mysqld stop
systemctl stop mysqld
/etc/init.d/mysqld stop
SQL命令关闭
mysql -uroot -p123456 -e 'shutdown;'
# 或在MySQL控制台执行
mysql> shutdown;
注意
避免使用kill、pkill、killall命令关闭MySQL,严禁使用kill -9,可能导致数据损坏。
2. 配置文件管理
配置方法与优先级
MySQL支持三种配置方式:配置文件(主要方法)、命令行参数(特殊场景)、源码编译(较少使用)。
配置优先级:命令行 > 配置文件 > 编译默认值
配置文件加载顺序
mysqld --help --verbose | grep my.cnf
# 按顺序加载以下位置的配置文件:
/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/mysql/etc/my.cnf
~/.my.cnf
当多个配置文件存在相同参数时,后加载的配置会覆盖先加载的配置。
手动指定配置文件
使用--defaults-file参数指定特定配置文件:
mysqld_safe --defaults-file=/opt/my.cnf &
mysqld --defaults-file=/opt/my.cnf &
自定义systemd服务
cat > /etc/systemd/system/mysqldd.service <<EOF
[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
ExecStart=/opt/mysql/bin/mysqld --defaults-file=/opt/my.cnf
LimitNOFILE = 5000
EOF
配置文件格式
[mysqld] # 服务端标签
user=mysql # MySQL内置管理用户
basedir=/data/app/mysql # 软件目录
datadir=/data/3306/data # 数据目录
socket=/tmp/mysql.sock # socket文件生成目录
port=3306 # 端口号
server_id=1 # 主机编号(主从复制使用)
[mysql]
socket=/tmp/mysql.sock # 客户端连接使用的socket文件
常用配置标签:
- 服务端:[server](所有服务端程序)、[mysqld](mysqld程序)、[mysqld_safe](mysqld_safe程序)
- 客户端:[client](所有客户端程序)、[mysql](mysql命令)、[mysqldump](mysqldump工具)
3. 连接管理
本地连接
# 创建本地用户
grant all on *.* to test@'localhost' identified by '123';
# 本地连接方式
mysql -utest -p123 # 默认socket连接
mysql -utest -p123 -S /tmp/mysql.sock # 指定socket文件
远程连接
# 创建远程用户
grant all on *.* to test1@'10.0.0.%' identified by '123';
# 远程连接
mysql -utest1 -p123 -h 10.0.0.51 -P3306
批处理操作
# 执行单条SQL
mysql -uroot -p123 -e "select user,host from mysql.user;"
# 导入SQL文件
mysql -uroot -p123 < world.sql
图形化工具
常用图形化管理工具:SQLyog、Navicat、MySQL Workbench
用户与权限管理
1. 用户管理
用户体系说明
MySQL用户与Linux用户独立,Linux用户管理系统文件,MySQL用户管理数据库对象。
MySQL用户定义格式:用户名@'白名单'
白名单示例:
oldya@'localhost'
- 仅允许本地socket连接oldya@'10.0.0.10'
- 仅允许指定IP连接oldya@'10.0.0.%'
- 允许10.0.0.0/24网段连接oldya@'10.0.0.5%'
- 允许10.0.0.50-59连接oldya@'%'
- 允许所有主机连接oldya@'db01.oldya.com'
- 允许指定域名连接
用户管理操作
# 查询用户
select user,host,authentication_string from mysql.user;
# 创建用户
create user oldya@'localhost'; # 无密码用户
create user oldya@'10.0.0.%' identified by '123'; # 带密码用户
# 修改密码
alter user oldya@'localhost' identified by '123'; # root修改其他用户
set password=password('123456'); # 用户修改自己密码
# 删除用户
drop user oldya@'localhost';
2. 权限管理
权限体系
MySQL权限系统控制用户对数据库对象的操作能力。查看所有可用权限:
show privileges;
授权语法
GRANT 权限列表 ON 权限范围 TO '用户'@'主机' IDENTIFIED BY '密码';
授权示例:
# 创建远程管理员
GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.0.0.%' IDENTIFIED BY '123456';
# 创建普通用户(指定权限和数据库)
grant select,update,delete,insert on test.* to test@'10.0.0.%' identified by '123';
# 查看用户权限
show grants for test@'10.0.0.%';
权限管理操作
# 回收权限
revoke delete on test.* from 'test'@'10.0.0.%';
# 删除用户
DROP USER '用户'@'主机';
提示
MySQL权限是累加的,多次授权会叠加权限而非覆盖。
权限表结构
3. 密码管理与恢复
密码设置与修改
初次设置root密码:
mysqladmin -uroot password '123456'
mysqladmin -uroot password '123456' -S /tmp/mysql_3306.sock
修改密码方法:
# 方法1:mysqladmin命令
mysqladmin -uroot -p123456 password '123'
# 方法2:SQL语句修改指定用户
set password for root@localhost = PASSWORD('123');
# 方法3:直接更新user表(MySQL 5.7)
UPDATE mysql.user SET authentication_string=PASSWORD("123456")
WHERE user='root' and host='localhost';
# 方法4:修改当前用户密码
set password=password('123456');
flush privileges;
root密码恢复
危险
密码恢复过程中数据库处于无认证状态,任何人都可以访问,请确保在安全环境中操作。
# 1. 停止MySQL服务
systemctl stop mysql
# 2. 以无授权模式启动
mysqld_safe --skip-grant-tables --user=mysql
# 3. 无密码登录
mysql
# 4. 修改root密码
UPDATE mysql.user SET authentication_string=PASSWORD("123456")
WHERE user='root' and host='localhost';
# 5. 重启MySQL服务
systemctl restart mysqld
# 6. 使用新密码登录
mysql -uroot -p123456