1、原题
1.1、英文原题
You have a MySQL replication setup and you intentionally stop the SQL thread on the slave. mysql> SHOW SLAVE STATUS\G
…
Slave_IO_Running: Yes
Slave_SQL_Running: No
What are two reasons that you may stop the SQL thread on the slave while keeping the I/O thread running?
A、to allow the remaining events to be processed on the slave while not receiving new events from the master.
B、to allow a backup to be created under reduced load.
C、to allow for point-in-time recovery on the slave.
D、to prevent schema changes from propagating to the slave before they are validated.
E、to prevent any transaction experiencing a deadlock.
1.2、中文翻译
您有一个MySQL复制设置,并且有意停止从属服务器上的SQL线程。mysql> SHOW SLAVE STATUS\G
…
Slave_IO_Running: Yes
Slave_SQL_Running: No
在保持I/O线程运行的同时,您可能会停止从属服务器上的SQL线程的两个原因是什么?
A、 以允许在从机上处理剩余的事件,同时不从主机接收新的事件。
B、 以允许在减少的负载下创建备份。
C、 以允许在从属设备上进行时间点恢复。
D、 以防止模式更改在验证之前传播到从属服务器。
E、 以防止任何事务出现死锁。
1.3、答案
C、D
2、题目解析
2.1、题干解析
本题考察MySQL复制时两个关键线程的作用:IO线程和SQL应用线程。当IO线程保持运行而停止了SQL应用线程时,从服务器会继续从主服务器读取二进制日志,写入relay日志,但是不会解析为SQL去执行从而应用到数据文件中。所以日志被同步了,但从库的数据暂时没有变化。
2.2、选项解析
- 因为IO线程仍然在运行,所以会继续接收主库的新事务,所以选项A错误。
- 因为没有应用SQL,所以数据保持不变,所以适合做时间点恢复,因为保存了某个时间点下的数据。所以选项C正确。
- 因为没有应用SQL,所以主库的模式更改不会传播到从库,所以选项D正确。
3、总结
- MySQL的复制有两个关键线程:IO线程、SQL应用线程。IO线程接收从主库传来的新的二进制日志并写入中继日志。SQL应用线程负责读取中继日志,并运行其中的SQL从而做数据更新。