本文原创作品,良心制作,干货为主,简洁清晰,一看就会


前言

本文聚焦 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.000001mylog.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相关知识。