推薦學習:mysql影片教學
在修改表格結構之前,先來看下可能存在的問題。
MySQL有一個把鎖,叫做MDL元資料鎖,當對錶修改的時候,會自動給表加上這把鎖,也就是不需要自己明確使用。
讀與讀之間不互斥,讀與寫,寫與寫之間互斥,因此
並且MDL一旦上鎖之後,只有目前請求的交易提交才會釋放,如果是一個長事務,或者是線上資料量很大,修改表結構預設上了MDL寫鎖,會很耗時地一直阻塞掉後邊其他請求。
想像一種場景,A(select),B(alter), C(select),D(select).....分別為依照順序對MySQL同一張表的請求,這些請求會形成一個隊列。
當A(select)取得表格的MDL讀鎖之後,就會阻塞掉B(alter),因為B要加的是MDL寫鎖,B被阻塞掉之後,就會導致後邊等待佇列中的其他請求都被阻塞掉,最終造成Mysql的可用連線耗盡,請求逾時等問題。
鑑於以上MDL鎖,得知對錶做alter修改結構很會阻塞掉其他的正常請求,所以修改操作要放在非業務高峰期來做,通常是放到凌晨2-4點。
具體步驟:
以上方案的問題是,資料量很大的時候,資料都會匯入需要時間,這個過程中,服務是無法存取的。
改進:
新建一張表A_new,其比原始表多了幾個字段,透過資料訂閱的方式訂閱原表A,把線上的表A中的資料同步到這個新建的表A_new中,這個過程會一直持續,並且這個過程中表A是可以增刪改查的,總有一個時刻,這兩張表的資料是完全同步的,資料上是沒有任何差異的,這個時候把原表表名A給修改掉,把新表A_new修改為原表A,這個操作是一個短暫操作,可以瞬間完成,不會有很大影響。
優缺點:
推薦學習:mysql影片教學
#以上是MySQL資料庫線上修改表格結構的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!