MySql 5.5.37を使用しています。ルートとして、いくつかのテーブルをロックしているトランザクションを強制終了しようとしています。走る
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX\G
そして、出力を取得します
…
*************************** 6. row ***************************
trx_id: 143E6CDE
trx_state: RUNNING
trx_started: 2014-10-20 06:03:56
trx_requested_lock_id: NULL
trx_wait_started: NULL
trx_weight: 2305887
trx_mysql_thread_id: 158360
trx_query: delete from event where id not in (select q.* from (select e.id FROM event e, (select object_id, max(date_processed) d from event group by object_id) o where e.object_id = o.object_id and e.date_processed = o.d) q)
trx_operation_state: NULL
trx_tables_in_use: 3
trx_tables_locked: 3
trx_lock_structs: 210634
trx_lock_memory_bytes: 19790264
trx_rows_locked: 10668793
trx_rows_modified: 2095253
trx_concurrency_tickets: 0
trx_isolation_level: REPEATABLE READ
trx_unique_checks: 1
trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
trx_adaptive_hash_latched: 0
trx_adaptive_hash_timeout: 10000
しかし、「kill」ステートメントを実行すると、エラーが発生します。
mysql> kill 158360;
ERROR 1095 (HY000): You are not owner of thread 158360
MySqlからこのトランザクションをクリアするにはどうすればよいですか?
自分のスレッドはいつでも強制終了できますが、他のユーザーのスレッドを強制終了するには、SUPER特権が必要です。
RDSを利用していますか?その場合、ユーザー名が「root」であっても、SUPER権限はありません。 「ルート」名について暗黙的に特別なものは何もありません。重要なのは特権です。
次のコマンドを実行して、権限を確認できます。
mysql> SHOW GRANTS;
スレッドを強制終了する方法については、これがRDSの場合、プロシージャ rds_kill() を呼び出して実行できます。
RDS MySQLを使用している場合は、Bill Answerを完了するために、次の例のようにrds_kill()プロシージャを使用できます。
MySQLに接続
リストプロセス:
SHOW PROCESSLIST;
私の場合、ID 1948452のプロセスを終了したいと思います。
CALL mysql.rds_kill(1948452);
できた
Azure Database for MySQLを使用している場合は、手順az_kill
を使用できます。
リストプロセス:
SHOW PROCESSLIST;
強制終了するプロセスのIDが345の場合は、次のコマンドを実行します。
CALL mysql.az_kill(345);
これは、現在ログインしているユーザーがプロセス345を所有していない場合でも機能します。