记录日常工作关于系统运维,虚拟化云计算,数据库,网络安全等各方面问题。
 
0

MySQL8的binlog文件保存时间


MySQL expire_logs_days 参数用于控制Binlog文件的保存时间,当Binlog文件存在的时间超过该参数设置的阈值时,

Binlog文件就会被自动清除,该参数的时间单位是天,设置为0,表示Binlog文件永不过期,即不自动清除Binlog文件。



在MySQL 8.0 版本,expire_logs_days参数被废弃,使用新的参数binlog_expire_logs_seconds代替,新参数的时间粒度是秒,能够更加灵活的控制Binlog文件过期时间。


expire_logs_days:
默认0代表99天,也是最大值

动态修改:Yes
作用范围:Global
取值范围:0~99

默认值:0


binlog_expire_logs_seconds:


动态修改:Yes
作用范围:Global
取值范围:0~4294967295
默认值:2592000(30天)

 

mysql>  show variables like 'log_%';
+----------------------------------------+----------------------------------------+
| Variable_name                          | Value                                  |
+----------------------------------------+----------------------------------------+
| log_bin                                | ON                                     |
| log_bin_basename                       | /var/lib/mysql/mysql-bin               |
| log_bin_index                          | /var/lib/mysql/mysql-bin.index         |
| log_bin_trust_function_creators        | OFF                                    |
| log_bin_use_v1_row_events              | OFF                                    |
| log_error                              | stderr                                 |
| log_error_services                     | log_filter_internal; log_sink_internal |
| log_error_suppression_list             |                                        |
| log_error_verbosity                    | 2                                      |
| log_output                             | FILE                                   |
| log_queries_not_using_indexes          | OFF                                    |
| log_raw                                | OFF                                    |
| log_replica_updates                    | ON                                     |
| log_slave_updates                      | ON                                     |
| log_slow_admin_statements              | OFF                                    |
| log_slow_extra                         | OFF                                    |
| log_slow_replica_statements            | OFF                                    |
| log_slow_slave_statements              | OFF                                    |
| log_statements_unsafe_for_binlog       | ON                                     |
| log_throttle_queries_not_using_indexes | 0                                      |
| log_timestamps                         | UTC                                    |
+----------------------------------------+----------------------------------------+
21 rows in set (0.04 sec)


mysql> 
mysql> 
mysql> 
mysql> show variables like '%expire%';
+--------------------------------+---------+
| Variable_name                  | Value   |
+--------------------------------+---------+
| binlog_expire_logs_auto_purge  | ON      |
| binlog_expire_logs_seconds     | 2592000 |
| disconnect_on_expired_password | ON      |
| expire_logs_days               | 0       |
+--------------------------------+---------+
4 rows in set (0.03 sec)

使用set命令配置过期日期

mysql> set global  binlog_expire_logs_seconds=60*60*24;
Query OK, 0 rows affected (0.00 sec)




MySQL 8.0关闭binlog默认开启binlog,即使在my.ini或my.cnf的[mysqld]部分没有。

MySQL中的binlog日志记录了数据库中数据的变动,便于对数据的基于时间点和基于位置的恢复,但是binlog也会日渐增大,占用很大的磁盘空间,因此,要对binlog使用正确安全的方法清理掉一部分没用的日志。

windows


1.登录mysql数据库,mysql -uroot –p
2.查看binlog是否开启,log_bin的状态未ON,表明binlog日志开启

mysql> show variables like 'log_%';
+----------------------------------------+---------------------------------------------------------------+
| Variable_name                          | Value                                                         |
+----------------------------------------+---------------------------------------------------------------+
| log_bin                                | ON                                                            |
| log_bin_basename                       | C:\Program Files\mysql-8.0.15-winx64\data\binlog              |
| log_bin_index                          | C:\Program Files\mysql-8.0.15-winx64\data\binlog.index        |
| log_bin_trust_function_creators        | OFF                                                           |
| log_bin_use_v1_row_events              | OFF                                                           |
| log_error                              | C:\Program Files\mysql-8.0.15-winx64\data\DESKTOP-SK4KOON.err |
| log_error_services                     | log_filter_internal; log_sink_internal                        |
| log_error_suppression_list             |                                                               |
| log_error_verbosity                    | 2                                                             |
| log_output                             | FILE                                                          |
| log_queries_not_using_indexes          | OFF                                                           |
| log_slave_updates                      | ON                                                            |
| log_slow_admin_statements              | OFF                                                           |
| log_slow_extra                         | OFF                                                           |
| log_slow_slave_statements              | OFF                                                           |
| log_statements_unsafe_for_binlog       | ON                                                            |
| log_throttle_queries_not_using_indexes | 0                                                             |
| log_timestamps                         | UTC                                                           |
+----------------------------------------+---------------------------------------------------------------+
18 rows in set, 1 warning (0.00 sec)

