mysql binlog 参数_MySQL 8.0 新增参数 binlog_row_metadata

MySQL 8.0.1引入的binlog_row_metadata参数,当设置为FULL时,会在ROW格式的binlog中记录完整的表元数据信息,包括符号、字段名称等,以便于在不同表结构环境下进行数据转换和第三方工具解析。然而,这也会导致binlog文件增大,占用更多磁盘空间和网络带宽。例如,与MINIMAL模式相比,FULL模式下的binlog大小增加了约100字节。在OLTP场景和小事务频繁的情况下,这一变化尤为显著。

binlog_row_metadata 参数是 MySQL 8.0.1 版本引入的新参数,当 binlog 格式为ROW时,设置该参数为FULL,会将表完整的元数据信息写入到binlog文件中。

binlog_row_metadata:

动态修改:是

全局变量:是

可选值:FULL,MINIMAL

默认值:MINIMAL

基于ROW格式的binlog,在记录DML语句产生的binlog event时,总会先记录一个table_map类型的event,table_map记录了表结构相关的元数据,比如数据库名称,表名称,表的字段类型,表的字段大小,精度等元数据。这些元数据并不完整,比如缺少数值类型的符号信息(signed, unsigned),缺少字段名称,缺少set和enum类型的字符串定义,缺少主键信息,缺少地理空间数据类型的具体分类等等。当binlog_row_metadata参数设置为FULL时,binlog 日志就会记录完整的表元数据信息。

举一个例子,binlog2sql 工具应该很多人都熟悉,它是一个非常好用的在线binlog解析工具,注意在线两个字,这个工具需要连接到MySQL才能解析binlog,因为它需要从MySQL里面获取binlog缺失的表元数据,而8.0设置binlog_row_metadata为FULL,就不再需要连接MySQL,解析binlog就能获取完整的表元数据信息。

binlog_row_metadata设置为FULL带来的好处:

当从库的表结构与主库不同时,可以利用完整的表元数据做转换。

第三方工具可以使用完整的表元数据信息解析binlog行数据,然后将其存储在其他数据库。

binlog_row_metadata设置为FULL带来的坏处:

存储完整的表元数据信息导致binlog文件变大,占用磁盘空间。

binlog文件变大,占用网络带宽。

测试sysbench表,插入同样的3条记录,binlog大小对比:

FULL:1130 字节

MINIMAL:1030字节

显然配置为FULL,会导致binlog文件变大,尤其是oltp,小事务多的场景下,binlog文件变大更加明显。

