介绍

复制是指将主数据库的DDL 和 DML 操作通过 二进制日志 传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。
MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制。

优势

MySQL 复制的有点主要包含以下三个方面 :
主库出现问题,可以快速切换到从库提供服务。 (备用数据库)
可以在从库上执行查询操作,从主库中更新,实现读写分离,降低主库的访问压力。 (用于读写分离)
可以在从库中执行备份,以避免备份期间影响主库的服务。

操作

描述:
①、准备 2 台服务器Centos7,IP地址分别为 192.168.3.18 (主)、192.168.3.19 (备)
②、2台服务器上都安装好 MySQL 服务, MySQL版本 ——MySQL-5.6.46

master (主库)

修改配置文件

在 mysql 的配置文件中的[mysqld]下 添加,如下配置:

  1. # mysql 服务ID,保证整个集群环境中唯一
  2. server-id=1
  3. # mysql binlog 日志的存储路径和文件名
  4. log-bin=/var/lib/mysql/mysqlbin
  5. #是否只读,1 代表只读, 0 代表读写
  6. read-only=0
  7. # 忽略的数据, 指不需要同步的数据库
  8. binlog-ignore-db=mysql

注意:如果是使用 rpm 方式安装的 mysql,那默认的配置文件:/usr/my.cnf , 如果是源码安装的话, 配置文件可能在:/etc/my.cnf

重启 mysql 服务

  1. service mysql restart

创建同步数据的账户,并且进行授权操作

  1. grant replication slave on *.* to 'root'@'192.168.3.19' identified by '654321';
  2. flush privileges;

查看master状态

  1. show master status;

MySQL主从复制 - 图1

slave (从库)

修改配置文件

在 slave 端配置文件中,配置如下内容 :

  1. #mysql服务端ID,唯一
  2. server-id=2
  3. #指定binlog日志
  4. log-bin=/var/lib/mysql/mysqlbin

重启 mysql 服务

  1. service mysql restart

登录 mysql , 执行如下指令

  1. change master to master_host= '192.168.3.18', master_user='root', master_password='654321', master_log_file='mysqlbin.000001', master_log_pos=408;

注意:这里用到了 master 中的状态值

开启同步操作

  1. start slave;
  2. show slave status;

MySQL主从复制 - 图2
注意:
停止同步操作 :

stop slave;

验证同步操作

在主库中创建数据库,创建表,并插入数据 :

create database db01;

use db01;

create table user(
    id int(11) not null auto_increment,
    name varchar(50) not null,
    sex varchar(1),
    primary key (id)
)engine=innodb default charset=utf8;

insert into user(id,name,sex) values(null,'Tom','1');
insert into user(id,name,sex) values(null,'Trigger','0');
insert into user(id,name,sex) values(null,'Dawn','1');

在从库中查询数据,进行验证 (过程略)

可能遇到问题

通过 rpm 方式安装 mysql 数据库, 登录时提示需要用户名和密码

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

MySQL主从复制 - 图3
操作
①、查看密码

cat /root/.mysql_secret

②、使用密码登录

mysql -uroot -p

③、设置新密码

set password = password('654321');

④、授权远程登录

grant all privileges on *.* to 'root' @'%' identified by '654321'

flush privileges;

mysql 远程连接不上,防火墙的问题

在 Centos7 中默认防火墙 firewalle,将防火墙改为iptables
安装 iptables

yum -y install iptables-services iptables

禁用/停止自带的firewalld服务

#停止firewalld服务
systemctl stop firewalld
#禁用firewalld服务
systemctl mask firewalld

查看 iptables 的状态

service iptables status

关闭 iptables 防火墙

service iptables stop

注意:关闭了防火墙,然后使用 mysql 客户端工具(navicat)测试一下是否能连接上数据库
编辑 iptables 入栈规则

vi /etc/sysconfig/iptables

MySQL主从复制 - 图4
重启 iptables 服务即可生效

service iptables restart