MySQL 8.
MySQL 5.7とそれ以前の行ベースレプリケーション
行ベースレプリケーションについては、
MySQL 5.SHOW SLAVE STATUS構文からSeconds_の値が増えていくのですが、
まず、SHOW PROCESSLIST構文とSHOW SLAVE STATUS構文を見ればすぐにわかります。
SBRの場合
マスター側で以下のSQLを実行したとします。
mysql> show variables like 'binlog_format'; +---------------+-----------+ | Variable_name | Value | +---------------+-----------+ | binlog_format | STATEMENT | +---------------+-----------+ mysql> DELETE FROM sbtest2; Query OK, 1000000 rows affected (20.22 sec)
スレーブで確認します
mysql> show processlist;
+--------+-------------+---------------------+------+-------------+---------+--------------------+----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+-------------+---------------------+------+-------------+---------+--------------------+----------------------+
| 211476 | system user | | db | Connect | 17 | updating | DELETE FROM sbtest2 |
+--------+-------------+---------------------+------+-------------+---------+--------------------+----------------------+
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 17
Slave_SQL_Running_State: updating
Seconds_から遅延していることが確認でき、SHOW PROCESSLISTからどのようなSQLが実行されているか確認することができます。
RBRの場合
マスター側で以下のSQLを実行したとします。
mysql> show variables like 'binlog_format'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | binlog_format | ROW | +---------------+-------+ mysql> DELETE FROM sbtest1 LIMIT 2000000;
スレーブで確認します
mysql> show processlist;
+--------+-------------+---------------------+------+-------------+---------+---------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+-------------+---------------------+------+-------------+---------+---------------------------------------------------------------+------------------+
| 211476 | system user | | NULL | Connect | 41 | Reading event from the relay log | NULL |
+--------+-------------+---------------------+------+-------------+---------+---------------------------------------------------------------+------------------+
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 40
Slave_SQL_Running_State: Reading event from the relay log
RBRの場合は、Seconds_から遅延していることは確認することはできますが、SHOW PROCESSLISTからはReading event from the relay logと表示されるだけです。
Reading event from the relay log、
原因を探るには、binlog_オプションを有効にして、
MySQL 8.0の行ベースレプリケーション
MySQL 8.
Applying batch of row changes (write)…RBRでInsertしている状態Applying batch of row changes (update)…RBRでUpdateしている状態Applying batch of row changes (delete)…RBRでDeleteしている状態
これらが追加されたことで、Reading event from the relay logというSQLスレッドがどのような処理をしているのかわからない状態ではなく、
先ほどのように試してみます。
マスター側で以下のSQLを実行したとします。
mysql> show variables like 'binlog_format'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | binlog_format | ROW | +---------------+-------+ mysql> DELETE FROM test LIMIT 1000000; Query OK, 1000000 rows affected (4.88 sec)
スレーブで確認します
mysql> show processlist;
+----+-----------------+-----------+------+---------+-------+----------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------+------+---------+-------+----------------------------------------+------------------+
| 17 | system user | | test | Query | 9 | Applying batch of row changes (delete) | NULL |
+----+-----------------+-----------+------+---------+-------+----------------------------------------+------------------+
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 8
Slave_SQL_Running_State: Applying batch of row changes (delete)
このように、
さらに、binlog_オプションSHOW PROCESSLISTのINFOカラムに実行しているSQLが表示されるようになります。
mysql> show processlist; +----+-----------------+-----------+------+---------+-------+----------------------------------------+--------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-----------------+-----------+------+---------+-------+----------------------------------------+--------------------------------+ | 19 | system user | | test | Query | 8 | Applying batch of row changes (delete) | DELETE FROM test LIMIT 1000000 | +----+-----------------+-----------+------+---------+-------+----------------------------------------+--------------------------------+
このように、
最後に、
mysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/sql/Applying batch of row changes%'; Query OK, 0 rows affected (0.01 sec) Rows matched: 3 Changed: 0 Warnings: 0 mysql> SELECT * from performance_schema.setup_instruments WHERE NAME LIKE 'stage/sql/Applying batch of row changes%'; +--------------------------------------------------+---------+-------+------------+------------+---------------+ | NAME | ENABLED | TIMED | PROPERTIES | VOLATILITY | DOCUMENTATION | +--------------------------------------------------+---------+-------+------------+------------+---------------+ | stage/sql/Applying batch of row changes (write) | YES | YES | progress | 0 | NULL | | stage/sql/Applying batch of row changes (update) | YES | YES | progress | 0 | NULL | | stage/sql/Applying batch of row changes (delete) | YES | YES | progress | 0 | NULL | +--------------------------------------------------+---------+-------+------------+------------+---------------+
そして、performance_テーブルから確認します。
- WORK_
COMPLETED …完了作業量 - WORK_
ESTIMATED …見積り作業量
となっており、
mysql> SELECT WORK_COMPLETED, WORK_ESTIMATED FROM performance_schema.events_stages_current WHERE EVENT_NAME LIKE 'stage/sql/Applying batch of row changes%' +--------------------------------------------------+----------------+----------------+ | EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED | +--------------------------------------------------+----------------+----------------+ | stage/sql/Applying batch of row changes (delete) | 561 | 908 | +--------------------------------------------------+----------------+----------------+
しかし、
まとめ
MySQL 8.
今回紹介した内容は、