独角兽企业重金招聘Python工程师标准>>>
mysql - GTID主从复制
Mysql replication
从主服务器(master)将数据复制到另外slave服务器的过程。将主数据库DDL和DML操作通过二进制日志传输到从服务器上,从服务器按顺序执行这些日志记录的操作达到主从数据同步的目的。
复制操作是异步的。slave不需要持续保持连接接收master的数据。
原理
每个事务更新数据完成之前,master将数据的改变记录到二进制日志(Binary Log)中;写入完成后,master服务器通知存储引擎提交事务。slave上的I/O进程连接master,发出日志请求;Master接收后通过负责复制的I/O进程根据请求读取指定日志指定位置之后的信息返回给slave。除日志信息外,还包括本次返回日志信息已经到Master端的bin-log文件的名称和bin-log的位置。slave_I/O进程收到信息后,按顺序将 master的binary log events 复制到自己的中继日志(Relay Log)中; 并读取Master端的bin-log文件名和位置记录到master-info文件中。Slave_Sql进程检测到relay-log中新增了内容,解析并执行。过滤复制
可根据实际情况Slave服务器配置‘replicate*’来指定(不)需要复制的db、table。
不推荐使用binlog-do-db, binlog-ignore-db, replicate-do-db 和 replicate-ignore-db 来设置需要过滤的数据库:通过默认的数据库为“mysql" 的连接, 过滤二进制的(SQL)语句日志的. 换句话说, 过滤不是基于查询的字符串的, 而实际于你使用的数据库。
推荐:在 slave上配置过滤, 使用基于查询中真正涉及到的表的选项
replicate-wild-do-table=db_name.%replicate-wild-ignore-table=mysql.%
操作
master服务器增加用于复制的用户msql_rep,授权replication,密码Rep@!123mysql>grant replication slave on *.* to 'msql_rep'@'172.30.1.52' identified by 'Rep@!123';
修改Master的配置
vi /etc/f;开启BINGLOG: 增加行: log-bin = /usr/local/var/mysql/mysql-bin设置server-id值: 增加行: server-id = 51
在master服务器设置度锁定有效,确保没有新数据库操作,便于获得一致性快照.
mysql> fulsh tables with read lock;
查看master信息
mysql> show master status \G;
恢复写操作
mysql> unlock tables;
修改slave数据库配置文件f,增加server-id参数;servier-id的值唯一,不能与master和其他slaver配置相同。
重启slave数据库,关闭slave;指定master的复制用户、密码、主ip、复制日志文件、位置等。
service mysqld restartmysql -uroot -prootmysql> stop slave;mysql>change master to-> master_host ='172.30.1.51',// Master IP-> master_user='msql_rep', -> master_password='Rep@!123', -> master_log_file='mysql-bin.000010', //Master实现复制的binlog文件-> master_log_pos=2000; //Master实现复制的binlog文件的偏移量mysql> start slave;mysql> show slave status \G;
指定截止位置:
start slave until master_log_file='mysql-bin.000008',master_log_pos=310; 可以在master\slaver服务器上查看服务器进程状态
mysql> show processlist \G;
检测主从设置的正确性
当主库数据发生变化时,日志偏移量改变
master: 新增datebase和table
slave: 异步延时完成同步。
问题
Slave_SQL_Running:No成因:
1、slave上这个表中出现了其他的写操作。
2、slave进程重启,事务回滚造成。
解决方法:
mysql> slave stop;mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER= 1; //客户端运行,用来跳过指定N个数的事件,只有当同步进程出现错误而停止的时候才可以执行。 mysql> slave start;
Slave_SQL_Running:No
成因:
1、网络连接不上
2、配置不对, replication slave和file没权限
3、master_log_file、master_log_pos同步错误。
解决方法:
从master中找到最新的logfile及logpos;修改slave同步日志文件及位置。
change master to master_log_file='mysql-bin.000013', master_log_pos=8654;