もしMySQLにおいてROLLBACK処理が発生したら?どのくらい時間がかかるか確認する為の指標。
START TRANSACTIONまたはBEGINでを使用すると、トランザクションを COMMIT または ROLLBACK で終了するまでは、自動コミットは無効のままになるので、以下の様に明示的にトランザクション内で処理を実行して、該当プロセスをKillコマンドでCOMMIT前に停止しました。当然ながらROLLBACK処理が実行されるのですが、大量にデータを扱っている場合にどれだけ時間がかかるか不安な場合もあるかと思います。全てのケースで確認した訳ではないですが、以下の様にINFORMATION_SCHEMA.INNODB_TRXテーブル内のtrx_rows_modifiedを確認する事でおおよその目途を付ける事が可能です。
1.テスト用の処理を実行
2. 上記処理中のトランザクションの確認
3.ROLLBACK
処理が終わったので、Connection_id63をKillしてROLLBACKを発生させます。
ロールバック中は以下のSQLで進行状況を確認。
4.確認用のSQLを実行
SELECT OBJECT_TYPE, OBJECT_SCHEMA, OBJECT_NAME, LOCK_TYPE,
LOCK_STATUS, THREAD_ID, PROCESSLIST_ID, PROCESSLIST_INFO, PROCESSLIST_USER,PROCESSLIST_HOST,
PROCESSLIST_DB,PROCESSLIST_COMMAND, trx_id,trx_state,trx_rows_modified,trx_started
FROM performance_schema.metadata_locks INNER JOIN performance_schema.threads ON THREAD_ID = OWNER_THREAD_ID
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX ON PROCESSLIST_ID = trx_mysql_thread_id
WHERE trx_state = "ROLLING BACK" and PROCESSLIST_ID <> CONNECTION_ID();
SELECT THREAD_ID, PROCESSLIST_ID, PROCESSLIST_INFO, PROCESSLIST_USER,PROCESSLIST_HOST,
PROCESSLIST_DB,PROCESSLIST_COMMAND, trx_id,trx_state,trx_rows_modified,trx_started
FROM performance_schema.threads INNER JOIN INFORMATION_SCHEMA.INNODB_TRX ON PROCESSLIST_ID = trx_mysql_thread_id
WHERE PROCESSLIST_ID <> CONNECTION_ID();
ROLLBACKが進むと同時に以下のtrx_rows_modifiedの値も減少して行く事が確認出来ます。
どれだけROLLBACKに時間がかかるか?不明瞭な場合は不安になる事ともあると思うので
定数的な指標があると安心ですね。
上記の画像から抜粋
左の画像にあるように、ROLLBACK処理の 進捗が進むにあたり、トランザクションで変更 した行数が減少して行く事が確認出来ます。 |
5. ROLLBACKの確認