如何在線修改表結構

在線的修改表結構一定要慎重

隨意的添加和刪除字段,都會造成嚴重的事故。並且在修改表之前,必須要對數據表做備份,如果每天都做增量備份的話,備份一次數據也花不了太長的時間。
常規的備份是先對業務停機,然後再維護數據庫和系統代碼,這種徹底停掉業務的方式是安全的, 穩妥的,通常會在後半夜去做,比如說淘寶在凌晨2點去做維護系統,12306每晚也會做對系統的維護,到第二天早上才能購票。

要是不影響正常業務的表結構變更還是可以在線去做的,比如說數據太多,int類型的主鍵不太夠用了需要換成bigint類型的主鍵,再或者原來某個字段是有唯一性約束的,現在我想去掉唯一性的約束,這種修改不會影響到線上正在執行的業務,所以修改起來問題不是特別大,但是在實際操作上,必須要認真的對待,否則也會對系統造成非常不好的影響。

ALTER TABLE修改表結構的弊病

在系統沒有上線時候,alter table語句是可以的,包括我們在navicat圖形界面上去做表結構的修改,最終也會用alter table語句的,但是這個ddl數據還是挺多的

  • 由於修改表結構是表級鎖,因此在修改表結構時,影響寫入操作
    如果要給1000萬數據的表做修改,這個時間有點長,並且期間是不能對這個表做任何修改和讀取的,對線上的業務影響非常大,數據越多影響越長
  • 如果表結構修改失敗,必須還原表結構,所以耗時更長。
    舉個例子給表某個字段設置not null,修改到中途發現表有的數據這個字段是null值,這時候還要還原回來,這個期間也是鎖表的
  • 大數據表記錄多,修改表結構鎖表時間很久
    可以想象下給淘寶表添加一個字段得多慢

使用PerconaTookit工具

是Percona公司維護的這個MySQL工具包,這家公司太優秀了,比如對MySQL做的深入優化再次發行後叫Percona Server數據庫,這個數據庫的性能是MySQL中性能最好的,甚至說當初阿里巴巴開發出自家的電商數據庫OceanBase也是借鑑了PerconaServer很多的技術。不管怎麼說,Percona的產品幾乎都是免費試用的,這一點非常好。

話說回來,這個PerconaToolkit裏包含了一個pt-online-schema-change的工具,可以在線完成修改表結構

在線修改表結構的原理

pt-online-schema-change工具怎麼能夠實現不鎖表實現在線修改表結構的呢?

在這裏插入圖片描述
我現在想修改訂單表的結構,這個Percona去重新拷貝訂單表的結構,創建一個新的數據表,然後在新的數據表裏做結構上的修改, 在這之後Percona會在原來的訂單表上創建觸發器,只要原來的數據表有添加、修改、刪除,就會同步到新的訂單表,Percona程序也沒有閒着,它還會把原來訂單表的數據拷貝到新的訂單表裏,這樣雙管齊下之後,數據都同步過來之後,原來訂單表也沒有數據之後,Percona程序就會刪除原來的訂單表,然後把新的訂單表的名字改成原來訂單表的名字,這樣就完成了在線修改表結構,並且全程都沒有鎖表呀

安裝PerconaTookit依賴包

因爲PerconaToolKit的工具包和MySQL8.0有衝突,所以不要安裝在同虛擬機實例上,建議在一個沒有安裝過任何實例的虛擬機實例上安裝PerconaTooKit

  1. 安裝三方依賴包
yum install -y perl-DBI
yum install -y perl-DBD-mysql
yum install -y perl-IO-Socket-SSL
yum install -y perl-Digest-MDS
yum install -y perl-TermReadKey
  1. 接下來安裝PerconaTookit工具

將兩個文件的rpm包上傳到虛擬機實例,然後執行rpm -ivh *.rpm ,就安裝完成了

pt-online-schema-change使用參數

pt-online-schema-change OPTIONS DSN

上面命令中,OPTIONS是可選參數 ,DSN是邏輯庫邏輯表
在這裏插入圖片描述

舉個栗子

把客戶收穫地址中的name字段改爲VARCHAR(20)
這個操作不會對業務系統產生影響,所以是允許在線修改的,我們不想鎖表就使用該工具,怎麼做?

pt-online-schema-change --host=192.168.99.202 --port=3306 --user=root --password=abc123456 --alter "Modify name VARCHAR(20) NOT NULL COMMENT '收貨人'" D=net,t=t_customer_address --print --execute

太長了,真個縮略圖
在這裏插入圖片描述

接下來檢查數據庫的認證方式,如果是Mysql8.0的方式,需要在navicat上執行下面兩行命令,把數據庫的認證方式從mysql8.0改成老版本的認證方式,這樣PerconaTookit就可以連接上了(不支持Mysql8.0的認證方式)

ALTER USER 'root'@'%' INDENIFIED BY 'password' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'%' INDENIFIED WITH mysql_native_password by 'abc123456';	

下圖是一個執行成功的截圖
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章