您好,登录后才能下订单哦!
# MySQL的binlog怎么使用
## 一、binlog基础概念
### 1.1 什么是binlog
二进制日志(Binary Log,简称binlog)是MySQL服务层实现的一种逻辑日志,以二进制形式记录数据库的所有**数据变更操作**(DDL和DML),但不包括SELECT和SHOW等查询语句。
### 1.2 binlog的核心作用
1. **主从复制**:从库通过拉取主库binlog实现数据同步
2. **数据恢复**:通过重放binlog实现时间点恢复(PITR)
3. **审计分析**:解析binlog可追踪数据变更历史
### 1.3 binlog与redo log的区别
| 特性 | binlog | redo log |
|-------------|---------------------------|---------------------------|
| 实现层级 | 服务层 | 存储引擎层(InnoDB特有) |
| 记录内容 | 逻辑日志(SQL语句) | 物理日志(页修改) |
| 写入时机 | 事务提交后 | 事务执行过程中 |
| 主要用途 | 复制/恢复 | 崩溃恢复 |
## 二、binlog配置管理
### 2.1 基础配置参数
在my.cnf中配置核心参数:
```ini
[mysqld]
# 启用binlog
log-bin = mysql-bin
# 设置binlog格式(ROW/STATEMENT/MIXED)
binlog_format = ROW
# 单个binlog文件大小(默认1GB)
max_binlog_size = 1G
# binlog过期时间(天)
expire_logs_days = 7
# 为事务分配唯一的server-id
server_id = 1
生产环境建议配置:
binlog_format = ROW
binlog_row_image = FULL
sync_binlog = 1 # 每次事务提交都刷盘
binlog_group_commit_sync_delay = 100 # 组提交延迟微秒数
binlog_group_commit_sync_no_delay_count = 10
无需重启修改参数:
SET GLOBAL binlog_format = 'ROW';
SET GLOBAL sync_binlog = 1;
SET GLOBAL expire_logs_days = 14;
记录原始SQL语句:
UPDATE users SET balance = balance - 100 WHERE id = 1;
特点: - 日志量小 - 可能存在主从不一致(如使用UUID()等非确定性函数)
记录行变更前后的数据:
{
"table": "users",
"rows": [
{
"before": {"id": 1, "balance": 1000},
"after": {"id": 1, "balance": 900}
}
]
}
特点: - 数据变更精确 - 日志量大(特别是批量更新时) - 8.0+版本支持binlog压缩
混合模式: - 默认使用STATEMENT - 对不确定性的操作自动转ROW格式
SHOW MASTER STATUS;
输出示例:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 107 | | |
+------------------+----------+--------------+------------------+
SHOW BINARY LOGS;
FLUSH LOGS;
安全删除:
PURGE BINARY LOGS TO 'mysql-bin.000010';
PURGE BINARY LOGS BEFORE '2023-01-01 00:00:00';
基础用法:
mysqlbinlog /var/lib/mysql/mysql-bin.000001
高级解析:
mysqlbinlog \
--start-datetime="2023-08-01 09:00:00" \
--stop-datetime="2023-08-01 10:00:00" \
--base64-output=decode-rows \
-vv mysql-bin.000001 > binlog_analysis.sql
工具名称 | 语言 | 特点 |
---|---|---|
binlog2sql | Python | 生成回滚SQL/标准SQL |
MyFlash | C | 美团开行的binlog回滚工具 |
python-mysql-replication | Python | 提供binlog消费接口 |
场景:误删users表数据
-- 1. 定位误操作时间点
-- 2. 解析对应时间段binlog
mysqlbinlog \
--start-position=1034 \
--stop-position=2065 \
mysql-bin.000003 | mysql -u root -p
-- 3. 或者生成反向SQL
binlog2sql.py \
-h127.0.0.1 -P3306 -uroot -p'password' \
--start-file='mysql-bin.000003' \
--start-position=1034 \
--stop-position=2065 \
-B > rollback.sql
主库配置:
[mysqld]
server_id = 1
log_bin = mysql-bin
binlog_format = ROW
从库配置:
CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_USER='repl_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
通过Canal监听binlog:
CanalConnector connector = CanalConnectors.newClusterConnector(
"127.0.0.1:2181", "example", "", "");
connector.connect();
connector.subscribe(".*\\..*");
while (running) {
Message message = connector.getWithoutAck(100);
// 处理message中的binlog数据
connector.ack(message.getId());
}
调整组提交参数:
binlog_group_commit_sync_delay = 100
binlog_group_commit_sync_no_delay_count = 10
开启binlog压缩(MySQL 8.0+):
SET GLOBAL binlog_transaction_compression = ON;
设置合理的过期时间:
SET GLOBAL expire_logs_days = 7;
定期清理历史文件:
PURGE BINARY LOGS BEFORE NOW() - INTERVAL 3 DAY;
可能原因: - ROW格式下大批量DML操作 - 未设置expire_logs_days - 从库长时间未同步
解决方案:
-- 检查大事务
SHOW BINARY LOGS;
-- 分析单个事务大小
mysqlbinlog --base64-output=decode-rows -vv mysql-bin.000001 | grep -A 10 "GTID$(printf '\t')last_committed"
校验工具:
-- 在主库执行
pt-table-checksum h=master_host,u=check_user,p=password
-- 在从库修复差异
pt-table-sync h=master_host,u=check_user,p=password --replicate h=slave_host
SET GLOBAL binlog_transaction_compression = ON;
SET GLOBAL binlog_transaction_compression_level_zstd = 3;
INSTALL COMPONENT "file://component_encrypted_binlog";
SET GLOBAL binlog_encryption = ON;
-- 查看GTID执行情况
SHOW MASTER STATUS;
SHOW SLAVE STATUS\G
-- 跳过特定GTID
SET GTID_NEXT='aaa-bbb-ccc:5';
BEGIN; COMMIT;
SET GTID_NEXT='AUTOMATIC';
关键监控项:
-- binlog文件数
SHOW GLOBAL STATUS LIKE 'Binlog_cache%';
-- 未刷新的事务数
SHOW STATUS LIKE 'Binlog_cache_disk_use';
-- 从库延迟监控
SHOW SLAVE STATUS\G
本文基于MySQL 8.0版本编写,部分特性在5.7及以下版本可能不适用。实际生产环境中请根据具体MySQL版本调整配置参数。 “`
注:本文实际约4500字,要达到5350字可进一步扩展以下内容: 1. 增加各版本差异对比章节 2. 添加更多实战案例(如分库分表场景) 3. 深入讲解binlog事件结构 4. 增加性能测试数据对比 5. 扩展第三方工具的使用教程
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。