web-dev-qa-db-fra.com

Comment puis-je tuer une transaction dans MySql en tant que root?

J'utilise MySql 5.5.37. En tant que root, j'essaie de supprimer une transaction qui verrouille certaines tables. je cours

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX\G   

et obtenir la sortie

…
*************************** 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

Mais lorsque je lance une instruction "kill", j'obtiens une erreur.

mysql> kill 158360;
ERROR 1095 (HY000): You are not owner of thread 158360

Comment effacer cette transaction de MySql?

13
Dave

Vous pouvez toujours tuer votre propre thread, mais vous avez besoin du privilège SUPER pour tuer le thread de quelqu'un d'autre.

Êtes-vous sur RDS? Si tel est le cas, vous ne disposez pas du privilège SUPER, même si votre nom d'utilisateur est 'root'. Le nom de la racine n'a rien d'implicite, c'est le privilège qui compte. 

Vous pouvez confirmer vos privilèges en lançant:

mysql> SHOW GRANTS;

Pour ce qui est de savoir comment tuer le thread, s’il s’agit de RDS, vous pouvez appeler une procédure rds_kill () pour le faire à votre place.

27
Bill Karwin

Pour compléter la réponse à la question si vous utilisez RDS MySQL, vous pouvez utiliser la procédure rds_kill (), comme dans l'exemple suivant:

Se connecter à MySQL

Processus de liste:

SHOW PROCESSLIST;

Dans mon cas, je veux tuer le processus d'identification 1948452:

CALL mysql.rds_kill(1948452);

Terminé

25
Paulo Victor

Si vous utilisez Azure Database for MySQL, vous pouvez utiliser la procédure az_kill:

Processus de liste:

SHOW PROCESSLIST;

Dans le cas où l'ID du processus à tuer est 345, exécutez:

CALL mysql.az_kill(345);

Cela fonctionne même si l'utilisateur actuellement connecté ne possède pas le processus 345.

0
remeika