1.异步复制原理
异步复制是mysql的默认复制方式,原理就是在主库写入binlog日志后即可成功返回客户端,不需要等待binlog日志传递给从库的过程。但是这样一旦主库发生宕机,就有可能出现数据丢失的情况。
2.异步复制搭建实战
基于binlog和position方式搭建一主一从的架构,环境如下:
- 192.168.130.135 作为主库
- 192.168.130.136 作为从库
搭建主从的几个必要条件:
- 主库和从库的server-id不一样
- 主从库开启binlog功能,且binlog模式为row模式
在主库上执行如下命令:先创建一个主从复制的用户,并赋予权限:
create user 'sync'@'192.168.130.%' identified by '123456';
grant replication slave on *.* to 'sync'@'192.168.130.%';
flush privileges;
其次,使用mysqldump导出数据,命令如下:
mysqldump --single-transaction -uroot -p --master-data=2 -A > /usr/local/data/backup/all-20181206.sql
#必须加--master-data=2,让备份的文件记录这一时刻的binlog文件和position号。
#将备份的文件远程拷贝到192.168.130.136上
scp all-20181206.sql root@192.168.130.136:/usr/local/data/backup/
查看备份文件的信息,里面记录了使用的binlog文件和position号。
接下来在从库上执行如下命令:
#恢复从主库传递过来的数据
mysql -uroot -p < all-20181206.sql
#在数据库命令行执行下面的命令
change master to master_host='192.168.130.135',master_user='sync',master_password='123456',master_log_file='mysql-bin.000006',master_log_pos=1996;
#开始执行主从复制的命令
start slave;
#查看主从复制的状态
show slave status \G;
最后验证主从是否可以正常同步数据:
在主库的mysql库下的test表新增一条数据,查看从库的mysql库的test表的数据是否一样:
查看从库的数据:
停止同步命令:
stop slave;
3.搭建过程出现的问题和解决方法
在搭建完成后,使用如下命令查看主从复制状态时:提示无法链接到远程的数据库。
show slave status \G;
解决方法如下:
首先可以使用ping命令查看下网络是否能连通
发现网络可以ping通,然后使用telnet命令查看是否 能访问端口
找到问题所在了,防火墙屏蔽了这个端口号。
直接关闭防火墙解决该问题。
接着重新查看主从复制的状态,如果还有错误,可以再看看我们是否开启了远程访问数据库的权限。开启此权限的方法如下:
方法1:
#登录数据库
mysql -uroot -p123456
#%为所有ip都可以远程访问
mysql>update user set host = '%' where user = 'root';
#查看一下修改
mysql>select host, user from user;
#推送设置到内存或重启服务器也行
mysql>FLUSH PRIVILEGES;
方法2:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
#如果是固定ip就这么写
grant all privileges on *.* to 'root'@'192.168.130.135' identified by '123456' with grant option;
#推送设置到内存或重启服务器也行
mysql>FLUSH PRIVILEGES;