MySQL主从复制+过滤复制+GTID

MySQL主从复制+过滤复制+GTID

1.修改主库从库配置文件

主库:

vim /etc/my.cnf
[mysqld]
server_id=1
log-bin=mysql-bin

从库:

vim /etc/my.cnf
[mysqld]
server_id=1

注意:
1)主库server_id为1,从库server_id不等于1即可,从库之间可以相同.
2)主库需要开启binlog,从库可以不开启binlog,就算开启,也不会写入数据.

主从库server-id一定要彼此独立,不能重复,否则会出现如下错误:

Slave: received end packet FROM server, apparent master shutdown
**主库:
Binlog_Do_DB  #在主库上设置白名单:只记录白名单设置的库或者表,相关的SQL语句到binlog中
**生产中不能设置,否则不记录其他库的binlog,数据一旦丢失找不回来**

Binlog_Ignore_DB   #在主库上设置黑名单:不记录黑名单设置的库或者表,相关的SQL语句到binlog中

**从库:
replicate-do-db=test  #从库白名单,只同步某个库
replicate-do-table=test.t1  #从库白名单,只同步某个库中的某个表
replicate-wild-do-table=test.t*  #从库白名单,只同步某个库中的以t开头的所有表
Replicate_Ignore_DB=test2  #在从库上设置黑名单:IO线程会拿所有的binlog,但是SQL线程不执行黑名单设置的库或者表相关的SQL语句

实现过程

命令行:

mysqldump -uroot -p -B test --master-data=2 --single-transaction >/tmp/test.sql

scp /tmp/test.sql 192.168.1.1:/tmp

mysql -uroot -p123 </tmp/test.sql

head -22  /backup/full.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=154;

[root@db01 ~]# mysql -uroot -p
输入密码
mysql> source /tmp/test.sql

从库:
mysql > CHANGE MASTER TO
		MASTER_HOST='10.0.0.51',
		MASTER_USER='repl',
		MASTER_PASSWORD='123',
		MASTER_PORT=3307,
		MASTER_LOG_FILE='mysql-bin.000002',
		MASTER_LOG_POS=154,
		MASTER_CONNECT_RETRY=10;
		start  slave;
[root@db01 ~]# vim /etc/my.cnf 
replicate_do_db=ppt
replicate_do_db=word    #从库只同步ppt和word的数据库

[root@db01 ~]# /etc/init.d/mysqld restart

基于GTID的主从:
主库:
主库配置:
[root@db-01 ~]# vim /etc/my.cnf
[mysqld]
server_id=1
log-bin=mysql-bin
binlog_format=row
gtid_mode=on
enforce_gtid_consistency=on
log-slave-updates

从库:
从库01:
[root@db-02 data]# vim /etc/my.cnf
[mysqld]
gtid_mode=on
enforce_gtid_consistency=on
log-bin=mysql-bin
#更新从库的binlog
log-slave-updates

2.重启数据库(重新加载配置文件)

/etc/init.d/mysqld restart
systemctl restart mysqld

3.创建主从复制用户(主库)

grant replication slave on *.* to rep@'172.16.1.5%' identified by '123';

4.备份MySQL数据库(全备,打点)

[root@db01 tmp]# mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction > /tmp/full.sql
Warning: Using a password on the command line interface can be insecure.

5.将全备发送到从库

[root@db01 tmp]# scp ./full.sql root@172.16.1.53:/tmp
root@172.16.1.53's password: 
full.sql                                                        100% 6869KB  91.1MB/s   00:00    

6.在从库执行sql文件

[root@db04 tmp]# mysql -uroot -p123 < ./full.sql 
Warning: Using a password on the command line interface can be insecure.

7.查看sql文件中的位置点

[root@db04 tmp]# head -30 /tmp/full.sql |grep 'MASTER_LOG_POS'
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=574;

8.在从库上执行change master

mysql> change master to
    -> master_host='172.16.1.50',
    -> master_user='rep',
    -> master_password='123',
    -> master_log_file='mysql-bin.000005',
    -> master_log_pos=574;
Query OK, 0 rows affected, 2 warnings (0.04 sec)

9.开启SQL线程和IO线程

start slave;

10.查看主从复制的状态

show slave status\G

下面的两个必须都为yes才是成功。
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes

可自行测试,在主库增删改,查看从库变化。

2.SQL线程是NO
Slave_IO_Running: YES
Slave_SQL_Running: NO

数据不一致:
1)主库有该数据,从库没有,操作对象不存在(insert update delete drop truncate alter)
	主库:a库
	从库:没有a库

2)从库有该数据,主库要创建,操作对象已存在(create)
	从库:a库
	主库:要创建a库

处理方法一:(生产环境不建议使用)
#临时停止同步
mysql> stop slave;
#将同步指针向下移动一个(可重复操作)
mysql> set global sql_slave_skip_counter=1;
#开启同步
mysql> start slave;

处理方法二:(生产环境不建议使用)
#编辑配置文件
[root@db01 ~]# vim /etc/my.cnf
#在[mysqld]标签下添加以下参数
slave-skip-errors=1032,1062,1007

处理方法三:
1.要求,主从复制之前,主库和从库的数据保证一致.
2.在从库上设置 只读:set read-only=1;

posted @ 2019-11-25 18:29  Beua  阅读(635)  评论(0编辑  收藏  举报