sql >> Databáze >  >> RDS >> Mysql

Zobrazit všechny aktuální zámky z get_lock

Od MySQL 5.7 výše je to možné, ale vyžaduje nejprve povolení mdl nástroj v performance_schema.setup_instruments stůl. Můžete to udělat dočasně (do příštího restartu serveru) spuštěním:

UPDATE performance_schema.setup_instruments
SET enabled = 'YES'
WHERE name = 'wait/lock/metadata/sql/mdl';

Nebo trvale přidáním následujícího zaklínadla do [mysqld] části vašeho my.cnf soubor (nebo jakékoli konfigurační soubory, které MySQL čte ve vaší instalaci):

[mysqld]
performance_schema_instrument = 'wait/lock/metadata/sql/mdl=ON'

(Pokud použijete druhý přístup, bude samozřejmě nutné restartovat MySQL, aby se změna konfigurace projevila.)

Zámky, které odstraníte po mdl nástroj byl aktivován lze zobrazit spuštěním SELECT proti performance_schema.metadata_locks stůl. Jak je uvedeno v dokumentech, GET_LOCK zámky mají OBJECT_TYPE z 'USER LEVEL LOCK' , takže můžeme náš dotaz filtrovat až na ně pomocí WHERE klauzule:

mysql> SELECT GET_LOCK('foobarbaz', -1);
+---------------------------+
| GET_LOCK('foobarbaz', -1) |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM performance_schema.metadata_locks 
    -> WHERE OBJECT_TYPE='USER LEVEL LOCK'
    -> \G
*************************** 1. row ***************************
          OBJECT_TYPE: USER LEVEL LOCK
        OBJECT_SCHEMA: NULL
          OBJECT_NAME: foobarbaz
OBJECT_INSTANCE_BEGIN: 139872119610944
            LOCK_TYPE: EXCLUSIVE
        LOCK_DURATION: EXPLICIT
          LOCK_STATUS: GRANTED
               SOURCE: item_func.cc:5482
      OWNER_THREAD_ID: 35
       OWNER_EVENT_ID: 3
1 row in set (0.00 sec)

mysql> 

Významy sloupců v tomto výsledku jsou většinou adekvátně zdokumentovány na https://dev.mysql.com/doc/refman/en/metadata-locks-table.html , ale jeden bod zmatení stojí za zmínku:OWNER_THREAD_ID sloupec není obsahovat spojení ID (jako by bylo uvedeno v PROCESSLIST nebo vráceno CONNECTION_ID() ) závitu, který drží zámek. Je matoucí, že termín „ID vlákna“ je někdy používán jako synonymum „ID připojení“ v dokumentaci MySQL, ale není jeden z těch časů. Pokud chcete určit spojení ID připojení, které drží zámek (například za účelem ukončení tohoto připojení pomocí KILL ), budete muset vyhledat PROCESSLIST_ID který odpovídá THREAD_ID v performance_schema.threads stůl. Například zabít spojení, které drželo můj zámek nahoře...

mysql> SELECT OWNER_THREAD_ID FROM performance_schema.metadata_locks
    -> WHERE OBJECT_TYPE='USER LEVEL LOCK'
    -> AND OBJECT_NAME='foobarbaz';
+-----------------+
| OWNER_THREAD_ID |
+-----------------+
|              35 |
+-----------------+
1 row in set (0.00 sec)

mysql> SELECT PROCESSLIST_ID FROM performance_schema.threads
    -> WHERE THREAD_ID=35;
+----------------+
| PROCESSLIST_ID |
+----------------+
|             10 |
+----------------+
1 row in set (0.00 sec)

mysql> KILL 10;
Query OK, 0 rows affected (0.00 sec)


  1. Záměna s Oracle CONNECT BY

  2. Zlepšení výkonu backendu Část 2/3:Použití databázových indexů

  3. MySQL - SELECT AS in WHERE

  4. Efektivnější systém hierarchie