MySQL數(shù)據(jù)庫線上如何修改表結(jié)構(gòu)

本篇內(nèi)容介紹了“MySQL數(shù)據(jù)庫線上如何修改表結(jié)構(gòu)”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、成都網(wǎng)站建設(shè)、蘇尼特左網(wǎng)絡(luò)推廣、微信小程序開發(fā)、蘇尼特左網(wǎng)絡(luò)營銷、蘇尼特左企業(yè)策劃、蘇尼特左品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供蘇尼特左建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:bm7419.com

一、MDL元數(shù)據(jù)鎖

在修改表結(jié)構(gòu)之前,先來看下可能存在的問題。

1、什么是MDL鎖

MySQL有一個(gè)把鎖,叫做MDL元數(shù)據(jù)鎖,當(dāng)對表修改的時(shí)候,會(huì)自動(dòng)給表加上這把鎖,也就是不需要自己顯式使用。

  • 當(dāng)對表做增刪改查的時(shí)候,加的是MDL讀鎖

  • 當(dāng)對表結(jié)構(gòu)做變更修改的時(shí)候,加的是MDL寫鎖

讀與讀之間不互斥,讀與寫,寫與寫之間互斥,因此

  • 當(dāng)有一個(gè)線程對表執(zhí)行增刪蓋茶的時(shí)候,會(huì)阻塞掉別的線程對表結(jié)構(gòu)修改的請求

  • 當(dāng)有一個(gè)線程對表結(jié)構(gòu)修改的時(shí)候,會(huì)阻塞掉別的線程對表增刪改查的請求

2、MDL鎖的問題

并且MDL一旦上鎖之后,只有當(dāng)前請求的事務(wù)提交才會(huì)釋放,如果是一個(gè)長事務(wù),或者是線上數(shù)據(jù)量很大,修改表結(jié)構(gòu)默認(rèn)上了MDL寫鎖,會(huì)很耗時(shí)一直阻塞掉后邊其他請求。

想象一種場景,A(select),B(alter), C(select),D(select).....分別為按照順序?qū)ySQL同一張表的請求,這些請求會(huì)形成一個(gè)隊(duì)列。
當(dāng)A(select)獲取表的MDL讀鎖之后,就會(huì)阻塞掉B(alter),因?yàn)锽要加的是MDL寫鎖,B被阻塞掉之后,就會(huì)導(dǎo)致后邊等待隊(duì)列中的其他請求都被阻塞掉,最終造成Mysql的可用連接耗盡,請求超時(shí)等問題。

二、如何線上修改MySQL表結(jié)構(gòu)

鑒于以上MDL鎖,得知對表做alter修改結(jié)構(gòu)很會(huì)阻塞掉其他的正常請求,所以修改操作要放在非業(yè)務(wù)高峰期來做,一般是放到凌晨2-4點(diǎn)。

具體步驟:

  • 對表加讀寫鎖,使得此時(shí)表只讀、

  • 復(fù)制原表的物理結(jié)構(gòu)

  • 修改新表的物理結(jié)構(gòu),包括增加新字段或者修改其他表結(jié)構(gòu)

  • 把表結(jié)構(gòu)導(dǎo)入新表,數(shù)據(jù)同步完成,鎖住中間表,刪除原表

  • 將新表rename為原表名

  • 釋放鎖

以上方案的問題是,數(shù)據(jù)量很大的時(shí)候,數(shù)據(jù)都導(dǎo)入需要時(shí)間,這個(gè)過程中,服務(wù)是不可訪問的。

改進(jìn):

MySQL數(shù)據(jù)庫線上如何修改表結(jié)構(gòu)

新建一張表 A_new,其比原表多了幾個(gè)字段,通過數(shù)據(jù)訂閱的方式訂閱原表A,把線上的表A中的數(shù)據(jù)同步到這個(gè)新建的表A_new中,這個(gè)過程會(huì)一直持續(xù),并且這個(gè)過程中表A是可以增刪改查的,總有一個(gè)時(shí)刻,這兩張表的數(shù)據(jù)是完全同步的,數(shù)據(jù)上是沒有任何差異的,這個(gè)時(shí)候把原表表名A給修改掉,把新表A_new修改為原表A,這個(gè)操作是一個(gè)短暫操作,可以瞬間完成,不會(huì)有很大影響。
優(yōu)缺點(diǎn):

  • 好處是同步的過程不會(huì)影響原有的業(yè)務(wù)正常。

  • 缺點(diǎn)是過程中需要額外一倍的存儲(chǔ)空間去存儲(chǔ)這個(gè)新表,當(dāng)rename完成之后,可以把老表刪掉。

“MySQL數(shù)據(jù)庫線上如何修改表結(jié)構(gòu)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

新聞標(biāo)題:MySQL數(shù)據(jù)庫線上如何修改表結(jié)構(gòu)
文章網(wǎng)址:http://bm7419.com/article24/jdjsce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序網(wǎng)站建設(shè)、App開發(fā)、自適應(yīng)網(wǎng)站、微信公眾號網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)