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;