久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL數據庫線上如何修改表結構

180次閱讀
沒有評論

共計 1164 個字符,預計需要花費 3 分鐘才能閱讀完成。

本篇內容介紹了“MySQL 數據庫線上如何修改表結構”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

一、MDL 元數據鎖

在修改表結構之前,先來看下可能存在的問題。

1、什么是 MDL 鎖

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

當對表做增刪改查的時候,加的是 MDL 讀鎖

當對表結構做變更修改的時候,加的是 MDL 寫鎖

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

當有一個線程對表執行增刪蓋茶的時候,會阻塞掉別的線程對表結構修改的請求

當有一個線程對表結構修改的時候,會阻塞掉別的線程對表增刪改查的請求

2、MDL 鎖的問題

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

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

二、如何線上修改 MySQL 表結構

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

具體步驟:

對表加讀寫鎖,使得此時表只讀、

復制原表的物理結構

修改新表的物理結構,包括增加新字段或者修改其他表結構

把表結構導入新表,數據同步完成,鎖住中間表,刪除原表

將新表 rename 為原表名

釋放鎖

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

改進:

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

好處是同步的過程不會影響原有的業務正常。

缺點是過程中需要額外一倍的存儲空間去存儲這個新表,當 rename 完成之后,可以把老表刪掉。

“MySQL 數據庫線上如何修改表結構”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-13發表,共計1164字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 米脂县| 蒙自县| 四川省| 铜川市| 仙居县| 天水市| 顺义区| 南陵县| 康定县| 云林县| 平凉市| 张家川| 久治县| 湘潭县| 乐清市| 隆尧县| 嘉义县| 常熟市| 南宫市| 惠安县| 澄城县| 云梦县| 沁源县| 平乐县| 东台市| 泾川县| 永济市| 中宁县| 桃源县| 连江县| 车致| 齐齐哈尔市| 昌图县| 普陀区| 左云县| 阿坝县| 红安县| 阿荣旗| 广平县| 绿春县| 武夷山市|