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 statusG
下面的两个必须都为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;