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.
今回紹介した内容は、