欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql kill進程后出現(xiàn)killed死鎖問題及解決

 更新時間:2024年01月18日 10:32:44   作者:DBA界的小學生  
這篇文章主要介紹了mysql kill進程后出現(xiàn)killed死鎖問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

mysql kill進程后出現(xiàn)killed死鎖

經(jīng)常會出現(xiàn)這樣的場景

有一張3億的表,現(xiàn)在要對這張表進行刪除1億行,于是有人開始運行

delete from table limit 100000000;

毫無疑問這是一個愚蠢的刪除方式,于是有人開始變更刪除方式:

delete from table where id<100000000;

然而運行一段時間后,又發(fā)現(xiàn)批量刪除的效率可能會更高,所以kill掉了上一條運行了一段時間的sql,開始批量刪除, 由于是大sql,晚上點擊運行想第二天早上來看結果的DBA就會遺憾的發(fā)現(xiàn)新執(zhí)行的sql被鎖給擋了回來,并沒有運行,導致浪費了一晚上的時間。

但是盲目的等待鎖釋放心里沒底,所以我們可以通過下面的方式計算出這個鎖什么時候能夠釋放,我們就可以使用表了。

場景

一個巨大的delete語句 執(zhí)行一小時后kill ,

show processlist出現(xiàn)killed進程 ,

不要盲目重啟! 重啟MySQL后進程消失但鎖依然存在!

重啟MySQL后進程消失但鎖依然存在,因為回滾還要繼續(xù),這是mysql對數(shù)據(jù)的保護機制

通過下列語句查詢事務情況

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  #代表鎖影響的行數(shù),當數(shù)值為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)

trx_rows_modified: 代表鎖影響的行數(shù),當數(shù)值為0時,鎖將會釋放

查看表鎖信息

SELECT * FROM information_schema.INNODB_LOCKS
SELECT * FROM information_schema.INNODB_LOCK_waits
desc innodb_locks;
+————-+———————+——+—–+———+——-+
| Field       | Type                | Null | Key | Default | Extra |
+————-+———————+——+—–+———+——-+
| lock_id     | varchar(81)         | NO   |     |         |       |#鎖ID
| lock_trx_id | varchar(18)         | NO   |     |         |       |#擁有鎖的事務ID
| lock_mode   | varchar(32)         | NO   |     |         |       |#鎖模式
| lock_type   | varchar(32)         | NO   |     |         |       |#鎖類型
| lock_table  | varchar(1024)       | NO   |     |         |       |#被鎖的表
| lock_index  | varchar(1024)       | YES  |     | NULL    |       |#被鎖的索引
| lock_space  | bigint(21) unsigned | YES  |     | NULL    |       |#被鎖的表空間號
| lock_page   | bigint(21) unsigned | YES  |     | NULL    |       |#被鎖的頁號
| lock_rec    | bigint(21) unsigned | YES  |     | NULL    |       |#被鎖的記錄號
| lock_data   | varchar(8192)       | YES  |     | NULL    |       |#被鎖的數(shù)據(jù)
+————-+———————+——+—–+———+——-+
10 rows in set (0.00 sec)

desc innodb_lock_waits;
+——————-+————-+——+—–+———+——-+
| Field             | Type        | Null | Key | Default | Extra |
+——————-+————-+——+—–+———+——-+
| requesting_trx_id | varchar(18) | NO   |     |         |       |#請求鎖的事務ID
| requested_lock_id | varchar(81) | NO   |     |         |       |#請求鎖的鎖ID
| blocking_trx_id   | varchar(18) | NO   |     |         |       |#當前擁有鎖的事務ID
| blocking_lock_id  | varchar(81) | NO   |     |         |       |#當前擁有鎖的鎖ID
+——————-+————-+——+—–+———+——-+
4 rows in set (0.00 sec)
   
