一 binlog日志方式
1. 在主服务器上,必须启用二进制日志记录并配置唯一的服务器ID。需要重启服务器。
-编辑主服务器的配置文件 my.cnf
[root@localhost ~]# vim /etc/my.cnf
-添加如下内容
[mysqld]
log-bin=/var/log/mysql/mysql-bin 二进制日志存储目录
server-id=1 主从复制id
-创建日志存储目录并赋予mysql用户权限
[root@localhost ~]# mkdir /var/log/mysql
[root@localhost ~]# chown mysql.mysql /var/log/mysql
-重启mysql服务
[root@localhost ~]# systemctl restart mysqld
-确保在主服务器上 skip_networking 选项处于 OFF 关闭状态, 这是默认值。如果是启用的,则从站无法与主站通信,并且复制失败。
mysql> show variables like '%skip_networking%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| skip_networking | OFF |
+-----------------+-------+
注意:
如果省略server-id(或将其显式设置为默认值0),则主服务器拒绝来自从服务器的任何连接。
为了在使用带事务的InnoDB进行复制设置时尽可能提高持久性和一致性,
应该在主服务器 my.cnf文件中使用以下配置项:
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
2. 应该创建一个专门用于复制数据的用户
每个从服务器需要使用MySQL 主服务器上的用户名和密码连接到主站。
例如,计划使用用户 repl 可以从任何主机上连接到主服务器上进行复制操作, 并且用户 repl 仅可以使用复制的权限。
在 主服务器 上执行如下操作
-创建用户repl可以从任意来源访问
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'Cc@123';
-给予用户repl权限
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' identified by 'Cc@123';
-在从服务器上测试该用户
mysql -urepl -p'Cc@123' -h 主服务器地址;
replication slave:拥有此权限可以查看从服务器,从主服务器读取二进制日志。
3. 从服务器配置
3.1 主服务器中无数据
-编辑从服务器的配置文件 my.cnf
[root@localhost ~]# vim /etc/my.cnf
-添加如下内容
[mysqld]
server-id=2
-重启mysql服务
[root@localhost ~]# systemctl restart mysqld
-查看主服务器的二进制日志的名称
mysql> show master status\G
-配置连接到主服务器的相关信息
mysql> CHANGE MASTER TO
-> MASTER_HOST='master', //主服务器ip
-> MASTER_USER='repl', //主服务器用户
-> MASTER_PASSWORD='Cc@123', //用户密码
-> MASTER_PORT=3306, //端口
-> MASTER_LOG_FILE='mysql-bin.000001', //binlog日志文件名称
-> MASTER_LOG_POS=599, //日志位置
-> ;
-启动从服务器的复制线程
mysql> start slave;
-检查是否成功
mysql> show slave status\G
输出结果中应该看到 I/O 线程和 SQL 线程都是 YES, 就表示成功。
slave_IO_Running:YES
slave_SQL_Running:YES
到此配置完成
3.2 主服务器中有数据
如果在启动复制之前有现有数据需要与从属设备同步,请保持客户端正常运行,以便锁定保持不变。这可以防止进行任何进一步的更改,以便复制到从站的数据与主站同步。
-在主服务器中导出现有的数据
mysqldump -u用户名 -p密码 -A --master-data > alldb.sql;
-如果不使用 --master-data 参数,则需要手动锁定单独会话中的所有表。
-传输备份数据给从服务器
scp alldb.sql root@从服务器地址:/存放目录
-导入数据到从服务器
mysql -u用户 -p'密码' < 备份的路径/备份文件名
-编辑从服务器的配置文件 my.cnf
[root@localhost ~]# vim /etc/my.cnf
-添加如下内容
[mysqld]
server-id=2
-重启从服务器mysql服务
[root@localhost ~]# systemctl restart mysqld
-查看主服务器的二进制日志的名称
此处也可以在备份的数据里查看
mysql> show master status\G
-配置连接到主服务器的相关信息
mysql> CHANGE MASTER TO
-> MASTER_HOST='master', //主服务器ip
-> MASTER_USER='repl', //主服务器用户
-> MASTER_PASSWORD='Cc@123', //用户密码
-> MASTER_PORT=3306, //端口
-> MASTER_LOG_FILE='mysql-bin.000001', //binlog日志文件名称
-> MASTER_LOG_POS=599, //日志位置
-> ;
-启动从服务器的复制线程
mysql> start slave;
-检查是否成功
mysql> show slave status\G
输出结果中应该看到 I/O 线程和 SQL 线程都是 YES, 就表示成功。
slave_IO_Running:YES
slave_SQL_Running:YES
到此配置完成
4. 在从服务器上暂停复制
-要停止从主服务器处理二进制日志
mysql> STOP SLAVE;
-当复制停止时,从I / O线程停止从主二进制日志读取事件并将它们写入中继日志,并且SQL线程停止从中继日志读取事件并执行它们。您可以通过指定线程类型单独暂停I / O或SQL线程:
mysql> STOP SLAVE IO_THREAD;
-要再次开始执行,请使用以下
mysql> START SLAVE;
-要启动特定线程,请指定线程类型:
mysql> START SLAVE IO_THREAD;
mysql> START SLAVE SQL_THREAD;
5. 主主同步
-masterA设置(192.168.188.2)
# vim /etc/my.cnf //编辑my.cnf文件
server-id=2 //增加server-id为2,一般为自己ip
log_bin=test01 //设置log_bin名为test01
# systemctl restart mysqld //重启mysql服务
# mysql -uroot -p123456 //登录mysql,不要照抄,-u后面是账号,-p后面是密码
> grant replication slave on *.* to 'repl'@'192.168.188.3' identified by '123456'; //创建mysql账号repl,只容许指定ip访问,也可以指定ip范围192.168.188.%,其中%为通配符,表示所有;
> flush privileges; //刷新授权表信息
> flush tables with read lock; //锁定数据库表暂时无法写服务;
> show master status; //查看binlog文件值与pos值
> stop slave; //关闭同步
-masterB设置(192.168.188.3)
# vim /etc/my.cnf
server-id=3 //增加server-id为3,一般为自己ip
log_bin=test02 //设置log_bin名为test02
# systemctl restart mysqld //重启mysql服务
# mysql -uroot -p123456 //登录mysql
> grant replication slave on *.* to 'repl'@'192.168.188.2' identified by '123456'; //创建用户,允许192.168.188.2登录本机器
> flush privileges; //刷新授权表
> stop slave; //关闭同步
> show master status; //查看binlog文件值与pos值
> change master to master_host='192.168.188.2', master_user='repl', master_password='123456', master_log_file='test01.000001', master_log_pos=664383; //这里注意log_file与pos值都要对应对应A的show master status;值
> start slave; //开启同步
-masterA设置
> change master to master_host='192.168.188.3', master_user='repl', master_password='123456', master_log_file='test02.000001', master_log_pos=664343; //这里log_file与pos值写的必须是B上show master status;的值
> start slave; //开启同步
> unlock tables; //解锁写
测试。如果提示uuid冲突,删掉auto.conf,重启。
二 GTID 基于事务ID复制
- master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
- slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
- sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
- 如果有记录,说明该GTID的事务已经执行,slave会忽略。
- 如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
1. 主服务器配置
-编辑主服务器的配置文件 my.cnf
[root@localhost ~]# vim /etc/my.cnf
-添加如下内容
[mysqld]
log-bin=/var/log/mysql/mysql-bin 二进制日志存储目录
server-id=1 主从复制id
gtid_mode = ON 开启gtid
enforce_gtid_consistency=1 强制gtid
-创建日志存储目录并赋予mysql用户权限
[root@localhost ~]# mkdir /var/log/mysql
[root@localhost ~]# chown mysql.mysql /var/log/mysql
-重启mysql服务
[root@localhost ~]# systemctl restart mysqld
-创建用户repl可以从任意来源访问
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'Cc@123';
-给予用户repl权限
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' identified by 'Cc@123';
-在从服务器上测试该用户
mysql -urepl -p'Cc@123' -h 主服务器地址;
replication slave:拥有此权限可以查看从服务器,从主服务器读取二进制日志。
2. 从服务器配置
-编辑从服务器的配置文件 my.cnf
[root@localhost ~]# vim /etc/my.cnf
-添加如下内容
[mysqld]
server-id=2
gtid_mode = ON
enforce_gtid_consistency=1
-重启mysql服务
[root@localhost ~]# systemctl restart mysqld
-配置连接到主服务器的相关信息
mysql> CHANGE MASTER TO
-> MASTER_HOST='master', //主服务器ip
-> MASTER_USER='repl', //主服务器用户
-> MASTER_PASSWORD='Cc@123', //用户密码
-> master_auto_position=1;
-启动从服务器的复制线程
mysql> start slave;
-检查是否成功
mysql> show slave status\G
输出结果中应该看到 I/O 线程和 SQL 线程都是 YES, 就表示成功。
slave_IO_Running:YES
slave_SQL_Running:YES
到此配置完成
开启 GTID 后的导出导入数据的注意点
数据导出时需要添加--set-gtid-purged=OFF参数.
mysqldump -u用户名 -p密码 -A --set-gtid-purged=OFF > alldb.sql;