{eval=Array;=+count(Array);}

国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

問答專欄Q & A COLUMN

mysql新增字段為何會鎖表?

YancyYeYancyYe 回答0 收藏1
收藏問題

1條回答

CarlBenjamin

CarlBenjamin

回答于2022-06-28 14:03

MySQL在5.6.0版本之前對表結構進行修改會鎖表的,5.6以后引入了online ddl,online ddl解決的就是修改表結構時候鎖表的問題,能夠讓mysql在進行表變更時候,不影響正常的讀寫操作。要知道為什么表結構變更時候(新增/修改字段、索引的刪除和添加)會鎖表,就得知道當我們修改表結構時候,MySQL都做了哪些事情。

SQL語言

  1. DQL:數據查詢語言:SELECT <字段名表> FROM <表或視圖名> WHERE <查詢條件>;
  2. DML:數據操作語言:INSERT/UPDATE/DELETE;
  3. DDL:數據定義語言:CREATE TABLE/VIEW/INDEX;
  4. DCL:數據控制語言:授權、事物ROLLBACK/COMMIT;

DDL

在MySQL5.6之前的版本中,執行ddl有copy和inplace兩種方式,可以根據命名就知道兩種方式的意思。其中replace方式僅支持添加、刪除索引操作。這兩種方式都是鎖表操作。copy方式執行的操作:
  1. 創建一個臨時表,和要修改的表結構一致;
  2. 將原來的表鎖住,禁止DML操作,可以DQL操作;
  3. 將原來的表數據拷貝到臨時表中
  4. 將臨時表重命名為原來的表,刪除原來的表
  5. 創建新的索引數據
inplace方式執行的操作:
  1. 新建索引的數據字典
  2. 鎖表,禁止DML操作,可以DQL操作;
  3. 構造新的索引數據
  4. 等待所有只讀操作完畢
  5. 創建索引結束
所以表新增字段屬于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了解一下。

評論0 贊同0
  •  加載中...

最新活動

您已邀請0人回答 查看邀請

我的邀請列表

  • 擅長該話題
  • 回答過該話題
  • 我關注的人
向幫助了您的網友說句感謝的話吧!
付費偷看金額在0.1-10元之間
<