SQL基础及MySQL DBA运维实战-3: DCL 权限管理 + 日志管理实战教程(DBA 必备)

引言

在MySQL数据库运维中,DCL(数据控制语言)和日志管理是DBA日常工作的核心内容。掌握这些知识点不仅能保障数据库的安全性,还能提高数据库的性能和可靠性。本文将基于前两章的内容,深度解析DCL的核心知识点,包括权限管理和日志管理两大部分。

DCL与权限管理

权限级别深度解析

MySQL的权限系统非常精细,分为四个级别,每个级别都有其特定的应用场景:

Global level(全局级别)

  • 作用范围:适用于所有库、所有表
  • 权限存储:存储在mysql.user表中
  • 应用场景:用于管理需要全局权限的用户,如数据库管理员
  • 示例权限SUPERCREATE USERRELOAD等管理权限

Database level(数据库级别)

  • 作用范围:适用于某个数据库中的所有表
  • 权限存储:存储在mysql.db表中
  • 应用场景:用于管理需要访问特定数据库的用户,如应用开发人员
  • 示例权限CREATEALTERDROP等数据库操作权限

Table level(表级别)

  • 作用范围:适用于库中的某个表
  • 权限存储:存储在mysql.tables_priv表中
  • 应用场景:用于管理需要访问特定表的用户,如报表生成人员
  • 示例权限SELECTINSERTUPDATEDELETE等表操作权限

Column level(列级别)

  • 作用范围:适用于表中的某个字段
  • 权限存储:存储在mysql.columns_priv表中
  • 应用场景:用于管理需要访问特定列的用户,如财务数据查看人员
  • 示例权限:对特定列的SELECTUPDATE权限

这种分级权限管理机制使得DBA可以根据实际需求,为不同用户设置精确的权限范围,提高数据库的安全性。

MySQL用户管理详细操作

创建用户

创建用户的基本语法如下:

CREATE USER user1@'localhost' IDENTIFIED BY 'Qwe@123456';

参数详解

  • CREATE:创建关键字
  • USER:用户关键字
  • user1:用户名称(自定义)
  • @:分隔符
  • 'localhost':允许登录的主机
  • IDENTIFIED BY:身份认证关键字
  • 'QianFeng@123456':用户密码

验证方法

-- 查看所有用户
SELECT * FROM mysql.user\G;

-- 只查看用户名和主机
SELECT user, host FROM mysql.user;

注意事项

  • 用户名和主机名组合必须唯一
  • 密码应符合安全要求,包含大小写字母、数字和特殊字符
  • 主机名可以使用通配符,如%表示所有主机

删除用户

删除用户的语法如下:

DROP USER 'user1'@'localhost';

操作示例

-- 查看用户是否存在
SELECT user, host FROM mysql.user WHERE user = 'user1';

-- 删除用户
DROP USER 'user1'@'localhost';

-- 验证用户是否删除
SELECT user, host FROM mysql.user WHERE user = 'user1';

修改用户密码

root修改自己密码

方法一:使用mysqladmin命令

mysqladmin -uroot -p'旧密码' password 'new_password'

参数说明

  • -u:指定用户名
  • -p:指定旧密码
  • password:修改密码命令
  • 'new_password':新密码

方法二:使用SET PASSWORD语句

-- 修改当前用户密码
SET PASSWORD=password('new_password');

-- 刷新权限
FLUSH PRIVILEGES;

方法三:直接更新mysql.user表

-- 更新密码
UPDATE mysql.user SET authentication_string=password('new_password') WHERE user='root' AND host='localhost';

-- 刷新权限
FLUSH PRIVILEGES;

丢失root用户密码的解决方案

前言:当root用户,忘记了密码。可以使用破解的方式来登录系统,修改密码。

原理:使系统在启动时,不加载密码文件。

  1. 修改MySQL启动设置,跳过权限验证:
vim /etc/my.cnf
[mysqld]
skip-grant-tables
  1. 重启MySQL服务并无密码登录
systemctl restart mysqld
mysql -uroot
  1. 修改密码
