Mysql

ALTER TABLE 表 ENGINE=InnoDB 超時 - 表仍然轉換嗎?

  • June 16, 2017

我正在將舊的 MISAM 數據庫中的表轉換為 InnoDB,以增加在斷電等情況下的強韌性。

我正在使用 Mysql 5.5.x

在做生產系統之前,我正在測試機器上對數據庫的副本進行試執行——以防萬一。

我使用這些資訊用 mysqldump 備份了這些表。

有些表的轉換時間超過了超時時間(600 秒),所以我收到 2013 年錯誤:

ALTER TABLE voice.members ENGINE=InnoDB Error Code: 2013. Lost connection to MySQL server during query

當我稍後檢查該表時,它被列為 InnoDB。

show table status in voice like "members";

以下是我的問題:

  1. 我可以假設轉換按預期進行嗎?
  2. 我應該執行任何明顯的檢查以確保完整性不受影響嗎?
  3. 我應該在轉換之前強制數據庫是單個使用者,還是我唯一擔心轉換正在進行時響應時間可能很糟糕+如果從初始備份恢復會失去工作?

問題 #1

我可以假設轉換按預期進行嗎?

在測試之前不要假設轉換。感謝您提前備份。

問題2

我應該執行任何明顯的檢查以確保完整性不受影響嗎?

對於您轉換為 InnoDB 的任何給定表mydb.mytable,請檢查兩件事

表數

計算所有行

SELECT COUNT(1) FROM mydb.mytable;

在 MyISAM 備份上執行相同的計數。

校驗和

執行整個表的校驗和

CHECKSUM TABLE mydb.mytable;

在 MyISAM 備份上執行相同的校驗和。

關於問題 #2 的總結

您應該為 InnoDB 和 MyISAM 表獲得相同的計數和校驗和值。

問題 #2 的建議

如果您想分階段管理 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;

或保留它作為備份

ALTER TABLE mydb.mytable_old RENAME mydb.mytable_myisam;

問題 #3

我應該在轉換之前強制數據庫是單個使用者,還是我唯一擔心轉換正在進行時響應時間可能很糟糕+如果從初始備份恢復會失去工作?

如果要將實時 MyISAM 表轉換為 InnoDB,請參閱我的文章將實時 MyISAM 表轉換為 InnoDB

如果您非常懷疑或擔心數據失去,那麼您對單使用者訪問的想法很好。

你可以像這樣重啟mysql

service mysql restart --skip-networking

root@localhost. 進行轉換,然後

service mysql restart

試一試 !!!

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