首頁>Club>
11
回覆列表
  • 1 # 鯨剪曦

    最近再找一些Mysql鎖表原因,整理出來一部分sql語句會鎖表的,方便查閱,整理的不是很全,都是工作中碰到的,會持續更新筆者能力有限,如果有不正確的,或者不到位的地方,還請大家指出來,方便你我,方便大家。此測試環境Mysql5.5基於innodb引擎 insert into table1 valu

  • 2 # java架構設計

    MySQL在5.6.0版本之前對錶結構進行修改會鎖表的,5.6以後引入了online ddl,online ddl解決的就是修改表結構時候鎖表的問題,能夠讓mysql在進行表變更時候,不影響正常的讀寫操作。要知道為什麼表結構變更時候(新增/修改欄位、索引的刪除和新增)會鎖表,就得知道當我們修改表結構時候,MySQL都做了哪些事情。SQL語言DQL:資料查詢語言:SELECT <欄位名錶> FROM <表或檢視名> WHERE <查詢條件>;DML:資料操作語言:INSERT/UPDATE/DELETE;DDL:資料定義語言:CREATE TABLE/VIEW/INDEX;DCL:資料控制語言:授權、事物ROLLBACK/COMMIT;DDL在MySQL5.6之前的版本中,執行ddl有copy和inplace兩種方式,可以根據命名就知道兩種方式的意思。其中replace方式僅支援新增、刪除索引操作。這兩種方式都是鎖表操作。copy方式執行的操作:建立一個臨時表,和要修改的表結構一致;將原來的表鎖住,禁止DML操作,可以DQL操作;將原來的表資料複製到臨時表中將臨時表重新命名為原來的表,刪除原來的表建立新的索引資料inplace方式執行的操作:新建索引的資料字典鎖表,禁止DML操作,可以DQL操作;構造新的索引資料等待所有隻讀操作完畢建立索引結束所以表新增欄位屬於ddl資料定義語言,採用的是copy方式,鎖表。那麼是否說online ddl就不存在鎖表的問題了呢?不是的,對於不支援online ddl操作的DDL語句,還得采取copy方式,比如修改列的資料型別、主鍵的刪除、表字符集的修改等這些需要徹底修改記錄資料格式的操作。線上大資料表如何執行DDL當我們需要對生產資料庫中的表執行DDL的話,一定要小心,一定要慎之又慎。一不小心就會導致鎖表,鎖表一旦產生,資料庫就會堆積大量對該表的請求,瞬間將資料庫的連線吃沒,CPU飆升,最後。。。資料庫宕機!這裡提供以下思路供大家參考:1.停服務執行,這種方式要求業務可以停止執行的情況下執行,比如半夜凌晨執行表結構變更,簡單粗暴。

    2.參考copy的方式自己執行這些步驟:

    建立一個臨時表table_copy,代表最新的表結構和索引;

    把舊錶的資料copy到新表:這步不要用sql操作,自己寫一個指令碼,按照資料的建立時間一次10000條的複製到新表,這個過程中可能會有新的資料進入,所以根據每一條記錄的建立時間不斷同步,直至兩張表的記錄完全一致,再執行第三步。刪除舊錶,把新表重新命名為舊錶的名字3.pt-online-schema-change:線上修改大資料表結構工具,可以google瞭解一下。

  • 3 # 蓮花童子哪吒

    鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制,資料庫中,資料也是一種供許多使用者共享的資源。需要用到鎖來保證資料的一致性。

    新增表字段本身就是對自身表結構的修改,而在一開始建立表之後就會儲存到對應的資料檔案當中,如果不加鎖,當前你在修改的時候,客戶端請求還可以繼續來訪問資料,這樣違背了資料的一致性。因為前後的表結構已經發生了變化

    例如:接通電路的時候,我們同樣需要關閉電源的開關

    如何發現表鎖

    對於鎖定表,首先我們需要去發現它,這樣才能做故障的排查

    1、服務端命令檢查

    一般情況下我們可以透過show processlist 來檢查出是那條語句導致大量查詢語句處於等待狀態,然後kill 掉修改表格語句的程序。

    2、服務監控提示

    可以透過檢查table_locks_waited和table_locks_immediate狀態變數來分析系統上的表鎖定爭奪:

    mysql> show status like "table%";

    +-----------------------+-------+

    | Variable_name | Value |

    +-----------------------+-------+

    | Table_locks_immediate | 2979 |

    | Table_locks_waited | 0 |

    +-----------------------+-------+

    2 rows in set (0.00 sec))

    如果Table_locks_waited的值比較高,則說明存在著較嚴重的表級鎖爭用情況。

    Table_locks_immediate表示立即釋放表鎖數

    Table_locks_waited表示需要等待的表鎖數

    表結構修改原理

    在MySQL5.6之前的版本中,直接修改表結構的過程中會鎖表。之後引入了Online DDL用於支援DDL執行期間DML語句的並行操作,提高資料庫的吞吐量

    (1)首先建立新的臨時表,表結構透過命令ALTAR TABLE新定義表結構

    (2)然後把原表中資料匯入到臨時表

    (4)最後把臨時表重新命名為原來的表名

  • 中秋節和大豐收的關聯?
  • 人這一生是應該過循規蹈矩的工作生活,還是轟轟烈烈的闖蕩生活?