Part01-基础概念与理论知识
1.1 二进制日志概述
二进制日志(Binary
Log)是MySQL的一种日志类型,记录了所有对数据库的修改操作,包括INSERT、UPDATE、DELETE等语句。二进制日志是MySQL复制和恢复的重要依据。风哥教程参考MySQL官方文档Backup and
Recovery部分的二进制日志相关内容。更多视频教程www.fgedu.net.cn
mysql> SHOW VARIABLES LIKE ‘log_bin’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| log_bin | ON |
+—————+——-+
1 row in set (0.00 sec)
# 查看二进制日志文件
mysql> SHOW BINARY LOGS;
+—————+———–+
| Log_name | File_size |
+—————+———–+
| binlog.000001 | 1073741824 |
| binlog.000002 | 524288000 |
| binlog.000003 | 262144000 |
+—————+———–+
3 rows in set (0.00 sec)
1.2 二进制日志的作用
二进制日志的主要作用包括:数据恢复、主从复制、审计等。通过二进制日志,我们可以将数据库恢复到某个时间点或某个操作之前的状态。学习交流加群风哥微信: itpux-com
审计:可以通过二进制日志查看数据库的所有修改操作。
1.3 基于二进制日志恢复的原理
基于二进制日志的恢复原理是:先通过备份恢复到某个时间点,然后应用备份之后的二进制日志,将数据库恢复到最新状态或指定时间点的状态。学习交流加群风哥QQ113257174
mysql> SHOW VARIABLES LIKE ‘binlog_format’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| binlog_format | ROW |
+—————+——-+
1 row in set (0.00 sec)
# 查看二进制日志过期时间
mysql> SHOW VARIABLES LIKE ‘expire_logs_days’;
+——————+——-+
| Variable_name | Value |
+——————+——-+
| expire_logs_days | 7 |
+——————+——-+
1 row in set (0.00 sec)
Part02-生产环境规划与建议
2.1 二进制日志配置规划
在生产环境中,需要合理规划二进制日志的配置,包括日志格式、过期时间、大小限制等。风哥提示:生产环境中应启用二进制日志,并合理配置相关参数,以确保数据恢复的可靠性。
配置二进制日志大小限制,避免单个日志文件过大;5. 将二进制日志存储在独立的磁盘上,提高性能和安全性。
2.2 恢复策略设计
基于二进制日志的恢复策略应包括:备份策略、二进制日志保留策略、恢复测试计划等。更多学习教程公众号风哥教程itpux_com
– 完全备份:每天凌晨2:00
– 增量备份:每小时一次
– 二进制日志保留:14天
– 恢复测试:每周一次
– 恢复演练:每月一次
2.3 性能影响评估
启用二进制日志会对MySQL的性能产生一定影响,主要体现在写入操作的延迟上。在实施前需要评估性能影响,并采取相应的优化措施。from MySQL:www.itpux.com
# 启用前
# mysqlslap –user=fgedu_admin –password=StrongPassword123! –host=192.168.1.100 –port=3306
–concurrency=100 –iterations=10 –query=”INSERT INTO fgedudb.fgedu_test VALUES (NULL, ‘test’)”
Benchmark
Average number of seconds to run all queries: 0.125 seconds
Minimum number of seconds to run all queries: 0.105 seconds
Maximum number of seconds to run all queries: 0.156 seconds
Number of clients running queries: 100
Average number of queries per client: 1
# 启用后
# mysqlslap –user=fgedu_admin –password=StrongPassword123! –host=192.168.1.100 –port=3306
–concurrency=100 –iterations=10 –query=”INSERT INTO fgedudb.fgedu_test VALUES (NULL, ‘test’)”
Benchmark
Average number of seconds to run all queries: 0.156 seconds
Minimum number of seconds to run all queries: 0.135 seconds
Maximum number of seconds to run all queries: 0.187 seconds
Number of clients running queries: 100
Average number of queries per client: 1
Part03-生产环境项目实施方案
3.1 二进制日志配置
配置二进制日志是实施基于二进制日志恢复的基础,以下是配置步骤。
# vi /etc/my.cnf
[mysqld]
# 启用二进制日志
log_bin = /mysql/logs/binlog
# 二进制日志格式
binlog_format = ROW
# 二进制日志过期时间(天)
expire_logs_days = 14
# 二进制日志大小限制(MB)
max_binlog_size = 1024M
# 服务器ID
server_id = 1
# 启用二进制日志校验
binlog_checksum = CRC32
# 启用二进制日志事务压缩
binlog_transaction_compression = ON
# 重启MySQL服务
# systemctl restart mysqld
# 验证二进制日志配置
mysql> SHOW VARIABLES LIKE ‘log_bin%’;
+———————————+—————————–+
| Variable_name | Value |
+———————————+—————————–+
| log_bin | ON |
| log_bin_basename | /mysql/logs/binlog |
| log_bin_index | /mysql/logs/binlog.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+———————————+—————————–+
5 rows in set (0.00 sec)
3.2 备份策略与二进制日志配合
合理的备份策略应与二进制日志配合使用,以确保数据的安全性和可恢复性。
# vi /mysql/scripts/backup_with_binlog.sh
#!/bin/bash
# backup_with_binlog.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
BACKUP_DIR=”/backup/mysql/full”
DATE=$(date +%Y%m%d_%H%M%S)
DB_USER=”fgedu_admin”
DB_PASS=”StrongPassword123!”
# 创建备份目录
mkdir -p $BACKUP_DIR
# 获取当前二进制日志位置
BINLOG_POS=$(mysql –user=$DB_USER –password=$DB_PASS -e “SHOW MASTER STATUS” | grep -v File)
# 执行完全备份,包含二进制日志位置
mysqldump –user=$DB_USER –password=$DB_PASS –single-transaction –flush-logs –master-data=2
–all-databases > $BACKUP_DIR/full_backup_$DATE.sql
# 压缩备份文件
gzip $BACKUP_DIR/full_backup_$DATE.sql
# 记录备份信息,包括二进制日志位置
echo “[$(date +%Y-%m-%d%H:%M:%S)] Full backup completed: $BACKUP_DIR/full_backup_$DATE.sql.gz” >>
/mysql/logs/backup.log
echo “Binary log position: $BINLOG_POS” >> /mysql/logs/backup.log
# 删除7天前的备份文件
find $BACKUP_DIR -name “full_backup_*.sql.gz” -mtime +7 -delete
3.3 恢复前准备工作
在进行基于二进制日志的恢复前,需要做好充分的准备工作,包括备份文件的准备、二进制日志文件的收集、恢复计划的制定等。
1. 确认备份文件的完整性
2. 收集所有需要的二进制日志文件
3. 确定恢复的时间点或位置
4. 停止应用对数据库的写入操作
5. 创建恢复测试环境(可选)
6. 制定恢复计划和回滚方案
Part04-生产案例与实战讲解
4.1 基于二进制日志的时间点恢复
基于二进制日志的时间点恢复是指将数据库恢复到指定时间点的状态,以下是具体的操作步骤。
# gzip -d /backup/mysql/full/full_backup_20260401_020000.sql.gz
# mysql –user=fgedu_admin –password=StrongPassword123! < /backup/mysql/full/full_backup_20260401_020000.sql # 步骤2:查看备份文件中的二进制日志位置 # head -50 /backup/mysql/full/full_backup_20260401_020000.sql -- MySQL dump 10.13 Distrib 8.4.0, for Linux (x86_64) -- -- Host: localhost Database: -- ------------------------------------------------------ -- Server version 8.4.0 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!50503 SET NAMES utf8mb4 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- Position to start replication or point-in-time recovery from -- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000002' , MASTER_LOG_POS=123456; # 步骤3:应用二进制日志到指定时间点 # mysqlbinlog --start-position=123456 --stop-datetime="2026-04-01 10:00:00" /mysql/logs/binlog.000002 /mysql/logs/binlog.000003 | mysql --user=fgedu_admin --password=StrongPassword123! # 步骤4:验证恢复结果 mysql>
SELECT * FROM fgedudb.fgedu_users LIMIT 10;
+—-+——+——————+————-+
| id | name | id_card | phone |
+—-+——+——————+————-+
| 1 | 张三 | 110101199001011234 | 13812345678 |
| 2 | 李四 | 310101199102022345 | 13987654321 |
| 3 | 王五 | 440101199203033456 | 13765432109 |
+—-+——+——————+————-+
3 rows in set (0.00 sec)
4.2 基于二进制日志的位置恢复
基于二进制日志的位置恢复是指将数据库恢复到指定二进制日志位置的状态,以下是具体的操作步骤。
# gzip -d /backup/mysql/full/full_backup_20260401_020000.sql.gz
# mysql –user=fgedu_admin –password=StrongPassword123! < /backup/mysql/full/full_backup_20260401_020000.sql # 步骤2:查看备份文件中的二进制日志位置 # head -50 /backup/mysql/full/full_backup_20260401_020000.sql -- Position to start replication or point-in-time recovery from -- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000002' , MASTER_LOG_POS=123456; # 步骤3:查看二进制日志文件,确定恢复的结束位置 # mysqlbinlog /mysql/logs/binlog.000002 | grep -n "DROP TABLE" 1234:DROP TABLE IF EXISTS `fgedu_users`; # 步骤4:应用二进制日志到指定位置 # mysqlbinlog --start-position=123456 --stop-position=1234 /mysql/logs/binlog.000002 | mysql --user=fgedu_admin --password=StrongPassword123! # 步骤5:验证恢复结果 mysql>
SHOW TABLES;
+——————-+
| Tables_in_fgedudb |
+——————-+
| fgedu_users |
| fgedu_orders |
+——————-+
2 rows in set (0.00 sec)
4.3 二进制日志恢复故障排查
在进行基于二进制日志的恢复时,可能会遇到各种问题,如二进制日志文件损坏、恢复位置错误等。以下是常见故障的排查方法。
# 解决方案:使用mysqlbinlog工具检查二进制日志文件
# mysqlbinlog –verify-binlog-checksum /mysql/logs/binlog.000002
# 问题2:恢复位置错误
# 解决方案:使用mysqlbinlog工具查看二进制日志内容,确定正确的恢复位置
# mysqlbinlog –start-position=123456 –stop-position=234567 /mysql/logs/binlog.000002 > /tmp/binlog.sql
# vi /tmp/binlog.sql
# 问题3:恢复过程中出现错误
# 解决方案:查看错误日志,分析错误原因
# tail -f /mysql/logs/error.log
# 问题4:二进制日志文件丢失
# 解决方案:从备份中恢复二进制日志文件,或使用最近的完全备份进行恢复
Part05-风哥经验总结与分享
通过多年的MySQL数据库管理经验,我总结了以下关于基于二进制日志恢复的关键点:
1. 二进制日志配置:启用二进制日志,使用ROW格式,设置合理的过期时间和大小限制,确保二进制日志的可靠性和安全性。
2. 备份策略:结合完全备份和增量备份,与二进制日志配合使用,确保数据的可恢复性。
3. 恢复计划:制定详细的恢复计划,包括备份文件的准备、二进制日志的收集、恢复步骤的制定等。
4. 恢复测试:定期进行恢复测试,验证备份和二进制日志的有效性,确保在实际灾难发生时能够快速响应。
5. 故障排查:掌握二进制日志恢复的常见故障排查方法,如二进制日志文件损坏、恢复位置错误等。
6. 最佳实践:建立完善的备份和恢复体系,包括备份策略、二进制日志管理、恢复测试等,确保数据的安全性和可恢复性。
定期进行恢复测试;6. 建立备份和恢复的监控机制;7. 制定详细的恢复计划和回滚方案。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
