mysql二进制日志

mysql二进制日志

  • Mysql二进制日志记录了所有对mysql的修改事件,包括增删改查和对表结构的修改
  • Mysql二进制日志记录的都是成功执行的语句,没有成功执行,回滚了的sql和语法错误的sql是不会写入这里的

binlog工具

binlog二进制日志的格式STATEMENT

基于段的格式 binglog_formart = STATEMENT
基于SQL语句的复制(SBR)
这种方式,记录的是执行的语句

优点:

  • 日志记录量相对较少,节约磁盘和网络I/O
  • 并不强制要求主从数据库的表定义相同
  • 相比基于行的复制更为灵活

缺点:

  • 必须要记录上下文信息,以保证语句在主服务器和从服务器上执行的结果相同
  • 对于特定的函数如UUID()user() 这些非确定性函数还是无法复制,如果使用这些函数,可能导致主从服务器上的数据不一致
  • 对于存储过程,触发器,自定义函数产生的修改也可能造成主从数据的不一致
  • 相比于基于行的复制,在从服务器上执行时需要更多的锁
#确定当前使用的是什么binglog格式
show variables like 'binlog_format';

#显示binlog日志
show binary logs;

#刷新binlog,这会产生一个新的binlog文件,方便测试
flush logs

#查看产生的binglog,使用mysqlbinlog命令。不要使用vim
mysqlbinlog mysql-bin.000053

mysqlbinlog -vv mysql-bin.000053

binlog二进制日志的格式ROW(建议的方式)

基于行的复制(RBR)
mysql5.7版本后的默认格式

基于行的格式 binglog_formart = ROW,这种格式记录了数据表中的增删改查行的信息

row格式可以避免mysql复制中出现的主从不一致的问题

同一SQL语句修改了10000条的情况下,基于段的格式(statement)只会记录这个SQL语句,而基于行的格式(row)会有10000条记录分别记录每一行的数据修改

优点:

  • 使mysql主从复制更加安全
  • 对每一行的数据修改比基于段的复制更高效,降低主从复制的延迟
  • 误操作而修改了数据库中的数据,同时又没有备份可以恢复时,我们可以通过分析二进制日志,对日志中记录的数据修改操作做反向处理的方式来达到恢复数据的目的
  • 可以应用于任何SQL的复制包括非确定函数、存储过程等
  • 可以减少从服务器锁的使用,增加并发性能

缺点:

  • 记录日志量较大,需要通过再配置一个参数控制记录的方式,binlog_row_image = [FULL | MINIMAL | NOBLOB]
  • 要求主从服务器上的表结构完全相同(包括字段顺序),否则可能会中断主从复制
  • 无法在从服务器上单独执行触发器
#查看binlog_row_image的方式,推荐使用MINIMAL ,只记录修改的列
SHOW VARIABLES LIKE 'binlog_row_image'

binlog二进制日志的格式MIXED

根据SQL语句由操作系统决定选择基于段(statement)或行(row)的格式记录日志

binlog二进制日志记录方式的选择

建议选择 row 或mixed

注意:
使用binlog二进制日志记录方式row时,需要再设置一个参数 binlog_row_image = MINIMAL

