事件发现及排查:mysql
早上来公司第一件事,习惯性的打开邮箱,收收报警邮件,看看监控。看到一个sql实例(从库)报警磁盘空间不足。当时没有引发足够的注意,习惯性的登录服务器开始查看binlog过时时间,查看relay log清理信息。sql
mysql> select @@version; +--------------+ | @@version | +--------------+ | 5.7.10-3-log | +--------------+ 1 row in set (0.00 sec) mysql> show variables like 'relay_log_purge'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | relay_log_purge | ON | +-----------------+-------+ 1 row in set (0.01 sec) mysql> show variables like 'expire_logs_days'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | expire_logs_days | 3 | +------------------+-------+ 1 row in set (0.00 sec)
看起来一切正常,我这是800多G的SSD。有点诡异,看下主库的磁盘空间使用状况服务器
tom@sql09:~$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 58G 32G 23G 59% / devtmpfs 32G 0 32G 0% /dev tmpfs 32G 12K 32G 1% /dev/shm tmpfs 32G 3.2G 29G 11% /run tmpfs 32G 0 32G 0% /sys/fs/cgroup /dev/sda1 283M 113M 152M 43% /boot /dev/sda5 814G 587G 186G 76% /home tmpfs 6.3G 0 6.3G 0% /run/user/99 tmpfs 6.3G 0 6.3G 0% /run/user/10194
在看一下从库的磁盘空间使用状况微信
tom@sql10:~$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 58G 14G 41G 26% / devtmpfs 32G 0 32G 0% /dev tmpfs 32G 12K 32G 1% /dev/shm tmpfs 32G 3.2G 29G 11% /run tmpfs 32G 0 32G 0% /sys/fs/cgroup /dev/sda1 283M 113M 152M 43% /boot /dev/sda5 814G 704G 69G 92% /home tmpfs 6.3G 0 6.3G 0% /run/user/99 tmpfs 6.3G 0 6.3G 0% /run/user/10194
对比一下主从库MySQL Data目录下文件大小,这里我就不贴图了(你懂的),发现主从库log目录差别巨大,从库明显比主库多了100G左右,进入从库log目录下,发现有大量的reloy log信息日志
tom@sql10:~/mysql/log$ mysql-relay-bin.092121 mysql-relay-bin.092383 mysql-relay-bin.092645 mysql-relay-bin.092907 mysql-relay-bin.093169 mysql-relay-bin.093431 mysql-relay-bin.093693 mysql-relay-bin.093955 ...... ...... ......
从库relay log purge已经打开,log日志怎么会有这么多relay log文件呢?第一反应就是从库的主从出问题了,登录从库查看主从状态code
故障现场事件
Last_Errno: 1507 Last_Error: Error 'Error in list of partitions to DROP' on query. Default database: ''. Query: 'ALTER TABLE DROP PARTITION part_20170209'
解决办法:ip
根据从库报错到相应位置查看要删除的分区,发现果真没有那个分区。问题到这里已经很明朗了,剩下的就是简单的一些修复操做it
mysql> stop slave ; Query OK, 0 rows affected (0.00 sec) mysql> set global sql_slave_skip_counter=1; Query OK, 0 rows affected (0.00 sec) mysql> start slave; Query OK, 0 rows affected (0.01 sec)
重复上面的操做,直到问题获得修复。若是一样的报错不少,也能够本身写一个脚本,不断监控mysql slave状态,若是匹配到一样的报错就跳过。下面来看一下修复后的状况io
Seconds_Behind_Master: 330860 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error:
感受还好,只是这个延迟有点太大了,90多个小时。此刻我也只能在内心默念:SSD快跑
个人思考:
一、出现这样的问题,首先能够确定的是,有人为用大权限帐号在从库手动执行drop partition操做,致使主库执行的时候从库没有发现这个partition报错。要控制这样的问题,能够从权限着手,严格控制用户权限,非DBA人员直接不让他有操做权限(咱们的权限是很严格的)
二、监控报警不到位,从库主从停了几天了,一直没有收到报警,后期能够把监控系统完善一下
为了方便你们交流,本人开通了微信公众号,和QQ群291519319。喜欢技术的一块儿来交流吧