
简介这份资源是 Oracle University 出品的《MySQL 8.0 for Database Administrators Student Guide - Volume II》官方学习指南面向数据库管理员、运维工程师及准备 MySQL 认证的进阶学习者帮助其系统掌握 MySQL 8.0 的管理与优化技能。压缩包内共 1 个 PDF 文件大小约 6.75MB内容为完整的学生手册涵盖课程目标、安装与升级、用户认证与授权、复制配置、备份恢复、性能监控与调优等模块并涉及 JSON 文档处理、安全增强及与 Oracle 云服务集成等新特性。目录从 Introduction to MySQL 起步逐章展开安装序列、RPM/DEB 包管理、Yum 与 APT 仓库配置等实操主题结构清晰便于按章节查阅。目前已有 93 人学习适合希望从基础操作进阶到高级配置、在实际工作中高效维护 MySQL 数据库系统的管理员参考。1. 从一份 DBA 学生手册说起MySQL 8.0 管理到底要啃哪些硬骨头很多人第一次拿到《MySQL 8.0 for Database Administrators StudentGuide》这类 PDF翻两页就放下了——全是概念没有一条能直接敲进终端。但如果你正在管一套 MySQL 8.0 实例或者准备从 5.7 往 8.0 迁移这份手册的价值恰恰在于它把 DBA 日常要面对的几块硬骨头串成了一条线账户与权限、InnoDB 存储引擎、备份恢复、复制与性能观测。它不教你写业务 SQL它教你怎么让这套数据库活着、稳着、出问题能查。适合谁已经会装 MySQL、能跑SELECT但一遇到锁等待、主从延迟、权限报错就抓瞎的运维和开发。下面我不复述手册目录而是按“这份资源能解决什么”拆成可复现的操作路径把手册里的知识点落到你能直接抄的命令上。2. 账户权限与连接层从 root 乱用到最小权限落地2.1 为什么 8.0 的权限模型值得重新学一遍MySQL 8.0 在权限和认证上动了几个大手术最直接的影响是以前 5.7 能用的授权语句搬到 8.0 可能直接报错。核心变化有三个。第一默认认证插件从mysql_native_password换成了caching_sha2_password老客户端连不上多半是这个原因。第二GRANT语句不再支持隐式创建用户你必须先CREATE USER再授权这是很多迁移脚本翻车的地方。第三角色ROLE正式可用可以把一组权限打包成角色再赋给用户权限管理从“一人一配”变成“按岗授权”。手册里把账户管理放在很靠前的位置逻辑是对的——DBA 第一件事就是搞清楚谁能连、能干什么。我一般接手一套新实例先跑一遍账户盘点确认没有匿名用户、没有%通配的 root、没有空密码账户。这三样是安全审计的必查项也是血泪经验见过太多测试库直接root%空密码暴露在内网出事只是时间问题。2.2 创建用户、授权与角色的一套可抄流程先看最小权限落地的完整操作。假设要给一个只读报表账号和一个读写业务账号同时用角色管理-- 1. 创建角色把权限挂在角色上而不是直接挂用户 CREATE ROLE role_readonly, role_readwrite; -- 2. 给只读角色授全局和库级权限 GRANT SELECT, SHOW VIEW ON *.* TO role_readonly; GRANT SELECT ON report_db.* TO role_readonly; -- 3. 给读写角色授业务库的增删改查 GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO role_readwrite; GRANT EXECUTE ON app_db.* TO role_readwrite; -- 4. 创建用户指定认证插件和密码 CREATE USER rpt_user10.0.1.% IDENTIFIED WITH caching_sha2_password BY Str0ng_Pwd!; CREATE USER app_user10.0.1.% IDENTIFIED WITH caching_sha2_password BY An0ther_Pwd!; -- 5. 把角色赋给用户并设为默认角色 GRANT role_readonly TO rpt_user10.0.1.%; GRANT role_readwrite TO app_user10.0.1.%; SET DEFAULT ROLE ALL TO rpt_user10.0.1.%, app_user10.0.1.%;逻辑说明角色是权限的容器用户是角色的载体。这样做的好处是当只读权限需要调整时改角色即可所有挂该角色的用户自动生效不用逐个用户改。SET DEFAULT ROLE ALL保证用户登录后角色自动激活否则用户连上后还得手动SET ROLE业务侧会莫名其妙报权限不足。参数说明caching_sha2_password是 8.0 默认插件安全性高于旧的mysql_native_password但要求客户端支持。如果你的老应用连不上要么升级客户端驱动要么在建用户时显式指定IDENTIFIED WITH mysql_native_password BY ...但这是妥协方案能升级就升级。主机部分10.0.1.%限定来源网段比%安全得多生产环境不要图省事用通配。授权完一定要验证别假设它生效了-- 查看用户最终拥有的权限含角色带来的 SHOW GRANTS FOR rpt_user10.0.1.% USING role_readonly; -- 查看当前会话激活的角色 SELECT CURRENT_ROLE();SHOW GRANTS ... USING能把角色带来的权限一并展开这是排查“明明授了权却报 denied”的第一条命令。常见坑是用户建了、角色赋了但没设默认角色用户登录后CURRENT_ROLE()返回NONE权限自然不生效。2.3 连接层排查认证失败到底卡在哪连接问题分两类网络层和认证层。网络层先确认端口和防火墙telnet 10.0.1.5 3306通不通。认证层看错误码ERROR 1045是密码或用户不对ERROR 2059是认证插件不匹配ERROR 1130是主机不允许连接。手册里对错误码的归类很实用我把它整理成排查顺序错误码含义优先检查1045Access denied用户名、密码、host 匹配2059Authentication plugin cannot be loaded客户端是否支持 caching_sha2_password1130Host not allowed用户 host 白名单、bind-address2003Cant connect服务是否启动、端口、防火墙排查时先看SELECT user, host, plugin FROM mysql.user WHERE userxxx;确认 plugin 字段。如果应用报 2059而 plugin 是caching_sha2_password基本就是驱动版本太老。这时候要么升级驱动要么临时改插件ALTER USER xxxhost IDENTIFIED WITH mysql_native_password BY pwd;。但记住这是后悔药不是常规操作改完记得在迁移计划里排期升级驱动。3. InnoDB 存储引擎与锁把“卡死”变成可定位的问题3.1 为什么锁问题总在 8.0 上显得更复杂InnoDB 是 MySQL 8.0 的默认引擎事务、行锁、MVCC 都归它管。手册里花了大篇幅讲 InnoDB 的架构但 DBA 真正需要的是出问题时怎么快速定位是哪把锁、谁持有、谁在等。8.0 在performance_schema和information_schema里补了不少观测表比 5.7 好用但前提是你知道查哪张表。锁的本质是并发控制的代价。行锁粒度小、并发高但容易死锁表锁粒度大、简单但阻塞严重。DBA 的日常不是消灭锁而是让锁等待可控、让死锁可复现可定位。我一般会在业务高峰期前先看一眼当前的锁等待情况心里有个基线出问题时对比就知道是不是异常。3.2 用 performance_schema 定位锁等待与死锁8.0 里定位锁等待核心是performance_schema.data_locks和data_lock_waits两张表。下面这套查询能直接告诉你“谁在等谁”-- 查看当前所有锁等待关系 SELECT w.REQUESTING_ENGINE_TRANSACTION_ID AS waiting_trx, w.BLOCKING_ENGINE_TRANSACTION_ID AS blocking_trx, r.PROCESSLIST_ID AS waiting_thread, b.PROCESSLIST_ID AS blocking_thread, r.PROCESSLIST_INFO AS waiting_sql, b.PROCESSLIST_INFO AS blocking_sql FROM performance_schema.data_lock_waits w JOIN performance_schema.data_locks l ON w.REQUESTING_ENGINE_LOCK_ID l.ENGINE_LOCK_ID JOIN performance_schema.threads r ON w.REQUESTING_THREAD_ID r.THREAD_ID JOIN performance_schema.threads b ON w.BLOCKING_THREAD_ID b.THREAD_ID;逻辑说明data_lock_waits记录等待关系data_locks记录锁本身threads把内部线程 ID 映射到PROCESSLIST_ID这样你才能拿PROCESSLIST_ID去KILL或者去SHOW PROCESSLIST里对号入座。waiting_sql和blocking_sql直接给出两边正在执行的语句定位效率比翻SHOW ENGINE INNODB STATUS高得多。参数说明ENGINE_TRANSACTION_ID是 InnoDB 内部事务号和information_schema.innodb_trx里的trx_id对应。如果你只想看阻塞源头可以加WHERE w.BLOCKING_ENGINE_TRANSACTION_ID IS NOT NULL。注意data_locks在锁多的时候可能很大生产环境查询加LIMIT别把performance_schema拖垮。死锁的排查靠错误日志。8.0 默认会把死锁信息写进innodb_print_all_deadlocks开启后的日志里或者直接看SHOW ENGINE INNODB STATUS的LATEST DETECTED DEADLOCK段。手册里强调死锁不可怕可怕的是不知道哪两条 SQL 在互相等。我的习惯是一旦业务报死锁先把那两条 SQL 拿出来看加锁顺序是否相反然后调整业务逻辑或加索引减少锁范围。3.3 事务隔离级别与锁范围的实操边界8.0 默认隔离级别是REPEATABLE READ配合 MVCC 实现一致性读。但要注意REPEATABLE READ下的普通SELECT是快照读不加锁而SELECT ... FOR UPDATE、UPDATE、DELETE是当前读会加锁。很多人以为“读不加锁”结果在事务里用了FOR UPDATE把行锁住另一个事务再更新就等上了。-- 查看当前会话隔离级别 SELECT transaction_isolation; -- 会话级临时改成读已提交很多互联网业务这么干 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 查看当前事务正在持有的锁 SELECT * FROM performance_schema.data_locks WHERE ENGINE_TRANSACTION_ID (SELECT trx_id FROM information_schema.innodb_trx WHERE trx_mysql_thread_id CONNECTION_ID());逻辑说明READ COMMITTED下每次读都取最新快照锁范围通常比REPEATABLE READ小能减少间隙锁带来的等待但代价是同一事务内两次读可能不一致。选哪个取决于业务能不能接受不可重复读。手册里对隔离级别的描述偏理论实际选型时我一般建议金融类强一致用默认REPEATABLE READ高并发互联网业务评估后可用READ COMMITTED。参数说明transaction_isolation是 8.0 的变量名5.7 里叫tx_isolation迁移脚本里如果写死旧变量名会报错。改隔离级别优先在会话级做全局改影响所有连接风险大。innodb_lock_wait_timeout默认 50 秒太长会导致请求堆积太短会误杀正常等待一般调到 10 到 20 秒之间配合业务重试。4. 备份恢复与复制别等删库了才想起 binlog4.1 逻辑备份与物理备份怎么选备份这件事手册里讲得比较全但 DBA 真正要决策的是用mysqldump还是mysqlbackup或 Percona XtraBackup。逻辑备份导出 SQL 文本跨版本、跨平台好使但大库慢、恢复更慢物理备份直接拷数据文件快但版本和平台绑定紧。我的经验是中小库几十 GB 以内用逻辑备份足够配合--single-transaction保证一致性大库上物理备份恢复时间从小时级降到分钟级。# 逻辑备份单事务保证一致性记录 binlog 位点 mysqldump -u backup_user -p \ --single-transaction \ --master-data2 \ --routines --triggers --events \ --databases app_db report_db \ /backup/full_$(date %F).sql # 恢复先关 binlog 写入避免恢复过程产生大量日志 mysql -u root -p --init-commandSET sql_log_bin0 /backup/full_2025-01-01.sql逻辑说明--single-transaction在 InnoDB 上开启一个一致性快照备份期间不锁表业务可写。--master-data2把当前 binlog 文件名和位点以注释形式写进备份文件做时间点恢复时靠它定位起点。恢复时SET sql_log_bin0避免恢复操作被记进 binlog 再同步到从库造成重复。参数说明--routines --triggers --events分别导出存储过程、触发器和事件调度器漏了任何一个恢复后业务可能缺功能。--databases后面跟多个库名导出的文件里会带CREATE DATABASE语句恢复时不用手动建库。注意--master-data在 8.0 里需要RELOAD或REPLICATION CLIENT权限。4.2 基于 binlog 的时间点恢复备份只是起点真正救命的是 binlog。假设凌晨两点有人误删了一张表你有前一天的全备加上全备之后的 binlog就能恢复到误删前一刻。# 1. 从全备文件里找到 binlog 起点 grep CHANGE MASTER TO /backup/full_2025-01-01.sql # 输出类似CHANGE MASTER TO MASTER_LOG_FILEmysql-bin.000042, MASTER_LOG_POS154; # 2. 用 mysqlbinlog 解析并过滤恢复到误操作前 mysqlbinlog --start-position154 \ --stop-datetime2025-01-02 01:59:59 \ /var/lib/mysql/mysql-bin.000042 \ | mysql -u root -p app_db逻辑说明--start-position从全备记录的位点开始--stop-datetime停在误操作前一秒。这样全备加上这段 binlog 重放数据就回到误删前。关键是--stop-datetime要精确宁可少恢复一秒也别把DROP TABLE重放进去。参数说明mysqlbinlog解析出的内容默认带use语句和事务边界直接管道给mysql即可。如果 binlog 格式是ROW解析出来是行变更恢复更精确但文件更大。8.0 默认binlog_formatROW这是好事别改回STATEMENT。另外binlog_expire_logs_seconds控制 binlog 保留时长默认 30 天按备份策略调整别让 binlog 被过早清理导致无法恢复。4.3 复制搭建与延迟观测复制是 DBA 的另一个核心活。8.0 支持 GTID 复制比传统的 binlog 位点复制省心因为不用手动算位点。搭建从库的基本流程-- 主库确认 GTID 开启 SHOW VARIABLES LIKE gtid_mode; -- 应为 ON SHOW VARIABLES LIKE enforce_gtid_consistency; -- 应为 ON -- 从库配置复制源并启动 CHANGE REPLICATION SOURCE TO SOURCE_HOST10.0.1.5, SOURCE_PORT3306, SOURCE_USERrepl_user, SOURCE_PASSWORDRepl_Pwd!, SOURCE_AUTO_POSITION1; START REPLICA; SHOW REPLICA STATUS\G逻辑说明SOURCE_AUTO_POSITION1表示用 GTID 自动定位不用手动指定 binlog 文件和位点。SHOW REPLICA STATUS里重点看Replica_IO_Running和Replica_SQL_Running是否都为Yes以及Seconds_Behind_Source延迟秒数。参数说明8.0 把CHANGE MASTER TO改成了CHANGE REPLICATION SOURCE TOSTART SLAVE改成START REPLICA旧语法还能用但会告警新脚本直接用新语法。repl_user需要REPLICATION SLAVE权限。延迟大时先看Relay_Log_Space和Seconds_Behind_Source如果是 SQL 线程慢多半是从库单线程回放跟不上主库并发可以开replica_parallel_workers多线程回放。5. 避坑与排查DBA 最容易翻车的五个场景5.1 升级后服务起不来报 invalid mysql server upgrade现象从 5.7 升到 8.0或者 8.0 小版本升级后net start mysql失败错误日志里出现[ERROR] [MY-014060] [Server] Invalid MySQL server upgrade。原因数据字典版本不匹配8.0 的数据字典是事务型的升级必须走mysqld --upgradeFORCE或让服务自动升级但有时候权限或残留文件导致升级中断。解决先备份数据目录然后用mysqld --upgradeFORCE --usermysql手动跑一次升级观察输出升级完成后再启动服务。别直接删数据目录重来那是最后手段。5.2 客户端报 2059应用连不上现象应用升级驱动前能连 5.7切到 8.0 后报Authentication plugin caching_sha2_password cannot be loaded。原因客户端驱动版本老不认识 8.0 默认认证插件。解决优先升级驱动到支持caching_sha2_password的版本实在升不了临时把用户改成mysql_native_password但要在迁移计划里排期替换别长期留着。5.3 备份恢复后存储过程和触发器丢了现象用mysqldump备份恢复后发现存储过程、触发器、事件全没了。原因备份时没加--routines --triggers --events默认不导出这些对象。解决重新备份时补上这三个参数。已经丢了的话如果 binlog 还在可以从 binlog 里找CREATE PROCEDURE语句重放但麻烦不如一开始就带全参数。5.4 主从延迟越来越大Seconds_Behind_Source 飙升现象从库延迟从几秒涨到几千秒业务读到旧数据。原因主库并发写入高从库 SQL 线程单线程回放跟不上或者从库上有大查询拖慢回放。解决开多线程回放SET GLOBAL replica_parallel_workers8;和replica_parallel_typeLOGICAL_CLOCK;然后STOP REPLICA; START REPLICA;生效。同时排查从库上是否有长查询必要时把读流量切走。5.5 锁等待超时业务报 Lock wait timeout exceeded现象业务更新语句报Lock wait timeout exceeded; try restarting transaction。原因有事务持有行锁长时间不提交或者间隙锁范围过大。解决先用第 3 章的锁等待查询找到阻塞事务确认是业务逻辑问题还是漏提交必要时KILL阻塞线程。长期方案是缩短事务、加合适索引减少锁范围、评估隔离级别。6. 性能观测与参数调优把手册里的指标变成日常习惯手册最后一章讲性能但 DBA 的性能工作不是背参数而是建立观测习惯。我一般固定看几个东西SHOW GLOBAL STATUS里的Threads_connected、Threads_running、Innodb_row_lock_waits、Innodb_buffer_pool_read_requests和Innodb_buffer_pool_reads。最后两个的比值就是缓冲池命中率低于 95% 就该考虑加innodb_buffer_pool_size了。-- 缓冲池命中率低于 95% 要警惕 SELECT ROUND( (1 - (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAMEInnodb_buffer_pool_reads) / (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAMEInnodb_buffer_pool_read_requests) ) * 100, 2 ) AS buffer_pool_hit_rate; -- 当前连接数和运行线程数 SELECT (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAMEThreads_connected) AS connected, (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAMEThreads_running) AS running;逻辑说明命中率低说明大量读走了磁盘缓冲池不够大。Threads_running持续高于 CPU 核数说明有排队要么加资源要么优化慢查询。这两个指标配合performance_schema.events_statements_summary_by_digest找 TOP SQL基本能覆盖八成性能问题。参数说明innodb_buffer_pool_size在专用数据库服务器上一般设物理内存的 50% 到 70%8.0 支持在线调整但调整时会有短暂阻塞建议在低峰做。max_connections别盲目调大连接数上去内存和上下文切换成本也上去配合连接池用。慢查询日志slow_query_logON、long_query_time1先抓出来再谈优化别凭感觉猜。有个习惯我坚持了很多年每次上生产变更前先把SHOW GLOBAL STATUS和SHOW GLOBAL VARIABLES各存一份快照变更后对比。这样出问题时能快速判断是变更引入的还是本来就有。手册里的知识点是死的但把这套观测和对比流程跑顺MySQL 8.0 的管理就从“救火”变成了“可控”。希望这份拆解能帮你把手册里的内容真正落到自己的实例上。本文还有配套的精品资源点击获取