最近意识到云服务器数据库也有主从同步的必要性,重点是解决实时备份问题,主库挂掉可以随时切到从库恢复业务;但是在配置的时候发现从库一直同步失败。具体错误是主库的二进制日志不完整,导致从库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
则说明同步正常。
其它
内容写的可能比较乱,但是这个思路的确可以解决主数据库已存在数据
的问题,希望能帮到有缘人。