3.查看binary log(我这个之前已经清理过了)

mysql> show binary logs;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000007 |       199 | No        |
| binlog.000008 |       155 | No        |
+---------------+-----------+-----------+
2 rows in set (0.00 sec)

4.删除binlog日志文件,切勿删除正在使用的binlog!!(所以删除老年的即可,不要全删)

不要轻易手动去删除binlog,会导致binlog.index和真实存在的binlog不匹配,使用PURGE,根据自己需求改写下面命令

mysql> PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY);//删除1天前的binlog日志文件
或者
mysql>purge binary logs before '2019-11-25 13:09:51';  //将指定时间之前的binlog清掉:
或者
mysql>purge binary logs to 'bin.000055';  //将bin.000055之前的binlog清掉:

5.设置binlog的过期时间,binlog失效日期参数为 binlog_expire_logs_seconds,默认2592000(30天)过期,可以设置 604800(7天)

mysql> show variables like '%expire%';
+--------------------------------+---------+
| Variable_name                  | Value   |
+--------------------------------+---------+
| binlog_expire_logs_seconds     | 2592000 |
| disconnect_on_expired_password | ON      |
| expire_logs_days               | 0       |
+--------------------------------+---------+
3 rows in set (0.00 sec)


mysql> set global  binlog_expire_logs_seconds=60*60*24;
Query OK, 0 rows affected (0.00 sec)


mysql> show variables like '%expire%';
+--------------------------------+---------+
| Variable_name                  | Value   |
+--------------------------------+---------+
| binlog_expire_logs_seconds     | 604800  |
| disconnect_on_expired_password | ON      |
| expire_logs_days               | 0       |
+--------------------------------+---------+
3 rows in set (0.00 sec)


mysql> flush logs;
Query OK, 0 rows affected, 64 warnings (0.16 sec)

binlog_expire_logs_seconds设置之后不会立即清除过期的,触发条件是:

  • binlog大小超过max_binlog_size
  • 手动执行flush logs
  • 重新启动时(MySQL将会new一个新文件用于记录binlog)

如果binlog非常多,不要轻易设置改参数,有可能导致io争用,所以我先使用purge命令清除老年的binlog。
过期时间设置的要适当,对于主从复制,要看从库的延迟决定过期时间,避免主库binlog还未传到从库便因过期而删除,导致主从不一致!!!

5.5设置过期时间也可以直接修改my.ini配置文件,关闭修改再重启

expire_logs_days = 7 #自动删除15天前的日志。默认值为0,表示从不删除。

6.如果你希望关闭binlog
8.0版本情况下,关闭mysql服务,找到my.ini, 在[mysqld] 下添加 skip-log-bin,然后重启MySQL,不可以不关闭的情况下,修改重启。
在关闭后,可以下使用reset master把现有的binlog都删除掉,因为binlog关闭了,不会有正在使用的binlog,所以没问题。

 [mysqld] 
...
...
skip-log-bin

也有说想要关闭binlog,只将这两条注释(添加#),不知道哪个对,可能都对,或者是版本原因,我没试

#log-bin=mysql-bin #注释掉之后,会关闭binlog日志
#binlog_format=mixed #注释掉之后,会关闭binlog日志

如果找不到my.ini,可以手动打开显示C盘的隐藏文件选项(不会百度),就会出现ProgramData文件夹,找到mysql文件夹,就可以找到my.ini文件




使用RESET MASTER可以删除任何二进制日志文件及其相关的二进制日志索引文件,从而使主数据库恢复到开始二进制日志记录之前的状态

mysql>RESET MASTER;

 



转载请标明出处【MySQL8的binlog文件保存时间】。

《www.micoder.cc》 虚拟化云计算,系统运维,安全技术服务.

网站已经关闭评论