MySQL主从复制 实践(2)

1)主库安装插件 show plugins; install PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; 2)��库安装插件 show plugins; INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 3)参数设置 主库: show variables like '%semi%'; SET GLOBAL rpl_semi_sync_master_enabled=1; 从库: SET GLOBAL rpl_semi_sync_slave_enabled=1; 4)重启主从复制 从库: stop slave; start slave; 5)状态检查 show global status like '%semi%'; 6)复制检查 主库: use db1; insert into t1 values(100); 从库: use db1; select * from t1;(获得数据) 7)测试延迟 从库: stop slave; 主库: use db1; insert into t1 values(1);(被卡10s) set global rpl_semi_sync_master_timeout=1000;(设置主等从时间1秒) 从库: start slave; stop slave; 主库: use db1; insert into t1 values(88);(被卡1s)

注意:rpl_semi_sync_master_timeout主库等待时间不能设置大,不然会引起主库雪崩效应;最好在1秒内;

MySQL主从复制 实践

MySQL主从复制 实践

并行复制

1.MySQL并行复制

 

#从库: show variables like '%slave_par%'; set global slave_parallel_workers=10; 设置sql线程数为10 #重启 slave stop slave; start slave; #查看线程 show processlist;(十个worker线程)

 

注:实际上有11个线程,10worker线程,1个调度线程;

部分数据复制

 

部分数据复制:

在配置文件中设置

主库添加参数指定到库:

binlog_do_db=db1

binlog_ignore_db=db1

binlog_ignore_db=db2

或从库添加参数

可以到表;

replicate_do_db=db1

replicate_ignore_db=db1

replicate_do_table=db1.t1

replicate_wild_do_table=db%.%          #配置设置

replicate_wild_ignore_table=db1.%     #1打头的表

注:建议使用在从库添加参数,这样更加灵活可以指定到表级别;

部分复制

 

1)主库: create database db2; 2)从库部分复制配置 配置文件中增加配置 #vim /data/mysql/my1.cnf(replicate_do_db=db2) 重启mysql #mysqladmin -uroot --socket=XXX --port=3306 -p123456 shutdown #/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/my1.cnf & show slave status; 显示:replicate_do_db=db2 3)测试 主库: use db1; delete from t1; 从库: use db1; select * from t1;(任然保留数据) 主库: use db2; create table user(a int,b int); 从库: use db2; show tables;(查看到user表)

联级复制

 

联级复制(A->B->C)

1)从库: #vim /data/mysql/my1.cnf(log_slave_updates) #mysqladmin -uroot --socket=XXX --port=3306 -p123456 shutdown #/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/my1.cnf & 2)创建新实例 在主库服务器上创建一个从库2实例 #mysqladmin -uroot --socket=XXX --port=3306 -p123456 shutdown #kill -9 (mysqld_safe进程号) #cp -r node1 node2 #vim my.cnf(修改相关参数,端口3307) #chown -R mysql.mysql node2 #/usr/local/mysql56/bin/mysqld_safe --defaults-file=/data/mysql/my1.cnf & #/usr/local/mysql56/bin/mysqld_safe --defaults-file=/data/mysql/my2.cnf & #mysqldump -utest -ptest -hXXX -P3306 -A --master-data=1 > d731.sql(dump从库1的全备) #mysql -uroot --socket=/data/mysql/node2/mysqld.sock -p123456 < d731.sql 3)配置从1和从2的主从 从1授权: grant replication slave on *.* to repl@'(从2IP)' identified by 'repl'; 从2配置复制: less d731.sql|grep "change master to" change master to master_host='(从1IP)',master_user='repl',master_password='repl',master_log_file='XXX',master_log_pos=XXX; start stave; show slave status\G show processlist; 4)联级复制测试 主库: create database db3; 从1: show databases;(获得新建库) 从2: show databases;(获得新建库)

监控与处理

#查看状态
show slave status;

成功与否:

slave_sql_running:

slave_io_running:

延时多久

seconds_Behind_Master

从库出现问题时

last_sql_errno

last_sql_error

last_io_errno

last_io_error

复制出错处理

常见:1062(主键冲突),1032(记录不存在)

解决:

手动处理

跳过复制错误:set global sql_slave_skip_counter=1

复制出错,大部分因为,主从数据不一致导致的;

最好的办法还是进行数据主从复制的校验;percona公司有主从复制校验工具;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/4d883c8269d7cfaa06fbb2770e926295.html