亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

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

    本篇文章給大家?guī)砹岁P于mysql的相關知識,MySQL有一個把鎖,叫做MDL元數(shù)據(jù)鎖,當對表修改的時候,會自動給表加上這把鎖,也就是不需要自己顯式使用,下面介紹一下MySQL數(shù)據(jù)庫線上修改表結(jié)構(gòu)的方法,希望對大家有幫助。

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

    推薦學習:mysql視頻教程

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

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

    1、什么是MDL鎖

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

    • 當對表做增刪改查的時候,加的是MDL讀鎖
    • 當對表結(jié)構(gòu)做變更修改的時候,加的是MDL寫鎖

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

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

    2、MDL鎖的問題

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

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

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

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

    具體步驟:

    • 對表加讀寫鎖,使得此時表只讀、
    • 復制原表的物理結(jié)構(gòu)
    • 修改新表的物理結(jié)構(gòu),包括增加新字段或者修改其他表結(jié)構(gòu)
    • 把表結(jié)構(gòu)導入新表,數(shù)據(jù)同步完成,鎖住中間表,刪除原表
    • 將新表rename為原表名
    • 釋放鎖

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

    改進:

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

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

    • 好處是同步的過程不會影響原有的業(yè)務正常。
    • 缺點是過程中需要額外一倍的存儲空間去存儲這個新表,當rename完成之后,可以把老表刪掉。

    推薦學習:mysql視頻教程

    前端(vue)入門到精通課程:立即學習

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號