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/

PostgreSQL 一主多从复制 异步流复制 mysql异步复制_mysql

查看备份文件的信息,里面记录了使用的binlog文件和position号。

PostgreSQL 一主多从复制 异步流复制 mysql异步复制_slave_02

接下来在从库上执行如下命令:

#恢复从主库传递过来的数据
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;

PostgreSQL 一主多从复制 异步流复制 mysql异步复制_主从复制_03

最后验证主从是否可以正常同步数据:

在主库的mysql库下的test表新增一条数据,查看从库的mysql库的test表的数据是否一样:

PostgreSQL 一主多从复制 异步流复制 mysql异步复制_linux_04

PostgreSQL 一主多从复制 异步流复制 mysql异步复制_master_05

查看从库的数据:

PostgreSQL 一主多从复制 异步流复制 mysql异步复制_linux_06

停止同步命令:

stop slave;

PostgreSQL 一主多从复制 异步流复制 mysql异步复制_linux_07

3.搭建过程出现的问题和解决方法

在搭建完成后,使用如下命令查看主从复制状态时:提示无法链接到远程的数据库。

show slave status \G;

PostgreSQL 一主多从复制 异步流复制 mysql异步复制_主从复制_08

解决方法如下:

首先可以使用ping命令查看下网络是否能连通

PostgreSQL 一主多从复制 异步流复制 mysql异步复制_主从复制_09

发现网络可以ping通,然后使用telnet命令查看是否 能访问端口

PostgreSQL 一主多从复制 异步流复制 mysql异步复制_mysql_10

找到问题所在了,防火墙屏蔽了这个端口号。

直接关闭防火墙解决该问题。

PostgreSQL 一主多从复制 异步流复制 mysql异步复制_linux_11

接着重新查看主从复制的状态,如果还有错误,可以再看看我们是否开启了远程访问数据库的权限。开启此权限的方法如下:

方法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;