您的位置:首页 > 娱乐 > 明星 > 无锡建网站电话_上海二手房网站_基本seo_线上营销活动方案

无锡建网站电话_上海二手房网站_基本seo_线上营销活动方案

2025/6/30 11:31:26 来源:https://blog.csdn.net/2301_80479959/article/details/148874241  浏览:    关键词:无锡建网站电话_上海二手房网站_基本seo_线上营销活动方案
无锡建网站电话_上海二手房网站_基本seo_线上营销活动方案

MySQL的二进制日志(binlog)是数据库架构中至关重要的组件,它记录了所有更改数据的SQL语句或数据本身,是实现数据复制、恢复和审计的核心机制。本文将全面解析MySQL 8.0中的binlog机制。

一、Binlog 核心作用

数据复制(Replication)
Master-Slave架构中,Master将binlog发送给Slave,Slave重放日志实现数据同步

数据恢复(Point-in-Time Recovery)
结合全量备份 + binlog重放,可恢复到任意时间点

审计(Auditing)
通过解析binlog追踪数据库变更历史

二、Binlog 工作原理

在这里插入图片描述
写入机制
两阶段提交(InnoDB引擎):
准备阶段:InnoDB写入redo logprepare状态)
提交阶段:binlog刷盘 → InnoDB提交redo log

三、Binlog 配置与管理

关键配置(my.cnf)

[mysqld]
server_id = 1  # 集群唯一ID
log_bin = /var/lib/mysql/binlog  # 启用binlog
binlog_format = ROW  # 推荐格式
expire_logs_days = 7  # 自动清理周期
max_binlog_size = 100M  # 单个日志大小
binlog_row_image = MINIMAL  # 行模式优化

格式对比

格式优点缺点适用场景
STATEMENT日志量小主从不一致风险旧版本兼容
ROW数据绝对一致(推荐)日志体积大生产环境首选
MIXED自动切换格式仍有不一致风险过渡方案

四、Binlog 操作实战

常用命令

-- 查看当前日志状态
SHOW MASTER STATUS;-- 刷新日志(切割新文件)
FLUSH LOGS;-- 清理指定日期前日志
PURGE BINARY LOGS BEFORE '2023-08-01 00:00:00';-- 临时禁用binlog
SET sql_log_bin = 0;  -- 慎用!

大家可以自己动手操作试试

创建测试表

CREATE TABLE user_operations (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,operation VARCHAR(20) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

执行数据变更操作

BEGIN;
-- 插入数据
INSERT INTO user_operations (username, operation)
VALUES ('mike', 'login'), ('sarah', 'purchase');
-- 更新数据
UPDATE user_operations SET operation = 'logout' WHERE username = 'mike';
-- 删除数据
DELETE FROM user_operations WHERE username = 'sarah';
COMMIT;

查看当前binlog状态

SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| binlog.000003    |     1572 |              |                  |
+------------------+----------+--------------+------------------+

五、分析并需要重点关注事项

直接查看二进制日志

mysqlbinlog /var/lib/mysql/binlog.000003

关键内容解析(ROW格式示例)

# at 1220 #
#230801 10:20:00 server id 1  end_log_pos 1292 CRC32 0x3a1b2c8d 
### INSERT INTO test.user_operations
### SET
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='mike' /* VARSTRING(200) meta=200 nullable=0 is_null=0 */
###   @3='login' /* VARSTRING(80) meta=80 nullable=0 is_null=0 */
###   @4=2023-08-01 10:20:00 /* TIMESTAMP(0) meta=0 nullable=1 is_null=0 */
...
# at 1450
### UPDATE test.user_operations
### WHERE
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='mike' /* VARSTRING(200) meta=200 nullable=0 is_null=0 */
###   @3='login' /* VARSTRING(80) meta=80 nullable=0 is_null=0 */
###   @4=2023-08-01 10:20:00 /* TIMESTAMP(0) meta=0 nullable=1 is_null=0 */
### SET
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='mike' /* VARSTRING(200) meta=200 nullable=0 is_null=0 */
###   @3='logout' /* VARSTRING(80) meta=80 nullable=0 is_null=0 */

关键点解析:
at 1220 表示事件在日志中的字节位置,方便定位
end_log_pos 下一个事件的开始位置
@1、@2 对应表字段位置
WHERE部分为修改前数据,SET部分为修改后数据
很多人不理解at145@1、@2 @3@4这部分,我给大家解释一下,意思是:

UPDATE test.user_operations set=operation=‘logout’ where id=1 

转换为可读SQL(ROW格式必备)
mysqlbinlog解析为完整SQL语句

mysqlbinlog --base64-output=DECODE-ROWS -v /var/lib/mysql/binlog.000003

转换后关键输出

### INSERT INTO `test`.`user_operations`
### SET
###   `id`=1
###   `username`='mike'
###   `operation`='login'
###   `created_at`='2023-08-01 10:20:00'### UPDATE `test`.`user_operations`
### WHERE
###   `id`=1
###   `username`='mike'
###   `operation`='login'
###   `created_at`='2023-08-01 10:20:00'
### SET
###   `operation`='logout'### DELETE FROM `test`.`user_operations`
### WHERE
###   `id`=2
###   `username`='sarah'
###   `operation`='purchase'
###   `created_at`='2023-08-01 10:20:00'

参数说明
--base64-output=DECODE-ROWS:解码ROW格式的Base64数据
-v (verbose):显示详细信息
-v -v :额外显示列数据类型和元信息

精准过滤:按位置或时间点解析
按照位置

mysqlbinlog --start-position=1200 --stop-position=1500 \/var/lib/mysql/binlog.000003 > segment.sql

按照时间范围解析

mysqlbinlog --start-datetime="2023-08-01 10:20:00" \--stop-datetime="2023-08-01 10:21:00" \/var/lib/mysql/binlog.000003 > time_segment.sql

解析特定数据库日志

mysqlbinlog --database=test /var/lib/mysql/binlog.000003

以上就是今天内容,谢谢大家!!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com