sql >> Databasteknik >  >> RDS >> Mysql

Visa alla aktuella lås från get_lock

Från MySQL 5.7 och framåt är detta möjligt, men du måste först aktivera mdl instrument i performance_schema.setup_instruments tabell. Du kan göra detta tillfälligt (tills servern startas om nästa gång) genom att köra:

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

Eller permanent genom att lägga till följande besvärjelse till [mysqld] avsnittet i din my.cnf fil (eller vilka konfigurationsfiler som MySQL läser från på din installation):

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

(Naturligtvis måste MySQL startas om för att konfigurationsändringen ska träda i kraft om du använder det senare tillvägagångssättet.)

Lås du tar ut efter mdl instrumentet har aktiverats kan ses genom att köra en SELECT mot performance_schema.metadata_locks tabell. Som noterats i dokumenten, GET_LOCK lås har en OBJECT_TYPE av 'USER LEVEL LOCK' , så att vi kan filtrera ner vår fråga till dem med en WHERE klausul:

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> 

Innebörden av kolumnerna i detta resultat är för det mesta tillräckligt dokumenterade på https://dev.mysql.com/doc/refman/en/metadata-locks-table.html , men en punkt av förvirring är värd att notera:OWNER_THREAD_ID kolumnen inte innehålla anslutningen ID (som skulle visas i PROCESSLIST eller returneras av CONNECTION_ID() ) av tråden som håller låset. Förvirrande nog används termen "tråd-ID" ibland som en synonym till "anslutnings-ID" i MySQL-dokumentationen, men det är inte en av de gångerna. Om du vill bestämma anslutningen ID för anslutningen som har ett lås (till exempel för att döda den anslutningen med KILL ), måste du leta upp PROCESSLIST_ID som motsvarar THREAD_ID i performance_schema.threads tabell. Till exempel för att döda anslutningen som höll mitt lås ovanför...

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. MySQL-förberedda uttalanden

  2. php:snabbaste sättet att generera ett 5-siffrigt nummer som inte redan finns i MySQL db-kolumnen (med ett unikt attribut)

  3. Får ett ORA - 00907-fel på följande vid ON UPDATE

  4. Installation av postgresql med NSIS