首頁  >  文章  >  資料庫  >  MySQL資料庫線上修改表格結構的方法

MySQL資料庫線上修改表格結構的方法

WBOY
WBOY轉載
2022-09-05 17:45:282393瀏覽

推薦學習:mysql影片教學

#一、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影片教學

#

以上是MySQL資料庫線上修改表格結構的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:jb51.net。如有侵權,請聯絡admin@php.cn刪除