desc innodb_trx ;
+—————————-+———————+——+—–+———————+——-+
| Field                      | Type                | Null | Key | Default             | Extra |
+—————————-+———————+——+—–+———————+——-+
| trx_id                     | varchar(18)         | NO   |     |                     |       |#事務ID
| trx_state                  | varchar(13)         | NO   |     |                     |       |#事務狀態(tài):
| trx_started                | datetime            | NO   |     | 0000-00-00 00:00:00 |       |#事務開始時間;
| trx_requested_lock_id      | varchar(81)         | YES  |     | NULL                |       |#innodb_locks.lock_id
| trx_wait_started           | datetime            | YES  |     | NULL                |       |#事務開始等待的時間
| trx_weight                 | bigint(21) unsigned | NO   |     | 0                   |       |#
| trx_mysql_thread_id        | bigint(21) unsigned | NO   |     | 0                   |       |#事務線程ID
| trx_query                  | varchar(1024)       | YES  |     | NULL                |       |#具體SQL語句
| trx_operation_state        | varchar(64)         | YES  |     | NULL                |       |#事務當前操作狀態(tài)
| trx_tables_in_use          | bigint(21) unsigned | NO   |     | 0                   |       |#事務中有多少個表被使用
| trx_tables_locked          | bigint(21) unsigned | NO   |     | 0                   |       |#事務擁有多少個鎖
| trx_lock_structs           | bigint(21) unsigned | NO   |     | 0                   |       |#
| trx_lock_memory_bytes      | bigint(21) unsigned | NO   |     | 0                   |       |#事務鎖住的內(nèi)存大?。˙)
| trx_rows_locked            | bigint(21) unsigned | NO   |     | 0                   |       |#事務鎖住的行數(shù)
| trx_rows_modified          | bigint(21) unsigned | NO   |     | 0                   |       |#事務更改的行數(shù)
| trx_concurrency_tickets    | bigint(21) unsigned | NO   |     | 0                   |       |#事務并發(fā)票數(shù)
| trx_isolation_level        | varchar(16)         | NO   |     |                     |       |#事務隔離級別
| trx_unique_checks          | int(1)              | NO   |     | 0                   |       |#是否唯一性檢查
| trx_foreign_key_checks     | int(1)              | NO   |     | 0                   |       |#是否外鍵檢查
| trx_last_foreign_key_error | varchar(256)        | YES  |     | NULL                |       |#最后的外鍵錯誤
| trx_adaptive_hash_latched  | int(1)              | NO   |     | 0                   |       |#
| trx_adaptive_hash_timeout  | bigint(21) unsigned | NO   |     | 0                   |       |#
+—————————-+———————+——+—–+———————+——-+
22 rows in set (0.01 sec)

結論:

時間過長的update、delete等語句在kill之后會進行回滾操作,會鎖表,經(jīng)常有人更換不同方式對大數(shù)據(jù)進行修改刪除,然而盲目的殺死正在長時間運行的進程后并不能馬上對表進行新的操作,后果只能是等待之前的操作回滾結束,本想用更快的方式操作表結果得不償失,所以還是建議選擇好對表修改操作方式然后一次運行,不再修改。

后續(xù)測試了innodb_force_recovery參數(shù)的修改:

結論:非緊急情況不允許把innodb_force_recovery修改成非0值!

補充:

今天又遇到一個新的情況:

當我在改一個小表的表結構時發(fā)現(xiàn)本應該瞬間完成的語句一直沒有執(zhí)行成功,連接數(shù)據(jù)庫端查看發(fā)現(xiàn)此語句正在等待鎖釋放;

于是開始尋找加鎖的源頭 

show processlist;
select * from information_schema.processlist where time>100 and command<>'sleep';

果然查到了一個刪除語句;

但是發(fā)現(xiàn)該語句已經(jīng)被kill 狀態(tài)顯示為killed,并且已經(jīng)執(zhí)行了50000s+ 也就是幾天前了;(之所以沒有監(jiān)控到是因為這個我的過濾條件寫的是where command=‘Query’ 所以這個killed進程就沒有捕捉到)此時我使用上述查詢查找鎖記錄發(fā)現(xiàn)查找結果是空的

SELECT * FROM information_schema.INNODB_TRX\G

