sql >> Database >  >> RDS >> Mysql

Toon alle huidige sloten van get_lock

Vanaf MySQL 5.7 is dit mogelijk, maar hiervoor moet eerst de mdl worden ingeschakeld instrument in de performance_schema.setup_instruments tafel. U kunt dit tijdelijk doen (tot de volgende keer dat de server opnieuw wordt opgestart) door het volgende uit te voeren:

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

Of permanent, door de volgende bezwering toe te voegen aan de [mysqld] gedeelte van uw my.cnf bestand (of welke configuratiebestanden MySQL dan ook leest op uw installatie):

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

(Natuurlijk moet MySQL opnieuw worden gestart om de configuratiewijziging door te voeren als u de laatste benadering volgt.)

Sloten die u na verwijdert de mdl instrument is ingeschakeld, kan worden bekeken door een SELECT . uit te voeren tegen de performance_schema.metadata_locks tafel. Zoals vermeld in de documenten, GET_LOCK sloten hebben een OBJECT_TYPE van 'USER LEVEL LOCK' , zodat we onze zoekopdracht daarop kunnen filteren met een WHERE clausule:

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> 

De betekenissen van de kolommen in dit resultaat zijn meestal voldoende gedocumenteerd op https://dev.mysql.com/doc/refman/en/metadata-locks-table.html , maar één punt van verwarring is vermeldenswaard:de OWNER_THREAD_ID kolom doet niet bevatten de verbinding ID (zoals zou worden getoond in de PROCESSLIST of geretourneerd door CONNECTION_ID() ) van de draad die het slot vasthoudt. Verwarrend genoeg wordt de term "thread-ID" soms gebruikt als synoniem van "verbindings-ID" in de MySQL-documentatie, maar dit is niet een van die keren. Als u de verbinding wilt bepalen ID van de verbinding met een slot (bijvoorbeeld om die verbinding te beëindigen met KILL ), moet u de PROCESSLIST_ID . opzoeken die overeenkomt met de THREAD_ID in de performance_schema.threads tafel. Om bijvoorbeeld de verbinding te verbreken die mijn slot hierboven vasthield...

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. Hoe laatste record (op voorwaarde) te verwijderen uit een tabel in MySql

  2. Definieer een variabele binnen select en gebruik deze binnen dezelfde select

  3. Azure Virtual Machines voor gebruik van SQL Server

  4. phpMyAdmin gooit een #2002 kan niet inloggen op de mysql-server phpmyadmin