mysql主从同步
2018-07-20 本文已影响46人
無法定义
mysql中为了读写分离,高可用时,都会用到mysql的主从同步方案。 MySQL的主从复制是一个异步的复制过程(虽然一般情况下感觉是实时的),数据将从一个Mysql数据库(我们称之为Master)复制到另一个Mysql数据库(我们称之为Slave),在Master与Slave之间实现整个主从复制的过程是由三个线程参与完成的。其中有两个线程(SQL线程和IO线程)在Slave端,另一个线程(I/O线程)在Master端。
环境搭建
下载镜像
docker pull mysql:5.7
配置
主库配置
- 新建文件夹/opt/mysql/master/conf和/opt/mysql/master/data
- data存放mysql数据
- conf存放配置my.cnf
[mysqld]
log-bin=mysql-bin
server-id=101
binlog-do-db=test
binlog_format=STATEMENT
从库配置
- 新建文件夹/opt/mysql/slave/conf和/opt/mysql/slave/data
- data存放mysql数据
- conf存放配置my.cnf
[mysqld]
log-bin=mysql-bin
server-id=102
replicate-do-table=test.pay_trade
binlog_format=STATEMENT
启动
启动主库
docker run --name mysql-master -v /opt/mysql/master/data:/var/lib/mysql -v /opt/mysql/master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7
启动从库
docker run --name mysql-slave -v /opt/mysql/slave/data:/var/lib/mysql -v /opt/mysql/slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 -d mysql:5.7
开启主备
创建库
在主备上创建相同的库test,并创建表pay_trade
主库开启同步
创建用于同步的账户
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by '123456';
查看主库状态
SHOW MASTER STATUS;
mark
从库开启同步
开启同步
- master_host为docker的地址不能写127.0.0.1
- master_user是在主库创建的用户
- master_log_pos是主库show master status;查询出的Position
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
change master to master_host='172.18.160.102',master_user='backup',master_password='123456',master_log_file='mysql-bin.000005',master_log_pos=444227;
查看从库状态
SHOW SLAVE STATUS;
mark
同步方式
主库同步方式
- binlog-do-db 二进制日志记录的数据库(多数据库用逗号,隔开)
- binlog-ignore-db 二进制日志中忽略数据库 (多数据库用逗号,隔开)
从库同步方式
- replicate-do-db 设定需要复制的数据库(多数据库使用逗号,隔开)
- replicate-ignore-db 设定需要忽略的复制数据库 (多数据库使用逗号,隔开)
- replicate-do-table 设定需要复制的表
- replicate-ignore-table 设定需要忽略的复制表
- replicate-wild-do-table 同replication-do-table功能一样,但是可以通配符
- replicate-wild-ignore-table 同replication-ignore-table功能一样,但是可以加通配符
binlog三种模式
ROW
- 日志中会记录每一行数据被修改的形式,然后在slave端再对相同的数据进行修改
- 优点:在row level模式下,bin-log中可以不记录执行的sql语句的上下文相关的信息,仅仅只需要记录那一条被修改。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。不会出现某些特定的情况下的存储过程或function,以及trigger的调用和触发无法被正确复制的问题
- 缺点:row level,所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,会产生大量的日志内容。
STATEMENT
- 每一条会修改数据的sql都会记录到master的bin-log中。slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql来再次执行
- 优点:statement level下的优点首先就是解决了row level下的缺点,不需要记录每一行数据的变化,减少bin-log日志量,节约IO,提高性能,因为它只需要在Master上锁执行的语句的细节,以及执行语句的上下文的信息。
- 缺点:由于只记录语句,所以,在statement level下 已经发现了有不少情况会造成MySQL的复制出现问题,主要是修改数据的时候使用了某些定的函数或者功能的时候会出现。
MIXED
在Mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志格式,也就是在Statement和Row之间选择一种。如果sql语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。
配置
- 查看
show global variables like '%binlog_format%';
- 配置
[myslqd]
log-bin=mysql-bin
#binlog_format=STATEMENT
#binlog_format=ROW
#binlog_format=MIXED