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;