MySQL 在轉換到 InnoDB 期間使用交換
我正在嘗試將我數據庫中的一些 MyISAM 表轉換為 InnoDB (MySQL 5.1)。伺服器有相當多的記憶體(96G),給我帶來問題的表可能是 5000 萬行 - 16000 萬行(從 10G 到 25G),但無論表如何,都會發生同樣的事情尺寸。
在“INSERT INTO … SELECT * FROM …”期間,MySQL 開始使用交換記憶體,我必須終止轉換,因為它需要 10 多個小時左右。在研究轉換過程時,我發現多個來源說 innodb_buffer_pool_size 應該是伺服器 RAM 的 70% 左右,所以我就這樣做了,但我認為這可能是導致問題的原因。
以下是一些重要的 my.cnf 設置:
innodb_buffer_pool_size=64G innodb_flush_method=O_DIRECT innodb_log_file_size=224K innodb_log_buffer_size=24M innodb_flush_log_at_trx_commit=0 innodb_additiona_mem_pool_size=24M
key_buffer_size=8G sort_buffer_size=4M read_buffer_size=128K
任何想法我做錯了什麼/為什麼要交換?任何想法都會有所幫助。
要切換 MySQL 引擎,您可以:
1 製作一個ALTER TABLE myTable ENGINE=InnoDB
2 為您的表創建一個 mysqldump,然後編輯CREATE TABLE語句以用 InnoDB 替換 MyISAM 並在新表中恢復轉儲(我稱之為 myTable_InnoDB):
DROP TABLE IF EXISTS `mytable`; CREATE TABLE `mytable` ( `id` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
.
DROP TABLE IF EXISTS `mytable_InnoDB`; CREATE TABLE `mytable_InnoDB` ( `id` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
最好的祝福
這是您使用交換的原因:您使用的是 MySQL 5.1。
MySQL 5.1 中的 InnoDB 儲存引擎不像 MySQL 5.5+ 那樣了解記憶體。
這些年來我看到的是:每當 InnoDB 緩衝池大於已安裝 RAM 的 50% 時,就會發生大量交換。我寫過關於 MySQL 5.5 的文章(請參閱我的文章How do you tune MySQL for a heavy InnoDB work?)
我會進一步建議你閱讀
請執行以下一項或多項建議:
建議 #1
升級到 MySQL 5.6 並將innodb_buffer_pool_instances設置為 2 或更多。
建議 #2
將 innodb_buffer_pool_size 減少到 48G(我會使用 44G 只是為了遠低於 50% RAM 標記)
建議#3
您可以 mysqldump 數據,但我會一次將數據塊減少到 1 行,如下所示:
第 1 步:製作 InnoDB 表
CREATE TABLE mytable_innodb LIKE mytable_myisam; ALTER TABLE mytable_innodb ENGINE=InnoDB;
第 2 步:mysqldump 數據
MYSQLDUMP_OPTIONS="--no-create-info --skip-extended-insert" mysqldump ${MYSQLDUMP_OPTIONS} mydb mytable_myisam | sed 's/mytable_myisam/mytable_innodb/g' > mydata.sql
注意:mysqldump 一次只會插入一行(–skip-extended-insert)。如果您認為 mysql 和 InnoDB 可以使用較小的緩衝池來處理它,請刪除 –skip-extended-insert。
第 2a 步:可選
在 InnoDB Double Write Buffer Off 的情況下重新啟動 mysql。這將有助於快速寫入 InnoDB 表。
service mysql restart --innodb-doublewrite=0
第 3 步:導入數據
mysql -Dmydb < mydata.sql
第 3a 步(如果您執行第 2a 步)
service mysql restart
試一試 !!!