問題:阿里云RDS數(shù)據(jù)庫Binlog日志一直增大郑藏,撐爆磁盤
最后結果衡查,是因為MySQL語句問題,沒有where的條件下必盖,導致更新操作
沒有開啟安全模式拌牲,需要開啟sql更改安全模式,禁止沒有where的條件下歌粥,更新操作
阿里云的需要提交工單塌忽,其他的直接進入數(shù)據(jù)庫進行查看并開啟就可以
mysql> show VARIABLES LIKE 'sql_safe_updates' 查看安全
mysql> set sql_safe_updates=1 開啟安全模式
mysql> set sql_safe_updates=0 關閉安全模式
原因:MySQL實例可能會由于大事務快速生成Binlog文件,導致實例空間滿失驶,為避免數(shù)據(jù)丟失土居,RDS會對實例進行自動鎖定,磁盤鎖定之后嬉探,將無法進行寫入操作擦耀。
? 一鍵上傳Binlog會在后臺異步提交清理任務,清理任務會將已寫入的Binlog上傳到OSS(非用戶購買的OSS)上涩堤,然后再從實例空間中刪除Binlog文件眷蜓,當前正在被寫入的Binlog文件由于未完成寫入,是不可以被清理的胎围。因此吁系,清理過程會有一定延遲,建議您單擊一鍵上傳Binlog后耐心等待一定時間白魂,請勿多次單擊該按鈕汽纤,可以到基本信息頁中查看已用空間是否減小。
? 由于DML等操作(比如涉及大字段的DML操作)導致快速生成Binlog福荸,可能會出現(xiàn)上傳Binlog文件到備份空間并且從實例空間中刪除的處理速度跟不上實例生成Binlog文件的速度蕴坪,在這種情況下,建議考慮升級磁盤空間敬锐,并且排查Binlog快速生成的原因辞嗡。
mysql的binlog太大太多占用大量磁盤的解決
處理方法一
? 分析過程及解決方案:通常出現(xiàn)這種問題都應該磁盤剩余空間過低捆等,使用df –lh檢查,發(fā)現(xiàn)磁盤空間已使用82%续室。再進一步通過du –sh對可以的目錄進行檢查,發(fā)現(xiàn)是mysql的binlog占用空間過大谒养。清理binlog的方法如下:
? 1) 設置日志保留時長expire_logs_days自動刪除
查看當前日志保存天數(shù):
show variables like '%expire_logs_days%';
這個默認是0挺狰,也就是logs不過期,可通過設置全局的參數(shù)买窟,使他臨時生效:
set global expire_logs_days=7;
設置了只保留7天BINLOG, 下次重啟mysql這個參數(shù)默認會失敗丰泊,所以需在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自動刪除規(guī)則
±-----------------±------+
| Variable_name | Value |
±-----------------±------+
| expire_logs_days | 0 |
±-----------------±------+
1 row in set (0.00 sec)
此處為0,意思是不限制
mysql> set global expire_logs_days = 3; 動態(tài)設置binlog日志只保留3天
#修改mysql配置文件my.cnf亏推,永久修改binlog保留天數(shù) 寫在[Mysqld]下面 空閑狀態(tài)重啟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文件的內容(會有很多內容輸出学赛,具體根據(jù)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 數(shù)據(jù)庫為geeRunner 的操作日志,輸入如下命令將數(shù)據(jù)寫入到一個備用的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
處理方法二
主從服務器之間同步數(shù)據(jù)
主服務器上所有的操作都在記錄日志中吞杭,從服務器可以根據(jù)該日志來進行盏浇,以確保兩個同步。
處理方法分兩種情況:
1:只有一個mysql服務器芽狗,關閉MySQL的日志功能步驟:
- 刪除日志:
登錄后執(zhí)行:mysql> reset master;
2)禁用MySQL日志:修改/etc/my.cnf 文件绢掰,找到
log-bin=mysql-bin
binlog_format=mixed
這兩行前面加上#,將其注釋掉童擎,再執(zhí)行/etc/init.d/mysql restart即可滴劲。
如果實在想保留日志,可以在/etc/my.cnf里加入expire_logs_days = 10 然后重啟mysql顾复,這樣10天就會自動清理日志班挖。
2:如果你的環(huán)境是主從服務器,那么就需要做以下操作了捕透。
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將這些文件刪除迅办。