整体流程逻辑如下:
在服务器A上创建一个复制账号;
服务器A和服务器B上分别设置不同的server_id;
服务器A执行一次完整的逻辑备份;
从服务器A拷贝备份到服务器B;
服务器B上执行一次全量恢复;
服务器B上执行change master设置主从复制;
服务器B上执行start slave启动复制;
服务器A上设为read only;
服务器B设为主库(服务器B把服务器A转过来的binlog消化完);
step 1. 在3306库上创建一个复制用户
此处示例用户和密码分别为repl和repl4Slave。
grant replication slave,replication client on . to repl@'%' identified by 'repl4Slave' ;
1
grantreplicationslave,replicationclienton.torepl@'%'identifiedby'repl4Slave';
step 2. 修改3306库和3307库上的server_id,确保不一样
3306库
3307库
发现一样,修改server_id:
在3307上执行:
set global server_id= 102;
1
setglobalserver_id=102;
修改3307库的配置文件,把server_id改成102
vi /u01/my3307/my.cnf
step 3. 在3306库上做一个逻辑全备
mysqldump --single-transaction --master-data=2 -uroot test > /tmp/test.sql
1
mysqldump--single-transaction--master-data=2-uroottest>/tmp/test.sql
–single-transaction数据量大的时候不锁表
–master-data=2 记录备份的时候日志文件和日志位置,如下:
如果dump出来的文件/tmp/test.sql文件过大,可以直接grep搜索
grep -i " CHANGE MASTER TO" /tmp/test.sql
1
grep-i" CHANGE MASTER TO"/tmp/test.sql
step 4. 把dump出来的3306的dump文件拷贝到3307
自行scp传送即可。
step 5. 在3307库上新建跟3306dump出来的文件一样的数据库
我在3306上dump的是test库的数据,所以在3307上新建一个一样的数据库
create database test default character set utf8 ;
1
createdatabasetestdefaultcharactersetutf8;
step 6. 直接在3307上恢复
查看当前选中的是哪个数据库
select database();
1
selectdatabase();
选中需要恢复到的目标库
use test
1
usetest
应用dump出来的文件进行恢复
mysql> source /tmp/test.sql
1
mysql>source/tmp/test.sql
再次查看test数据库上是否有t1表以及t1表中数据是否已经有了。
step 7. 设置3307复制库是源库的从数据库
在3307上执行下面的命令:
change master to
master_host='127.0.0.1',
master_port=3306,
master_user='repl',
master_password='repl4Slave',
master_log_file='binlog.000018',
master_log_pos=718;
1
2
3
4
5
6
7
changemasterto
master_host='127.0.0.1',
master_port=3306,
master_user='repl',
master_password='repl4Slave',
master_log_file='binlog.000018',
master_log_pos=718;
这条命令的意思是:设置3306为3307的主库,通过3306源库的repl用户进行复制,开始复制的位置是binlog日志binlog.000018的718位置处(也就是全备后的日志位置)。
启动slave在3307上复制
start slave ;
1
startslave;
查看slave的状态:
show slave status\G;
1
showslavestatus\G;
step 8. 确认全备后又插入的数据是否已经复制过来了
在3306的test库上的t1表在插入一条数据
insert into t1 values(2);
1
insertintot1values(2);
在3307上查询数据是否过来
验证数据已经过来了!
step 9. 在3306源库上把数据库设置成readonly状态
show variables like '%read_only%' ;
flush tables with read lock;
set global read_only=on ;
show global variables like "%read_only%";
1
2
3
4
showvariableslike'%read_only%';
flushtableswithreadlock;
setglobalread_only=on;
showglobalvariableslike"%read_only%";
这样设置以后主库3306下所有的用户(包括超级用户root),都无法修改该库下的任何数据!
step 10. 切换主从
在确认从库3307完全应用完主库的所有日志以后,就可以切换主从。即把应用切换到3307,3306作为备库。
原文链接:https://blog.csdn.net/kadwf123/java/article/details/79250499
喜欢 (0)or分享 (0)