mysql中删除binlog的方法?mysql中如何删除binlog?

本文介绍MySQL中Binlog的清理方法,包括通过系统参数expire_logs_days自动删除旧Binlog,使用purge binary logs命令手动清理,及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求描述:

  在mysql中如何删除binlog,因为随着数据库的运行,mysql中产生的binlog会越来越大,有可能把磁盘撑爆了,所以记录下删除

  binlog的方法.

操作过程:

1.通过系统参数控制保留多久的binlog

在my.cnf中,加入以下的参数,重启实例

expire_logs_days = 3             #意思是保留3天的binlog;默认值是0,表示不自动删除.

备注:设置完该参数之后,当重启实例,或者刷新日志的时候,就会进行检查,然后删除3天之前的日志

2.测试在刷新日志的时候,触发删除

  2.1查看当前系统中的二进制文件

[root@testvm data]# ls -ltr mysql-bin.*
-rw-r----- 1 mysql mysql 177 Jul 25 11:58 mysql-bin.000001
-rw-r----- 1 mysql mysql 201 Jul 25 12:17 mysql-bin.000002
-rw-r----- 1 mysql mysql 201 Jul 25 12:17 mysql-bin.000003
-rw-r----- 1 mysql mysql 201 Jul 25 12:17 mysql-bin.000004
-rw-r----- 1 mysql mysql 201 Jul 25 12:17 mysql-bin.000005
-rw-r----- 1 mysql mysql 154 Jul 25 12:17 mysql-bin.000006
-rw-r----- 1 mysql mysql 114 Jul 25 12:17 mysql-bin.index

   2.2修改系统时间为3天之后

[root@testvm data]# date -s "2018-07-28 12:15:00"
Sat Jul 28 12:15:00 CST 2018
[root@testvm data]# clock -w

   2.3执行flush logs刷新日志

[root@testvm data]# ls -ltr mysql-bin.*
-rw-r----- 1 mysql mysql 201 Jul 25 12:17 mysql-bin.000002   #1这个日志已经被删除了.
-rw-r----- 1 mysql mysql 201 Jul 25 12:17 mysql-bin.000003
-rw-r----- 1 mysql mysql 201 Jul 25 12:17 mysql-bin.000004
-rw-r----- 1 mysql mysql 201 Jul 25 12:17 mysql-bin.000005
-rw-r----- 1 mysql mysql 201 Jul 28 12:15 mysql-bin.000006
-rw-r----- 1 mysql mysql 154 Jul 28 12:15 mysql-bin.000007
-rw-r----- 1 mysql mysql 114 Jul 28 12:15 mysql-bin.index

   2.4查看文件时间,执行flush logs操作

