sql >> データベース >  >> RDS >> Mysql

get_lockから現在のすべてのロックを表示する

    MySQL 5.7以降では、これは可能ですが、最初にmdlを有効にする必要があります performance_schema.setup_instrumentsのインストゥルメント テーブル。これは、次のコマンドを実行して一時的に(サーバーが次に再起動されるまで)実行できます。

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

    または永続的に、次の呪文を[mysqld]に追加します my.cnfのセクション ファイル(またはMySQLがインストールで読み取る構成ファイル):

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

    (当然、後者のアプローチを採用する場合、構成の変更を有効にするには、MySQLを再起動する必要があります。)

    に取り出すロック mdl 機器が有効になっていることは、SELECTを実行することで確認できます performance_schema.metadata_locksに対して テーブル。ドキュメントに記載されているように、GET_LOCK ロックにはOBJECT_TYPEがあります 'USER LEVEL LOCK'の 、したがって、WHEREを使用してクエリをフィルタリングできます。 条項:

    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> 
    

    この結果の列の意味は、ほとんどの場合、に適切に文書化されています。 https://dev.mysql.com/doc/refman/en/metadata-locks-table.html 、ただし、1つの混乱点は注目に値します:OWNER_THREAD_ID 列はしません 接続を含む ID(PROCESSLISTに表示されるようなもの またはCONNECTION_ID()によって返されます )ロックを保持するスレッドの。紛らわしいことに、「スレッドID」という用語は、MySQLドキュメントで「接続ID」の同義語として使用されることがありますが、これはではありません。 それらの時間の1つ。 接続を確認する場合 ロックを保持している接続のID(たとえば、 KILL )、PROCESSLIST_IDを検索する必要があります THREAD_IDに対応します performance_schema.threads テーブル。たとえば、上のロックを保持していた接続を切断するには...

    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. Postgres-CREATE TABLE FROM SELECT

    2. パスワードに特殊文字が含まれている場合、JDBCを使用してOracleデータベースに接続できません

    3. Oracle:シーケンスMySequence.currvalはこのセッションではまだ定義されていません

    4. SQL Serverのsys.views、sys.system_views、およびsys.all_viewsの違い