[ 来源:http://www.it55.com | 作者: | 时间:2007-09-07 | 收藏 | 推荐 ] 【大 中 小】
问: master还在运行中,如何在不停止它的情况下配置slave?
http://www.it55.com
答: 需要设计几个选项参数。如果已经有了master的备份并且记录了数据快照二进制日志文件名以及偏移位置(运行 SHOW MASTER STATUS 查看结果),执行以下步骤:
1. 确定slave指定了一个唯一的服务器编号。
2. 在slave上执行如下语句,把一些选项值改成实际值:
sflj http://www.it55.com kg^&fgd
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; 免费设计素材下载http://www.it55.com
3. 在slave上执行 START SLAVE 语句。 免费壁纸下载http://www.it55.com
如果事先没有备份master的数据,可以用以下方法快速创建一个备份。以下所有的操作都是在master上。
it55.com
1. 提交语句:
mysql> FLUSH TABLES WITH READ LOCK;
vd;k;l http://www.it55.com rdfg
2. 确保这个锁一直存在,执行以下命令(或者其他类似的): 45398 http://www.it55.com it55学习IT知识,享受IT生活 4dfkjn
shell> tar zcf /tmp/backup.tar.gz /var/lib/mysql
3. 执行以下语句,记录下输出的结果,后面要用到:
精美韩国模版下载http://www.it55.com
mysql> SHOW MASTER STATUS; 免费网页模版下载http://www.it55.com
4. 释放锁:
mysql> UNLOCK TABLES; 45398 http://www.it55.com it55学习IT知识,享受IT生活 4dfkjn
上述步骤的另一个办法是创建master的SQL转储文件。只需在master上执行 mysqldump --master-data 命令,然后将导出来的SQL转储文件载入slave。不过,这么做会制作二进制数据快照的方式慢一点。
无论使用上述两种方法的哪种,最后都能创建master的数据快照然后记录二进制日志文件名以及偏移位置。可以在好几的其他的slave上使用同一个备份的二进制数据快照。得到master的快照后,只要master的二进制日志完好无损,接着就能开始设置slave了。两个确实需要等待的时间长度被以下两个方面所限制:在master上磁盘空间保存二进制日志,以及slave从master抓取更新事件。 IT资讯之家 http://www.it55.com
也可以使用 LOAD DATA FROM MASTER。这个语句可以很方便地在slave上取得数据快照并且能立刻调整二进制日志文件名以及偏移位置。在将来,我们推荐用 LOAD DATA FROM MASTER 来设置slave。警告,它只能用于 MyISAM 表,并且可能会保持一个较长时间的读锁。由于它还没达到所期望的高效率,因此如果数据表很大,最好还是在执行完 FLUSH TABLES WITH READ LOCK 后直接制作二进制数据快照。
精美韩国模版下载http://www.it55.com
问:是否slave总是需要连接到master? vd;k;l http://www.it55.com rdfg
答:不,非必需。slave可以好几小时甚至几天关闭或者不连接master,然后重连再取得更新操作日志。例如,可以在拨号链接上设置一个mater/slave关系,拨号可能只是零星的不定期的连接。这种做法隐含的是,在任何指定的时间里,除非使用特殊的度量标准,否则slave不能保证总是能和master保持同步。在未来,有个选项可以阻止master,除非至少有一个slave在同步中。
http://www.it55.com在线教程
问:怎么知道比master晚了多少?也就是说,怎么知道slave最后同步的时间? 45398 http://www.it55.com it55学习IT知识,享受IT生活 4dfkjn
答:如果slave是4.1.1或者更新,只需查看 SHOW SLAVE STATUS 结果中的 Seconds_Behind_Master 字段。对于老版本,可以用以下办法。如果在slave上执行 SHOW PROCESSLIST 语句结果显示SQL线程(对MySQL 3.23则是slave线程)正在运行,这就意味着该线程至少从master读取一个更新操作事件。详情请看"6.3 Replication Implementation Details"。 vd;k;l http://www.it55.com rdfg
当SQL线程执行一个master上读取的更新操作事件时,它把自己的时间改成事件的时间(这也就是 TIMESTAMP 也要同步的原因)。在 SHOW PROCESSLIST 结果中的 Time 字段中,slave的SQL线程显示的秒数就是最后一次同步的时间戳和slave本机的实际时间相差秒数。可以根据这个值来判断最后同步的时间。注意,如果slave已经从master断开好几个小时了,然后重新连接,就能看到slave的 SHOW PROCESSLIST 结果中的SQL线程的Time 字段的值类似3600。这是因为slave正在执行一个小时前的语句。 45398 http://www.it55.com it55学习IT知识,享受IT生活 4dfkjn
问:如何强制master在slave赶上全部更新之前阻止更新?
答:执行以下步骤:
1. 在master上,执行以下语句:
免费资源http://www.it55.com
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
sflj http://www.it55.com kg^&fgd
记录下结果中的日志文件名以及偏移位置,它们是同步的坐标值。
2. 在slave上,提交以下语句,MASTER_POS_WAIT() 函数的参数的值就是前面取得的同步坐标值:
mysql> SELECT MASTER_POS_WAIT('log_name', log_offset);
SELECT 语句会阻止更新,直到slave同步到了上述日志文件及位置。在这个时候,slave就和master保持同步了,并且这个语句就会返回。
3. 在master上,执行以下语句允许master重新处理更新操作: 45398 http://www.it55.com it55学习IT知识,享受IT生活 4dfkjn
mysql> UNLOCK TABLES; 精美韩国模版下载http://www.it55.com
问:设置一个双向复制时要注意什么问题?
答:MySQL同步目前还不支持任何在master和slave上的分布式(跨服务器)更新锁协议以保证操作的原子性。也就是说,存在这样的可能性:客户端A在并存的master 1上做了一个更新,同时,在它同步到并存master 2上之前,客户端B在master 2上可能也做了一个和客户端A在master 1上不同的更新操作。因此,当客户端A所做的更新同步到master 2时,它将产生和master 1上不同的数据表,尽管master 2上的更新操作也全都同步到master 1上去。这意味着除非能确保所有的更新都能以任何顺序安全地执行,否则不要使用双向同步,或者除非注意在客户端程序中的不知原因的无序更新操作。
http://www.it55.com在线教程
同时也要意识到在所关心的更新问题上,双向同步实际上并不能很大地改善性能(甚至没有)。两个服务器都需要执行同样数量的更新操作,在一台服务器上也是。唯一区别的是,可能这样做会减少一些锁争夺,因为来自其他服务器的更新操作都会被串行地放到slave线程中。甚至这种好处还可以作为网络延迟的补偿。
问:我如何利用同步来提高系统性能?
http://www.it55.com/
答:需要安装一个服务器作为master并且把所有的写操作直接放在这上面。然后配置多个廉价的使用机架磁盘的slave,把读操作分配给master和slave。还可以在启动slave时使用 --skip-innodb, --skip-bdb, --low-priority-updates,和 --delay-key-write=ALL 选项来提高slave端的性能。这种情况下,slave会使用非事务的 MyISAM 表来代替 InnoDB 和 BDB 表,已取得更快速度。
(编辑:IT资讯之家 www.it55.com)