精读笔记 · 第22章 SQL 控制语言 DCL 与 MySQL 日志
大约 4 分钟
精读笔记 · 第22章 SQL 控制语言 DCL 与 MySQL 日志
精读整理自 RHCE9 随堂讲义(原文字版 9 页)|同名视频约 14 节(第02套) 关联知识文件:
分章笔记/02-Oracle(Oracle 权限体系对照)、05-认证考试要点
一、权限级别(四级,由大到小)
- Global level:所有库所有表(如
*.*) - Database level:某库所有表(如
bbs.*) - Table level:某库某表(如
bbs.stu) - Column level:表中某字段(如
grant select(id) ...)
二、用户管理(MySQL 8.0 语法)
- 创建用户:
CREATE USER 用户名@'主机' IDENTIFIED BY '密码';(如user1@'localhost';主机可写%所有主机、192.168.2.%网段、具体 IP/localhost)。 - 查看用户:
select user,host from mysql.user;(用户身份=用户名+主机 复合主键)。 - 删除用户:
DROP USER 'user1'@'localhost';(5.7 起直接 drop,无需先 revoke)。 - 改密码:root 改自己密码可用
mysqladmin -uroot -p'旧密码' password '新密码';库内UPDATE mysql.user SET authentication_string=...+FLUSH PRIVILEGES(老版本);8.0 推荐alter user 'root'@'localhost' identified by '新密码';+flush privileges;。
三、忘记 root 密码的破解流程(运维必会)
vim /etc/my.cnf的[mysqld]加skip-grant-tables(跳过密码文件加载);systemctl restart mysqld;- 免密登录
mysql -uroot; update mysql.user set authentication_string='' where user='root';;- 注释掉
skip-grant-tables并重启; mysqladmin -uroot -p password '新密码'(此时空密码)设置新密码。
四、mysql 客户端登录参数
mysql -h 主机 [-P 3306] -u 用户名 -p密码 [数据库] -e 'SQL语句'
-h主机(默认 localhost)、-P端口(默认 3306,大写 P)、-u用户(默认 root)、-p密码(默认空)、-e免登录执行 SQL(如-e 'show tables')。
五、GRANT 授权(核心语法)
GRANT 权限列表 ON 库.表 TO '用户'@'主机' [IDENTIFIED BY '密码' WITH GRANT OPTION];- 权限列表:
all(除授权权限外全部)、select,update,insert,delete等;列级示例grant select(id), insert(name,age) on mydb.mytbl to ...。 - 库.表写法:
*.*全局、web.*库级、web.stu_info表级。 WITH GRANT OPTION:允许被授权者再转授。- 实操套路:先
create user admin3@'%' identified by ...→GRANT ALL ON bbs.* TO admin3@'%';→ 用 admin3 登录只能在 bbs 建库建表,建别的库报ERROR 1044 Access denied。 - 查看权限:
SHOW GRANTS;(自己)/SHOW GRANTS FOR 用户@主机;(别人,可加\G竖排)。 - 回收权限:
REVOKE ALL PRIVILEGES ON bbs.* FROM admin3@'%';(也可指定单权限列表)。 - 注意:新版 MySQL 授权时不会顺带创建用户(需先 create user);密码策略复杂度不足会报错。
六、MySQL 日志体系(六类)
| 日志 | 作用 | 默认 |
|---|---|---|
| 错误日志 error log | 启动/停止/故障报错(RPM 默认 /var/log/mysqld.log) | 开 |
| 通用查询日志 general log | 记录所有查询(含 select) | 关 |
| 二进制日志 binlog | 记录除 select 外所有改变数据的操作,用于备份/增量/主从 | 关(需开) |
| 中继日志 relay log | 从库读取主库 binlog 后本地回放(主从复制) | 从库开 |
| 慢查询日志 slow log | 记录超过阈值的慢 SQL,指导调优 | 关 |
| DDL log | 记录 DDL 语句 | - |
- 错误日志:
log-error=/var/log/mysqld.log;mysql 起不来先看它。 - 开启 binlog:my.cnf 加
log_bin+server-id=2(主从必配编号)→ 重启 →ls /var/lib/mysql/*bin*出现localhost-bin.000001→mysqlbinlog -v /var/lib/mysql/localhost-bin.000001查看(可用at N定位记录位置)。 - 慢查询:my.cnf 加
slow_query_log=1+long_query_time=3(建议 ≤1s)→ 重启 → 模拟SELECT BENCHMARK(500000000,2*3);(内置性能测试函数,重复计算 count 次评估效率,返回恒 0,看耗时)→tail /var/lib/mysql/*slow*验证。 - 通用查询日志:
general_log=1→ 重启 → 记录 Connect/Query/Quit 全流程(如 select * from haha.t5)。
七、命令速查表
| 场景 | SQL/命令 |
|---|---|
| 建/删用户 | create/drop user '名'@'主机' identified by '密码'; |
| 授权 | grant 权限 on 库.表 to '用户'@'主机'; |
| 回收 | revoke all privileges on 库.* from '用户'@'主机'; |
| 查权限 | show grants for '用户'@'主机'; |
| 改密码 | alter user ... identified by ... + flush privileges; |
| 免密登录 | mysql -uroot -p'密码' -e 'SQL'、-h/-P/-u/-p |
| 破 root 密码 | skip-grant-tables → 重启 → update mysql.user → 还原重启 → mysqladmin 改密 |
| 开 binlog | my.cnf log_bin、server-id=N;查看 mysqlbinlog -v 文件 |
| 开慢查询 | slow_query_log=1、long_query_time=3;模拟 select benchmark(500000000,2*3); |
八、易错点
- 权限对象写法三层:
*.*/库.*/库.表,写错级别会授权过宽或无效。 - 用户=
用户名@主机两个维度;同名不同 host 是两个用户。 - MySQL 5.7+
drop user前不必先 revoke;8.0 密码字段/算法变化,别再用老SET PASSWORD=password()试。 - 忘记密码破解完务必删掉 skip-grant-tables,否则数据库裸奔。
- binlog 只记“改变数据”(含 DDL/DML,select 不记);它是增量备份与主从复制的基础,默认关闭必须显式开。
- 慢查询阈值与调优思路:找到慢 SQL → explain 分析 → 反馈开发优化。
九、实操清单
建 admin3@'%' → 授 bbs.* → 切换用户验证能建 bbs、不能建 bba → show grants/revoke → 练习 alter user 改密 → 开 binlog 做一次建库建表再 mysqlbinlog 查看 → 开慢查询用 benchmark 触发并 tail 验证 → (备用)skip-grant-tables 破解演练后还原。
十、本章自测
- 权限四级分别是?2. create/drop/grant/revoke 语法各要素?3.
%与192.168.2.%区别?4. 忘记 root 密码六步?5. 六类日志各自用途、binlog 记录什么?6. 慢查询如何开启与验证?7. mysql 客户端 -h/-P/-e 参数含义?
