回答:
ALTERを実行してストレージエンジンを変更しても、行が消えることはありません。しかし、あなたはあなたがあなたの質問で「データベース初心者」だと言ったので、いくつかのアドバイスをさせてください。
既存のスキーマを変更したり、データに影響を与える可能性のあることを行ったりする場合、基本的なアドバイスを次に示します。
おそらくもっと多くのことができるでしょうが、上記は何かがうまくいかないときにオプションを提供します。
不足しているデータ/行に関しては、「前/後」のスナップショットを比較して知る方法はありません。最新のバックアップと比較して、少なくともその程度を確認できます。
多くのダウンタイムなしでMyISAMをInnoDBに変換する最良の方法の1つは、レプリケーションスレーブを使用するという1つの前提条件のみです。
これがその計画の鳥瞰図です
簡単に聞こえますか?この背後には多くの詳細があります。
レプリケーションマスター/スレーブセットアップの作成
マスターに大きな混乱を与えることなくスレーブを作成する洗練された方法があります。私は2つの投稿を書きました:
rsyncの使用方法を詳しく説明するのではなく、これら2つの投稿を読んでください。
スレーブ上のすべてのMyISAMテーブルをInnoDBに変換します
DBスレーブでは、次のSQLステートメントを実行できます。
MySQL 5.5の場合:
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM' AND table_schema NOT IN
('information_schema','mysql','performance_schema');
MySQL 5.5より前のMySQLのバージョン
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM' AND table_schema NOT IN
('information_schema','mysql');
クエリからの出力を使用して、スレーブ用の変換スクリプトを作成します。
次の2行をスクリプトの先頭に配置する必要があります。
SET SQL_LOG_BIN = 0;
STOP SLAVE;
スクリプトは、最初にバイナリロギングを無効にし(スレーブにバイナリログを設定した場合)、レプリケーションを停止し、各MyISAMテーブルをInnoDBに変換します。
そのスクリプトを作成して実行する方法は次のとおりです。
SQLSTMT="SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') FROM information_schema.tables WHERE engine = 'MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema')"
INNODB_CONV_SCRIPT=MassConvertMyISAMTablesToInnoDB.sql
echo "SET SQL_LOG_BIN = 0;" > ${INNODB_CONV_SCRIPT}
echo "STOP SLAVE;" >> ${INNODB_CONV_SCRIPT}
mysql -h(IP of Master) -u... -p... --skip-column-names -A -e"${SQL}" >> ${INNODB_CONV_SCRIPT}
echo "START SLAVE;" >> ${INNODB_CONV_SCRIPT}
mysql -h(IP of Slave) -u... -p... --skip-column-names -A < ${INNODB_CONV_SCRIPT}
アプリをスレーブに向ける
スレーブからSELECTクエリを実行します。スレーブ上のデータコンテンツに満足している場合は、次のようにアプリをスレーブに向けてください。
SHOW SLAVE STATUS\G
Seconds_Behind_Masterが0であることを確認して実行しますservice mysql stop
(ダウンタイム開始)これまで無傷でおめでとうございます、おめでとうございます!!!
追加ボーナス:マスター/スレーブの代わりにマスター/マスターレプリケーション(別名循環レプリケーション)をセットアップする場合、代わりにこれを行うことができます:
SHOW SLAVE STATUS\G
Seconds_Behind_Masterが0であることを確認して実行しますSTOP SLAVE;
CHANGE MASTER TO MASTER_HOST='';
あなたが今持っているのは、逆のマスター/スレーブです。新しいマスターにはInnoDBデータがあり、古いマスターはMyISAMデータを持つスレーブになりました。読み取りと書き込みを分割すると、読み取りはスレーブから行われ(読み取りはMyISAMからInnoDBより高速になります)、書き込みはマスターに送られます(InnoDBのトランザクションサポート)。ハンナ・モンタナが歌うように、あなたは(はい、私はショーを愛する2人の娘を持っている)の両方の長所を取得します!
別の追加ボーナス:マスターがInnoDBになったため、ダウンタイムやトランザクションを妨げることなく、マスターからmysqldumpを実行できます。唯一の欠点は、CPUとディスクI / Oの増加です。したがって、マスター(InnoDB)のみのテーブル構造のmysqldumpおよびスレーブのみのデータのmysqldump(このようなダンプはInnoDBまたはMyISAMへの参照を持ちません。データのみになります)とmysqldumpのスレーブがMyISAMレイアウトを持つためのテーブル構造。
この新しいセットアップにより、可能性が広がります...
更新2011-08-27 19:50 EDT
謝罪いたします。私は質問を完全には読みませんでした。あなたはすでに会話をしました。
既にバイナリロギングを有効にしていて、以前にバックアップを行っている場合のみ、
service mysql stop
service mysql start --datadir=/var/lib/mysql2
これにより、記録されたすべてが捕捉され、変換が開始されるはずです。繰り返しますが、これはすべて、前回のバックアップの前に既にバイナリロギングをオンにしていた場合に発生します。そうでなければ、私の哀dolの意。