Setup Master Slave from MariaDB to MySQL

Install MySQL 8.0

$ sudo apt update
$ sudo apt install mysql-server

$ sudo systemctl status mysql

Master DB 相关设置

创建复制账户

在MariaDB中创建用于MySQL 8.0 slave连接的用户账户,并授予复制权限。

CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'repl';

GRANT REPLICATION SLAVE ON *.* TO  'repl'@'192.168.1.%' ;
FLUSH PRIVILEGES;

启用 Binlog

在MariaDB中查看当前的二进制日志文件名和位置。可以使用以下命令:

SHOW MASTER STATUS;

/usr/local/mariadb10/etc/mysql/my.cnf[mysqld]下增加如下内容:

[mysqld]
server-id = 101
log-bin=mysql-bin
# gtid-mode=on                   # 在MariaDB上不需要
# enforce-gtid-consistency=true  # 在MariaDB上不需要 
# gtid_strict_mode=1
binlog_format=ROW
max_binlog_size=100M
expire_logs_days=10
log-slave-updates=true
sync-master-info=1
slave-parallel-threads=2
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
binlog-checksum = CRC32
binlog-ignore-db = mysql
replicate-ignore-db = mysql

保存配置文件并重启 MariaDB 服务:

$ sudo systemctl restart pkgctl-MariaDB10.service

验证 binlog 是否启用成功,可以使用以下命令查看:

$ sudo mysql -u root -p -e "SHOW BINARY LOGS;"
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       328 |
+------------------+-----------+

如果出现类似如下的输出,则表示 binlog 启用成功:

+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |     32409 |
+------------------+-----------+

以上命令可以显示当前存在的binlog文件列表,以及文件的大小信息。

Slave DB 相关设置

同步 Master DB 所有数据

$ mysqldump -u root -p --all-databases --column-statistics=0 --skip-lock-tables > alldb.sql

$ mysql -u root -p --force < alldb.sql

同步Master DB单库数据

CREATE DATABASE IF NOT EXISTS `supernotes` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
$ mysqldump -u username -p supernotes --column-statistics=0 --skip-lock-tables > supernotes.sql

$ mysql -u username -p supernotes < supernotes.sql

配置Server ID及开启binlog

$ sudo mysql
SHOW VARIABLES LIKE '%server_id%';

编辑/etc/mysql/mysql.conf.d/mysqld.cnf,增加或者替换成如下内容。

以下是开启GTID的场景

[mysqld]
bind-address            = 0.0.0.0

server-id = 102                        # 服务器ID
log-bin = mysql-bin                    # 二进制日志文件名
binlog_format = row                    # 强烈建议,其他格式可能造成数据不一致
gtid-mode = on                         # 启用gitd功能
enforce-gtid-consistency = 1           # 开启强制GTID一致性
master-info-repository = TABLE         # 记录IO线程读取已经读取到的master binlog位置,用于slave宕机后IO线程根据文件中的POS点重新拉取binlog日志
relay-log-info-repository = TABLE      # 记录SQL线程读取Master binlog的位置,用于Slave 宕机后根据文件中记录的pos点恢复Sql线程
sync-source-info = 1                   # 启用确保无信息丢失;任何一个事务提交后, 将二进制日志的文件名及事件位置记录到文件中
replica-parallel-workers = 4           # 设定从服务器的复制线程数;0表示关闭多线程复制功能
binlog-checksum = CRC32                # 设置binlog校验算法(循环冗余校验码)
source-verify-checksum = 1             # 设置主服务器是否校验
replica-sql-verify-checksum = 1        # 设置从服务器是否校验
binlog-rows-query-log_events = 1       # 用于在二进制日志记录事件相关的信息,可降低故障排除的复杂度
read_only = on                         # 设置一般用户为只读模式
relay_log_recovery = 1                 # crash safe slave
super_read_only = on                   # 设置super(root)用户为只读模式
log-replica-updates = 1                # 是否记录从服务器同步数据动作

以下是开启非GTID的场景

[mysqld]
server-id = 102

保存配置文件并重启 MySQL 服务:

$ sudo systemctl restart mysql

在从服务器上登录 MySQL,执行以下命令启动复制:

STOP SLAVE;
RESET SLAVE ALL;

-- CHANGE MASTER TO MASTER_HOST='192.168.1.6', master_port=3306, MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_AUTO_POSITION=1;

CHANGE MASTER TO MASTER_HOST='192.168.1.6', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=61179;

START SLAVE;
SHOW SLAVE STATUS \G;