Skip to content

06.项目六 MySQL数据库高级安全维护

06 项目六 MySQL 数据库高级安全维护

Section titled “06 项目六 MySQL 数据库高级安全维护”

🎯 本项目学习目标

  • 能使用 Navicat 图形化完成数据库、数据表、字段、索引和外键的日常管理
  • 能使用 Navicat 管理用户权限,并与命令行 GRANT / REVOKE 结果相互验证
  • 能使用 Navicat 完成数据导入导出、备份还原、结构同步和数据维护
  • 能通过 Navicat 监控连接、进程、服务器变量和日志相关状态
  • 能基于项目五的安全基础,形成数据库日常维护与安全加固清单

第 1 课 Navicat 连接与界面认知:从命令行走向图形化管理

Section titled “第 1 课 Navicat 连接与界面认知:从命令行走向图形化管理”

项目五已经解决了 MySQL “能装、能连、能授权、能看日志”。本项目进一步解决:如何像数据库管理员一样,用图形化工具完成日常管理与维护

本课重点不是替代命令行,而是建立对应关系:

命令行操作Navicat 中的位置用途
SHOW DATABASES;左侧连接树查看数据库列表
CREATE DATABASE ...右键连接 → 新建数据库创建业务库
CREATE TABLE ...右键表 → 新建表设计表结构
GRANT ...用户管理 / 权限页授权
SHOW PROCESSLIST;工具 → 服务器监控 / 进程列表查看连接与执行中的 SQL
mysqldump转储 SQL 文件 / 运行 SQL 文件备份与还原

在宿主机 Windows 打开 Navicat:

  1. 点击 连接MySQL
  2. 填写连接信息:
配置项示例值说明
连接名MySQL-Ubuntu-Root自定义名称
主机192.168.100.20Ubuntu 虚拟机 IP
端口3306MySQL 默认端口
用户名root 或项目五创建的管理账号管理操作建议使用管理员账号
密码123456课堂统一密码
  1. 点击 测试连接
  2. 成功后点击 确定 保存

连接成功后,重点认识以下区域:

区域作用
左侧连接树查看连接、数据库、表、视图、函数、事件等对象
对象工具栏新建表、设计表、打开表、删除对象
查询窗口编写并执行 SQL,适合验证界面操作结果
表设计器图形化维护字段、主键、索引、外键
用户管理创建账号、分配权限、锁定账号
工具菜单导入导出、转储 SQL、运行 SQL、数据传输、结构同步

每完成一个图形化操作,都建议在查询窗口中验证:

-- 查看当前连接身份
SELECT USER(), CURRENT_USER();
-- 查看数据库
SHOW DATABASES;
-- 查看当前服务器版本
SELECT VERSION();

第 2 课 Navicat 图形化建库建表:管理数据库对象

Section titled “第 2 课 Navicat 图形化建库建表:管理数据库对象”

掌握数据库管理员最常见的对象维护任务:建库、建表、改字段、建索引、建外键、查看表数据。

本课用 Navicat 创建一个员工管理实验库:employees_lab

在 Navicat 左侧连接上右键:

  1. 选择 新建数据库
  2. 填写:
配置项
数据库名employees_lab
字符集utf8mb4
排序规则utf8mb4_unicode_ci
  1. 点击 确定
  2. 在左侧连接上右键 刷新

在查询窗口验证:

SHOW CREATE DATABASE employees_lab;

展开 employees_lab → 右键 新建表

添加字段:

字段名类型长度允许空说明
dept_idvarchar10主键部门编号
dept_namevarchar50唯一索引部门名称
created_attimestamp创建时间

设置建议:

  • dept_id 设置为主键
  • created_at 默认值设置为 CURRENT_TIMESTAMP
  • dept_name 创建唯一索引,防止部门重名
  • 保存表名为 departments

对应 SQL 可在查询窗口验证:

SHOW CREATE TABLE employees_lab.departments\G

继续新建表 employees

字段名类型长度允许空说明
emp_idint主键员工编号
emp_namevarchar50员工姓名
dept_idvarchar10普通索引 / 外键所属部门
salarydecimal10,2薪资
hire_datedate入职日期
updated_attimestamp更新时间

