📝 MySQL 实战手记:日志管理与主从复制搭建全指南
在 MySQL 的日常运维中,日志管理是排查问题的基石,而主从复制则是实现数据备份、读写分离和高可用架构的核心。本文将结合实际操作,详细记录如何进行 MySQL 的日志管理,以及如何从零搭建并排错主从复制架构。
🛠️ 第一部分:MySQL 日志管理实战
1. 错误日志(Error Log)的查看与清理
错误日志记录了 MySQL 启动、运行或停止时出现的问题。 我们可以通过查看配置文件和全局变量来定位错误日志的位置:
bash
# 查看 MySQL 配置文件中的日志设置
root@db-server:~# cat /etc/mysql/mysql.cnf
# 配置文件内容示例:
# [mysqld]
# log_error = /var/log/mysql/error.log
# log_error_verbosity = 2
# binlog_error_action = ABORT_SERVER
除了查看配置文件,也可以直接登录 MySQL 查询日志路径:
sql
-- 查看错误日志目录
SHOW VARIABLES LIKE '%log_error%';
如果 MySQL 无法启动,我们还可以借助系统的 syslog 来排查:
bash
grep mysql /var/log/syslog
🧹 日志清理: 随着时间推移,错误日志会不断增加并被系统自动轮转打包。为了释放磁盘空间,我们可以手动删除陈旧的压缩日志:
bash
# 删除 5-7 的旧日志文件
rm /var/log/mysql/error.log.{5,6,7}.gz
2. 二进制日志(Binlog)的定位与解析
二进制日志(Binlog)记录了所有的 DDL 和 DML 语句,是数据恢复 和主从复制的基础。
首先,在 MySQL 中查看 Binlog 的相关信息:
sql
-- 查看二进制日志所在目录及前缀
SHOW VARIABLES LIKE 'log_bin%';
-- 查看二进制日志的记录格式(ROW, STATEMENT, MIXED)
SHOW VARIABLES LIKE '%binlog_format%';
🔍 查看 Binlog 内容: 由于 Binlog 是以二进制方式存储的,不能使用 cat 或 vim 直接读取,必须借助专门的工具 mysqlbinlog。
常用命令语法如下:
bash
mysqlbinlog [参数选项] logfilename
实用参数解析:
-d:指定数据库名称,只列出指定数据库相关的操作。-o:忽略掉日志中的前 n 行命令。-v:将行事件(数据变更)重构为 SQL 语句(非常重要,否则看到的是 Base64 编码)。-vv:将行事件重构为 SQL 语句,并额外输出字段的数据类型等注释信息。
🚀 第二部分:MySQL 主从复制搭建(Master-Slave)
主从复制的原理简单来说,就是从库(Slave)读取主库(Master)的 Binlog,并在本地重放,从而保持数据一致。
Step 1:配置主服务器(Master)
编辑主服务器的 MySQL 配置文件(通常为 /etc/mysql/my.cnf 或 my.ini):
ini
[mysqld]
# 服务器唯一ID,默认为1,主从必须不一致
server-id = 1
# 启用二进制日志,这是复制的基石
log-bin = mysql-bin
# 可选:指定需要/不需要复制的数据库
# binlog-do-db = your_database_name
# binlog-ignore-db = mysql
# binlog-ignore-db = information_schema
修改完成后,重启 MySQL 服务:
bash
systemctl restart mysql
Step 2:主库创建同步账号并获取 Binlog 位点
登录主库,创建一个专门用于复制的账号(注意 MySQL 8.0 建议使用 mysql_native_password 插件以防兼容性问题):
sql
-- 创建用户并使用 mysql_native_password 插件(IP和密码请根据实际替换)
CREATE USER 'repl'@'192.168.1.100' IDENTIFIED WITH mysql_native_password BY 'StrongPassword123!';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.100';
-- 刷新权限
FLUSH PRIVILEGES;
-- 查看主服务器状态(⚠️非常重要,记下 File 和 Position 的值)
SHOW MASTER STATUS;
记录下输出结果中的 File (如 mysql-bin.000001) 和 Position (如 107),后面从库配置时需要用到。
Step 3:配置从服务器(Slave)
编辑从库的配置文件 /etc/mysql/my.cnf:
ini
[mysqld]
# 服务器唯一ID,必须与主库不同!
server-id = 2
# 可选:从库也可以开启 Binlog,作为级联复制的中间节点
# log-bin = mysql-bin
# 可选:指定要复制的数据库(通常与主库一致)
# replicate-do-db = your_database_name
重启从库 MySQL:
bash
systemctl restart mysql
Step 4:数据全量同步(初始化从库)
在开启复制前,主从库的数据必须一致。我们在主库上导出一份全量数据并导入从库。
在主库服务器上执行:
bash
# 导出全量数据,--master-data=1 会自动在 SQL 中记录主库的 binlog 位置
mysqldump -u root -p --all-databases --master-data=1 > master_dump.sql
# 将导出文件传送到从库
scp master_dump.sql root@192.168.1.100:/root/
在从库服务器上执行导入:
bash
mysql -u root -p < /root/master_dump.sql
Step 5:启动主从复制
在从库登录 MySQL,配置主库信息并开启同步:
sql
CHANGE MASTER TO
MASTER_HOST='192.168.1.50', -- 主库IP地址
MASTER_USER='repl',
MASTER_PASSWORD='StrongPassword123!', -- 你设置的密码
MASTER_LOG_FILE='Step2中记录的File值', -- 如 'mysql-bin.000001'
MASTER_LOG_POS=Step2中记录的Position值; -- 如 107 (注意这里没有引号)
-- 启动从库
START SLAVE;
-- 查看从库状态
SHOW SLAVE STATUS \G;
检查 Slave_IO_Running 和 Slave_SQL_Running 是否均为 Yes,如果是,恭喜你搭建成功!
🔧 第三部分:主从复制排错指南
在实际搭建或运行过程中,可能会遇到复制中断或连接失败的问题。以下是常见的排错手段。
1. 账号认证插件导致的连接失败
如果从库无法连接主库,经常是因为 MySQL 8.0 默认使用了 caching_sha2_password 插件,而从库不支持或配置不当。
解决办法(主库端重新授权):
sql
-- 若账号不存在则创建
CREATE USER 'repl'@'192.168.1.100' IDENTIFIED BY 'StrongPassword123!';
-- 授权
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.100';
-- 强制更改密码认证插件
ALTER USER 'repl'@'192.168.1.100' IDENTIFIED WITH mysql_native_password BY 'StrongPassword123!';
-- 刷新权限生效
FLUSH PRIVILEGES;
从库端重置连接:
sql
STOP SLAVE;
-- 重新配置密码
CHANGE MASTER TO MASTER_PASSWORD='StrongPassword123!';
START SLAVE;
-- 再次检查状态
SHOW SLAVE STATUS \G;
2. 清理 Host 缓存
如果由于网络抖动导致主库频繁收到异常连接,主库可能会将从库的 IP 屏蔽(Host is blocked)。此时可以在主库执行以下命令清除缓存:
sql
FLUSH HOSTS;
结语: MySQL 的日志管理与主从架构是保障数据安全的基础操作。掌握 mysqlbinlog 的排查技巧,并深刻理解 CHANGE MASTER 背后 File 与 Position 的对应关系,可以让我们在面对数据库故障时更加从容不迫。希望这篇实战笔记对你有所帮助!