首页 > 数据库 > MySQL > 正文

mysql主键的缺少导致备库hang住

2024-07-24 12:44:43
字体:
来源:转载
供稿:网友

最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的稳定性,也希望通过这篇博客,来加深主键在innodb引擎中的重要性,希望用户在使用RDS,设计自己的表的时候,一定要为表加上主键,主键可以认为是innodb存储引擎的生命,下面我们就来分析一下这个案例(本案例的生产环境的binlog为row模式,对于myisam存储引擎也有同样的问题):
(1).现象slave:

mysql> show slave status/G;*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: xxx.xx.xx.xxMaster_User: replicatorMaster_Port: 3006Connect_Retry: 60Master_Log_File: mysql-bin.000006Read_Master_Log_Pos: 47465657Relay_Log_File: slave-relay.100383Relay_Log_Pos: 251Relay_Master_Log_File: mysql-bin.000006Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:Last_Errno: 0Last_Error:Skip_Counter: 0Exec_Master_Log_Pos: 18057461Relay_Log_Space: 29409335Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master: 1339Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error:Last_SQL_Errno: 0Last_SQL_Error:

slave的Seconds_Behind_Master一直在增加,slave出现hang住。
(2).解析当前slave执行到的位置的binlog:

mysqlbinlog -vvv /home/mysql/data3006/mysql/mysql-bin.000006 –start-position=18057461 >/tmp/2.log### UPDATE qianyi.dmpush_message_temp### WHERE### @1='fb5c72c9-0ac2-4800-93b2-b94dc9e1dd54′ /* VARSTRING(108) meta=108 nullable=1 is_null=0 */### @2=133 /* LONGINT meta=0 nullable=1 is_null=0 */### @3='20121012220000′ /* VARSTRING(42) meta=42 nullable=1 is_null=0 */### @4='0′ /* VARSTRING(24) meta=24 nullable=1 is_null=0 */

(3)分析:
模拟场景:
1.表中无主键,全表进行更新:
master:
表结构:
CREATE TABLE `dmpush_message_temp` (
`clientid` varchar(36) DEFAULT NULL,
`infoid` bigint(10) DEFAULT NULL,
`endtime` varchar(14) DEFAULT NULL,
`stat` varchar(8) DEFAULT NULL
) ENGINE=innodb DEFAULT CHARSET=utf8;

mysql> update dmpush_message_temp set stat=1 ;
Query OK, 226651 rows affected (1.69 sec)
Rows matched: 226651 Changed: 226651 Warnings: 0
a.binlog中第一个出现的update事务日志:
mysqlbinlog -vvv /home/mysql/data3006/mysql/mysql-bin.000007 >/tmp/test.log

2281772 ### UPDATE qianyi.dmpush_message_temp
2281773 ### WHERE
2281774 ### @1='fb5c72c9-0ac2-4800-93b2-b94dc9e1dd54′ /* VARSTRING(108) meta=108 nullable=1 is_null=0 */

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表