表设计器中注意:

  • emp_id 设置为主键并勾选自动递增
  • salary 使用 DECIMAL(10,2),不要用 FLOAT 存钱
  • updated_at 默认值设置为 CURRENT_TIMESTAMP,并设置更新时自动刷新
  • dept_id 建普通索引,后面用于外键

对应 SQL 示例:

CREATE TABLE employees_lab.employees (
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(50) NOT NULL,
dept_id VARCHAR(10) NOT NULL,
salary DECIMAL(10,2),
hire_date DATE NOT NULL,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_dept_id (dept_id),
CONSTRAINT fk_emp_dept FOREIGN KEY (dept_id)
REFERENCES employees_lab.departments(dept_id)
);

employees 表设计器中:

  1. 切换到 外键 页签
  2. 新建外键,名称填写 fk_emp_dept
  3. 字段选择 dept_id
  4. 参考数据库选择 employees_lab
  5. 参考表选择 departments
  6. 参考字段选择 dept_id
  7. 保存表结构

打开 departments 表,添加示例数据:

dept_iddept_name
d001技术部
d002财务部
d003运营部

打开 employees 表,添加示例数据:

emp_namedept_idsalaryhire_date
张三d0018500.002024-03-01
李四d0027800.002024-04-15
王五d0036900.002024-05-20

用查询窗口验证:

SELECT e.emp_id, e.emp_name, d.dept_name, e.salary, e.hire_date
FROM employees_lab.employees e
JOIN employees_lab.departments d ON e.dept_id = d.dept_id;

图形化改表很方便,但也容易误操作。建议遵循:

  1. 修改前右键表 → 转储 SQL 文件,先备份
  2. 在测试库验证修改
  3. 使用 设计表 修改字段或索引
  4. 保存前查看 Navicat 生成的 SQL
  5. 保存后用 SHOW CREATE TABLE 验证

第 3 课 Navicat 用户与权限管理:图形化落实最小权限

Section titled “第 3 课 Navicat 用户与权限管理:图形化落实最小权限”

项目五已经讲过 CREATE USERGRANTREVOKE。本课重点是:如何在 Navicat 中完成同样的权限管理,并验证权限边界

employees_lab 为例,设计三类账号:

账号来源主机密码权限范围适用角色
reader192.168.100.%123456SELECT数据分析、报表查询
writer192.168.100.%123456SELECT, INSERT, UPDATE, DELETE应用系统
developer192.168.100.%123456SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX开发测试

进入用户管理界面:

  1. 右键连接 → 管理用户,或菜单中打开用户管理
  2. 点击 新建用户
  3. 填写:
    • 用户名:reader
    • 主机:192.168.100.%
    • 密码:123456
  4. 认证插件优先选择兼容 Navicat 的 mysql_native_password
  5. 保存

按同样方式创建 writerdeveloper

如果界面创建失败,回到查询窗口先降低课堂密码策略:

SET GLOBAL validate_password.policy = LOW;
SET GLOBAL validate_password.length = 6;

在用户管理中选择 reader@192.168.100.%

  1. 打开 权限 页签
  2. 找到数据库 employees_lab
  3. 只勾选 SELECT
  4. 保存

writer 勾选:

  • SELECT
  • INSERT
  • UPDATE
  • DELETE

developer 勾选:

  • SELECT
  • INSERT
  • UPDATE
  • DELETE
  • CREATE
  • ALTER
  • INDEX

保存后用 SQL 验证:

SHOW GRANTS FOR 'reader'@'192.168.100.%';
SHOW GRANTS FOR 'writer'@'192.168.100.%';
SHOW GRANTS FOR 'developer'@'192.168.100.%';

在 Navicat 中分别新建三个连接:

  • MySQL-reader
  • MySQL-writer
  • MySQL-developer

每个连接使用对应账号登录,然后执行测试:

测试操作readerwriterdeveloper
SELECT * FROM employees_lab.employees;应成功应成功应成功
INSERT INTO employees_lab.departments VALUES ('d004','人事部',NOW());应失败应成功应成功
UPDATE employees_lab.employees SET salary=salary+100 WHERE emp_id=1;应失败应成功应成功
CREATE TABLE employees_lab.tmp_test (id INT);应失败应失败应成功
DROP DATABASE employees_lab;应失败应失败应失败

