复制是一种允许在从库上复制主库数据的功能。
MySQL复制功能使用三个线程实现,一个在主服务器上,两个在从服务器上
Binlog备份线程。 主设备创建一个线程,以便在从库连接时将二进制日志内容发送到从库。可以SHOW PROCESSLIST在主服务器的输出中将此线程标识为Binlog Dump线程。
二进制日志转储线程获取主机二进制日志上的锁,用于读取要发送到从机的每个事件。一旦读取了事件,即使在事件发送到从站之前,锁也会被释放。
从库I/O线程。 在START SLAVE从属服务器上发出语句时,从属服务器会创建一个I/O线程,该线程连接到主服务器并要求它发送二进制日志中记录的更新。
从库I/O线程读取主库Binlog Dump线程发送的更新 并将它们复制到从库的中继日志
从库SQL线程,从库创建一个SQL线程来读取由从I/O线程写入的中继日志,并执行。
大致过程:
从库会启动2个线程,一个I/O线程,一个SQL线程,I/O线程负责连接主库,完成认证和获取主库binlog日志的内容,然后写到从库的中继日志中。再由SQL线程读取并执行中继日志中的SQL语句。
必须使用唯一ID配置主库和每个从库(使用该server-id选项)以及开启binlog日志
在主库配置文件/etc/my.cnf中添加下面2行
log-bin=bin.log
server-id=1 #必须保证每个数据库的server id不同
启动主库
mysqld_safe &
先把主库当前时间点做个备份
mysqldump -uroot -pmysql --flush-logs --quick --single-transaction --master-data=2 --all-databases > ~/alldb.sql
在从库的配置文件/etc/my.cnf中添加一行
log-bin=bin.log #打开binlog日志
server-id=2 #确保每个数据库的server-id不同
启动从库
mysqld_safe &
在从库上,获取主库的备份文件
scp [email protected]:/root/alldb.sql ~/
导入从库(从库的用户名密码为 root/slave )
mysql -uroot -pslave < ~/alldb.sql
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'192.168.253.158' IDENTIFIED BY 'replication';
查看主库binlog信息
mysql> SHOW MASTER LOGS;
如果这时候数据库是一直在往里读写数据的状态,我们可以查看刚刚完全备份的数据来确定binlog信息
这里完全备份的位置是120,我们数据库中查看的位置是352的原因是,在我们备份完了之后我们还创建了允许从库连接的用户所以主库又往前跑了一些距离,这里不希望从库也创建repl用户,所以采取的位置是352
mysql> CHANGE MASTER TO MASTER_HOST='192.168.253.128',MASTER_USER='repl',MASTER_PASSWORD='replication',MASTER_LOG_FILE='bin.000004',MASTER_LOG_POS=352;
mysql> START SLAVE;
查看状态
SHOW SLAVE STATUS\G;
这时候再主库创建一个新的数据库看从库能不能复制过去
主库:
mysql> create database master;
拓扑图
简单地说就是互为主从,我们再刚才一主一从的基础上继续做,刚才已经设置好了一主一从,这时候只需要在192.168.253.158上创建个账户允许192.168.253.128连接过来复制数据,然后再192.168.253.158上配置向相关信息即可。
注意:互为主从时,自动增长id可能会冲突,所以需要设置一下
定义一个节点使用奇数id,下面配置表示从1开始每次增2
auto_increment_offset=1
auto_increment_increment=2
另一个节点使用偶数id,下面配置表示从2开始没次递增2
auto_increment_offset=2
auto_increment_increment=2
环境:
基于刚才一主一从配置
192.168.253.128配置文件的几个关键项
log-bin=bin.log
server-id=1
auto_increment_offset=2
auto_increment_increment=2
192.168.253.158配置文件的几个关键项
log-bin=bin.log
server-id=2
auto_increment_offset=1
auto_increment_increment=2
在192.168.253.158上创建用户,允许192.168.253.128连接获取binlog
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'192.168.253.128' IDENTIFIED BY 'replication';
在192.168.253.128上配置主从复制
mysql> CHANGE MASTER TO MASTER_HOST='192.168.253.158',MASTER_USER='repl',MASTER_PASSWORD='replication',MASTER_LOG_FILE='bin.000004',MASTER_LOG_POS=669051;
START SLAVE;
查看状态
SHOW SLAVE STATUS\G
现在在192.168.253.158上再创建个数据库,看192.168.253.128能不能获取到数据
create database slave;
这个实现方式有2个
#通过这两个变量设置
binlog_do_db= #记录某数据库
binlog_ignore_db= #不记录某数据库
#通过下面几个变量实现
Replicate_Do_DB= #表示复制指定数据库
Replicate_Ignore_DB= # 表示不复制指定数据库
Replicate_Do_Table= # 表示复制指定表
Replicate_Ignore_Table= #表示忽略指定表
Replicate_Wild_Do_Table= #从库被限制为复制与指定通配符模式匹配的表
Replicate_Wild_Ignore_Table=#从库将忽略复制流中与指定通配符模式匹配的表的任何更改