sql >> データベース >  >> RDS >> Mysql

MYSQLは、トランザクション内のダンプファイルをすべてまたはまったく再生しません

    注:以下は大まかにテストされているだけです。データベースによっては、ダンプするときに考慮すべきことがさらにある場合があります。

    これは特定の状況でのみ可能です。

    最初の失敗は、トランザクションがセッションにバインドされていることです。再度接続してrollbackを発行するため 、rollback ロールバックするトランザクションがないため、使用できません。それは別のセッションでした。

    2番目の失敗は、通常、mysqldumpに暗黙のcommitをキャストするいくつかのステートメントがあることです。 したがって、トランザクションを終了します。これには、すべてのDDLステートメントが含まれます(データ定義言語、これにはdropが含まれます 、altercreate など)および(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()"
    

    または、もちろん、ダンプファイル名を使用してプロシージャをパラメータ化します。




    1. IDでレコードを検索し、いくつかの列、Ruby on Railsを選択するにはどうすればよいですか?

    2. テーブルのスキーマを取得する

    3. テキストファイルの構造(テーブル)

    4. PHPPDOプリペアドステートメントバインドNULL値