欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

mysql新增字段為何會(huì)鎖表?

MySQL在5.6.0版本之前對(duì)表結(jié)構(gòu)進(jìn)行修改會(huì)鎖表的,5.6以后引入了onlineddl,onlineddl解決的就是修改表結(jié)構(gòu)時(shí)候鎖表的問(wèn)題,能夠讓mysql在進(jìn)行表變更時(shí)候,不影響正常的讀寫(xiě)操作。要知道為什么表結(jié)構(gòu)變更時(shí)候(新增/修改字段、索引的刪除和添加)會(huì)鎖表,就得知道當(dāng)我們修改表結(jié)構(gòu)時(shí)候,MySQL都做了哪些事情。

SQL語(yǔ)言

  1. DQL:數(shù)據(jù)查詢語(yǔ)言:SELECT<字段名表>FROM<表或視圖名>WHERE<查詢條件>;
  2. DML:數(shù)據(jù)操作語(yǔ)言:INSERT/UPDATE/DELETE;
  3. DDL:數(shù)據(jù)定義語(yǔ)言:CREATETABLE/VIEW/INDEX;
  4. DCL:數(shù)據(jù)控制語(yǔ)言:授權(quán)、事物ROLLBACK/COMMIT;

DDL

在MySQL5.6之前的版本中,執(zhí)行ddl有copy和inplace兩種方式,可以根據(jù)命名就知道兩種方式的意思。其中replace方式僅支持添加、刪除索引操作。這兩種方式都是鎖表操作。copy方式執(zhí)行的操作:
  1. 創(chuàng)建一個(gè)臨時(shí)表,和要修改的表結(jié)構(gòu)一致;
  2. 將原來(lái)的表鎖住,禁止DML操作,可以DQL操作;
  3. 將原來(lái)的表數(shù)據(jù)拷貝到臨時(shí)表中
  4. 將臨時(shí)表重命名為原來(lái)的表,刪除原來(lái)的表
  5. 創(chuàng)建新的索引數(shù)據(jù)
inplace方式執(zhí)行的操作:
  1. 新建索引的數(shù)據(jù)字典
  2. 鎖表,禁止DML操作,可以DQL操作;
  3. 構(gòu)造新的索引數(shù)據(jù)
  4. 等待所有只讀操作完畢
  5. 創(chuàng)建索引結(jié)束
所以表新增字段屬于ddl數(shù)據(jù)定義語(yǔ)言,采用的是copy方式,鎖表。那么是否說(shuō)onlineddl就不存在鎖表的問(wèn)題了呢?不是的,對(duì)于不支持onlineddl操作的DDL語(yǔ)句,還得采取copy方式,比如修改列的數(shù)據(jù)類(lèi)型、主鍵的刪除、表字符集的修改等這些需要徹底修改記錄數(shù)據(jù)格式的操作。

線上大數(shù)據(jù)表如何執(zhí)行DDL

當(dāng)我們需要對(duì)生產(chǎn)數(shù)據(jù)庫(kù)中的表執(zhí)行DDL的話,一定要小心,一定要慎之又慎。一不小心就會(huì)導(dǎo)致鎖表,鎖表一旦產(chǎn)生,數(shù)據(jù)庫(kù)就會(huì)堆積大量對(duì)該表的請(qǐng)求,瞬間將數(shù)據(jù)庫(kù)的連接吃沒(méi),CPU飆升,最后。。。數(shù)據(jù)庫(kù)宕機(jī)!這里提供以下思路供大家參考:1.停服務(wù)執(zhí)行,這種方式要求業(yè)務(wù)可以停止運(yùn)行的情況下執(zhí)行,比如半夜凌晨執(zhí)行表結(jié)構(gòu)變更,簡(jiǎn)單粗暴。

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

  • 創(chuàng)建一個(gè)臨時(shí)表table_copy,代表最新的表結(jié)構(gòu)和索引;

  • 把舊表的數(shù)據(jù)copy到新表:這步不要用sql操作,自己寫(xiě)一個(gè)腳本,按照數(shù)據(jù)的創(chuàng)建時(shí)間一次10000條的拷貝到新表,這個(gè)過(guò)程中可能會(huì)有新的數(shù)據(jù)進(jìn)入,所以根據(jù)每一條記錄的創(chuàng)建時(shí)間不斷同步,直至兩張表的記錄完全一致,再執(zhí)行第三步。
  • 刪除舊表,把新表重命名為舊表的名字
3.pt-online-schema-change:在線修改大數(shù)據(jù)表結(jié)構(gòu)工具,可以google了解一下。