mysql
6.9 同步 FAQ
问: master还在运行中,如何在不停止它的情况下配置slave?
答: 需要设计几个选项参数。如果已经有了master的备份并且记录了数据快照二进制日志文件名以及偏移位置(运行 SHOW MASTER STATUS 查看结果),执行以下步骤:
确定slave指定了一个唯一的服务器编号。
在slave上执行如下语句,把一些选项值改成实际值:
mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name',
-> MASTER_USER='master_user_name',
-> MASTER_PASSWORD='master_pass',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;
在slave上执行 START SLAVE 语句。
如果事先没有备份master的数据,可以用以下方法快速创建一个备份。以下所有的操作都是在master上。
提交语句:
mysql> FLUSH TABLES WITH READ LOCK;
确保这个锁一直存在,执行以下命令(或者其他类似的):
shell> tar zcf /tmp/backup.tar.gz /var/lib/mysql
执行以下语句,记录下输出的结果,后面要用到:
mysql> SHOW MASTER STATUS;
释放锁:
mysql> UNLOCK TABLES;
上述步骤的另一个办法是创建master的SQL转储文件。只需在master上执行 mysqldump --master-data 命令,然后将导出来的SQL转储文件载入slave。不过,这么做会制作二进制数据快照的方式慢一点。
无论使用上述两种方法的哪种,最后都能创建master的数据快照然后记录二进制日志文件名以及偏移位置。可以在好几的其他的slave上使用同一个备份的二进制数据快照。得到master的快照后,只要master的二进制日志完好无损,接着就能开始设置slave了。两个决定是否需要等待较长时间的限制是:在master上磁盘空间保存二进制日志,以及slave从master抓取更新事件。
也可以使用 LOAD DATA FROM MASTER。这个语句可以很方便地在slave上取得数据快照并且能立刻调整二进制日志文件名以及偏移位置。在将来,我们推荐用 LOAD DATA FROM MASTER 来设置slave。警告,它只能用于 MyISAM 表,并且可能会保持一个较长时间的读锁。由于它还没达到所期望的高效率,因此如果数据表很大,最好还是在执行完 FLUSH TABLES WITH READ LOCK 后直接制作二进制数据快照。
问:是否slave总是需要连接到master?
答:不,非必需。slave可以好几小时甚至几天关闭或者不连接master,然后重连再取得更新操作日志。例如,可以在拨号链接上设置一个mater/slave关系,拨号可能只是零星的不定期的连接。这种做法隐含的是,在任何指定的时间里,除非使用特殊的度量标准,否则slave不能保证总是能和master保持同步。在未来,有个选项可以阻止master,除非至少有一个slave在同步中。
问:怎么知道比master晚了多少?也就是说,怎么知道slave最后同步的时间?
答:如果slave是4.1.1或者更高,只需查看 SHOW SLAVE STATUS 结果中的 Seconds_Behind_Master 字段。对于老版本,可以用以下办法。如果在slave上执行 SHOW PROCESSLIST 语句结果显示SQL线程(对MySQL 3.23则是slave线程)正在运行,这就意味着该线程至少从master读取一个更新操作事件。详情请看"6.3 Replication Implementation Details"。
当SQL线程执行一个master上读取的更新操作事件时,它把自己的时间改成事件的时间(这也就是 TIMESTAMP 也要同步的原因)。在
SHOW PROCESSLIST 结果中的 Time 字段中,slave的SQL线程显示的秒数就是最后一次同步的时间戳和slave本机的实际时间相差秒数。可以根据这个值来判断最后同步的时间。注意,如果slave已经从master断开好几个小时了,然后重新连接,就能看到slave的SHOW PROCESSLIST 结果中的SQL线程的Time 字段的值类似3600。这是因为slave正在执行一个小时前的语句。