Почему 'lock_type' для information_schema.INNODB_LOCKS всегда записывается? - PullRequest
1 голос
/ 10 мая 2019

Согласно документу: https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-table.html,

LOCK_TYPE таблицы INFORMATION_SCHEMA INNODB_LOCKS должно иметь 2 Возможные значения: RECORD AND TABLE.

Однако я не видел, чтобы это поле было "СТОЛ". Что бы я ни пытался, это всегда было «ЗАПИСЬ». Кто-нибудь может предложить мне случай, чтобы "ТАБЛИЦА" случилась?

Спасибо, Сяньи Е

Ответы [ 2 ]

0 голосов
/ 11 мая 2019

Вы ссылаетесь на некоторую документацию по MySQL 5.7, поэтому я предполагаю, что вы используете 5.7.

Единственными блокировками таблиц в InnoDB являются блокировки метаданных , которые также называются намеренными блокировками , задокументированными здесь: https://dev.mysql.com/doc/refman/5.5/en/innodb-locking.html#innodb-intention-locks

Любая транзакция, которая хочет выполнить какую-либо операцию DML для чтения или записи записей в таблице (т. Е. SELECT / INSERT / UPDATE / DELETE), должна сначала получить блокировку метаданных. Несколько одновременных сеансов могут получить блокировки метаданных для выполнения DML, и они не конфликтуют друг с другом.

Аналогично, операции с метаданными (операторы DDL ALTER, DROP или TRUNCATE TABLE) должны получить блокировку метаданных, прежде чем они начнутся. Таким образом, операторы DDL блокируются, если есть какие-либо транзакции, выполняющие операторы DML, и наоборот.

Вот как DML блокируется при запросе таблицы во время длительной ALTER.

В MySQL 5.7 вы можете настроить некоторые инструменты PERFORMANCE_SCHEMA для блокировки метаданных, но это довольно трудоемкий труд. См https://www.percona.com/blog/2016/12/28/quickly-troubleshooting-metadata-locks-mysql-5-7/

В MySQL 8.0.1 по умолчанию есть новый PERFORMANCE_SCHEMA.DATA_LOCKS для мониторинга этих блокировок. Вот пример:

mysql> select * from performance_schema.data_locks\G
*************************** 1. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 4874033848:1112:140194859105464
ENGINE_TRANSACTION_ID: 15171
            THREAD_ID: 49
             EVENT_ID: 12
        OBJECT_SCHEMA: test
          OBJECT_NAME: mytable
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: NULL
OBJECT_INSTANCE_BEGIN: 140194859105464
            LOCK_TYPE: TABLE                <-- TABLE lock
            LOCK_MODE: IX                   <-- "IX" intention lock mode
          LOCK_STATUS: GRANTED
            LOCK_DATA: NULL
*************************** 2. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 4874033848:55:4:2:140194863232024
ENGINE_TRANSACTION_ID: 15171
            THREAD_ID: 49
             EVENT_ID: 12
        OBJECT_SCHEMA: test
          OBJECT_NAME: mytable
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: PRIMARY
OBJECT_INSTANCE_BEGIN: 140194863232024
            LOCK_TYPE: RECORD
            LOCK_MODE: X
          LOCK_STATUS: WAITING
            LOCK_DATA: 1

Также есть таблица METADATA_LOCKS :

mysql> select * from performance_schema.metadata_locks;
+-------------+--------------------+----------------+-------------+-----------------------+---------------------+---------------+-------------+-------------------+-----------------+----------------+
| OBJECT_TYPE | OBJECT_SCHEMA      | OBJECT_NAME    | COLUMN_NAME | OBJECT_INSTANCE_BEGIN | LOCK_TYPE           | LOCK_DURATION | LOCK_STATUS | SOURCE            | OWNER_THREAD_ID | OWNER_EVENT_ID |
+-------------+--------------------+----------------+-------------+-----------------------+---------------------+---------------+-------------+-------------------+-----------------+----------------+
| TABLE       | test               | mytable        | NULL        |       140194860588144 | SHARED_WRITE        | TRANSACTION   | GRANTED     | sql_parse.cc:5820 |              48 |             26 |
...
0 голосов
/ 10 мая 2019
what Mysql version are you using?

Mysql8 INFORMATION SCHEMA does not have the table INNODB_LOCKS
mysql> show tables like '%innodb%';
+-----------------------------------------+
| Tables_in_information_schema (%INNODB%) |
+-----------------------------------------+
| INNODB_BUFFER_PAGE                      |
| INNODB_BUFFER_PAGE_LRU                  |
| INNODB_BUFFER_POOL_STATS                |
| INNODB_CACHED_INDEXES                   |
| INNODB_CMP                              |
| INNODB_CMPMEM                           |
| INNODB_CMPMEM_RESET                     |
| INNODB_CMP_PER_INDEX                    |
| INNODB_CMP_PER_INDEX_RESET              |
| INNODB_CMP_RESET                        |
| INNODB_COLUMNS                          |
| INNODB_DATAFILES                        |
| INNODB_FIELDS                           |
| INNODB_FOREIGN                          |
| INNODB_FOREIGN_COLS                     |
| INNODB_FT_BEING_DELETED                 |
| INNODB_FT_CONFIG                        |
| INNODB_FT_DEFAULT_STOPWORD              |
| INNODB_FT_DELETED                       |
| INNODB_FT_INDEX_CACHE                   |
| INNODB_FT_INDEX_TABLE                   |
| INNODB_INDEXES                          |
| INNODB_METRICS                          |
| INNODB_TABLES                           |
| INNODB_TABLESPACES                      |
| INNODB_TABLESPACES_BRIEF                |
| INNODB_TABLESTATS                       |
| INNODB_TEMP_TABLE_INFO                  |
| INNODB_TRX                              |
| INNODB_VIRTUAL                          |
+-----------------------------------------+
30 rows in set (0.01 sec)

исх http://drib.tech/programming/debug-monitor-mysql-locks

...