-- 更新密码
UPDATE mysql.user SET authentication_string=password('new_password') WHERE user='root' AND host='localhost';

-- 刷新权限
FLUSH PRIVILEGES;
  1. 恢复MySQL启动设置,注释掉跳过密码的配置:
vim /etc/my.cnf
mysqld
# skip-grant-tables
  1. 重启MySQL服务
systemctl restart mysqld

登录MySQL

登录MySQL的基本语法(扩展):

mysql -P 3306 -u root -p‘password’ mysql -e 'show tables'

参数详解

  • -h:指定主机名(默认为localhost)
  • -P:MySQL服务器端口(默认3306)
  • -u:指定用户名(默认root)
  • -p:指定登录密码(默认为空密码)
  • mysql:指定登录的数据库
  • -e:接SQL语句

示例

  1. 基本登录


    mysql -u root -p

  2. 指定主机和端口登录


    mysql -h 192.168.1.100 -P 3306 -u root -p

  3. 免交互执行SQL


    mysql -uroot -p'password' -hlocalhost -P 3306 mysql -e 'show tables'

MySQL权限原理深入剖析

权限授予的基本语法:

grant 权限列表 on 库名.表名 to '用户名'@'客户端主机' [identified by '密码' with option参数];

权限列表详解

  • ALL:所有权限(不包括授权权限)
  • SELECT:查询权限
  • INSERT:插入权限
  • UPDATE:更新权限
  • DELETE:删除权限
  • CREATE:创建权限
  • ALTER:修改权限
  • DROP:删除权限
  • GRANT OPTION:授权权限
  • SUPER:超级权限
  • RELOAD:重载权限
  • SHUTDOWN:关闭服务权限
  • PROCESS:查看进程权限
  • FILE:文件操作权限

数据库.表名详解

  • *.*:所有库下的所有表
  • web.*:web库下的所有表
  • web.stu_info:web库下的stu_info表
  • 列级别权限:
    GRANT SELECT (id), INSERT (name,age) ON mydb.mytb to 'user8'@'localhost' identified by 'user8@123';

客户端主机详解

  • %:所有主机
  • 192.168.2.%:192.168.2.0网段的所有主机
  • 192.168.2.168:指定主机
  • localhost:本地主机
  • 127.0.0.1:本地回环地址

with_option参数详解

  • GRANT OPTION:授权选项,允许用户将自己的权限授予其他用户
  • MAX_QUERIES_PER_HOUR:每小时最大查询次数
  • MAX_UPDATES_PER_HOUR:每小时最大更新次数
  • MAX_CONNECTIONS_PER_HOUR:每小时最大连接次数
  • MAX_USER_CONNECTIONS:用户最大连接数

MySQL权限示例详细操作

赋予权限

授权目标:授予admin3对bbs库所有的表,具有所有权限(不包含授权)

操作步骤

  1. 准备测试账户
-- 创建用户
CREATE USER admin3@'%' IDENTIFIED BY 'Abc@1234';

-- 验证用户创建成功
SELECT user, host FROM mysql.user WHERE user = 'admin3';
  1. 授权账户
-- 授权
GRANT ALL ON bbs.* TO admin3@'%' IDENTIFIED BY 'Abc@1234';

-- 验证授权成功
SHOW GRANTS FOR admin3@'%'\G;
  1. 使用测试账户操作数据库
# 登录测试账户
[root@localhost ~]# mysql -uadmin3 -p'Abc@1234'

# 创建bbs数据库
mysql> create database bbs;

# 尝试创建其他数据库(应该失败)
mysql> create database bba;
ERROR 1044 (42000): Access denied for user 'admin3'@'%' to database 'bba'

# 进入bbs库
mysql> USE bbs;

# 创建表
mysql> CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50));

# 插入数据
mysql> INSERT INTO users (name) VALUES ('test');

# 查询数据
mysql> SELECT * FROM users;

# 更新数据
mysql> UPDATE users SET name='test2' WHERE id=1;

# 删除数据
mysql> DELETE FROM users WHERE id=1;

回收权限

