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;