3.6 图形化锁定、解锁和删除账号

Section titled “3.6 图形化锁定、解锁和删除账号”

在用户管理中可以完成账号生命周期维护:

场景Navicat 操作SQL 对应
员工离职但不确定是否仍被系统使用锁定账号ALTER USER ... ACCOUNT LOCK;
账号恢复使用解锁账号ALTER USER ... ACCOUNT UNLOCK;
账号确认废弃删除用户DROP USER ...;
怀疑密码泄露修改密码ALTER USER ... IDENTIFIED BY ...;

删除前先在查询窗口检查依赖:

SELECT * FROM information_schema.VIEWS WHERE DEFINER LIKE '%reader%';
SELECT * FROM information_schema.ROUTINES WHERE DEFINER LIKE '%reader%';

第 4 课 Navicat 数据维护:导入、导出、备份、还原

Section titled “第 4 课 Navicat 数据维护:导入、导出、备份、还原”

数据库日常维护不只是建表授权,还包括数据迁移、备份、还原和批量处理。本课用 Navicat 完成常见维护动作。

右键 employees_lab.employees 表 → 导出向导

常见导出格式:

格式适用场景
Excel / CSV给业务人员、数据分析师查看
SQL迁移到另一台 MySQL 或备份表数据
JSON与接口、脚本、文档系统交换数据

导出 CSV 时建议:

  • 字符编码选择 UTF-8
  • 勾选字段名作为首行
  • 日期时间格式保持默认或统一为 YYYY-MM-DD

右键目标表 → 导入向导

导入前检查:

  1. CSV / Excel 字段名是否和表字段对应
  2. 字符编码是否为 UTF-8
  3. 日期格式是否能被 MySQL 识别
  4. 外键字段是否存在对应主表记录
  5. 主键是否重复

右键数据库 employees_lab转储 SQL 文件结构和数据

建议文件名:

employees_lab_20260512.sql

备份时建议勾选:

  • 包含表结构和数据
  • 使用 UTF-8 编码
  • 如果只想备份单个库并还原到同名库,可以勾选 CREATE DATABASE
  • 如果后面要还原到 employees_lab_restore 这样的测试库,不要勾选 CREATE DATABASE,避免 SQL 文件重新切回原库名

还原前建议新建一个测试库:employees_lab_restore

操作步骤:

  1. 右键连接 → 新建数据库employees_lab_restore
  2. 右键该数据库 → 运行 SQL 文件
  3. 选择刚才导出的 .sql 文件
  4. 执行完成后刷新数据库
  5. 查询验证:
SELECT COUNT(*) FROM employees_lab_restore.employees;
SELECT COUNT(*) FROM employees_lab_restore.departments;

Navicat 的 数据传输结构同步 常用于测试库、正式库之间迁移对象。

功能作用风险点
数据传输把表结构和数据从一个库复制到另一个库可能覆盖目标库对象
结构同步比较两个库的表结构差异并生成同步 SQL可能执行 DROP / ALTER
数据同步比较两边数据并同步差异可能误删或覆盖目标数据

课堂建议流程:

  1. 先从源库传输到测试库
  2. 查看 Navicat 生成的 SQL
  3. 确认没有危险 DROP 操作
  4. 再执行同步
维护事项Navicat 操作验证方式
备份数据库转储 SQL 文件新建测试库并还原
批量导入数据导入向导COUNT(*) 和抽样查询
给业务导出数据导出向导打开 CSV / Excel 检查乱码
修改表结构设计表SHOW CREATE TABLE
同步测试库结构结构同步先查看生成 SQL

第 5 课 Navicat 监控与排错:图形化看运行状态

Section titled “第 5 课 Navicat 监控与排错:图形化看运行状态”

项目五已经学过错误日志、慢查询日志、通用查询日志和 binlog。本课不重复日志原理,重点学习:如何用 Navicat 快速查看数据库当前状态,并辅助排错

在 Navicat 中打开服务器监控或进程列表,可以看到当前连接、用户、来源主机和正在执行的 SQL。

对应 SQL:

SHOW PROCESSLIST;

重点关注:

