Mysql

維護生產大表

  • November 5, 2019

我有一張非常大的桌子: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

引用自:https://dba.stackexchange.com/questions/252503