Mysql
ALTER TABLE 表 ENGINE=InnoDB 超時 - 表仍然轉換嗎?
我正在將舊的 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
我應該執行任何明顯的檢查以確保完整性不受影響嗎?
對於您轉換為 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
試一試 !!!