本文原创作品,良心制作,干货为主,简洁清晰,一看就会
前言
本文聚焦 MySQL 运维的三大核心模块 —— 权限管理、日志管理、数据备份与恢复,深入拆解关键操作逻辑与实践要点。这三项技能直接关系到业务系统的稳定性与数据可靠性,是运维工作中必须扎实掌握的重点内容
一、权限管理
1,用户管理
登录MySQL语法:mysql -u 用户 -p 密码 -h IP地址 -P 端口号
-h 指定主机名 【默认为localhost】
-P MySQL服务器端口 【默认3306】
-u 指定用户名
-p 指定登录密码
-e 接SQL语句,可以写多条拿;隔开
-D mysql为指定登录的数据库
#查看mysql端口号
[root@1 ~]# cat /etc/my.cnf | grep port
port = 3306
#可以更改端口,修改之后重启mysql即可
#本地用户登录
[root@1 ~]# mysql -p'Qing@123' #相当于mysql -uroot -p'Qing@123' -h 192.168.136.10 -P 3306
mysql> use mysql
mysql> select * from user\G

#允许root用户远程登录,远程用户登录
[root@1 ~]# mysql -uroot -p'Qing@123'
mysql> update user set host='%' where user='root'; #更改mysql库的user表的host字段
mysql> flush privileges; #刷新权限
#远程用户登录
[root@2 ~]# mysql -uroot -p'Qing@123' -h 192.168.136.10 -P 3306
#-e用法
[root@1 ~]# mysql -p'Qing@123' -e 'show databases;' #不进入数据库也可以查到内容,有的时候脚本编写需要用到-e
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
[root@1 ~]# mysql -uroot -p'Qing@123' -D mysql # -D指定数据库登录,登录进去就是mysql库
2,创建用户
创建用户有两种方式:
先创建用户再授权(CREATE USER + GRANT)
创建用户语法:CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
授权语法:GRANT 权限列表 ON 数据库.表名 TO '用户名'@'主机名';
#方法一,先创建用户再授权
mysql> create user tom@'localhost' identified by 'Mysql@123';
localhost 只允许本地用户登录
% 所有主机远程登录
192.168.136.% 允许136网段的所有主机登录
192.168.136.20指定主机
mysql> flush privileges;
mysql> grant all on *.* to 'tom'@'localhost'; #给tom授权,对所有的库下的表都有权限
mysql> flush privileges;
mysql> select * from user\G #查看用户表,可以看到tom这个用户
*************************** 4. row ***************************
Host: localhost
User: tom
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
......
#测试登录
[root@1 ~]# mysql -utom -p'Mysql@123' #登录成功
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.7.27 Source distribution
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
直接用GRANT创建并授权GRANT 权限列表 ON 数据库.表名 TO '用户名'@'主机名' IDENTIFIED BY '密码';
#方法二,创建用户同时授权
mysql> grant all on *.* to 'jack'@'192.168.136.%' identified by 'MYsql@123';
mysql> flush privileges;
#测试登录
[root@2 ~]# mysql -ujack -p'MYsql@123' -h 192.168.136.10
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.27 Source distribution
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
3,权限简介
| 权限 | 权限级别 | 权限说明 |
|---|---|---|
| CREATE | 数据库、表或索引 | 创建数据库、表或索引权限 |
| DROP | 数据库或表 | 删除数据库或表权限 |
| GRANT OPTION | 数据库、表或保存的程序 | 赋予权限选项 #小心给予 |
| ALTER | 表 | 更改表,比如添加字段、索引等 |
| DELETE | 表 | 删除数据权限 |
| INDEX | 表 | 索引权限 |
| INSERT | 表 | 插入权限 |
| SELECT | 表 | 查询权限 |
| UPDATE | 表 | 更新权限 |
| LOCK TABLES | 服务器管理 | 锁表权限 |
| CREATE USER | 服务器管理 | 创建用户权限 |
| REPLICATION SLAVE | 服务器管理 | 复制权限 |
| SHOW DATABASES | 服务器管理 | 查看数据库权限 |
#查看自己权限
mysql> show grants for 'root'@'%'; #也可以写成show grants\G
+-------------------------------------------------------------+
| Grants for root@% |
+-------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION |
+-------------------------------------------------------------+
#查看某人权限
mysql> show grants for 'tom'@'192.168.136.%';
+------------------------------------------------------+
| Grants for tom@192.168.136.% |
+------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'tom'@'192.168.136.%' |
+------------------------------------------------------+
4,修改权限
修改用户远程登录权限
#修改用户远程登录权限
mysql> update user set Host='192.168.136.%' where User='tom'; #允许136网段登录
mysql> flush privileges;
#测试登录
[root@2 ~]# mysql -utom -p'Mysql@123' -h 192.168.136.10
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.7.27 Source distribution
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
移除权限列表
移除用户权限语法:REVOKE 权限 ON 数据库.数据表 FROM '用户'@'IP地址'
被回收的权限必须存在,否则会出错
整个数据库,使用 ON datebase.*;
特定的表:使用 ON datebase.table;
#移除tom的所有权限
mysql> show grants for 'tom'@'192.168.136.%'; #先看一下tom有什么权限
+------------------------------------------------------+
| Grants for tom@192.168.136.% |
+------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'tom'@'192.168.136.%' |
+------------------------------------------------------+
mysql> revoke all privileges on *.* from 'tom'@'192.168.136.%';
mysql> show grants for 'tom'@'192.168.136.%';
+---------------------------------------------+
| Grants for tom@192.168.136.% |
+---------------------------------------------+
| GRANT USAGE ON *.* TO 'tom'@'192.168.136.%' |
+---------------------------------------------+
修改权限列表
#如果要修改权限列表,可以先回收所有权限,再用grant授权
mysql> revoke all privileges on *.* from 'jack'@'192.168.136.%'; #回收jack的所有权限
mysql> grant select,update on test.department to 'jack'@'192.168.136.%'; #jack得到针对于test库department表的查询更新权限
mysql> flush privileges;
mysql> show grants\G #查看自己权限
*************************** 1. row ***************************
Grants for jack@192.168.136.%: GRANT USAGE ON *.* TO 'jack'@'192.168.136.%'
*************************** 2. row ***************************
Grants for jack@192.168.136.%: GRANT SELECT, UPDATE ON `test`.`department` TO 'jack'@'192.168.136.%'
#验证
[root@1 ~]# mysql -ujack -p'MYsql@123' -h 192.168.136.10
mysql> show databases; #information_schema库所有用户都能看到
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
+--------------------+
mysql> use test;
mysql> show tables; #只能看到department表
+----------------+
| Tables_in_test |
+----------------+
| department |
+----------------+
mysql> select * from department;
+---------+-----------+
| dept_id | dept_name |
+---------+-----------+
| Ⅰ | 技术部 |
| Ⅱ | 市场部 |
| Ⅲ | 人事部 |
| Ⅳ | 财务部 |
+---------+-----------+
mysql> update department set dept_name='IT部' where dept_id='Ⅰ';
mysql> select * from department;
+---------+-----------+
| dept_id | dept_name |
+---------+-----------+
| Ⅰ | IT部 |
| Ⅱ | 市场部 |
| Ⅲ | 人事部 |
| Ⅳ | 财务部 |
+---------+-----------+
mysql> insert into department values ('Ⅴ','销售部'); #无插入权限
ERROR 1142 (42000): INSERT command denied to user 'jack'@'192.168.136.10' for table 'department'
mysql> delete from department; #无删记录权限
ERROR 1142 (42000): DELETE command denied to user 'jack'@'192.168.136.10' for table 'department'
mysql> drop table department; #无删表权限
ERROR 1142 (42000): DROP command denied to user 'jack'@'192.168.136.10' for table 'department'
5,权限控制机制
MySQL 权限认证逻辑(基于 user/db/tables_priv/columns_priv 四表)
MySQL 权限认证遵循自上而下的层级校验逻辑,以 SELECT 权限为例,校验顺序和规则如下,其他权限(如 INSERT/UPDATE 等)逻辑一致
5.1用户认证:基础校验层
依赖表:mysql.user 表
作用:存储用户账号、密码、全局权限等核心信息,是权限校验的起点
操作:通过查询该表确认用户是否存在、密码是否正确,同时获取全局权限开关
5.2权限认证:层级校验流程(以 SELECT 为例)
权限校验从“全局”到“列级”逐步缩小范围,一旦在某一层级命中 Y 或明确权限,即停止向下校验
5.2.1 第 1 层:全局权限校验(user 表)
校验字段:user.select_priv
规则:
若值为 Y:用户拥有所有数据库、所有表的 SELECT 权限,停止后续校验。
若值为 N:无全局 SELECT 权限,进入下一层级(db 表)校验
5.2.2 第 2 层:数据库级权限校验(db 表)
依赖表:mysql.db 表(存储用户对特定数据库的权限)
校验字段:db.select_priv
规则:
若值为 Y:用户拥有当前数据库下所有表的 SELECT 权限,停止后续校验
若值为 N:无当前数据库的 SELECT 权限,进入下一层级(tables_priv 表)校验
mysql> select * from db\G #可以看到alan没有库基本的权限
*************************** 1. row ***************************
Host: localhost
Db: performance_schema
User: mysql.session
Select_priv: Y
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Execute_priv: N
Event_priv: N
Trigger_priv: N
*************************** 2. row ***************************
Host: localhost
Db: sys
User: mysql.sys
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Execute_priv: N
Event_priv: N
Trigger_priv: Y
5.2.3 第 3 层:表级权限校验(tables_priv 表)
依赖表:mysql.tables_priv 表(存储用户对特定表的权限)
校验字段:tables_priv.Privileges(权限集合,含 SELECT 则生效)
规则:
若权限集合包含 SELECT:用户拥有当前表所有字段的 SELECT 权限,停止后续校验。
若权限集合不含 SELECT:无当前表的 SELECT 权限,进入下一层级(columns_priv 表)校验
mysql> select * from tables_priv; #alan有针对department表的select权限,接下来不用再往下看下去
+----------------+-------+---------------+------------+----------------------+---------------------+---------------+-------------+
| Host | Db | User | Table_name | Grantor | Timestamp | Table_priv | Column_priv |
+----------------+-------+---------------+------------+----------------------+---------------------+---------------+-------------+
| localhost | mysql | mysql.session | user | boot@connecting host | 0000-00-00 00:00:00 | Select | |
| localhost | sys | mysql.sys | sys_config | root@localhost | 2025-10-28 15:20:46 | Select | |
| 192.168.136.20 | test | alan | department | root@localhost | 0000-00-00 00:00:00 | Select,Update | |
+----------------+-------+---------------+------------+----------------------+---------------------+---------------+-------------+
5.2.4 第 4 层:列级权限校验(columns_priv 表)
依赖表:mysql.columns_priv 表(存储用户对特定表字段的权限)
校验字段:columns_priv.Privileges(权限集合,含 SELECT 则生效)
规则:
若权限集合包含 SELECT:用户仅拥有当前表指定列的 SELECT 权限。
若权限集合不含 SELECT:用户对所有数据库、表、列均无 SELECT 权限。
当然,如果alan没有表级别的权限,可以接着看columns_priv有没有字段基本的权限
5.2.5 详细流程图

