Mysql

在不停機的情況下向生產 MySQL 數據庫添加索引?

  • September 10, 2019

我希望通過添加適當的索引來提高在生產中執行的大型 MySQL 數據庫的查詢性能。我們嘗試在實時數據庫上添加索引,但這當然會鎖定數據庫並使我們的應用程序不可用。

我們曾考慮使用更新的索引創建一個輔助數據庫,然後將數據庫數據遷移過來。這將涉及一些停機時間。

有沒有更好的方法來做到這一點?這不涉及停機時間?

預先感謝您的幫助

如果您想為活動表添加索引,有兩種主要方法:

方法#1:pt-online-schema-change(首選)

這個工具很壯觀。它將為您創建一個臨時表並填充它。

簡單來說,它對 mydb.mytable 執行此操作:

CREATE TABLE mydb.mytable_new LIKE mydb.mytable;
INSERT INTO mydb.mytable_new SELECT * FROM mydb.mytable;
RENAME mydb.mytable TO mydb.mytable_old,mydb.mytable_new TO mydb.mytable;
DROP TABLE mydb.mytable_old;

然而,pt-online-schema-change遠不止於此。

如果已經復製到臨時表的行被更新或刪除了怎麼辦?好吧, pt-online-schema-change將觸發器添加到源表中,以便為您處理那些插入後的更改。當複製到臨時表完成時,觸發器在切換之前被刪除。

如果實時系統具有高負載或伺服器是否存在限制(例如–max-load–critical-load)或停止(例如–pause-file )複製到臨時表的選項有奴隸落後於一定的秒數(例如–max-lag)。

您還可以選擇僅測試語法(–dry-run)或實際執行更改(–execute)。

有一些選項可以將 sql_log_bin 等變數設置為 0 並檢查外鍵約束。

這個工具的局限性?

  1. 確保在切換發生之前有足夠的空間放置臨時表。例如,如果源表是 200G,我會確保磁碟上至少有 250G 可用空間。
  2. 以秒為單位切換臨時表和舊表的瞬間中斷。

方法 #2:線上 DDL

MySQL 還能夠使用本機 SQL 線上執行 DDL。

看我的舊帖

不幸的是,線上 DDL 沒有限製或停止操作的選項。

結語

這些天我使用pt-online-schema-change因為我可以控制這個過程的快慢。我什至可以在一系列的一天內停止並恢復它。有一次,我和另外兩個 DBA在一個具有超高讀寫能力的 30GB 上執行了pt-online-schema-change 。與我們合作的開發團隊要求我們在白天暫停複製到臨時表並在夜間恢復複製。我們在三天內完成了這項工作。一切都很成功,應用程序從未受到影響。

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