MySQL主从复制是一种数据复制技术,用于将一个MySQL数据库的数据实时复制到其他MySQL数据库,通常一个作为主数据库(master),其他作为从数据库(slave)
基本工作原理:
- 主数据库记录所有的数据变更操作,并将这些变更以binlog(二进制日志)的形式保存.
- 从数据库连接到主数据库,并开始读取主数据库的binlog,实时复制其中的数据变更操作。
- 从数据库将接收到的数据变更操作应用到自己的数据集上,保持与主数据库的数据一致性。
- 主数据库在每次的数据变更操作后会将binlog信息发送给从数据库,从数据库记录并维护一个执行位置,以确保下次读取binlog时能够从正确的位置开始。
- 如果主数据库出现故障,从数据库可以提升为新的主数据库,从而保证系统的高可用性。
详细步骤:
1 、 MySQL 将数据变化记录到二进制日志中;2 、 Slave 将 MySQL 的二进制日志拷贝到 Slave 的中继日志中;3 、 Slave 将中继日志中的事件在做一次,将数据变化,反应到自身( Slave )的数据库详细步骤:1 、从库通过手工执行 change master to 语句连接主库,提供了连接的用户一切条件( userpassword 、 port 、 ip ),并且让从库知道,二进制日志的起点位置( file 名 position 号); start slave2 、从库的 IO 线程和主库的 dump 线程建立连接。3 、从库根据 change master to 语句提供的 file 名和 position 号, IO 线程向主库发起 binlog 的请求。4 、主库 dump 线程根据从库的请求,将本地 binlog 以 events 的方式发给从库 IO 线程。5 、从库 IO 线程接收 binlog events ,并存放到本地 relay-log 中,传送过来的信息,会记录到master.info 中6 、从库 SQL 线程应用 relay-log ,并且把应用过的记录到 relay-log.info 中,默认情况下,已经应用过的 relay 会自动被清理 purge
主从复制的优势:
- 数据备份与恢复:通过主从复制,可以将主数据库的数据实时复制到从数据库,从而提供数据备份和灾难恢复的能力。
- 负载均衡:通过将读操作分发到多个从数据库,主从复制可以减轻主数据库的负载,并提高系统整体的读写性能。
- 提高数据可用性:当主数据库发生故障时,从数据库可以顶替主数据库的角色,从而确保系统仍然可用。
注意:
主从复制在数据同步过程中具有一定的延迟,从数据库的数据可能不是实时更新的,因此对于一些要求实时数据一致性的场景,可能需要考虑其他的数据复制技术。
基本配置:
环境准备两台机器一主一从。 主库( MySQL Master ):[ ip 为 192 .168.100.146 port 为 3306 ]从库( MySQL Slave ):[ ip 为 192 .168.100.145 port 为 3306 ]
#主库设置[root@RHCE ~]# vim /etc/my.cnf[mysqld]
log_bin = mysql-bin
server_id = 120mysql> grant replication slave on *.* to 'rep'@'192.168.100.%' identified by
'123456';
mysql> show grants for 'rep'@'192.168.100.%'; # 给定从库权限查看主库状态,即当前日志文件名和二进制日志偏移量
mysql> show master status;mysqldump -uroot -p -A -B |gzip > /server/backup/mysql_bak.$(date +%F).sql.gz #备份数据库scp /server/backup/mysql_bak.2015-11-18.sql.gz 192.168.95.130:/server/backup/ #将主库的备份传到从库上 使两个数据库的数一致#从库的配置
[root@RHCE ~]# vim /etc/my.cnf #设置从库参数
[mysqld]
server_id = 130 #从库和主库的server id 不能相同且唯一cd /server/backup/ #还原数据库
gzip -d mysql_bak.2015-11-18.sql.gz
mysql -uroot -p < mysql_bak.2015-11-18.sql[root@RHCE ~]# mysql -uroot -p -e 'show databases;' #查看数据库mysql> change master to
MASTER_HOST='192.168.100.146',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.0000022', #此选项一定要和主上的一致
MASTER_LOG_POS=194; #此选项一定要和主上的一致mysql> start slave; #启动从库
mysql> show slave status; #查看从库状态Slave_IO_Running: Yes #以下两个选项都为yes时 表示配置成功
Slave_SQL_Running: Yes
注意:
从主机上不能开启bin_log日志 否者无法创建