查看权限

  • 查看自己的权限


    SHOW GRANTS\G

  • 查看别人的权限


    SHOW GRANTS FOR admin3@'%'\G

回收权限

语法

REVOKE 权限列表 ON 数据库名 FROM 用户名@'客户端主机'

示例

  1. 回收所有权限


    REVOKE ALL PRIVILEGES ON bbs.* FROM admin3@'%';

  2. 回收部分权限


    REVOKE INSERT, UPDATE, DELETE ON bbs.* FROM admin3@'%';

  3. 验证权限回收


    SHOW GRANTS FOR admin3@'%'\G;

删除用户

-- 删除用户
DROP USER admin3@'%';

-- 验证用户删除
SELECT user, host FROM mysql.user WHERE user = 'admin3';

版本差异

  • MySQL 5.6之前:需要先回收权限,再删除用户
  • MySQL 5.7之后:可以直接删除用户,会自动回收权限

日志管理深度解析

日志分类及作用

MySQL的日志主要分为以下几类,每类日志都有其特定的作用:

日志类型作用默认位置开启状态
错误日志记录启动、停止、关闭失败报错/var/log/mysqld.log(RPM安装)默认开启
通用查询日志记录所有的查询操作/var/lib/mysql/hostname.log默认关闭
二进制日志实现备份,增量备份,只记录改变数据的操作/var/lib/mysql/hostname-bin.xxx默认关闭
中继日志读取主服务器的binlog,在本地回放,保持一致/var/lib/mysql/hostname-relay-bin.xxx仅复制环境开启
慢查询日志记录执行时间超过阈值的SQL语句,指导调优/var/lib/mysql/hostname-slow.log默认关闭
DDL日志记录定义语句的日志内存中,重启后丢失默认开启

Error Log(错误日志)

配置错误日志

编辑配置文件

vim /etc/my.cnf

添加配置

[mysqld]
log-error=/var/log/mysqld.log

参数说明

  • log-error:指定错误日志文件路径

查看错误日志

查看错误日志内容

tail -n 50 /var/log/mysqld.log

常见错误类型

  • 启动失败:端口被占用、配置文件错误
  • 连接失败:权限问题、网络问题
  • 运行错误:SQL语法错误、表损坏

错误日志分析

  • 查找关键字:ERRORWARNINGNote
  • 关注时间戳,确定错误发生时间
  • 结合上下文分析错误原因

Binary Log(二进制日志)

开启二进制日志

编辑配置文件

vim /etc/my.cnf

添加配置

[mysqld]
log_bin=/var/lib/mysql/mysql-bin
server-id=2

参数说明

  • log_bin:指定二进制日志文件路径,不加路径则默认在数据目录
  • server-id:服务器唯一标识,在复制环境中必须设置

重启MySQL服务

# systemctl restart mysqld

查看二进制日志

查看二进制日志文件列表

# ls -l /var/lib/mysql/*bin*

查看二进制日志内容

# mysqlbinlog -v /var/lib/mysql/mysql-bin.000001

参数说明

  • -v:显示详细内容
  • -s:简化输出
  • --start-datetime:指定开始时间
  • --stop-datetime:指定结束时间
  • --start-position:指定开始位置
  • --stop-position:指定结束位置

二进制日志的作用

  1. 数据恢复:通过二进制日志恢复数据
  2. 主从复制:主服务器通过二进制日志向从服务器同步数据
  3. 审计:记录所有数据修改操作,用于审计

二进制日志管理

查看当前二进制日志文件

SHOW MASTER STATUS;

刷新二进制日志

FLUSH LOGS;

删除二进制日志

-- 删除指定日期之前的日志
PURGE BINARY LOGS BEFORE '2026-01-01 00:00:00';

-- 删除指定文件之前的日志
PURGE BINARY LOGS TO 'mysql-bin.000005';

-- 保留指定天数的日志
SET GLOBAL expire_logs_days = 7;

Slow Query Log(慢查询日志)

开启慢查询日志

编辑配置文件

vim /etc/my.cnf

添加配置

