Mysql

MySQL:將大型 MyISAM 表更改為 InnoDB (17gb+) 的最佳配置/方法

  • September 11, 2019

我有一個大型 MySQL (5.1) MyISAM 表(13gb 表,4GB 索引 - 40mm+ 記錄)

  • 我將在生產環境中將此表轉換為 InnoDB。

數據庫位於具有 8GB RAM 的雲伺服器上(可能會升級到 30GB RAM 僅用於轉換)。

一種方法是簡單地編寫一個 ALTER 查詢:

哪些設置和配置最適合以這種方式盡可能快速順利地進行轉換?

我讀過的一些建議設置:

  • 大 innodb_buffer_pool_size (4GB 是最大的可能嗎?)
  • 使用 shell 命令預讀舊的 myisam 數據/索引文件
  • 增加 innodb_log_file_size (這種情況下最好的大小是多少?)
  • 在 X 個並行執行緒中執行 alter table,其中 X 是伺服器上 CPU 核心的數量(你怎麼能這樣做?)
  • 其他小調整(innodb_doublewrite=0,innodb_flush_log_at_trx_commit=0)

注意:這裡的類似問題(但具有不同伺服器大小 的小表範例): https ://stackoverflow.com/questions/2081823/speeding-up-conversion-from-myisam-to-innodb/2081871#2081871

當然,還有其他方法可以做到這一點:

  • 對舊表執行 MYSQLDUMP 並重新插入到新的干淨 InnoDB 表中,
  • 執行“SELECT * … INSERT INTO…”查詢,或
  • 對舊表執行“SELECT INTO OUTFILE…”查詢,然後對新表執行“LOAD DATA INFILE…”查詢

1. 您將如何配置您的設置以使此更改盡可能快速和順利進行?

2. 你認為哪種方法是最好的選擇?

建議 #1

假設您的雲伺服器上有相當多的磁碟空間。您分階段創建 InnoDB 表以觀察磁碟空間和 RAM 的慢動作效果。

假設您的 MyISAM 表被呼叫mydb.mytable,並且您想將其轉換為 InnoDB。

嘗試以下操作:

CREATE TABLE mydb.mytable_new LIKE mydb.mytable;
ALTER TABLE mydb.mytable_new ENGINE=InnoDB;
INSERT INTO mydb.mytable_new SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable RENAME mydb.mytable_old;
ALTER TABLE mydb.mytable_new RENAME mydb.mytable;

玩桌子。

如果你喜歡它的性能,那麼

DROP TABLE mydb.mytable_old;

如果你不喜歡它的表現,那麼

TRUNCATE TABLE mydb.mytable_old;
INSERT INTO mydb.mytable_old SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable RENAME mydb.mytable_zap;
ALTER TABLE mydb.mytable_old RENAME mydb.mytable;
DROP TABLE mydb.mytable_zap;

建議 #2

您提到您正在執行 MySQL 5.1。除非您安裝 InnoDB 外掛,否則 InnoDB 是單執行緒的。要使 InnoDB 成為多執行緒:

一旦你做任何一個,請配置 InnoDB 以使用多個核心。看我過去的文章:

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