我们生产环境中会碰到这种情况:备份主机数据,或者添加一台主机。进行双主机的结构。

另外就是在线上中途添加更多的从机。


而我们知道,从机上设置 slave 时要指定 master_log_file 和 master_log_pos, 即指定binlog文件和偏移值。

这也就是说,从机是可以从任意位置的 binlog 文件中进行数据的同步。比如:我们将 binlog 文件备份到其它某处放置,某天,数据库出问题了,需要对某些数据进行数据恢复,这时候从该文件中进行恢复。

添加一个新的从机,可以有两种方式:从 master 机器复制; 另一种是直接从 slave 复制.



复制主库要步骤:

====================

1.将内存中的数据同步到表中.

2.锁定表,不让出现脏数据

3.备份

4.解锁

5.在另一台机器上同步数据,并且设置 master_log_file 和 master-log_pos


命令:

a.同步数据,并锁表: mysql> flush tables with read lock;

b.记住当前 binlog 的偏移值,后面设置 slave 上的值. show master status; 记下 file 和 position

c.备份:.参照 http://blog.sina.com.cn/s/blog_5f54f0be0100vp6m.html

命令: [root@li387-161 ~] mysqldump --all-databases --host=master-1 > backup.sql

d.解锁 mysql> unlock tables;

e.同步从机.将 backup.sql 复制到从机上.[root@li387-161 ~] mysql --host=slave-1 < backup.sql

设置从机: 

mysql>change master to master_host = '192.168.3.119',master_port = 3306,master_user = 'repl_user',master_password='root',master_log_file='master-bin.000005',master_log_pos=194244;

这里的 master_log_file 和 master_log_pos 就是前面第 2 步中记下来的两个值.

开启从机

start slave;



复制从库要步骤:

====================

可以看到,从主库复制会有段时间锁表,这段时间会影响主库的使用。如果我们能直接从从库进行复制,就不会对主库产生影响了。但是,从从库复制要保证的是复制过程中从库上的数据不会发生变化,所以要先停掉从库。

1.停止从库: mysql> stop slave;

2.看当前从库的状态。和前面的看主库状态一样。但现在是从从库复制,所以查看从库状态:mysql> show slave status;

记下 Relay_Master_Log_file 和 Exec_Master_Log_Pos, 用处和前面一样.

3.备份从库数据.用 mysqldump

4.在新的从库上还原数据

5.设置新从库的 slave 参数.change master to master_host = '192.168.3.119',master_port = 3306,master_user = 'repl_user',master_password='root',master_log_file='master-bin.000005',master_log_pos=194244;

可以看到,虽然新从库是从从库复制的数据,但实际上 binlog 的 master 还是指向的主库。

另外,这里将 master_log_file 和 master_log_pos 设置成第 2 步中的 Relay_Master_Log_file 和 Exec_Master_Log_Pos

start slave;