2023年4月18日发(作者:高中历史教学反思)问题:阿⾥云RDS数据库Binlog⽇志⼀直增⼤,撑爆磁盘
问题:阿⾥云RDS数据库Binlog⽇志⼀直增⼤,撑爆磁盘
最后结果,是因为MySQL语句问题,没有where的条件下,导致更新操作
没有开启安全模式,需要开启sql更改安全模式,禁⽌没有where的条件下,更新操作
阿⾥云的需要提交⼯单,其他的直接进⼊数据库进⾏查看并开启就可以
mysql> show VARIABLES LIKE 'sql_safe_updates' 查看安全
mysql> t sql_safe_updates=1 8的正确笔顺
开启安全模式
mysql> t sql_safe_updates=0 关闭安全模式
原因:MySQL实例可能会由于⼤事务快速⽣成Binlog⽂件,导致实例空间满,为避免数据丢失,RDS会对实例进⾏⾃动锁定,磁盘锁定之后,将
⽆法进⾏写⼊操作。
⼀键上传Binlog会在后台异步提交清理任务,清理任务会将已写⼊的Binlog上传到OSS(⾮⽤户购买的OSS)上,然后再从实例空间中删除
Binlog⽂件,当前正在被写⼊的Binlog⽂件由于教学反思范文
未完成写⼊,是不可以被清理的。因此,清理过程会有⼀定延迟,建议您单击⼀键上传Binlog后
耐⼼等待⼀定时间,请勿多次单击该按钮,可以到基本信息页中查看已⽤空间是否减⼩。
由于DML等操作(⽐如涉及⼤字段的DML操作)导致快速⽣成Binlog,可能会出现上传Binlog⽂件到备份空间并且从实例空间中删除的处理速
度跟不上实例⽣成Binlog⽂件的速度,在这种情况下,建议考虑升级磁盘空间,并且排查Binlog快速⽣成的原因。
mmysql的binloysql的binlog太⼤太多占⽤⼤量磁盘的解决
处理⽅法⼀
分析过程及解决⽅案:通常出现这种问题都应该磁盘剩余空间过低,使⽤df –lh检查,发现磁盘空间已使⽤82%。再进⼀步通过du –sh对可以
的⽬录进⾏检查,发现是mysql的binlog占⽤空间过⼤。清理binlog的⽅法如下:
1) 设置⽇志保留时长expire_logs_days⾃动删除
查看当前⽇志保存天数:
show variables like '%expire_logs_days%';
这个默认是0,也就是logs不过期,可通过设置全局的参数,使他临时⽣效:
t global expire_logs_days=7;
设置了只保留7天BINLOG, 下次重启mysql这个参数默认会失败,爱情伤感诗句
所以需在中设置
expire_logs_days = 7
2) ⼿动删除BINLOG (purge binary logs)
⽤于删除列于在指定的⽇志或⽇期之前商业银行风险
的⽇志索引中的所有⼆进制⽇志金花菌
。这些⽇志也会从记录在⽇志索引⽂件
mysql> show binary logs; #获取binlog⽂件列表
mysql> show master status; #查看当前正在写⼊的binlog⽂件(除了这个⽂件其他的都可以删除)
mysql> purge binary logs to “mysql-bin.000012”; 这⾥清楚12之前的⽂件(这⾥删除后再mysql binlog 存放⽬录下对应的⽂件会被删除, ⽂件对应的名字也会被
mysql> show variables like ‘expire_logs_days’; 查看 binlog⾃动删除规则
-----------------------+
| Variable_name | Value |
-----------------------+
| expire_logs_days | 0 |
-----------------------+
1 row in t (0.00 c)
此处为0,意思是不限制
mysql> t global e竹笋怎么炒好吃
xpire_logs_days = 3; 动态设置binlog⽇志只保留3天
#修改mysql配置⽂件,永久修改binlog保留天数 写在[Mysqld]下⾯ 空闲状态重启Mysql
echo "expire_logs_days = 3" >/etc/
mysql> PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY); 删除1天前的binlog⽇志⽂件
mysql> show binlog events; 只查看第⼀个binlog⽂件的内容(会有很多内容输出,具体根据binlog⽇志⼤⼩⽽定)
mysql> show binlog events in ‘mysql-bin.000002’; 查看指定binlog⽂件的内容
⽤mysqlbinlog⼯具查看:
[root@hd3 ~]# mysqlbinlog --start-datetime=‘2016-08-02 00:00:00’ --stop-datetime=‘2016-08-03 23:01:01’ 难忘的一件事600字
-d hadoop /var/lib/mysql/mysql-bin.000001
如果需要查询2017-09-17 07:21:09到2017-09-19 07:59:50 数据库为geeRunner 的操作⽇志,输⼊如下命令将数据写⼊到⼀个备⽤的txt即
可
mysqlbinlog --no-defaults --databa=geeRunner --start-datetime=“2017-09-17 07:21:09” --stop-datetime=“2017-09-19 07:59:50” binlogs.000080 >
处理⽅法⼆
主从服务器之间同步数据
主服务器上所有的操作都在记录⽇志中,从服务器可以根据该⽇志来进⾏,以确保两个同步。
处理⽅法分两种情况:
1:只有⼀个mysql服务器,关闭MySQL的⽇志功能步骤:
1. 删除⽇志:
登录后执⾏:mysql> ret master;
2)禁⽤MySQL⽇志:修改/etc/ ⽂件,找到
log-bin=mysql-bin
binlog_format=mixed
这两⾏前⾯加上#,将其注释掉,再执⾏/etc/init.d/mysql restart即可。
如果实在想保留⽇志,可以在/etc/⾥加⼊expire_logs_days = 10 然后重启mysql,这样10天就会⾃动清理⽇志。
2:如果你的环境是主从服务器,那么就需要做以下操作了。
A:在每个从属服务器上,使⽤SHOW SLAVE STATUS来检查它正在读取哪个⽇志。
B:使⽤SHOW MASTER LOGS获得主服务器上的⼀系列⽇志。
C:在所有的从属服务器中判定最早的⽇志,这个是⽬标⽇志,如果所有的从属服务器是更新的,就是清单上的最后⼀个⽇志。
D:清理所有的⽇志,但是不包括⽬标⽇志,因为从服务器还要跟它同步。
清理⽇志⽅法为:
PURGE MASTER LOGS TO 'mysql-bin.010';
PURGE MASTER LOGS BEFORE '2008-12-19 21:00:00';
如果你确定从服务器已经同步过了,跟主服务器⼀样了,那么可以直接RESET MASTER将这些⽂件删除。