首页 > 数据库 > MySQL > 正文

MySQL手册版本 5.0.20-MySQL同步(五)

2024-07-24 12:55:05
字体:
来源:转载
供稿:网友
国内最大的酷站演示中心!

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正在执行一个小时前的语句。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表