centos7搭建标准通用MySQL8.0主从复制(一主一从)

目录

1.主从复制

2.角色划分

3.配置主从

4.跳过复制错误


1.主从复制

主从复制的原理简单来说就是主库把增删改查操作写入二进制文件,从库读取文件,复制数据,使得主从数据库保持一致。

主从复制的优势在于:

       1.高可用性:主库出现异常时,快速切换从库恢复应用

       2.负载均衡:读写分离。主库写,从库读。但需要其他插件实现,比如MaxScale

       3.备份数据:从库数据与主库是一致的,相当于一个备份手段

2.角色划分

IP地址 角色
192.168.44.66 master
182.168.44.88 slave

3.配置主从

MySQL8.0数据库安装参考https://blog.csdn.net/ct_666/article/details/111248343,这里直接开始配置。

前提条件:

# 关闭主从数据库服务器的防火墙
systemctl stop firewalld && systemctl disable firewalld

# 两台机器网络互通

主库配置:

# 编辑配置文件
vi /etc/my.cnf

# 在文件结尾添加以下内容:

# 主服务器唯一ID
server-id=1
# 启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个),不设置则默认同步所有库
binlog-ignore-db=sys
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
# 设置需要复制的数据库(可设置多个),不设置则默认同步所有库
binlog-do-db=test
# 设置logbin格式
binlog_format=STATEMENT

从库配置:

# 编辑配置文件
vi /etc/my.cnf

# 在文件结尾添加以下内容:

# 从服务器唯一ID
server-id=2
# 启用中继日志
relay-log=mysql-relay

重启主、从数据库,使配置生效

systemctl restart mysqld

登录主库创建复制所用的用户slave,并记录file和position的值

# 登录主库
mysql -uroot -p
或者
mysql -uroot -p -h127.0.0.1

# 在主库创建密码为Admin#2020的用户slave
mysql> create user 'slave'@'%' identified with mysql_native_password by 'Admin#2020';
Query OK, 0 rows affected (0.41 sec)

# 授权
mysql> grant replication slave on *.* to 'slave'@'%';
Query OK, 0 rows affected (0.00 sec)

# 刷新权限
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

# 查看master状态,并记录file和position的值
mysql> show master status;
+------------------+----------+--------------+-------------------------------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                                | Executed_Gtid_Set |
+------------------+----------+--------------+-------------------------------------------------+-------------------+
| mysql-bin.000001 |      156 | test         | sys,mysql,information_schema,performance_schema |                   |
+------------------+----------+--------------+-------------------------------------------------+-------------------+
1 row in set (0.00 sec)

# 退出主库以防误操作改变file和position的值
quit;

登录从库进行配置:

# 登录从库
mysql -uroot -p
或者
mysql -uroot -p -h127.0.0.1

# 设置从库向主库同步数据,参数说明:
# master_host的值是你的主库IP
# master_port的值是你的主库端口
# master_user就是创建的slave用户
# master_password就是创建的slave用户的密码
# master_log_file的值就是前面记录的file的值
# master_log_pos的值就是前面记录的position的值
mysql> change master to master_host='192.168.44.66',master_port=3306,master_user='slave',master_password='Admin#2020',master_log_file='mysql-bin.000001',master_log_pos=156;
Query OK, 0 rows affected, 2 warnings (0.19 sec)

# 开始同步
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)

# 查看slave同步状态
# Slave_IO_Running: Yes,Slave_SQL_Running: Yes,两个yes则同步成功,否则查看相应的报错
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.44.66
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 156
               Relay_Log_File: mysql-relay.000001
                Relay_Log_Pos: 324
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

测试主从同步:

# 主数据库创建数据库test
create database test;

# 从数据库查看
show databases;

# 主数据库创建表
use test;
create table user(id int, name varchar(20));

# 插入数据
insert into user values(1, '张三');

# 从数据库查看
use test;
select * from user;

如果同步出错,则停止同步,重置后再次开启同步:

stop slave;
reset slave;
start slave;

4.跳过复制错误

mysql主从复制,经常会遇到错误而导致slave端复制中断,这个时候一般就需要人工干预,跳过错误才能继续同步,跳过错误有三种种方式:

①跳过指定数量的事务:

mysql>stop slave;
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 #跳过一个事务
mysql>start slave;

②修改从库mysql的配置文件,通过slave_skip_errors参数来跳过指定类型的错误或跳过所有错误:

# 编辑配置文件
vi /etc/my.cnf

# 文件末尾添加,三选一
# 跳过1062,1053,1146类型的错误
slave-skip-errors=1062,1053,1146
# 跳过所有错误      
slave-skip-errors=all
# MySQL8.0可以添加参数ddl_exist_errors跳过一系列的error code,包括(1007,1008,1050,1051,1054,1060,1061,1068,1094,1146)
slave-skip-errors=ddl_exist_errors  

# 重启MySQL
systemctl restart mysqld

猜你喜欢

转载自blog.csdn.net/ct_666/article/details/111842000