<think>好的,用户现在想根据之前生成的binlog_analysis.sql文件找到执行删除操作的账号。之前我已经介绍了如何通过binlog恢复数据,现在需要补充如何追踪操作者账号的信息。首先,我得回忆一下MySQLbinlog中是否记录了执行操作的账号信息。 一般来说,binlog中会记录每个事务的上下文信息,包括时间戳、服务器ID、线程ID等。但是默认情况下,binlog可能不会直接记录用户名和主机信息。不过,如果开启了特定的参数,比如log_bin_trust_function_creators或者binlog_annotate_row_events,可能会有更多的信息。不过这些参数可能不是默认开启的,需要用户确认。 接下来,用户可能需要通过binlog中的信息间接找到账号。比如,通过线程ID(thread_id)结合系统表来查找。在MySQL中,每个连接都有一个线程ID,而performance_schema中的processlist表或者information_schema.processlist可以查看当前连接的线程信息,包括用户和主机。但问题是,binlog中的事件发生时对应的线程ID可能已经不存在了,除非用户当时有记录或者有监控。 另外,用户可能需要检查是否有审计日志(audit log)开启,因为审计日志通常会记录详细的操作信息,包括执行者账号。但如果没有开启审计日志,就需要依赖其他方法。 还有一种情况是,如果数据库使用的是ROW格式的binlog,可能不会直接记录执行者信息,而STATEMENT格式的binlog会记录原始SQL语句,但同样可能不包含用户信息。需要用户确认binlog格式。 总结下来,可能的步骤是:首先检查binlog是否包含用户信息,如果没有,通过线程ID结合历史数据或监控日志找到对应的用户,或者检查是否有审计日志。同时,用户需要确认他们的MySQL配置是否支持记录这些信息,或者是否有其他途径可以追踪账号。 需要注意的是,如果用户的环境没有开启相关日志或监控,可能无法直接通过binlog找到操作账号,这时候可能需要其他方法,比如检查应用程序日志,或者数据库的访问日志等。此外,提醒用户未来如何配置MySQL以便记录这些信息,比如开启审计日志或者调整binlog参数,也是必要的。</think>通过binlog定位操作账号的步骤如下(需满足MySQL特定配置条件): 1. 确认必要信息记录 ```sql SHOW VARIABLES LIKE 'binlog_rows_query_log_events%'; ``` - 若为ON时,binlog会记录原始客户端信息 2. 关键字段解析(在binlog事件头中查找): ```log # at 1234 #240601 14:30:00 server id 1 end_log_pos 1356 CRC32 0xabcd1234 # Thread_id=5 exec_time=0 error_code=0 # User@Host: root[root] @ [192.168.1.100] Id: 5 # Query_time: 0.123 Lock_time: 0.000 Rows_sent: 0 Rows_examined: 0 SET TIMESTAMP=1717216200/*!*/; BEGIN /*!*/; ``` 3. 具体查找步骤: ```bash grep -A 5 "DELETE FROM \`数据库名\`.\`表名\`" binlog_analysis.sql ``` 在找到的DELETE语句上方: - `User@Host` 显示执行账号(格式:用户名[数据库账号] @ 客户端地址) - `Thread_id` 对应连接线程ID 4. 若未直接显示账号: ```sql -- 通过线程ID关联系统表(需在操作发生时存在连接) SELECT * FROM performance_schema.threads WHERE THREAD_ID = [binlog中的thread_id]; -- 或查询历史连接记录(需开启general_log) SELECT * FROM mysql.general_log WHERE thread_id = [thread_id] AND command_type = 'Query'; ``` 5. 审计日志配合查询(需开启审计插件): ```sql SELECT * FROM mysql.audit_log WHERE command_class = 'delete' AND event_time BETWEEN '开始时间' AND '结束时间'; ``` 必要条件说明: 1. 需要满足以下至少一项: - 开启`binlog_rows_query_log_events`(5.6+版本可用) - 启用审计日志(企业版功能) - 开启`init_connect`参数记录登录信息 2. 若使用MySQL 8.0+,可通过以下配置增强追踪: ```ini [mysqld] binlog_metadata=full # 记录完整元数据 log_bin_trust_function_creators=ON ``` 常见限制及解决方法: 1. 若显示`User@Host: root[root] @ localhost []`: - 检查是否通过本地socket连接 - 确认应用使用的数据库账号 2. 若只能获取thread_id: - 结合监控系统(如Zabbix)的历史进程列表 - 检查同一时间段的其他SQL操作特征 3. 若账号显示为`[system user]`: - 可能是后台线程或事件调度程序 - 检查是否有定时任务(`SHOW EVENTS`) 预防性配置建议: ```sql -- 开启连接审计(所有版本可用) SET GLOBAL general_log = 'ON'; -- 创建审计表(社区版替代方案) CREATE TABLE cmd_audit ( id INT AUTO_INCREMENT PRIMARY KEY, user_host VARCHAR(256) NOT NULL, event_time DATETIME(6) NOT NULL, command TEXT ) ENGINE=ARCHIVE; DELIMITER // CREATE TRIGGER audit_trigger AFTER INSERT ON mysql.general_log FOR EACH ROW BEGIN INSERT INTO cmd_audit VALUES (NEW.user_host, NOW(6), NEW.argument); END// DELIMITER ; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值