系列文章:
本文内容部分整理自《高性能mysql》,链接如下:
两种复制方式
mysql支持两种复制方式:基于语句的复制和基于行的复制。
基于语句的复制(逻辑复制)在mysql 3.23版本就已存在,基于行的版本在5.1版本引入。
两种方式都是通过在主库记录二进制日志,在备库重放日志的方式来实现异步的数据复制。但是区别在于,基于语句复制时,日志中记录的是sql语句;基于行复制时,日志中记录的是变化了的数据。
复制的流程图如下:
复制三个步骤:
1.主库把数据更改记录到二进制日志(binarylog)中;
2.备库将主库上的日志复制到自己的中继日志(relay log)中;
3.备库读取中继日志中的事件,将其重放到备库数据之上;
而在复制的过程中,会有一定的延迟,原因在于主库更新数据是多线程操作,而从库更新数据是单线程。从库使用单线程更新是要考虑语句顺序问题。
语句复制和行复制相对比,各自特点如下:
基于语句复制:主库记录造成数据修改的语句,在从库上再执行一遍。好处实现简单,缺点必须串行实现。
基于行复制:将实际数据(变化了的数据)放在二进制日志中,好处是可以正确地复制每一行,缺点是当进行全表操作时复制代价大,时间点恢复也实现复杂。
配置主从
1.配置主库my.cnf文件
log_bin = mysql-bin
server_id = 10
2.配置授权账号及查看主库状态
grant replication slave on *.* to slave@192.168.1.11 identified by '123456' ;
show master status;
3.配置从库my.cnf
log_bin = mysql-bin
server_id = 12
relay_log = /var/lib/mysql/mysql-relay-bin
log_slave_updates = 1
read_only = 1
4.从库连接主库
change master to master_host='server1',
master_user = 'slave';
master_password = '123456',
master_log_file = 'mysql_bin.000001',
master_log_pos = 0;
5.查看复制状态
show slave status/G
正常状态为
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
6.开始复制
start slave;
主从不同步解决思路
1.先查看主库
show processlist; -- 查看下进程是否Sleep太多。发现很正常。
show master status; -- 也正常。
+-------------------+----------+--------------+-------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+-------------------------------+
| mysqld-bin.000001 | 3260 | | mysql,test,information_schema |
+-------------------+----------+--------------+-------------------------------+
1 row in set (0.00 sec)
2.查看从库
show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: No -- 说明有错误
3.跳过错误
stop slave;
#表示跳过一步错误,后面的数字可变
set global sql_slave_skip_counter =1;
start slave;
show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes