MENU

MySQL GTID主从同步配置(解决主库已有数据)

May 31, 2023 • Read: 228 • 随心笔记

最近意识到云服务器数据库也有主从同步的必要性,重点是解决实时备份问题,主库挂掉可以随时切到从库恢复业务;但是在配置的时候发现从库一直同步失败。具体错误是主库的二进制日志不完整,导致从库relay log重放时会出现数据库不存在等各式各样的问题。

以前我其实从来没有折腾过,这次因为某些云厂商变态的风控政策,导致数据差点丢失,这显然是个很严重的问题。

说回正题,搜索半天了解到MySQL5.6新增GTID特性,这里对具体内容不展开解释,只要知道这个东西可以让主从之间协同步伐,知道从什么时候开始同步。

主服务器是一个debian11系统,直接 lnmp 安装的一系列组件,数据库是直接跑在服务器;从服务器用作备份,为了方面就直接用 docker跑了一个mysql容器;当然,主从数据库版本一致,都是5.7.38

从服务器配置

宿主机创建目录/home/mysql/data用来存放容器数据,避免因意外删除容器导致数据丢失。

MySQL配置文件,/home/mysql/my.conf

[mysqld]
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

server-id=100 # 这里一定不能和主服务器相同
gtid-mode=ON
enforce-gtid-consistency=true
log-bin=mysql-bin
binlog_format=row

symbolic-links=0

pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

启动容器

docker run --restart=always --name mysql-backup -v /home/mysql/my.cnf:/etc/my.cnf -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=[这里配置ROOT密码] -d mysql:5.7.38 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

主服务器配置

开启二进制日志,开启GTID

gtid-mode=ON
enforce-gtid-consistency=true

log-bin=mysql-bin
binlog_format=row
server-id   = 1

创建用于同步的账号,并授权相关权限,账号是 backup,密码是2F344A6D627224C9C1406F2E35DFAA0B

CREATE USER 'backup'@'%' IDENTIFIED BY '2F344A6D627224C9C1406F2E35DFAA0B';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'backup'@'%';
flush privileges;

具体操作

  • 主服务器只有一个数据库db1,导出数据。

    mysqldump -uroot -p --default-character-set=utf8mb4 --databases db1 > db1.sql
  • 从服务器还原数据,将主数据库备份导出的数据文件db1.sql,复制进入从数据库容器内部,随后执行登录mysql -uroot -p,再执行source db1.sql保证数据能正常还原回去。

这部分等于是把主数据库其中的一个快照直接还原到从数据库,随后我们再配置主从同步,进入从数据库,执行命令,确定不报错。

CHANGE MASTER TO
MASTER_HOST='192.168.2.120',
MASTER_USER='backup',
MASTER_PASSWORD='2F344A6D627224C9C1406F2E35DFAA0B',
MASTER_AUTO_POSITION=1;

再执行start slave;即开始进行同步,我们可以通过show slave status;查看同步状态,只要Slave_IO_Running Slave_SQL_Running 都是 Yes则说明同步正常。

其它

内容写的可能比较乱,但是这个思路的确可以解决主数据库已存在数据的问题,希望能帮到有缘人。

参考