字段含义排查价值
Id连接 ID必要时用于结束连接
User当前用户判断是否异常账号
Host来源主机判断是否异常来源 IP
db当前数据库判断影响范围
Command当前命令Query / Sleep 等
Time持续时间长时间运行可能有问题
Info正在执行的 SQL排查慢 SQL 或锁等待

如需结束异常连接:

KILL 连接ID;

Navicat 的服务器信息界面可以查看变量和状态。也可以在查询窗口执行:

-- 查看关键变量
SHOW VARIABLES LIKE 'version';
SHOW VARIABLES LIKE 'character_set_server';
SHOW VARIABLES LIKE 'time_zone';
SHOW VARIABLES LIKE 'log_bin';
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'general_log';
-- 查看关键状态
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Slow_queries';
SHOW GLOBAL STATUS LIKE 'Connections';
SHOW GLOBAL STATUS LIKE 'Uptime';

常见判断:

现象可能原因下一步
Threads_connected 很高连接池配置不当 / 连接泄漏看进程列表来源
Slow_queries 增长快SQL 慢或缺索引开慢查询日志并分析
log_bin 为 OFFbinlog 未开启回到项目五配置 binlog
字符集不是 utf8mb4建库或配置不规范检查库表字符集

在 Navicat 中右键表 → 设计表 → 查看字段、索引、外键。

常用 SQL 验证:

-- 查看表结构
DESC employees_lab.employees;
-- 查看索引
SHOW INDEX FROM employees_lab.employees;
-- 查看表大小和行数估计
SELECT table_name, table_rows,
ROUND(data_length / 1024 / 1024, 2) AS data_mb,
ROUND(index_length / 1024 / 1024, 2) AS index_mb
FROM information_schema.tables
WHERE table_schema = 'employees_lab';

在 Navicat 查询窗口执行:

EXPLAIN
SELECT e.emp_name, d.dept_name
FROM employees_lab.employees e
JOIN employees_lab.departments d ON e.dept_id = d.dept_id
WHERE d.dept_id = 'd001';

重点看:

字段说明
type访问类型,越接近 const / ref 越好
key实际使用的索引
rows预计扫描行数,越少越好
Extra是否出现 Using filesortUsing temporary 等提示

5.6 图形化维护不要替代安全审计

Section titled “5.6 图形化维护不要替代安全审计”

Navicat 能让管理更方便,但安全审计仍应保留 SQL 证据:

-- 查看用户和来源
SELECT user, host, plugin, account_locked FROM mysql.user;
-- 查看某个账号权限
SHOW GRANTS FOR 'writer'@'192.168.100.%';
-- 查看 binlog 状态
SHOW BINARY LOG STATUS;
-- 查看慢查询数量
SHOW GLOBAL STATUS LIKE 'Slow_queries';

第 6 课 安全加固、主从复制与高可用认知:从会操作到会维护

Section titled “第 6 课 安全加固、主从复制与高可用认知:从会操作到会维护”

前面已经学会了 Navicat 图形化管理数据库。本课把操作上升为维护规范:哪些操作可以做,哪些操作要谨慎,生产环境如何防风险

风险操作风险建议
远程使用 root一旦泄露就是最高权限禁止 root 远程,使用专门 DBA 账号
保存生产密码本机被入侵会泄露凭证生产连接谨慎保存密码
图形化删除表 / 库点击错误可能导致数据丢失删除前先备份、再二次确认
结构同步直接执行可能生成 DROP / ALTER先查看 SQL,再测试库演练
长期开启通用查询日志影响性能、撑满磁盘只在排错时临时开启
加固措施检查方式防御什么
禁止 root 远程登录SELECT user, host FROM mysql.user WHERE user='root';远程暴力破解
限制账号来源 IP查看用户 host 是否为内网网段未授权来源连接
强密码策略SHOW VARIABLES LIKE 'validate_password%';弱密码
最小权限原则SHOW GRANTS权限滥用
删除匿名用户SELECT user, host FROM mysql.user WHERE user='';匿名访问
删除 test 数据库SHOW DATABASES LIKE 'test';测试库滥用
不授予 FILE 权限SHOW GRANTSUDF 提权 / 文件读写风险
开启 binlogSHOW VARIABLES LIKE 'log_bin';恢复和审计
定期备份并验证还原Navicat 转储 + 测试库还原误删和故障恢复
攻击方式表现防御措施
SQL 注入应用拼接 SQL,攻击者绕过认证或拖库参数化查询 + 最小权限
弱密码爆破反复尝试 root / 123456 等密码强密码 + 限制来源 + 防火墙
未授权访问3306 暴露到公网内网访问 + 安全组 / 防火墙
权限过大普通账号可删库、读系统表按角色授权,不给 ALL
UDF 提权借助 FILE 权限写入恶意库文件禁止业务账号 FILE 权限

