sql >> Database teknologi >  >> RDS >> Mysql

Vis alle aktuelle låse fra get_lock

Fra MySQL 5.7 og fremefter er dette muligt, men det kræver først at aktivere mdl instrument i performance_schema.setup_instruments bord. Du kan gøre dette midlertidigt (indtil serveren næste gang genstartes) ved at køre:

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

Eller permanent ved at tilføje følgende besværgelse til [mysqld] sektion af din my.cnf fil (eller hvilke konfigurationsfiler MySQL læser fra på din installation):

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

(Naturligvis skal MySQL genstartes for at få konfigurationsændringen til at træde i kraft, hvis du tager den sidstnævnte tilgang.)

Låse du tager ud efter mdl instrumentet er blevet aktiveret, kan ses ved at køre en SELECT mod performance_schema.metadata_locks bord. Som nævnt i dokumenterne, GET_LOCK låse har en OBJECT_TYPE af 'USER LEVEL LOCK' , så vi kan filtrere vores forespørgsel ned til 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> 

Betydningen af ​​kolonnerne i dette resultat er for det meste tilstrækkeligt dokumenteret på https://dev.mysql.com/doc/refman/da/metadata-locks-table.html , men et punkt til forveksling er værd at bemærke:OWNER_THREAD_ID kolonne ikke indeholde forbindelsen ID (som ville blive vist i PROCESSLIST eller returneret af CONNECTION_ID() ) af tråden, der holder låsen. Forvirrende nok bruges udtrykket "tråd-id" nogle gange som et synonym for "forbindelses-id" i MySQL-dokumentationen, men dette er ikke en af ​​de gange. Hvis du vil bestemme forbindelsen ID for forbindelsen, der holder en lås (f.eks. for at dræbe denne forbindelse med KILL ), skal du slå PROCESSLIST_ID op der svarer til THREAD_ID i performance_schema.threads bord. For eksempel for at dræbe forbindelsen, der holdt min lås over...

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. #1222 - De brugte SELECT-sætninger har et andet antal kolonner

  2. Hvordan omarrangerer man en primær nøgle?

  3. pdo lastInsertId returnerer nul(0)

  4. Forbindelsen mislykkedes:Adgang nægtet for brugeren 'root'@'localhost' (ved hjælp af adgangskode:JA) fra php-funktionen