дамп таблицы mysql innodb_locks в файл - PullRequest
1 голос
/ 17 марта 2019

Согласно справке mysql о странице информации транзакции и блокировки InnoDB :

  1. Данные, представленные таблицами транзакций и блокировки (INNODB_TRX, INNODB_LOCKS и INNODB_LOCK_WAITS)представляет собой представление о быстро меняющихся данных.
  2. По соображениям производительности и для минимизации вероятности введения в заблуждение объединений между таблицами транзакций и блокировок InnoDB собирает необходимую транзакцию и блокирует информацию в промежуточный буфер всякий раз, когда выполняется SELECT onвыпущена любая из таблиц.

Итак, я хотел бы знать, есть ли способ записать эту информацию / буфер в файл?

1 Ответ

1 голос
/ 17 марта 2019

Я не думаю, что есть какой-то способ получить доступ к буферу, о котором вы говорите напрямую.Вы можете использовать SELECT запросы к именованным таблицам INFORMATION_SCHEMA, которые будут косвенно считывать эти буферы.

Альтернативой является создание вывода SHOW ENGINE INNODB STATUS в журнал ошибок MySQL Server каждые 15 секунд.,При желании вы можете включить в этот статус информацию о блокировкеСм. https://dev.mysql.com/doc/refman/5.6/en/innodb-enabling-monitors.html

Пример: я включил монитор блокировки InnoDB с параметрами блокировки.

mysql> set global innodb_status_output_locks=on;
mysql> set global innodb_status_output=on;

Затем я создал одну транзакцию, вставив ее в тестовую таблицу.Но пока не фиксируйте.

mysql> BEGIN;
mysql> INSERT INTO t VALUES (1,1);

Во втором окне я начинаю другую транзакцию с другой вставки, предназначенной для конфликта с первой.

mysql> INSERT INTO t VALUES (1,1);

Это зависает, ожидаядля блокировки, удерживаемой первым сеансом.

Затем подключите журнал ошибок MySQL, чтобы наблюдать блокировки:

------------
TRANSACTIONS
------------
Trx id counter 3528210
Purge done for trx's n:o < 3528208 undo n:o < 0 state: running but idle
History list length 814
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 3528209, ACTIVE 30 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 360, 1 row lock(s)
MySQL thread id 1, OS thread handle 0x70000a4bd000, query id 23 localhost root update
insert into t values (1,1,null,null)
------- TRX HAS BEEN WAITING 30 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 3342 page no 3 n bits 72 index `PRIMARY` of table `test`.`t` trx id 3528209 lock mode S locks rec but not gap waiting
------------------
TABLE LOCK table `test`.`t` trx id 3528209 lock mode IX
RECORD LOCKS space id 3342 page no 3 n bits 72 index `PRIMARY` of table `test`.`t` trx id 3528209 lock mode S locks rec but not gap waiting
---TRANSACTION 3528208, ACTIVE 49 sec
2 lock struct(s), heap size 360, 1 row lock(s), undo log entries 1
MySQL thread id 2, OS thread handle 0x70000a501000, query id 17 localhost root
TABLE LOCK table `test`.`t` trx id 3528208 lock mode IX
RECORD LOCKS space id 3342 page no 3 n bits 72 index `PRIMARY` of table `test`.`t` trx id 3528208 lock_mode X locks rec but not gap
...