6.5 主从复制入门:让数据库具备热备能力

Section titled “6.5 主从复制入门:让数据库具备热备能力”

单机 MySQL 即使配置再规范,也存在单点故障。主从复制要解决的问题是:主库负责写入,从库持续同步主库数据,用于备份、读查询或故障切换准备

角色作用初学者理解
主库(Primary / Source)接收业务写入,产生 binlog“原始账本”
从库(Replica)拉取并回放主库 binlog“抄账本的人”
复制账号专门给从库连接主库使用“只允许抄账的账号”
binlog主库记录数据变更的日志“账本流水”
relay log从库本地保存的中继日志“抄回来的草稿本”
应用写入主库
主库写入 binlog
从库 I/O 线程连接主库并拉取 binlog
从库写入 relay log
从库 SQL 线程回放 relay log
从库数据与主库保持同步
条件检查方式说明
主库开启 binlogSHOW VARIABLES LIKE 'log_bin';必须为 ON
主从 server_id 不同SHOW VARIABLES LIKE 'server_id';每台 MySQL 必须唯一
主库允许从库访问 3306防火墙 / 安全组 / 网络连通性检查从库要能连到主库
存在复制账号SHOW GRANTS FOR 'repl'@'192.168.100.%';只授予复制权限
初始数据一致全量备份还原到从库否则复制起点不一致

复制账号示例:

CREATE USER 'repl'@'192.168.100.%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.100.%';

本次实验使用两台 Ubuntu 虚拟机模拟主从环境:

角色主机名IP 地址server_id说明
主库(Source)mysql-primary192.168.100.201项目五已有的 MySQL 实例
从库(Replica)mysql-replica192.168.100.212克隆或新建一台虚拟机

第一步:配置主库(192.168.100.20)

Section titled “第一步:配置主库(192.168.100.20)”

在主库 Ubuntu 上编辑 MySQL 配置文件:

Terminal window
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld] 段中确认或添加以下配置:

[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin
binlog_format = ROW
bind-address = 0.0.0.0

配置说明:

参数作用
server-id1主库唯一标识,集群内不能重复
log_bin/var/log/mysql/mysql-bin开启 binlog 并指定路径前缀
binlog_formatROW推荐行级复制,数据一致性最好
bind-address0.0.0.0允许远程连接(从库需要连入)

保存后重启 MySQL:

Terminal window
sudo systemctl restart mysql

验证配置生效:

SHOW VARIABLES LIKE 'server_id';
SHOW VARIABLES LIKE 'log_bin';
SHOW VARIABLES LIKE 'binlog_format';

第二步:配置从库(192.168.100.21)

Section titled “第二步:配置从库(192.168.100.21)”

在从库 Ubuntu 上编辑同样的配置文件:

Terminal window
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld] 段中确认或添加:

[mysqld]
server-id = 2
relay_log = /var/log/mysql/mysql-relay
read_only = ON
bind-address = 0.0.0.0

配置说明:

参数作用
server-id2从库唯一标识,必须和主库不同
relay_log/var/log/mysql/mysql-relay中继日志路径前缀
read_onlyON从库设为只读,防止误写入
bind-address0.0.0.0允许 Navicat 远程连接查看状态

保存后重启 MySQL:

Terminal window
sudo systemctl restart mysql

验证配置生效:

SHOW VARIABLES LIKE 'server_id';
SHOW VARIABLES LIKE 'relay_log';
SHOW VARIABLES LIKE 'read_only';

在主库执行(如果项目五已降低密码策略则可直接创建):