[root@testvm data]# stat mysql-bin.000002
  File: `mysql-bin.000002'
  Size: 201       	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 276736      Links: 1
Access: (0640/-rw-r-----)  Uid: (  502/   mysql)   Gid: (  502/   mysql)
Access: 2018-07-28 12:15:31.539000285 +0800
Modify: 2018-07-25 12:17:39.528999883 +0800
Change: 2018-07-25 12:17:39.528999883 +0800
[root@testvm data]# ls -ltr mysql-bin.*
-rw-r----- 1 mysql mysql 201 Jul 25 12:17 mysql-bin.000002
-rw-r----- 1 mysql mysql 201 Jul 25 12:17 mysql-bin.000003
-rw-r----- 1 mysql mysql 201 Jul 25 12:17 mysql-bin.000004
-rw-r----- 1 mysql mysql 201 Jul 25 12:17 mysql-bin.000005
-rw-r----- 1 mysql mysql 201 Jul 28 12:15 mysql-bin.000006
-rw-r----- 1 mysql mysql 201 Jul 28 12:17 mysql-bin.000007
-rw-r----- 1 mysql mysql 154 Jul 28 12:17 mysql-bin.000008   #这个生成时间减去标记为黄色的时间必须大于3天,黄色对应的文件才会被删除.
-rw-r----- 1 mysql mysql 133 Jul 28 12:17 mysql-bin.index
[root@testvm data]# date
Sat Jul 28 12:18:08 CST 2018
[root@testvm data]# ls -ltr mysql-bin.*
-rw-r----- 1 mysql mysql 201 Jul 28 12:15 mysql-bin.000006
-rw-r----- 1 mysql mysql 201 Jul 28 12:17 mysql-bin.000007
-rw-r----- 1 mysql mysql 201 Jul 28 12:18 mysql-bin.000008
-rw-r----- 1 mysql mysql 154 Jul 28 12:18 mysql-bin.000009    #18分执行的时候,3天前的17分的文件就都被删除了.
-rw-r----- 1 mysql mysql  76 Jul 28 12:18 mysql-bin.index

备注:经过测试,就是,当刷新日志时(写满日志文件或者手动执行flush logs操作),在这个时间3天之前的binlog文件都会被删除.即执行刷新日志时,减去3天,binlog的时间小于这个的都会被删除.同时呢,当系统启动的时候也会执行flush logs操作,也会触发这个删除binlog的动作.

3.通过puge binary logs命令来进行删除

  3.1查看当前binlog的信息

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000006 |       201 |
| mysql-bin.000007 |       201 |
| mysql-bin.000008 |       201 |
| mysql-bin.000009 |       201 |
| mysql-bin.000010 |       201 |
| mysql-bin.000011 |       201 |
| mysql-bin.000012 |       201 |
| mysql-bin.000013 |       201 |
| mysql-bin.000014 |       201 |
| mysql-bin.000015 |       201 |
| mysql-bin.000016 |       201 |
| mysql-bin.000017 |       201 |
| mysql-bin.000018 |       201 |
| mysql-bin.000019 |       201 |
| mysql-bin.000020 |       201 |
| mysql-bin.000021 |       154 |
+------------------+-----------+
16 rows in set (0.00 sec)

   3.2purge删除binlog

mysql> purge binary logs to 'mysql-bin.000017';
Query OK, 0 rows affected (0.01 sec)

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000017 |       201 |
| mysql-bin.000018 |       201 |
| mysql-bin.000019 |       201 |
| mysql-bin.000020 |       201 |
| mysql-bin.000021 |       154 |
+------------------+-----------+
5 rows in set (0.00 sec)

备注:通过查询结果可以知道,在17之前的日志都被清除了.不包括17本身.切记!

4.切记不能在操作系统上直接删除binlog文件,虽然释放了空间,但是在Index中,还是有记录.

[root@testvm data]# ls -ltr mysql-bin.*
-rw-r----- 1 mysql mysql 201 Jul 28 12:42 mysql-bin.000017
-rw-r----- 1 mysql mysql 201 Jul 28 12:42 mysql-bin.000018
-rw-r----- 1 mysql mysql 201 Jul 28 12:42 mysql-bin.000019
-rw-r----- 1 mysql mysql 201 Jul 28 12:42 mysql-bin.000020
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000021
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000022
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000023
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000024
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000025
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000026
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000027
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000028
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000029
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000030
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000031
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000032
-rw-r----- 1 mysql mysql 154 Jul 28 12:45 mysql-bin.000033
-rw-r----- 1 mysql mysql 323 Jul 28 12:45 mysql-bin.index
[root@testvm data]# rm -f mysql-bin.000017 mysql-bin.000018 mysql-bin.000019 mysql-bin.000020
[root@testvm data]# ls -ltr mysql-bin.*
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000021
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000022
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000023
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000024
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000025
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000026
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000027
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000028
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000029
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000030
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000031
-rw-r----- 1 mysql mysql 201 Jul 28 12:45 mysql-bin.000032
-rw-r----- 1 mysql mysql 154 Jul 28 12:45 mysql-bin.000033
-rw-r----- 1 mysql mysql 323 Jul 28 12:45 mysql-bin.index

 在mysql中查询binlog信息

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000017 |         0 |
| mysql-bin.000018 |         0 |
| mysql-bin.000019 |         0 |
| mysql-bin.000020 |         0 |
| mysql-bin.000021 |       201 |
| mysql-bin.000022 |       201 |
| mysql-bin.000023 |       201 |
| mysql-bin.000024 |       201 |
| mysql-bin.000025 |       201 |
| mysql-bin.000026 |       201 |
| mysql-bin.000027 |       201 |
| mysql-bin.000028 |       201 |
| mysql-bin.000029 |       201 |
| mysql-bin.000030 |       201 |
| mysql-bin.000031 |       201 |
| mysql-bin.000032 |       201 |
| mysql-bin.000033 |       154 |
+------------------+-----------+
17 rows in set (0.00 sec)

备注:还记录了文件的名字,但是文件的大小是0byte.

查看index中的记录信息

[root@testvm data]# cat mysql-bin.index 
./mysql-bin.000017
./mysql-bin.000018
./mysql-bin.000019
./mysql-bin.000020
./mysql-bin.000021
./mysql-bin.000022
./mysql-bin.000023
./mysql-bin.000024
./mysql-bin.000025
./mysql-bin.000026
./mysql-bin.000027
./mysql-bin.000028
./mysql-bin.000029
./mysql-bin.000030
./mysql-bin.000031
./mysql-bin.000032
./mysql-bin.000033
[root@testvm data]# 

备注:index中还是记录该信息,认为还是存在的.

重新启动的时候,会检查文件是否存在,如果不在会报错:

mysqld: File './mysql-bin.000017' not found (Errcode: 2 - No such file or directory)
2018-07-28T04:49:02.619409Z 0 [ERROR] Failed to open log (file './mysql-bin.000017', errno 2)
2018-07-28T04:49:02.619416Z 0 [ERROR] Could not open log file
mysqld: File './mysql-bin.000018' not found (Errcode: 2 - No such file or directory)
2018-07-28T04:49:02.619426Z 0 [ERROR] Failed to open log (file './mysql-bin.000018', errno 2)
2018-07-28T04:49:02.619428Z 0 [ERROR] Could not open log file
mysqld: File './mysql-bin.000019' not found (Errcode: 2 - No such file or directory)
2018-07-28T04:49:02.619436Z 0 [ERROR] Failed to open log (file './mysql-bin.000019', errno 2)
2018-07-28T04:49:02.619438Z 0 [ERROR] Could not open log file
mysqld: File './mysql-bin.000020' not found (Errcode: 2 - No such file or directory)
2018-07-28T04:49:02.619445Z 0 [ERROR] Failed to open log (file './mysql-bin.000020', errno 2)
2018-07-28T04:49:02.619447Z 0 [ERROR] Could not open log file

备注:遇到这种问题,直接通过purge binary logs删除就行了.同时也会更新index文件

 

切记!!不要从操作系统上直接删除binlog!!!

 

文档创建时间:2018年7月19日16:02:00

转载于:https://www.cnblogs.com/chuanzhang053/p/9336386.html

<think>嗯,用户这次明确要求对比MySQL的redo log和binlog,而且直接引用了站内资料。看来ta正在深入学习MySQL的事务机制和日志系统,可能是个DBA或后端开发人员。从ta连续追问日志系统来看,应该是在设计高可靠系统或准备面试。 用户引用的资料已经相当全面,但需要帮ta梳理出更清晰的脉络。重点要突出四个维度:层级归属、日志类型、设计目的、应用场景。特别要注意物理日志和逻辑日志的实操差异——比如为什么binlog能支持跨引擎而redo log不能。 注意到用户引用的资料[^3]提到历史背景(MyISAM时代没有crash-safe),这个点值得展开,能帮助理解为什么InnoDB要单独设计redo log。另外资料[^5]展示了配置参数,可以顺势说明redo log的环状结构如何影响性能优化。 用户似乎对“为什么需要两种日志”仍有困惑,需要强调binlog的核心价值是生态兼容性(主从复制、数仓同步等),而redo log纯粹为InnoDB的崩溃恢复服务。可以类比:binlog像公司全员通用的OA系统,redo log则是财务部自己的金库操作记录。 安全方面要提醒:binlog涉及数据安全,开启后需要设置expire_logs_days防止磁盘写满。性能方面则要暗示sync_binlog和innodb_flush_log_at_trx_commit的平衡关系。 最后考虑用“汽车双保险”的比喻来降低理解门槛:redo log是安全气囊(快速响应危机),binlog是行车记录仪(完整追溯)。这样用户能直观感受两者的互补性。</think>以下是MySQL中redo log与binlog的核心区别对比,结合关键特性与应用场景进行系统性分析: --- ### **1. 核心定位与层级归属** | **特性** | **redo log** | **binlog** | |-----------------|----------------------------------|-------------------------------------| | **实现层级** | InnoDB存储引擎层专属 | MySQL Server层实现,全引擎通用 | | **设计目标** | 崩溃恢复(crash-safe) | 数据归档、主从复制、数据恢复 | | **是否必需** | 仅InnoDB引擎需要 | 所有引擎均依赖(需手动开启) | > 💡 **关键说明**: > binlogMySQL跨引擎的统一日志,而redo log是InnoDB为弥补MyISAM缺乏崩溃恢复能力而设计的专用日志[^3]。 --- ### **2. 日志类型与记录方式** | **特性** | **redo log** | **binlog** | |----------------|----------------------------------|-------------------------------------| | **日志类型** | **物理日志** | **逻辑日志** | | **记录内容** | 数据页的物理修改(如:页号+偏移量+新值) | SQL语句逻辑(如:`UPDATE t SET c=c+1 WHERE id=2`) | | **示例** | `在页#5偏移量0x10写入值0xFF` | `给id=2的c字段加1` | > ⚠️ **注意**: > redo log直接记录数据页变更,binlog记录原始SQL逻辑,二者互补但不可替代[^1][^3]。 --- ### **3. 存储结构与生命周期** | **特性** | **redo log** | **binlog** | |------------------|----------------------------------|-------------------------------------| | **写入方式** | **循环写入** | **追加写入** | | **空间管理** | 固定大小(如默认2×1GB),写满后覆盖旧日志 | 持续增长,需定期清理(`expire_logs_days`) | | **配置示例** | `innodb_log_files_in_group=2`<br>`innodb_log_file_size=1G`[^5] | `max_binlog_size=1G` | > 🔄 **运作机制**: > redo log采用环状缓冲区,通过检查点(checkpoint)触发脏页刷盘释放空间;binlog按文件顺序写入,单个文件写满后创建新文件[^3][^4]。 --- ### **4. 核心应用场景** | **场景** | **redo log** | **binlog** | |------------------|----------------------------------|-------------------------------------| | **崩溃恢复** | ✅ 确保已提交事务持久化(重做机制) | ❌ 无crash-safe能力 | | **主从复制** | ❌ 不参与 | ✅ 核心依赖(从库重放SQL) | | **数据恢复** | 仅恢复未刷盘的脏页 | ✅ 支持全量/时间点恢复(PITR) | | **事务一致性** | ✅ 通过两阶段提交(2PC)与binlog协作 | ✅ 作为事务提交的最终凭证 | > 🔗 **协作流程**(以事务提交为例): > ```mermaid > graph LR > A[事务提交] --> B[写redo log prepare状态] > B --> C[写binlog] > C --> D[写redo log commit状态] > ``` > 此机制确保binlog与redo log的原子性,崩溃时通过状态判断需提交或回滚的事务[^1][^4]。 --- ### **5. 性能影响与优化** | **维度** | **redo log** | **binlog** | |------------------|----------------------------------|-------------------------------------| | **磁盘I/O** | 顺序写入,高效 | 写入量更大(语句级记录) | | **关键参数** | `innodb_flush_log_at_trx_commit`<br>(0/1/2控制刷盘频率) | `sync_binlog`<br>(控制fsync频率) | | **优化建议** | 增大日志文件减少刷盘频率 | 分离磁盘存放,避免与数据文件竞争I/O | --- ### **总结对比表** | **对比维度** | redo log | binlog | |------------------|-------------------|--------------------| | 层级 | InnoDB引擎层 | MySQL Server层 | | 日志类型 | 物理日志 | 逻辑日志 | | 主要用途 | 崩溃恢复 | 复制/备份/恢复 | | 空间管理 | 固定大小循环覆盖 | 持续增长追加写入 | | 跨引擎支持 | ❌ | ✅ | | crash-safe能力 | ✅ | ❌ | > 📌 **核心结论**: > redo log是InnoDB的“安全气囊”,确保数据不丢失;binlogMySQL的“黑匣子”,实现生态扩展能力。二者通过**两阶段提交(2PC)** 协同工作,共同保障ACID特性[^1][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值