上述内容旨在帮助大家理解MySQL的权限控制机制——从全局到列级的层级校验逻辑,以及不同权限范围对应存储的系统表(如user、db、tables_priv等)。实际运维中,查询某用户权限直接使用show grants for '用户'@'主机'即可
6,修改密码
root修改自己密码
#方法一,直接在mysql内修改
mysql> set password='LQing@123';
mysql> \q
Bye
[root@1 ~]# mysql -p'LQing@123'; #登录成功
mysql> \q
Bye
#方法二,免交互修改
[root@1 ~]# mysqladmin -uroot -p'LQing@123' password 'Qing@123';
[root@1 ~]# mysql -p'Qing@123';
mysql>
root修改其他用户密码
mysql> use mysql
mysql> set password for 'jack'@'192.168.136.%'='Yy@123';
'用户'@'主机' 新密码
7,删除用户
mysql> drop user 'jack'@'192.168.136.%'; #drop语句删除
mysql> delete from mysql.user where user='tom' and Host='192.168.136.%'; #delete语句删除
二、日志管理
MySQL 的日志主要分为5类:错误日志,binlog日志,查询日志,慢查询日志,中继日志
1,错误日志(Error Log)
作用:记录 MySQL 启动、关闭、运行中的错误信息(如崩溃、连接失败等),默认开启
关联:所有日志的基础,若数据库异常,优先查看错误日志定位底层问题
[root@1 ~]# mysql -u root -p -e "show variables like 'log_error';" #查看编译安装mysql的错误日志位置
Enter password:
+---------------+---------+
| Variable_name | Value |
+---------------+---------+
| log_error | ./1.err |
+---------------+---------+
[root@1 ~]# tail -5 /usr/local/mysql/data/1.err #查看错误日志内容
2025-11-04T06:20:52.568940Z 0 [Note] - '::' resolves to '::';
2025-11-04T06:20:52.568950Z 0 [Note] Server socket created on IP: '::'.
2025-11-04T06:20:52.572968Z 0 [Note] Event Scheduler: Loaded 0 events
2025-11-04T06:20:52.573129Z 0 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.7.27' socket: '/tmp/mysql.sock' port: 3306 Source distribution
2,二进制日志(Binary Log,binlog)
作用:记录增删改、表结构变更等,可用于数据恢复、主从复制(从库通过 binlog 同步主库数据),需要手动开启
关联:主从架构的核心日志,与中继日志配合实现数据同步;恢复时需结合备份文件使用
2.1 开启,查看binlog
#开启binlog日志
[root@1 ~]# cat /etc/my.cnf
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8
[mysqld]
port = 3306
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
character_set_server = utf8
log-bin=/var/log/mysql-bin/mylog #指定binlog日志位置
server-id=1 #AB复制的时候使用,为了防止相互复制,会设置一个ID,来识别谁产生的日志
binlog_format=statement #防止binlog不记录insert
[root@1 ~]# mkdir -p /var/log/mysql-bin
[root@1 ~]# chown -R mysql.mysql /var/log/mysql-bin
[root@1 ~]# systemctl restart mysqld
#查看binlog日志
[root@1 ~]# ls /var/log/mysql-bin/
mylog.000001 mylog.index
[root@1 ~]# mysqlbinlog /var/log/mysql-bin/mylog.000001 #查看binlog日志要使用mysqlbinlog命令

