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

間違ったMySQL更新クエリ後の回復?

    ここで学ぶべき2つの教訓があります:

    1. バックアップデータ
    2. トランザクション内でUPDATE/DELETEステートメントを実行して、ROLLBACKを使用できるようにします。 計画どおりに進まない場合

    データベースのトランザクション(自動コミット、明示的および暗黙的)処理に注意することで、バックアップからデータを復元する必要がなくなります。

    トランザクションは、データ操作ステートメントを制御して、それらがアトミックであることを確認します。 「アトミック」であるということは、トランザクションが発生するか、発生しないことを意味します。データベースへのトランザクションの完了を通知する唯一の方法は、COMMITのいずれかを使用することです。 またはROLLBACK ステートメント(ANSI-92によると、残念ながらトランザクションを作成/開始するための構文が含まれていなかったため、ベンダー固有です)。 COMMIT トランザクション内で行われた変更(ある場合)を適用します。 ROLLBACK トランザクション内で行われたアクションはすべて無視されます。UPDATE/DELETEステートメントが意図しないことを行う場合は非常に望ましいです

    通常、個々のDML(Insert、Update、Delete)ステートメントは、自動コミットトランザクションで実行されます。ステートメントが正常に完了するとすぐにコミットされます。つまり、あなたのような場合にステートメントが実行される前の状態にデータベースをロールバックする機会はありません。何か問題が発生した場合、利用可能な唯一の復元オプションは、バックアップからデータを再構築することです(バックアップが存在する場合)。 MySQLでは、自動コミットは InnoDBのデフォルト -MyISAMはトランザクションをサポートしていません。次を使用して無効にできます:

    SET autocommit = 0
    

    明示的なトランザクションとは、ステートメントが明示的に定義されたトランザクションコードブロック内にラップされている場合です- MySQLの場合、それはSTART TRANSACTION 。また、明示的に作成されたCOMMITも必要です。 またはROLLBACK トランザクション終了時のステートメント。ネストされたトランザクションは、このトピックの範囲を超えています。

    暗黙のトランザクションは、明示的なトランザクションとは少し異なります。暗黙的なトランザクションでは、トランザクションを明示的に定義する必要はありません。ただし、明示的なトランザクションと同様に、COMMITが必要です。 またはROLLBACK 提供されるステートメント。

    結論

    明示的なトランザクションは最も理想的なソリューションです。明示的なトランザクションには、COMMITというステートメントが必要です。 またはROLLBACK 、トランザクションを完了するために、そして何が起こっているかは、必要があれば他の人が読むことができるように明確に述べられています。データベースをインタラクティブに操作する場合、暗黙のトランザクションは問題ありませんが、COMMIT ステートメントは、結果がテストされ、有効であると完全に判断された後にのみ指定する必要があります。

    つまり、次を使用する必要があります:

    SET autocommit = 0;
    
    START TRANSACTION;
      UPDATE ...;
    

    ...そしてCOMMIT;のみを使用します 結果が正しい場合。

    とはいえ、UPDATEおよびDELETEステートメントは通常、影響を受ける行の数のみを返し、特定の詳細は返しません。そのようなステートメントをSELECTステートメントに変換し、結果を確認して、前に正確であることを確認します。 UPDATE/DELETEステートメントを試行します。

    補遺

    DDL(データ定義言語)ステートメントは自動的にコミットされます-COMMITステートメントは必要ありません。 IE:テーブル、インデックス、ストアドプロシージャ、データベース、およびビューの作成または変更ステートメント。



    1. 予期しない例外:SQLSTATE [HY000][1045]ユーザー****@'localhost'のアクセスが拒否されました(パスワードを使用:YES)

    2. Triggerで生成された値をHibernateValueObjectに与える方法は?

    3. すべてのテーブルのSQLServerデータベースに外部キー制約を削除する方法-SQLServer/TSQLチュートリアルパート72

    4. SQL Serverシステムデータベース–Tempdbのメンテナンス