一、主机

mysql-dev-master-1    192.168.7.241
mysql-dev-slave-1        192.168.7.242

二、安装mysql8

Server version: 8.0.26 MySQL Community Server – GPL

三、配置my.cnf

3.1主数据库配置
[root@mysql-dev-master-1 tmp]# vi /etc/my.cnf
gtid_mode=on                 #开启gtid模式
enforce_gtid_consistency=on  #强制gtid一致性,开启后对于特定create table不被支持
log-slave-updates=1
log_bin = master-binlog
binlog_format = row
3.2从数据库配置
[root@mysql-dev-slave-1 ~]# vi /etc/my.cnf
server-id = 2
gtid_mode=on                 #开启gtid模式
enforce_gtid_consistency=on  #强制gtid一致性,开启后对于特定create table不被支持
read_only=on
slave-skip-errors=1032,1062,1053,1146,1158,1159,1007,1008,1418
log-slave-updates=1
log_bin = master-binlog
binlog_format = row

备注:以上仅展示复制所需的基本配置,其他配置请参考官方说明。如果是克隆的mysql实例可能会存在server_uuid一致,这个必须调整。log-slave-updates=1这个参数指在从库执行sql增量更新时同时写自己的二进制binlog文件

3.3重启mysql
[root@mysql-dev-master-1 tmp]# systemctl start mysqld

四、数据导出导入

4.1主库操作
[root@mysql-dev-master-1 tmp]# mysqldump -uroot -pqwer -B --all-databases > dump.sql    #这里必须导入git事务标识
[root@mysql-dev-master-1 tmp]# scp dump.sql root@192.168.7.242:/tmp        #将备份文件传输至从库
4.2导入带有gtid标识符的备份文件
MySQL [(none)]> show variables like '%gtid%';

MySQL [(none)]> reset master;

MySQL [db]> source /tmp/dump.sql

五、创建复制用户

5.1主库创建用户
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
mysql> flush privileges;
5.2从库验证
[root@mysql-dev-slave-1 mysql]# mysql -h 192.168.7.241 -urepl -prepl -e 'show databases;'

六、配置mysql复制

6.1从库操作
CHANGE REPLICATION SOURCE TO
    SOURCE_HOST = '192.168.7.241',
    SOURCE_PORT = 3306,
    SOURCE_USER = 'repl',
    SOURCE_PASSWORD = 'repl',     
    SOURCE_AUTO_POSITION = 1,
    GET_MASTER_PUBLIC_KEY=1;
6.2启动复制
MySQL [(none)]> start slave;
6.3查看复制
MySQL [(none)]> show slave status\G

七、同步数据测试

7.1主库操作
MySQL [(none)]> create database testdb;
MySQL [(none)]> use testdb;

create table test(
     id int(4) not null auto_increment,
     name char(20) not null,
     primary key(id)
     );

insert into test(name) values('我好!!!');
7.2从库验证
MySQL [testdb]> select *from test;

7.3查看gtid标识发现一致

八、数据库备份

及时有主从架构无法规避人为的数据故障,所以考虑在从库进行备份,脚本参考地址:https://github.com/xiangys0134/deploy/blob/master/data_backup/mysqlbak-gtid.sh

#!/bin/bash
# 功能:数据库备份
# yousong.xiang
# 2021.8.5
# v1.0.2

[ -f /etc/profile ] && . /etc/profile

#数据库用户名
#CREATE USER 'mysqldumper'@'localhost' IDENTIFIED BY '123456';
#GRANT PROCESS,SELECT, RELOAD, SUPER, LOCK TABLES ON *.* TO 'mysqldumper'@'localhost';
##flush privileges ;
dbhost='localhost'
dbuser='mysqldumper'
#数据库用密码
dbpasswd='123456'
#备份时间
backtime=`date '+%Y%m%d%H%M%S'`
t_time=`date '+%Y-%m-%d %H:%M:%S'`

#日志备份路径
logpath='/data/mysqlbakup'
#数据备份路径
datapath='/data/mysqlbakup'