#测试binlog日志是否正常记录
[root@1 ~]# mysql -p'Qing@123'
mysql> use test;
mysql> create table user(id int,name varchar(20));
mysql> insert into user values('1','lisa'),('2','jack');
mysql> select * from user;
+------+------+
| id | name |
+------+------+
| 1 | lisa |
| 2 | jack |
+------+------+
[root@1 ~]# mysqlbinlog /var/log/mysql-bin/mylog.000002 #可以看到对表的操作都被记录了


2.2 binlog 截断操作(生产新日志文件)
截断操作会关闭当前 binlog 文件,生成序号递增的新文件(如 mylog.000001 → mylog.000002),不删除历史日志,常用于日志切割或备份节点切换
[root@1 ~]# ls /var/log/mysql-bin/
mylog.000001 mylog.000002 mylog.index
重启 mysqld 服务
操作:systemctl restart mysqld
说明:服务重启时自动截断 binlog,生成新日志文件,适用于服务维护场景
执行 flush logs 命令
操作:mysql> flush logs;
说明:在线无重启截断 binlog,无需停止服务,常用于日常日志切割(如按天切割)
2.3 binlog 删除操作
高风险:删除所有 binlog(reset master)
操作:mysql> reset master;
风险:彻底删除所有 binlog 文件及索引文件,会导致主从同步中断、历史数据无法通过 binlog 恢复
安全删除:删除指定文件之前的日志(purge)
操作:mysql> PURGE BINARY LOGS TO 'mylog.000004';
说明:仅删除 mylog.000004 及之前的所有 binlog 文件(不包含 mylog.000004),适用于清理过期日志、释放磁盘空间
2.4 binlog 临时开关
关闭当前会话 binlog
操作:mysql> SET SQL_LOG_BIN=0;
说明:当前会话后续执行的 SQL(如增删改)不写入 binlog
开启当前会话 binlog
操作:mysql> SET SQL_LOG_BIN=1;
说明:恢复当前会话的 binlog 记录功能,建议临时关闭后及时开启,避免遗漏关键操作日志
3,查询日志(General Log)
作用:记录会记录所有用户的连接行为和执行的 SQL 语句,包括 binlog 未记录的查询操作,默认不开启
临时开启(当前会话生效,重启失效)
-- 开启查询日志
SET GLOBAL general_log = ON;
-- (可选)指定日志文件路径
SET GLOBAL general_log_file = '/var/log/mysql/general.log';
永久开启(配置文件生效,需重启)
编辑 /etc/my.cnf,在 [mysqld] 段添加:
[mysqld]
general_log = ON # 开启查询日志
general_log_file = /var/log/mysql/general.log # 日志文件路径(需确保 mysql 用户有写入权限)
查询日志会记录所有 SQL(包括 SELECT),日志量极大,生产环境建议仅临时开启用于问题排查
4,慢查询日志(Slow Query Log)
作用:记录执行时间超过阈值(long_query_time)的 SQL 语句,用于优化性能,定位低效查询
#开启慢查询日志
[root@1 ~]# vim /etc/my.cnf
[client]
port = 3306
socket = /tmp/mysql.sock
#default-character-set = utf8
[mysqld]
port = 3306
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
log-bin=/var/log/mysql-bin/mylog
server-id=1
binlog_format=statement
slow_query_log=1 #开启慢查询
slow_query_log_file=/var/log/mysql-slow/slow.log #日志存放位置
long_query_time=3 #sql执行超过三秒的记录下来
[root@1 ~]# mkdir -p /var/log/mysql-slow
[root@1 ~]# chown -R mysql.mysql /var/log/mysql-slow
[root@1 ~]# systemctl restart mysqld
#验证慢查询日志能否正常记录慢sql
mysql> select sleep(5);
+----------+
| sleep(5) |
+----------+
| 0 |
+----------+
[root@1 ~]# cat /var/log/mysql-slow/slow.log
/usr/local/mysql/bin/mysqld, Version: 5.7.27-log (Source distribution). started with:
Tcp port: 3306 Unix socket: /tmp/mysql.sock
Time Id Command Argument
# Time: 2025-11-04T07:40:19.670723Z
# User@Host: root[root] @ localhost [] Id: 2
# Query_time: 5.000690 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
SET timestamp=1762242019;
select sleep(5);
5,中继日志(Relay Log)
作用:仅存在于从库,用于暂存主库发送的 binlog 内容,从库通过重放中继日志实现数据同步
关联:依赖主库的 binlog,是主从复制的中间桥梁,同步完成后会被自动清理
注:中继日志的用法暂不演示,后续讲解MySQL主从同步时,会结合场景详细说明该日志的作用与操作
小结
错误日志保障数据库可用性,binlog 和中继日志支撑数据一致性,查询日志和慢查询日志分别侧重操作审计与性能优化,共同构成 MySQL 运维的日志体系
注:
文中若有疏漏,欢迎大家指正赐教。
本文为100%原创,转载请务必标注原创作者,尊重劳动成果。
求赞、求关注、求评论!你的支持是我更新的最大动力,评论区等你~
后续会持续分享MySQL相关知识。
浙公网安备 33010602011771号