MySQL5.7.12 Base GTID Stream

开放防火墙端口

 firewall-cmd --zone=public --add-port=3306/tcp --permanent 
 firewall-cmd --reload

查看某个端口

firewall-cmd --zone=public --query-port=80/tcp

操作系统配置(可选)

systemctl  stop firewalld
systemctl  disable firewalld

主端配置

设置server_id

server_id = 1

开启log-bin

log-bin=on

检查是否开启bin log 日志:

show variables like '%log_bin%';

此选项是只读选项,需要添加到my.cnf 文件中。 且需要重启数据库。
确认以下参数为打开1 状态。

show variables like '%sync_binlog%';
show variables like '%innodb_flush_log_at_trx%';

配置log-bin 的保留日志

expire_logs_days=10

开启gtid 模式

gtid_mode=ON
enforce-gtid-consistency=ON
systemctl restart mysqld

在主端上创建从端连接的用户

CREATE USER 'repl'@'192.168.10.164' IDENTIFIED BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.10.164';

生成新的uuid

删除datadir 中的auto.conf文件。会自动生成新的uuid。

systemctl restart mysqld

制作备份

mysqldump -uroot -p1234 --all-databases --master-data > dbdump.db

注意:开启GTID 功能后以前的备份就不能用了。

从库准备

数据库初始化

mysql -u root -p1234
mysql < dbdump.db
CHANGE MASTER TO
MASTER_HOST = '192.168.10.166',
MASTER_PORT = 3306,
MASTER_USER = 'repl',
MASTER_PASSWORD = 'repl',
MASTER_CONNECT_RETRY=10,
MASTER_AUTO_POSITION = 1
FOR CHANNEL 'channel1';

要想使用多组复制,请把以下参数设置为TABLE ,否则,只能有一个slave 进程。

master_info_repository=TABLE 
relay_log_info_repository=TABLE

所有信息都存入在表中。

slave_master_info   
slave_relay_log_info
slave_worker_info   

清除所有slave 信息

 reset slave all;

设置server_id

server_id = 2

查询语句

select * from performance_schema.replication_applier_status_by_worker;
select * from mysql.gtid_executed;
 SELECT * FROM performance_schema.threads WHERE NAME LIKE '%gtid%'\G

变量查询

show variables like  '%gtid_next%';
show variables like '%server_uuid%';
show variables where variable_name in ('server_uuid','gtid_next','gtid_executed' ,'gtid_purged','gtid_executed_compression_period','master_info_repository','relay_log_info_repository');

参数说明:

设置过滤规则

只应用(不应用)某个DB 数据库(MySQL 8.0)

CHANGE REPLICATION FILTER REPLICATE_DO_DB = (ad_test) FOR CHANNEL channel1;

只应用(不应用)某个DB 数据库(MySQL 5.7)

CHANGE REPLICATION FILTER REPLICATE_DO_DB = (ad_test),REPLICATE_IGNORE_DB = (ad_test);

排除数据库(MySQL8.0)

CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB = (ad_test) FOR CHANNEL channel1;

排除数据库(MySQL5.7)

CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB = (ad_test) ;

只应用某些表

CHANGE REPLICATION FILTER
    REPLICATE_WILD_DO_TABLE = ('ad_test.old%');

REPLICATE_DO_DB 指定时,这个参数优先级低于REPLICATE_DO_DB.

从DB1 语句转写到DB2

CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB = ((db1, db2));

同时指定同一个库

CHANGE REPLICATION FILTER REPLICATE_DO_DB = (ad_test),REPLICATE_IGNORE_DB = (ad_test) ;
CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB = (ad_test) ,REPLICATE_DO_DB = (ad_test);
CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE = ('tpcds.test');
mysql> stop slave for channel 'channel1';
Query OK, 0 rows affected (0.03 sec)

mysql> CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE = ('tpcds.test','tpcds.test2');
Query OK, 0 rows affected (0.00 sec)

mysql> start slave for channel 'channel1';
Query OK, 0 rows affected (0.02 sec)

ad_test 下的库所有表都不会过滤。

同时指定一个表

CHANGE REPLICATION FILTER REPLICATE_DO_TABLE = (ad_test),REPLICATE_IGNORE_TABLE = (ad_test) ;
CHANGE REPLICATION FILTER REPLICATE_IGNORE_TABLE = (ad_test),REPLICATE_DO_TABLE = (ad_test) ;

清空过滤规则

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (), 
    REPLICATE_IGNORE_DB = (),
    REPLICATE_REWRITE_DB=(),
    REPLICATE_WILD_DO_TABLE=(),
    REPLICATE_WILD_IGNORE_TABLE=(),
    REPLICATE_DO_TABLE=(), 
    REPLICATE_IGNORE_TABLE=();
    

相同语句最后一个生效

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (db1, db2), REPLICATE_DO_DB = (db3, db4);

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (db3, db4);

以上语句生效的只有DB3,和DB4.