<think>好的,我现在需要帮助用户了解如何配置和使用MySQL二进制日志(binlog)。首先,我得回想一下自己之前学过的关于binlog的知识,以及结合用户提供的引用内容来组织回答。用户提到了几个引用,里面包括配置、查看、清理binlog,还有相关的错误和工具使用。我需要确保回答覆盖这些方面,同时结构清晰,分步骤说明。 首先,我应该解释binlog的基本功能,比如记录数据库的更改,用于主从复制和数据恢复。然后,配置部分需要提到修改my.cnf文件,开启log_bin参数,设置路径和文件名,可能还需要提到其他相关参数如expire_logs_days,用于自动清理日志。这里引用[1]提到了配置和清理,还有查看时的错误,比如字符集的问题,需要注意在配置时避免使用default_character-set这样的参数,可能导致mysqlbinlog工具报错。 接下来是使用方法,包括查看binlog内容。用户可能用mysqlbinlog命令,或者在MySQL内部使用SHOW BINARY LOGS等命令。引用[3]提到了SHOW BINLOG EVENTS,这也是需要提到的。另外,清理binlog的方法,比如PURGE BINARY LOGS和RESET MASTER,引用[1]和[3]都有涉及,这里要说明两者的区别和使用场景。 然后,注意事项部分需要提醒用户字符集的问题,避免mysqlbinlog报错,如引用[1]中的错误。还有主从复制中的应用,可能需要结合引用[5]提到的pymysqlreplication库,说明binlog在复制中的重要性。 最后生成相关问题,要覆盖用户可能感兴趣的扩展内容,比如主从复制配置、binlog格式差异、数据恢复步骤等。确保每个问题都基于回答中的内容,帮助用户进一步学习。 现在需要检查是否有遗漏的要点,比如binlog的三种格式(STATEMENT, ROW, MIXED),在配置部分是否需要提到binlog_format参数?用户的问题是关于配置和使用,所以可能需要简要说明格式的选择影响记录方式,但根据引用内容,用户提供的引用中没有提到这点,不过作为配置的一部分,应该包含进去,因为不同的格式会影响日志内容和应用场景。 另外,引用[4]提到了按时间查询日志并导出到SQL文件,这个在查看日志的使用方法里需要补充,比如使用mysqlbinlog的--start-datetime参数,并将结果输出到文件,方便后续恢复。 总结回答的结构应该是: 1. 功能介绍 2. 配置步骤(参数设置、路径、清理策略) 3. 使用方法(查看、清理、导出) 4. 注意事项(字符集、主从复制) 5. 示例命令 6. 相关问题 需要确保各部分内容正确,引用对应的参考文献。例如在配置部分引用[1]和[3],在查看日志时引用[1]的错误示例,清理部分引用[1]和[3],导出部分引用[4],主从复制引用[5]。 同时,要注意用户提到的所有引用都要适当引用,比如引用[2]提到日志文件序列号递增,可以在配置部分说明日志文件的生成方式。 可能还需要提到mysqlbinlog工具的使用方法,包括处理乱码问题,如引用[2]提到的日志文件乱码,但用户的问题中没有直接问这个,可能放在注意事项里提示字符集配置。 现在组织语言,用中文分步骤说明,确保LaTeX格式正确,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能涉及较少数学公式,更多是配置命令和代码块。需要检查是否有需要用到LaTeX的地方,比如参数名可能不需要,但如果有变量或方程则需要。例如expire_logs_days=7是一个参数,直接写出来即可,不需要LaTeX。 最后,生成的相关问题要围绕binlog的功能、配置、使用、优化、应用场景等,确保用户能进一步探索。</think>### 如何配置和使用 MySQL 二进制日志(binlog) #### 1. 功能介绍 MySQL 二进制日志(binlog)记录所有对数据库的修改操作,包括数据更改(如 INSERT、UPDATE、DELETE)和表结构变更(如 CREATE TABLE)。主要用途包括: - **数据恢复**:通过重放日志恢复误删或损坏的数据[^1]。 - **主从复制**:主库通过 binlog 同步数据到从库[^5]。 - **审计**:分析数据库操作历史。 --- #### 2. 配置步骤 ##### (1) 修改配置文件 编辑 MySQL 配置文件 `my.cnf`(Linux)或 `my.ini`(Windows),添加以下参数: ```ini [mysqld] # 启用 binlog log_bin = /var/log/mysql/mysql-bin.log # 设置日志格式(可选:STATEMENT/ROW/MIXED) binlog_format = ROW # 自动清理过期日志(单位:天) expire_logs_days = 7 # 单个日志文件大小(默认 1G) max_binlog_size = 100M ``` - `log_bin`:指定日志存储路径和文件名前缀。若不指定路径,默认存放在数据目录下,文件名格式为 `mysql-bin.000001`[^2]。 - `binlog_format`:建议使用 `ROW` 格式以记录行级变更,避免主从复制不一致问题。 ##### (2) 重启 MySQL 服务 ```bash systemctl restart mysqld ``` --- #### 3. 使用方法 ##### (1) 查看 binlog 文件列表 ```sql SHOW BINARY LOGS; ``` 输出示例: ``` +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 10485760 | | mysql-bin.000002 | 5242880 | +------------------+-----------+ ``` ##### (2) 查看日志内容 - **命令行工具**: ```bash mysqlbinlog --start-datetime="2024-08-22 00:00:00" mysql-bin.000014 > backup.sql ``` 注意:若报错 `unknown variable 'default_character-set=utf8mb4'`,需在命令中添加 `--no-defaults` 参数[^1]。 - **MySQL 内部查询**: ```sql SHOW BINLOG EVENTS IN 'mysql-bin.000003'; ``` ##### (3) 清理日志 - **手动删除指定日志**: ```sql PURGE BINARY LOGS TO 'mysql-bin.000005'; -- 删除 000001~000004 ``` - **重置所有日志**: ```sql RESET MASTER; -- 清空全部 binlog(慎用!) ``` ##### (4) 导出日志用于恢复 按时间范围导出日志到 SQL 文件: ```bash mysqlbinlog --start-datetime="2024-08-22 00:00:00" --stop-datetime="2024-08-23 00:00:00" mysql-bin.000014 > recovery.sql ``` 执行恢复: ```bash mysql -u root -p < recovery.sql ``` --- #### 4. 注意事项 1. **字符集问题**: 使用 `mysqlbinlog` 时,若配置文件中包含 `default_character-set` 参数,可能因版本兼容性问题导致报错。建议改用 `--no-defaults` 参数[^1]。 2. **主从复制**: binlog 是主从复制的核心组件。从库通过 `BinLogStreamReader` 等工具(如 Python 库 `mysql-replication`)解析主库日志并同步数据。 3. **日志格式选择**: - `STATEMENT`:记录 SQL 语句,但可能因函数调用导致主从不一致。 - `ROW`(推荐):记录行级变更,日志量较大但准确性高。 - `MIXED`:混合模式,根据操作自动选择格式。 --- #### 5. 示例配置 ```ini [mysqld] server_id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_format = ROW expire_logs_days = 7 max_binlog_size = 100M ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值