Mysql
維護生產大表
我有一張非常大的桌子:
Table1
在生產環境中,我需要更改其中的一列。在沒有停機時間的情況下,最好的首選方法是什麼?
選項1:
CREATE TABLE Table1_new LIKE Table1; INSERT INTO Table1_new SELECT * FROM Table1; ALERT TABLE Table1_new ADD COLUMN a; ALERT TABLE Table1 RENAME Table1_bu; ALERT TABLE Table1_new RENAME Table1; ###And then INSERT IGNORE INTO Table1 SELECT ... FROM Table1 WHERE id > ..;
瑪麗亞數據庫:5.6.44
InnoDB:5.6.44
CREATE TABLE Table1_new LIKE Table1; INSERT INTO Table1_new SELECT * FROM Table1; ALERT TABLE Table1_new ADD COLUMN a; --slow because of big table
不是最優的並且有問題。更好的:
CREATE TABLE Table1_new LIKE Table1; ALERT TABLE Table1_new ADD COLUMN a; -- fast because table empty INSERT INTO Table1_new SELECT *, NULL FROM Table1; -- needs value for `a`
問題是——如果
Table1
被寫入怎麼辦?這樣的 DML 將會失去。ALERT TABLE Table1 RENAME Table1_bu; ALERT TABLE Table1_new RENAME Table1;
應該作為單個語句(原子地)完成:
RENAME TABLE Table1 TO Table1_bu, Table1_new TO Table1;
計劃 A:(您的程式碼,修復後):只有在不發生任何修改的情況下才可行。
計劃 B:pt-online-schema-change(假設您沒有在桌面上使用觸發器)。
C計劃:橡木……——不;似乎沒有維護
計劃 D:升級到 MySQL 8.0(可能是 MariaDB 10.3)這樣你就可以得到
ALTER TABLE .. ADD COLUMN .. ALGORITHM=INSTANT