-- 创建复制专用账号
CREATE USER 'repl'@'192.168.100.%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.100.%';
FLUSH PRIVILEGES;
-- 验证账号权限
SHOW GRANTS FOR 'repl'@'192.168.100.%';

在从库测试能否用该账号连接主库:

Terminal window
mysql -h 192.168.100.20 -u repl -p123456 -e "SELECT 1;"

如果连接失败,检查:

  1. 主库防火墙是否放行 3306 端口:sudo ufw allow 3306
  2. 主库 bind-address 是否为 0.0.0.0
  3. 账号的 host 是否匹配从库 IP

第四步:备份主库数据并还原到从库

Section titled “第四步:备份主库数据并还原到从库”

主从复制要求从库的初始数据和主库一致。使用 mysqldump 做全量备份:

在主库执行:

-- 锁定主库并记录 binlog 位置
FLUSH TABLES WITH READ LOCK;
```sql
SHOW BINARY LOGS;
-- 查看当前正在写入的 binlog 文件及位置
SHOW MASTER STATUS;
记录输出中的两个关键值(后面配置从库要用):
```text
+------------------+----------+
| File | Position |
+------------------+----------+
| mysql-bin.000014 | 681 |
+------------------+----------+

打开另一个终端窗口,执行全量备份:

Terminal window
sudo mysqldump -u root -p123456 --all-databases --source-data=2 > /tmp/full_backup.sql

备份完成后,回到第一个终端解锁主库:

UNLOCK TABLES;

将备份文件传输到从库:

Terminal window
scp /tmp/full_backup.sql ly@192.168.1.141:/tmp/

在从库还原备份:

Terminal window
mysql -u root -p123456 < /tmp/full_backup.sql

第五步:在从库配置并启动复制

Section titled “第五步:在从库配置并启动复制”

在从库 MySQL 中执行以下命令,将第四步记录的 File 和 Position 填入:

CHANGE REPLICATION SOURCE TO
SOURCE_HOST = '192.168.1.136',
SOURCE_USER = 'repl',
SOURCE_PASSWORD = '123456',
SOURCE_LOG_FILE = 'mysql-bin.000013',
SOURCE_LOG_POS = 849,
SOURCE_PORT = 3306;

参数说明:

参数含义
SOURCE_HOST主库 IP 地址
SOURCE_USER复制账号用户名
SOURCE_PASSWORD复制账号密码
SOURCE_LOG_FILE第四步记录的 binlog 文件名
SOURCE_LOG_POS第四步记录的 binlog 位置
SOURCE_PORT主库端口

启动复制:

START REPLICA;

启动复制后,在从库立即检查状态:

SHOW REPLICA STATUS;

重点看这些字段:

字段正常值 / 关注点含义
Replica_IO_RunningYes从库能否连接主库并拉取日志
Replica_SQL_RunningYes从库能否正常回放日志
Seconds_Behind_Source越小越好从库落后主库多少秒
Last_IO_Error应为空拉取日志错误原因
Last_SQL_Error应为空回放日志错误原因

两个 Running 都是 Yes 才算复制正常。 如果有一个是 No,看对应的 Error 字段排查原因。

MySQL 8.0 中推荐使用 REPLICA 术语;旧资料里常见 SLAVE,含义基本对应。课堂看到旧命令时要能认出来,例如 SHOW SLAVE STATUS\G 是旧写法。

复制状态正常后,做一次写入测试验证数据确实能同步。

主库执行写入:

-- 在主库插入测试数据
INSERT INTO employees_lab.departments VALUES ('d005', '测试部-主从验证', NOW());
-- 确认主库已写入
SELECT * FROM employees_lab.departments WHERE dept_id = 'd005';

从库查询验证(等待 1-2 秒):

-- 在从库查询,应该能看到刚才主库写入的数据
SELECT * FROM employees_lab.departments WHERE dept_id = 'd005';

如果从库能查到 d005 这条记录,说明主从复制工作正常。

再验证从库的只读保护:

-- 在从库尝试写入,应该被拒绝(因为配置了 read_only)
INSERT INTO employees_lab.departments VALUES ('d006', '从库写入测试', NOW());
-- 预期报错:The MySQL server is running with the --read-only option

