web-dev-qa-db-ja.com

ALTER TABLEテーブルENGINE = InnoDBのタイムアウト-テーブルはまだ変換されていますか?

古いMYISAMデータベースのテーブルをInnoDBに変換して、停電などの場合の堅牢性を高めています。

Mysql 5.5.xを使用しています

本番システムを実行する前に、念のため、テストマシンでDBのコピーを試しに実行しています。

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. 変換前にDBがシングルユーザーであることを強制する必要がありますか、それとも、変換が進行中の応答時間が悪くなる可能性があるか、最初のバックアップから復元した場合に作業が失われることだけを心配する必要がありますか?
2
Anders Johansen

質問1

変換が意図したとおりに行われたと思いますか?

テストするまで変換を想定しないでください。よろしくお願いします。

質問2

整合性が損なわれていないことを確認するために実行する必要がある明らかなチェックはありますか?

InnoDBに変換した特定のテーブルmydb.mytableについて、2つのことを確認してください

テーブル数

すべての行を数える

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

変換前にDBがシングルユーザーであることを強制する必要がありますか、それとも変換が進行中の応答時間が悪くなる可能性があるか、または最初のバックアップから復元した場合に作業が失われることだけを心配する必要がありますか?

ライブMyISAMテーブルをInnoDBに変換する場合は、私の投稿を参照してください Converting live MyISAM table to InnoDB

非常に懐疑的であるか、データの損失を恐れている場合は、シングルユーザーアクセスのアイデアは問題ありません。

あなたはこのようにmysqlを再起動することができます

service mysql restart --skip-networking

root@localhostとしてmysqlにログインします。次に変換を行います

service mysql restart

試してみる !!!

4
RolandoMySQLDBA