前面已经在文章“简单配置MySQL复制”中配置Slave时,没有说明复制从哪里开始,所以Slave是从头开始读取Master的binlog日志的。
但如果Master已经运行一段时间,要重现之前所有日志的事件,而且日志可能已经丢失或转储。所以我们一种通用的做法是--不从头开始复制日志。
而是对Slave进行一次性初始化操作,建立新的Slave(又称引导Slave)。
主要用到change master to 命令中的两个参数,即:master_log_file和master_log_pos.使这些参数指定发送binlog的位置,而不是从头开始。
引导Slave的通用步骤:
● 1. 配置新的Slave(前面的文章已经提到)
● 2. 备份Master(或是备份已经复制Master的Slave),备份方法很多,这里我们主要使用mysqldump工具。
● 3. 记下该备份的binlog位置(即产生当前状态的最后一个事件所在的位置)
● 4. 在新的Slave上恢复备份。
● 5. 配置Slave从这个binlog位置开始复制。
对于上面第2步,使用的是Master还是Slave,处理过程差异。
如果只是一个服务且做为Master进行时,我们需要备份Master,这个过程叫“克隆Master”.
如果已经有Master的Slave,我们只需要备份Slave即可,这个过程叫“克隆Slave”.
下面分别用这个两种方法来新建一个Slave:
图:克隆Master来创建新的Slave
由于Master可能正在运行,而且缓存中有很多表,所以备份Master之前需要先Flush所有表锁定数据库,防止检查binglog之前数据库发生改变。
--FLUSH锁定数据库
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00sec)
--查看Master状态,记录File、Position位置
mysql> show master status\G;
*************************** 1.row ***************************
File: master-bin.000004
Position: 120
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
--创建数据库的备份,用mysqldump工具
# mysqldump -uroot -p --all-databases > master_bak.sql
--解锁数据库
mysql> unlock tables;
Query OK, 0 rows affected (0.00sec)
--在Slave上恢复数据库
# mysql -uroot -p < master_bak.sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| licz |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
--使用change master to复制数据库,注意master_log_file,master_log_pos参数的使用。
mysql> change master to
master_host = 'host8',
master_port = 3306,
master_user='repl_user',
master_password='licz',
master_log_file = 'master-bin.000004',
master_log_pos = 120;
Query OK, 0 rows affected, 2warnings (0.14 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01sec)
--查看slave的状态
mysql> show slave status\G;
*************************** 1.row ***************************
Slave_IO_State: Waiting formaster to send event
Master_Host: host8
Master_User: repl_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File:master-bin.000004
Read_Master_Log_Pos: 120
Relay_Log_File:slave_relay_bin.000002
Relay_Log_Pos: 284
Relay_Master_Log_File: master-bin.000004
....
Exec_Master_Log_Pos: 120
....
最后再检查一次主从复制的同步情况是否成功!
另外:
上面4步中change master to复制操作可以嵌入到mysqldump备份中自动执行上面的步骤,省略掉在Slave中的使用change master to复制操作。
方法如下:
--用下面的方法对Master进行备份
mysql> flush tables with read lock;
# mysqldump -uroot -p --all-databases --master-data=1 > backup_source.sql
mysql> unlock tables;
注:master-data=1选项使mysqldump写change master to语句,且参数为二进制日志文件及其位置。
可以在backup_source.sql中找到相关语句
# vi backup_source.sql
-- Position to startreplication or point-in-time recovery from
--
CHANGE MASTER TOMASTER_LOG_FILE='master-bin.000004', MASTER_LOG_POS=2099;
--在Slave端对恢复数据库
# mysql -uroot -p <backup_source.sql
--最后启动slave
mysql> start slave;
Query OK, 0 rows affected (0.01sec)
这样,就完成了通过克隆Master,建立了一个新的Slave.
如果已经有一个Slave连在Master上,就可使用这个Slave创建新的Slave,而不需要离线(offline)Master了。
与克隆Master基本相同,主要区别在于如果找到binlog位置。
因为要克隆那个Slave同时还在执行从Master的复制,所以必须在备份前停止Slave,保证Slave上不再发变化,否则会产生不一致的备份镜像。
但是如果使用某种在线备份方法,如InnoDB Hot Backup,则不需要在创建备份前停止Slave。
图:克隆Slave以创建一个新的Slave
--停止Slave
mysql> stop slave;
Query OK, 0 rows affected (0.04sec)
--锁定数据库
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.04sec)
--查看Slave数据库状态
mysql> show slave status\G;
*************************** 1.row ***************************
Slave_IO_State:
Master_Host: host8
Master_User: repl_user
Master_Port: 3306
....
Relay_Master_Log_File: master-bin.000004
....
Exec_Master_Log_Pos: 2958
注意:确定复制开始位置要看源Slave端的Relay_Master_Log_File和Exec_Master_Log_Pos两个值。
# mysqldump -uroot -p--all-databases > slave_bak.sql
# mysql -uroot -p <slave_bak.sql
mysql> change master to
master_host = 'host8',
master_port = 3306,
master_user='repl_user',
master_password='licz',
master_log_file ='master-bin.000004',
master_log_pos = 2958;
Query OK, 0 rows affected, 2warnings (0.11 sec)
--启动新的目标端Slave
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
--启动源端Slave
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
这样,通过克隆Slave的方法,我们又建了一个新的Slave连接到了Master.
最后可以通过测试查看Master和几个Slave之间的同步复制是否正常。