Navicat 主要用于图形化观察和验证:

  1. 在 Navicat 中分别建立主库连接(MySQL-Primary)和从库连接(MySQL-Replica
  2. 在主库连接中打开 employees_lab.departments 表,插入一行新数据
  3. 切换到从库连接,刷新同一张表,确认数据是否同步出现
  4. 在从库查询窗口执行 `SHOW REPLICA STATUS
  5. 查看 Replica_IO_RunningReplica_SQL_Running 和延迟字段
┌─────────────────────────────────────────────────────────┐
│ 主从复制搭建六步法 │
├─────────────────────────────────────────────────────────┤
│ 1. 配置主库:server-id + log_bin + binlog_format │
│ 2. 配置从库:server-id + relay_log + read_only │
│ 3. 主库创建复制账号:REPLICATION SLAVE 权限 │
│ 4. 主库全量备份 → 传输 → 从库还原(保证初始数据一致) │
│ 5. 从库 CHANGE REPLICATION SOURCE TO(填 File + Pos) │
│ 6. START REPLICA → SHOW REPLICA STATUS 验证双 Yes │
└─────────────────────────────────────────────────────────┘

主从复制只是高可用的基础,不等于完整高可用。完整高可用还要解决:主库故障后,谁来判断故障、谁来切换新主库、应用如何连接到新主库

方案原理初学者理解
主从复制主库写 binlog,从库回放同步数据热备和读写分离基础
MHA监控主库,故障时提升从库为主库传统主从自动切换
InnoDB Cluster基于 Group Replication 自动选主MySQL 官方高可用方案
MySQL Router / ProxySQL应用连接中间件,由中间件分发请求配合主从或集群使用
  1. 用 Navicat 新建 employees_lab 数据库
  2. 创建 departmentsemployees 两张表,包含主键、索引和外键
  3. 插入不少于 5 条员工数据
  4. 创建 readerwriterdeveloper 三个账号
  5. 分别用三个账号登录,验证权限边界
  6. 导出 employees_lab 为 SQL 文件
  7. 新建 employees_lab_restore 并还原 SQL 文件
  8. 查看当前连接进程、慢查询数量和 binlog 状态
  9. 写出 5 条本机 MySQL 安全加固建议
  10. 说明主从复制中 binlog、复制账号、复制线程和从库延迟的作用

课时核心能力验收点(可检查)
第 1 课:连接与界面会使用 Navicat 管理入口能连接 MySQL,能识别主要功能区
第 2 课:建库建表会管理数据库对象能创建库、表、索引、外键并插入数据
第 3 课:用户权限会图形化落实最小权限能创建多角色账号并验证权限边界
第 4 课:数据维护会导入导出和备份还原能转储 SQL 并还原到测试库
第 5 课:监控排错会查看运行状态能查看连接、变量、状态、索引和慢查询数量
第 6 课:安全维护会形成维护规范和主从复制认知能列出安全加固清单,并说明主从复制与高可用的关系

附录 A:Navicat 常用操作与 SQL 对照表

Section titled “附录 A:Navicat 常用操作与 SQL 对照表”
Navicat 操作SQL / 工具命令
新建数据库CREATE DATABASE ...
删除数据库DROP DATABASE ...
新建表CREATE TABLE ...
设计表ALTER TABLE ...
查看表数据SELECT * FROM ...
新建用户CREATE USER ...
授权GRANT ... ON ... TO ...
撤权REVOKE ... ON ... FROM ...
锁定账号ALTER USER ... ACCOUNT LOCK
转储 SQL 文件mysqldump 类似功能
运行 SQL 文件mysql < backup.sql 类似功能
查看进程SHOW PROCESSLIST
查看变量SHOW VARIABLES
查看状态SHOW STATUS
用途用户名主机密码权限
管理演示dba192.168.100.%123456课堂可给管理权限
只读验证reader192.168.100.%123456SELECT
读写验证writer192.168.100.%123456SELECT, INSERT, UPDATE, DELETE
开发验证developer192.168.100.%123456DML + CREATE, ALTER, INDEX

建议格式:

数据库名_用途_日期.sql

示例:

employees_lab_full_20260512.sql
employees_lab_before_alter_20260512.sql
employees_lab_restore_test_20260512.sql

命名要能看出:哪个库、什么用途、哪一天生成。