Mysql

MySQL 在轉換到 InnoDB 期間使用交換

  • December 16, 2013

我正在嘗試將我數據庫中的一些 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

試一試 !!!

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