最近需要弄MySQL主从同步,于是研究了一番。绝大部分主从同步的需求是一主多从,但我需要的是多主一从备份。搭了个Demo试一下,顺便记录下来备忘。
首先下载MySQL安装,我下载的是mysql-8.0.35-winx64.zip,windows下解压即用。根据说明,需要先初始化并创建配置文件。
cd /mysql/path # 先进入mysql解压目录
bin/mysqld --initialize
此时会在mysql解压目录下生成数据目录data,其中的日志文件xxx.err中记录了自动生成的root密码。可用此密码登录并修改root密码。
也可通过如下指令将mysql安装为系统服务。
cd /mysql/path
bin/mysqld --install --defaults-file=D:\mysql.ini
此处--defaults-file选项描述了配置文件的位置,可通过修改配置文件mysql.ini来调整mysql的一些功能。
此时可尝试运行mysqld来测试数据库可正常运行连接。
cd /mysql/path
bin/mysqld --defaults-file=/configuration/file/path --console
注意--defaults-file必须紧跟在mysqld命令后,否则会报未知变量错误。--console则是让服务器在终端输出,方便查看状态和报错信息。
mysql 8.0支持两种同步,传统的基于日志的同步方法(binary log file position based replication)和新的基于全局交易码的同步方法(replication with global transaction identifiers)。后一种方式更智能,接下来介绍后一种方式的具体配置实现过程。
假定所有数据库都是第一次运行,也就是说里面没有老数据需要迁移,这是最简单的情况。先配置主服务器mysql.ini
master1:
[mysqld]
# set basedir to your installation path
basedir=D:/Software/Portable/mysql-8.0.35-winx64
# set datadir to the location of your data directory
datadir=D:/Software/Portable/mysql-8.0.35-winx64/data
# set replication
server_id=1111
log_bin=master1111
# enable GTID mode
gtid_mode=ON
enforce_gtid_consistency=ON
# ignore these database to sync
binlog-ignore-db=performance_schema
binlog-ignore-db=information_schema
binlog-ignore-db=sys
binlog-ignore-db=mysql
# set database to sync, sync all database by default
binlog-do-db=test1
master2:
[mysqld]
# set basedir to your installation path
basedir=E:/Software/Portable/mysql-8.0.35-winx64
# set datadir to the location of your data directory
datadir=E:/Software/Portable/mysql-8.0.35-winx64/data
# set replication
server_id=1112
log_bin=master1112
# enable GTID mode
gtid_mode=ON
enforce_gtid_consistency=ON
# ignore these database to sync
binlog-ignore-db=performance_schema
binlog-ignore-db=information_schema
binlog-ignore-db=sys
binlog-ignore-db=mysql
# set database to sync, sync all database by default
binlog-do-db=test2
为了安全性考虑,在两台主服务器上分别创建用于同步的用户replica,
CREATE USER 'replica'@'%' IDENTIFIED BY 'replica123';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
若主服务器中已经存在一些数据,提前把数据同步到从服务器中,可以节约同步时间。可利用mysqldump先把多个主服务器中相应的数据导出,然后利用mysql客户端将数据导入从服务器。注意此时最好将数据库设为只读,确保在此期间服务器不会有新的写入。若是全新部署的主从服务器,则可略过这一步。注意如果要设置已有的主服务器向新的从服务器同步,需要先把这些主服务器设置为GTID模式。
然后是从服务器mysql.ini
[mysqld]
basedir=E:\\jjzhang\\Software\\mysql-8.0.35-winx64
datadir=E:\\jjzhang\\Software\\mysql-8.0.35-winx64\\data
server-id=2222
gtid_mode=ON
enforce_gtid_consistency=ON
# 注意下面的选项仅用于未配置好同步参数时,手动启动同步。若都配置好后可删除,以便mysql启动后自动开始执行同步
skip_replica_start=ON
启动从服务器并登陆后,执行如下指令
CHANGE REPLICATION SOURCE TO SOURCE_HOST='source_host1_IP_address', SOURCE_PORT=port1, SOURCE_USER='replica', SOURCE_PASSWORD='replica123', SOURCE_AUTO_POSITION=1 FOR CHANNEL 'master1111';
CHANGE REPLICATION SOURCE TO SOURCE_HOST='source_host2_IP_address', SOURCE_PORT=port2, SOURCE_USER='replica', SOURCE_PASSWORD='replica123', SOURCE_AUTO_POSITION=1 FOR CHANNEL 'master1112';
CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = ('test1.%') FOR CHANNEL "master1111";
CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = ('test2.%') FOR CHANNEL "master1112";
前两句表明同步对象,同步方式为GTID,以及同步频道;后两句则对要同步的数据表进行过滤,master1111频道只同步test1数据库,master1112频道只同步test2数据库。
设置好之后,可通过如下指令开启同步,查看同步状态或结束同步。
START REPLICA FOR CHANNEL "master1111";
START REPLICA FOR CHANNEL "master1112";
SHOW REPLICA STATUS FOR CHANNEL "master1111";
SHOW REPLICA STATUS FOR CHANNEL "master1112";
STOP REPLICA FOR CHANNEL "master1111";
STOP REPLICA FOR CHANNEL "master1112";
如果命令后面不带FOR CHANNEL,则表示对所有频道生效。
注意同步部署好之后,可做一个备份,因为不带GTID的老备份不能用在带有GTID的服务器上。