注:以下は大まかにテストされているだけです。データベースによっては、ダンプするときに考慮すべきことがさらにある場合があります。
これは特定の状況でのみ可能です。
最初の失敗は、トランザクションがセッションにバインドされていることです。再度接続してrollback
を発行するため 、rollback
ロールバックするトランザクションがないため、使用できません。それは別のセッションでした。
2番目の失敗は、通常、mysqldumpに暗黙のcommit
をキャストするいくつかのステートメントがあることです。 したがって、トランザクションを終了します。これには、すべてのDDLステートメントが含まれます(データ定義言語、これにはdrop
が含まれます 、alter
、create
など)および(un)lock tables
。
したがって、1つのトランザクションでダンプファイルを実行するには、ダンプは次のように作成されている必要があります。
mysqldump -uuser -ppw database --no-create-info --skip-add-locks --skip-disable-keys --skip-triggers >dumpfiles
--no-create-info
mysqldumpにすべてのdrop table ...; create table ...;
ステートメント。
--skip-add-locks
mysqldumpにすべてのlock table ...; unlock table ...;
ステートメント。
--skip-disable-keys
mysqldumpにすべてのalter table ... disable keys; alter table ...enable keys;
ステートメント。
--skip-triggers
mysqldumpにすべてのcreate trigger ...;
をスキップさせます ステートメント。
--single-transaction
もあります オプションですが、このオプションは単一のテーブルにのみ適用されます。
3番目の(可能性のある)失敗は、関係するすべてのテーブルがInnoDBやBDBのようにトランザクションに対応している場合にのみ、トランザクションを完全にロールバックできることです。そこにMyISAMテーブルがある場合は、insert
ステートメントはロールバックされません。
以下は失敗し、source
を引き起こします コマンドはストアドプロシージャでは許可されていません。むしろmysqlクライアントの一部です。
すべてが考慮された場合は、次のように行うことができます:
まず、次のような手順を作成します。
DELIMITER $$
CREATE PROCEDURE sp_exec_dumpfile()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
END ;
START TRANSACTION;
SOURCE '/path/to/dumpfile.sql';
COMMIT;
END $$
DELIMITER ;
次に、スクリプトで次のように実行します。
mysql -uuser -ppw -hhost databasename -e "CALL sp_exec_dump()"
または、もちろん、ダンプファイル名を使用してプロシージャをパラメータ化します。