[mysqld]
slow_query_log=1
slow_query_log_file=/var/lib/mysql/slow-query.log
long_query_time=1
log_queries_not_using_indexes=1

参数说明

  • slow_query_log:开启慢查询日志
  • slow_query_log_file:指定慢查询日志文件路径
  • long_query_time:慢查询阈值,单位秒
  • log_queries_not_using_indexes:记录未使用索引的查询

重启MySQL服务

systemctl restart mysqld

查看慢查询日志

查看慢查询日志文件

ls -l /var/lib/mysql/*slow*

查看慢查询日志内容

tail -n 50 /var/lib/mysql/slow-query.log

分析慢查询日志

使用mysqldumpslow工具

mysqldumpslow -s t /var/lib/mysql/slow-query.log

参数说明

  • -s:排序方式,t=按时间,l=按锁时间,r=按返回记录数
  • -t:显示前N条
  • -g:正则表达式过滤

示例

# 查看执行时间最长的10条慢查询
mysqldumpslow -s t -t 10 /var/lib/mysql/slow-query.log

# 查看包含特定表的慢查询
mysqldumpslow -s t -t 10 -g 'users' /var/lib/mysql/slow-query.log

模拟慢查询

使用BENCHMARK函数

-- 执行5亿次2*3运算,模拟慢查询
SELECT BENCHMARK(500000000,2*3);

使用SLEEP函数

-- 休眠5秒,模拟慢查询
SELECT SLEEP(5);

实践案例深度解析

案例1:为应用创建专用数据库用户

需求:为Web应用创建一个专用用户,只允许访问指定数据库,具有增删改查权限,且只能从指定网段登录。

步骤

  1. 创建用户,数据库,表


    CREATE USER 'webapp'@'192.168.88.%' IDENTIFIED BY 'WebApp@123';

    create database web_db;
    use web_db;
    CREATE TABLE users (name VARCHAR(50));

  2. 授权


    GRANT SELECT, INSERT, UPDATE, DELETE ON web_db.* TO 'webapp'@'192.168.88.%';

  3. 验证权限


    SHOW GRANTS FOR 'webapp'@'192.168.88.%'\G;

  4. 测试连接


    # 从192.168.88.100主机连接
    mysql -h 192.168.88.200 -u webapp -p'WebApp@123' web_db

  5. 测试权限


    -- 测试查询
    SELECT * FROM users;

    -- 测试插入
    INSERT INTO users (name) VALUES ('test');

    -- 测试更新
    UPDATE users SET name='test2';

    -- 测试删除
    DELETE FROM users;

    -- 测试创建表(应该失败)
    CREATE TABLE test (id INT);

案例2:配置慢查询日志优化性能

需求:配置慢查询日志,捕获执行时间超过1秒的SQL语句,分析并优化慢查询。

步骤

  1. 编辑配置文件


    vim /etc/my.cnf

  2. 添加配置


    [mysqld]
    slow_query_log=1
    slow_query_log_file=/var/lib/mysql/slow-query.log
    long_query_time=1
    log_queries_not_using_indexes=1
    log_slow_admin_statements=1
    log_slow_slave_statements=1

  3. 重启MySQL服务


    systemctl restart mysqld

  4. 查看慢查询日志


    tail -f /var/lib/mysql/slow-query.log

  5. 分析慢查询日志


    mysqldumpslow -s t -t 10 /var/lib/mysql/slow-query.log

  6. 优化慢查询

    • 添加适当的索引
    • 优化SQL语句结构
    • 考虑表结构优化
    • 调整MySQL参数

案例3:使用二进制日志恢复数据

需求:误删除了表数据,需要使用二进制日志恢复。

步骤:后续文章讲解

最佳实践与性能优化

权限管理最佳实践

  1. 最小权限原则:只授予用户完成工作所需的最小权限
  2. 定期审计:定期检查用户权限,回收不必要的权限
  3. 使用强密码:设置复杂的密码策略,定期更换密码
  4. 限制登录主机:尽量限制用户的登录主机,避免使用%通配符
  5. 分离职责:不同角色使用不同的用户,如管理员、开发人员、只读用户等
  6. 使用角色:MySQL 8.0引入了角色功能,可以更方便地管理权限
  7. 定期备份权限:定期备份mysql数据库,包含用户权限信息
  8. 使用SSL连接:对于远程连接,使用SSL加密传输

日志管理最佳实践

  1. 合理配置日志:根据实际需求配置日志级别和保留策略
  2. 定期备份日志:特别是二进制日志,用于数据恢复
  3. 监控错误日志:及时发现和解决数据库问题
  4. 分析慢查询日志:定期分析慢查询日志,优化SQL语句
  5. 控制日志大小:设置合理的日志轮转策略,避免日志文件过大
  6. 使用日志管理工具:如pt-query-digest等工具分析慢查询日志
  7. 合理设置二进制日志格式:根据实际需求选择ROW、STATEMENT或MIXED格式
  8. 定期清理过期日志:避免日志占用过多磁盘空间

性能优化建议

  1. 索引优化:为经常查询的列创建索引,避免全表扫描
  2. SQL语句优化:避免使用SELECT *,使用LIMIT限制结果集
  3. 表结构优化:合理设计表结构,避免冗余字段
  4. 参数调优:根据服务器配置调整MySQL参数,如innodb_buffer_pool_size
  5. 分区表:对于大表,使用分区表提高查询性能
  6. 读写分离:使用主从复制实现读写分离,减轻主服务器压力
  7. 连接池:使用连接池管理数据库连接,减少连接开销
  8. 定期维护:定期执行OPTIMIZE TABLE、ANALYZE TABLE等维护操作

常见问题与解决方案

权限管理常见问题

  1. 用户无法登录

    • 检查用户名和密码是否正确
    • 检查主机名是否匹配
    • 检查用户是否存在
    • 检查防火墙设置
  2. 权限不生效

    • 执行FLUSH PRIVILEGES刷新权限
    • 检查权限级别是否正确
    • 检查权限是否被正确授予
  3. 忘记root密码

    • 使用skip-grant-tables模式重置密码

日志管理常见问题

  1. 日志文件过大

    • 配置日志轮转
    • 定期清理过期日志
    • 调整日志级别
  2. 慢查询日志无记录

    • 检查慢查询日志是否开启
    • 检查long_query_time设置是否合理
    • 检查是否有慢查询产生
  3. 二进制日志无法应用

    • 检查二进制日志格式是否匹配
    • 检查服务器版本是否兼容
    • 检查二进制日志文件是否损坏

总结

本文深度解析了MySQL DBA运维实战中DCL的核心知识点,包括:

  1. 权限管理:详细介绍了MySQL的权限级别、用户管理、权限授予和回收等操作,以及权限管理的最佳实践。


  2. 日志管理:详细介绍了MySQL的日志分类、配置方法、查看和分析技巧,以及日志管理的最佳实践。


  3. 实践案例:通过具体的案例,展示了如何为应用创建专用用户、配置慢查询日志优化性能、使用二进制日志恢复数据等操作。


  4. 最佳实践:提供了权限管理、日志管理和性能优化的最佳实践建议,帮助DBA提高工作效率和数据库性能。


  5. 常见问题:分析了权限管理和日志管理中常见的问题,并提供了相应的解决方案。


随着MySQL的不断发展,其权限管理和日志管理功能也在不断完善。未来,MySQL可能会:

  1. 增强权限管理:提供更细粒度的权限控制,如行级权限
  2. 改进日志管理:提供更高效的日志存储和分析机制
  3. 智能化运维:通过AI技术自动分析慢查询日志,提供优化建议
  4. 安全性增强:提供更强大的密码策略和访问控制机制

我们需要不断学习和掌握这些新功能,以适应数据库技术的发展,为企业提供更安全、更高效、更可靠的数据库服务。

DCL的核心知识点是MySQL DBA必备的技能,包括权限管理和日志管理两大部分。在实际运维工作中,要灵活运用这些知识,结合具体场景进行配置和管理,才能确保MySQL数据库的安全、稳定和高效运行。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