21-查看从库的复制进度
很多情况下,我们都想知道从库复制的进度如何。知道这个差距,可以帮助我们判断是否需要手工来做主从的同步工作,也可以帮助我们判断从库上做统计的数据精度如何。这个值可以通过SHOW PROCESSLIST列表中的Slave_SQL_Running线程的Time值得到,它记录了从库当前执行的 SQL 时间戳与系统时间之间的差距,单位是秒。下面通过例子测试一下这个时间的准确性。
(1)首先在主库上插入一个包含当前时间戳的记录:
mysql> alter table repl_test add column createtime datetime;
Query OK, 5 rows affected (0.02 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> insert into repl_test values(5,now());
Query OK, 1 row affected (0.00 sec)
mysql> select * from repl_test;
+------+---------------------+
| id | createtime |
+------+---------------------+
| 5 | 2007-07-24 15:36:47 |
+------+---------------------+
1 rows in set (0.00 sec)
(2)为了方便模拟时间,这里把从库上复制的IO进程(Slave_IO_Running)停下来,使得从库暂时不写中继日志,也就是最后执行的SQL就是当前中继日志中最后一个SQL。
mysql> stop slave IO_THREAD ;
Query OK, 0 rows affected (0.00 sec)
(3)一段时间之后,在从库端查询复制的情况:
mysql> select * from repl_test;
+------+---------------------+
| id | createtime|
+------+---------------------+
| 5 | 2007-07-24 15:36:47 |
+------+---------------------+
1 rows in set (0.00 sec)
mysql> select now();
+---------------------+
| now()|
+---------------------+
| 2007-07-24 16:21:58 |
+---------------------+
1 row in set (0.00 sec)
(4)这时再查询SQL线程的时间,显示的Time值是2705,也就是最后执行的复制操作大概是主库上45分钟前的更新。
mysql> show processlist \G
1. row
…
2. row
Id: 5
User: system user
Host:
db: NULL
Command: Connect
Time: 2705
State: Has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
3. row
…
3 rows in set (0.00 sec)
由于MySQL复制的机制是执行主库传输过来的二进制日志,二进制日志中的每个语句通过设置时间戳来保证执行时间和顺序的正确性,所以每个语句执行之前都会首先设置时间戳,而通过查询这个进程的Time就可以知道最后设置的时间戳和当前时间的差距。