问题:阿里云RDS数据库Binlog日志一直增大,撑爆磁盘

问题:阿里云RDS数据库Binlog日志一直增大,撑爆磁盘
最后结果,是因为MySQL语句问题,没有where的条件下,导致更新操作
没有开启安全模式,需要开启sql更改安全模式,禁止没有where的条件下,更新操作

阿里云的需要提交工单,其他的直接进入数据库进行查看并开启就可以

mysql> show VARIABLES LIKE 'sql_safe_updates'     查看安全
mysql> set sql_safe_updates=1       开启安全模式
mysql> set sql_safe_updates=0   关闭安全模式

原因:MySQL实例可能会由于大事务快速生成Binlog文件,导致实例空间满,为避免数据丢失,RDS会对实例进行自动锁定,磁盘锁定之后,将无法进行写入操作。

​ 一键上传Binlog会在后台异步提交清理任务,清理任务会将已写入的Binlog上传到OSS(非用户购买的OSS)上,然后再从实例空间中删除Binlog文件,当前正在被写入的Binlog文件由于未完成写入,是不可以被清理的。因此,清理过程会有一定延迟,建议您单击一键上传Binlog后耐心等待一定时间,请勿多次单击该按钮,可以到基本信息页中查看已用空间是否减小。

​ 由于DML等操作(比如涉及大字段的DML操作)导致快速生成Binlog,可能会出现上传Binlog文件到备份空间并且从实例空间中删除的处理速度跟不上实例生成Binlog文件的速度,在这种情况下,建议考虑升级磁盘空间,并且排查Binlog快速生成的原因。

mysql的binlog太大太多占用大量磁盘的解决
处理方法一

​ 分析过程及解决方案:通常出现这种问题都应该磁盘剩余空间过低,使用df –lh检查,发现磁盘空间已使用82%。再进一步通过du –sh对可以的目录进行检查,发现是mysql的binlog占用空间过大。清理binlog的方法如下:

​ 1) 设置日志保留时长expire_logs_days自动删除

查看当前日志保存天数:

show variables like '%expire_logs_days%';

这个默认是0,也就是logs不过期,可通过设置全局的参数,使他临时生效:

set global expire_logs_days=7;

设置了只保留7天BINLOG, 下次重启mysql这个参数默认会失败,所以需在my.cnf中设置

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-bin.index 文件对应的名字也会被清除)
mysql> show variables like ‘expire_logs_days’; 查看 binlog自动删除规则
±-----------------±------+
| Variable_name | Value |
±-----------------±------+
| expire_logs_days | 0 |
±-----------------±------+
1 row in set (0.00 sec)
此处为0,意思是不限制
mysql> set global expire_logs_days = 3; 动态设置binlog日志只保留3天
#修改mysql配置文件my.cnf,永久修改binlog保留天数   写在[Mysqld]下面   空闲状态重启Mysql
echo  "expire_logs_days = 3" >/etc/my.cnf

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’ -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 --database=geeRunner --start-datetime=“2017-09-17 07:21:09” --stop-datetime=“2017-09-19 07:59:50” binlogs.000080 > sanjiaomao.txt
处理方法二

主从服务器之间同步数据

主服务器上所有的操作都在记录日志中,从服务器可以根据该日志来进行,以确保两个同步。

处理方法分两种情况:
1:只有一个mysql服务器,关闭MySQL的日志功能步骤:

  1. 删除日志:
    登录后执行:mysql> reset master;
    2)禁用MySQL日志:修改/etc/my.cnf 文件,找到
    log-bin=mysql-bin
    binlog_format=mixed
    这两行前面加上#,将其注释掉,再执行/etc/init.d/mysql restart即可。
    如果实在想保留日志,可以在/etc/my.cnf里加入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将这些文件删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值