MySQL学习笔记--复制建立新Slave的方法:克隆Master\Slave


即建立新的Slave的方法

前面已经在文章“简单配置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


图:克隆Master来创建新的Slave


1. 配置新的Slave(前面的文章已经提到,安装配置Mysql Slave步骤省略)

2. 创建Master备份

由于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)

 

3. 在新的Slave上恢复备份

--在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)

 

4. 配置Slave从这个binlog位置开始复制

--使用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

如果已经有一个Slave连在Master上,就可使用这个Slave创建新的Slave,而不需要离线(offline)Master了。

与克隆Master基本相同,主要区别在于如果找到binlog位置

因为要克隆那个Slave同时还在执行从Master的复制,所以必须在备份前停止Slave,保证Slave上不再发变化,否则会产生不一致的备份镜像。

但是如果使用某种在线备份方法,如InnoDB Hot Backup,则不需要在创建备份前停止Slave。


图:克隆Slave以创建一个新的Slave

1. 配置另一个新的Slave(前面的文章已经提到,安装配置Mysql Slave步骤省略)

 

2.锁定源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_FileExec_Master_Log_Pos两个值。

 

3.备份源Slave数据库

# mysqldump -uroot -p--all-databases > slave_bak.sql

 

4.在新的Slave目标端恢复数据库

# mysql -uroot -p <slave_bak.sql

 

5.在新的Slave目标端配置复制并启动

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之间的同步复制是否正常。

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值