业务上有一张回传状态记录数据,随着业务及时间的发展,这张表的数据量达1400W条数;应需求作归档操做;应数据量大使用delete操做效率低,不现实;方案操做记录以下:node
##锁表---->备份新数据---->重命名表; ----锁表 LOCK TABLES node_flow read local; 将当前表设置为只读,不能进行插入或更新操做。 UNLOCK TABLES;锁住表了,使用UNLOCK进行释放。 ----备份数据 INSERT INTO node_flow_copy SELECT * FROM node_flow WHERE create_time > '2020-05-01' ----重命名表 ALTER TABLE node_flow RENAME TO node_flow_20200603; RENAME TABLE node_flow_copy TO node_flow;
因表数据比较大,在执行INSERT语句时出现报错;
"ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction"的问题。
###解决;
1)在执行insert操做时,运行的进程被卡住,分析缘由;mysql
----查看数据库进程列表; Show processlist; kill id; 操做发现command显示killed,sql被阻塞了; ----查看数据库锁及锁等待; select * from information_schema.innodb_locks; select * from information_schema.innodb_lock_waits; ----查看数据进程 及锁、触发器 show processlist; show engine innodb status\G; Show triggers from DB_NAME; -----查看系异常统进程; Iotop perf top -p `pidof mysqld`
2)肯定调整innodb内存使用大小解决卡住问题sql
----查看数据库内存大小的问题 show variables like 'innodb_buffer_pool%'; 发现innodb_buffer_pool_size只有5M,感受缘由就是由于buffer pool太小, 增长buffer\_pool的大小到20G select 20\*1024\*1024\*1024; set global innodb\_buffer\_pool\_size=21474836480; 再使用show processlist;等待一下killd状态不在了;