業務上有一張回傳狀態記錄數據,隨着業務及時間的發展,這張表的數據量達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狀態不在了;