查詢show engine innodb status 也沒有找到rolling back關鍵字的大回滾事務;

(我中間還測了一下收回賬戶權限這個查詢會不會消失 ,然而和我推測的一樣,并沒有什么錘子用)

于是我決定重啟;既然沒有回滾想必重啟應該不會有什么大問題;

所以我就shutdown了一下,mysql登陸不了了,但是進程很奇怪的還在;我又手動kill -9 了一下;

然后重新啟動,成功啟動; 

new結論: 

遇到killed語句先 

SELECT * FROM information_schema.INNODB_TRX\G

看看有沒有什么事務正在回滾或被鎖住 

如果有就安心的等它回滾結束,暫時不要用這個表,如果非要用就新建一個別名表 在從庫把備份拿過來寫進去,讓程序先換個表讀?。?/p>

如果查詢沒有結果,再次確認一下show engine innodb status 有沒有正在回滾的事務 如果進程太多可以重定向出來: 

mysql -u -p -P 3306 -e “show engine innodb status” >/tmp/status.txt

斜杠/查找是否存在關鍵字 rolling back 

如果確定沒有回滾語句,就可以安心的重啟了 ;

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • MySQL如何給查詢結果添加行號

    MySQL如何給查詢結果添加行號

    這篇文章主要介紹了MySQL如何給查詢結果添加行號的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • mysql字段名和關鍵字沖突的問題

    mysql字段名和關鍵字沖突的問題

    這篇文章主要介紹了mysql字段名和關鍵字沖突的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • mysql之如何把查詢的結果保存到新表

    mysql之如何把查詢的結果保存到新表

    這篇文章主要介紹了mysql之如何把查詢的結果保存到新表問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Linux/Mac MySQL忘記密碼命令行修改密碼的方法

    Linux/Mac MySQL忘記密碼命令行修改密碼的方法

    這篇文章主要介紹了Linux/Mac MySQL忘記密碼命令行修改密碼的方法,需要的朋友可以參考下
    2017-05-05
  • MySQL如何保證備份數(shù)據(jù)的一致性詳解

    MySQL如何保證備份數(shù)據(jù)的一致性詳解

    在高并發(fā)的場景下,大量的請求直接訪問Mysql很容易造成性能問題,下面這篇文章主要給大家介紹了關于MySQL如何保證備份數(shù)據(jù)一致性的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • mysql中的四大運算符種類實例匯總(20多項)?

    mysql中的四大運算符種類實例匯總(20多項)?

    這篇文章主要介紹了mysql中的四大運算符種類匯總,運算符連接表達式中的各個操作數(shù),他的作用是用來指明對數(shù)據(jù)表中的操作數(shù)所進行的運算
    2022-07-07
  • MySQL系列之十三 MySQL的復制

    MySQL系列之十三 MySQL的復制

    這篇文章主要介紹了MySQL系列之十三 MySQL的復制,詳細的講述了多種復制架構的案例和MySQL復制相關概念等,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • windows下mysql忘記root密碼的解決方法

    windows下mysql忘記root密碼的解決方法

    windows下mysql忘記root密碼的解決方法,碰到這個問題的朋友可以參考下。
    2010-02-02
  • mysql執(zhí)行sql文件報錯Error: Unknown storage engine‘InnoDB’的解決方法

    mysql執(zhí)行sql文件報錯Error: Unknown storage engine‘InnoDB’的解決方法

    最近在執(zhí)行一個innoDB類型sql文件的時候,發(fā)現(xiàn)系統(tǒng)報錯了,通過查找相關的資料終于解決了,所以下面這篇文章主要給大家介紹了關于mysql執(zhí)行sql文件時報錯Error: Unknown storage engine 'InnoDB'的解決方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • MySql避免重復插入記錄的幾種方法

    MySql避免重復插入記錄的幾種方法

    本文章來給大家提供三種在mysql中避免重復插入記錄方法,主要是講到了ignore,Replace,ON DUPLICATE KEY UPDATE三種方法,有需要的朋友可以參考一下
    2013-08-08

最新評論