為了減少數據庫磁盤占用,使用delete + where語句清理表數據,但是這樣刪除數據后也無法釋放磁盤空間,而直接用delete和truncate表數據是可以清理磁盤的。
原因可參考https://www.cnblogs.com/renzhicai/p/8857480.html
為了清理磁盤計划先用delete + where清理表數據;在用optimize table釋放磁盤空間,但是這樣都鎖表。所以計划關閉session sql_bin_log逐個slave執行。
由於delete刪除數據量特別大,執行時間特別長造成主從復制延遲,就手欠的kill掉MySQL processlist進程。但是發現進程是killed狀態,就重啟MySQL服務。
重啟后show processlist出現killed是沒有 了,但是發現它回滾,而且trx_mysql_thread_id為0是沒法kill掉的
SELECT * FROM information_schema.INNODB_TRX\G *************************** 1. row *************************** trx_id: 715674773 trx_state: ROLLING BACK trx_started: 2018-09-24 23:17:30 trx_requested_lock_id: NULL trx_wait_started: NULL trx_weight: 540574 trx_mysql_thread_id: 0 trx_query: NULL trx_operation_state: NULL trx_tables_in_use: 0 trx_tables_locked: 1 trx_lock_structs: 3 trx_lock_memory_bytes: 1136 trx_rows_locked: 2 trx_rows_modified: 540571 #代表鎖影響的行數,當數值為0時,鎖將會釋放 trx_concurrency_tickets: 0 trx_isolation_level: REPEATABLE READ trx_unique_checks: 1 trx_foreign_key_checks: 1 trx_last_foreign_key_error: NULL trx_adaptive_hash_latched: 0 trx_is_read_only: 0 trx_autocommit_non_locking: 0 1 row in set (0.00 sec)
下次遇到這種情況,還是
1、先確定執行的sql是否為最優 ,
2、在slave不影響業務上執行,用screen命令執行,執行過程不要終止。因為執行不成功會回滾。執行時間更長。
鎖表查看命令
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
參考
MySQL kill進程后出現killed死鎖問題 - xibuhaohao - 博客園 https://www.cnblogs.com/xibuhaohao/p/11867024.html
(3條消息)mysql kill進程后出現killed死鎖問題_m0_37827567的博客-CSDN博客 https://blog.csdn.net/m0_37827567/article/details/82979767
(3條消息)mysql kill進程后出現killed死鎖問題(續)_m0_37827567的博客-CSDN博客 https://blog.csdn.net/m0_37827567/article/details/91044989