if [ ! -d {datapath} ];then
  mkdir{datapath} -p
fi

#日志记录头部
echo "备份时间为{t_time},备份数据库表{dbname} 开始" >> {logpath}/log.log

#获取数据库名
dbname=`mysql -h{dbhost} -u{dbuser} -p{dbpasswd} -e "show databases;" |egrep -v "Database|sys|information_schema|mysql|performance_schema"|grep "test"`

#正式备份数据库
for db in dbname; do
  mysqldump -h{dbhost} -u{dbuser} -p{dbpasswd} -F -B db --source-data=2 --single-transaction --set-gtid-purged=off |gzip>{logpath}/{db}{backtime}.sql.gz 2>> {logpath}/mysqllog.log
  #备份成功以下操作
  if [ "?" == 0 ];then
    cd datapath

    #删除七天前备份,也就是只保存7天内的备份
    finddatapath -name "*.gz" -type f -mtime +1 -exec rm -rf {} \; > /dev/null 2>&1
    echo "{t_time} 数据库{db} 备份成功!!" >> {logpath}/mysqllog.log
  else
    #备份失败则进行以下操作
    echo "{t_time} 数据库 {db} 备份失败!!" >>{logpath}/mysqllog.log
  fi
done

九、模拟故障

9.1从库添加一条索引
MySQL [testdb]> CREATE UNIQUE INDEX index_test on test(name);
9.2主库添加唯一索引
MySQL [testdb]> CREATE UNIQUE INDEX index_test on test(name);
9.3从库查看同步状态
MySQL [testdb]> show slave status\G
9.4配置跳过事务

传统二进制文件同步时可以通过”SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1″跳过事务进行同步,gtid模式就无法这样操作,该操作对于仅某一条或者几条sql还好操作,如果多了导致不同步的话还是进行洗库操作吧,最重要的是不要在从库上用root做任何操作。这里可能会有人有疑问,那存储过程或者存储函数导致不同步怎么办呢,其实我已经使用slave-skip-errors参数进行过滤了。那问题又来了,如果我必须要存储函数进行同步怎么办,这种情况其实官方也有说明的,具体连接忘记了。大体就是从库操作完sql后要把gtid_purged值更变一下(就是说如果该从库接着升级成主库时,新增的二进制日志文件不能让它存在,一般角色不做更变的话也无所谓,因为二进制日志文件我常规都只配置了7天的量)

#查看gtid位置信息
MySQL [testdb]> show slave status\G
Retrieved_Gtid_Set: b2621031-ff0d-11eb-808c-005056be4174:5-8
Executed_Gtid_Set: b2621031-ff0d-11eb-808c-005056be4174:1-7,
b2621031-ff0d-11eb-808c-005057be5174:1

备注:通过Executed_Gtid_Set可以看到我的从数据库(uuid:b2621031-ff0d-11eb-808c-005057be5174)执行了一个事务,而现在从数据库负载主库的gtid已经到了b2621031-ff0d-11eb-808c-005056be4174:1-7,马上准备执行b2621031-ff0d-11eb-808c-005056be4174:8是报错了。

#查看中继日志验证结论是否准确
[root@mysql-dev-slave-1 mysql]# mysqlbinlog --no-defaults  mysql-dev-slave-1-relay-bin.000002

备注:从中继日志中key看到该gtid标识符b2621031-ff0d-11eb-808c-005056be4174:8有记录index_test唯一索引

#停止从库复制
MySQL [testdb]> stop slave;
#从库操作
MySQL [testdb]> SET @@SESSION.GTID_NEXT= 'b2621031-ff0d-11eb-808c-005056be4174:8';
#设置空事务
MySQL [testdb]> BEGIN; COMMIT;
#恢复事务号
MySQL [testdb]> SET SESSION GTID_NEXT = AUTOMATIC;
#启动复制
MySQL [testdb]> START SLAVE;
#查看
MySQL [testdb]> show slave status\G

最后修改日期: 2024年1月6日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。