- MySQL主从复制介绍:
- mysql数据库默认是支持主从复制的,不需要借助于其他的技术。
- mysql主从复制是基于binlog二进制日志来实现的。
- binlog二进制日志记录了所有的DDL(数据定义语言)语句和DML(数据操纵语言)语句,但不包括数据查询语句。
- 从库取得主库的binlog进行回放
- 主从复制的过程是异步的
- MySQL主从复制的基本原则是:
- 1.每个slave只有对应一个master
- 2.每个slave只能有一个唯一的服务器ID
- 3.每个master可以有多个slave
- MySQL主从复制的形式包括有:
- 一主一从
- 一主多从
- 多主一从:多主一从可以将多个Mysql数据库备份到一台存储性能比较好的服务器上
- 双主复制:互做主从复制,两台master互相做对方的slave
- 级联复制:级联复制模式下,部分slave的数据同步不连接主节点,而是连接从节点
- MySQL主从复制的原理:
- 1.主服务器开启binlog日志,从服务器通过CHANGE MASTER TO 命令与主服务器建立连接
- 2.将主库的信息保存到自己的master.info中,便于下次再次连接
- 3.从服务器开启两个线程,一个IO线程一个SQL线程,IO线程负责监听主库的变化并将binlog日志下载到本地relay.log上,SQL线程通过查看relaylog.info找到最新数据的点,进行重放
- 4.除了第一次连接是由IO线程主动发起下载,之后会由主库的DUMP线程,主动的将新的日志传输给IO线程
- 主从复制涉及到四个文件和三个线程:
- 文件:
- 主库:
- binlog 主库的二进制日志 (记录操作信息,用于从库中回放)
- 从库:
- 1. relaylog 中继日志
- (IO线程将binlog文件中的内容写入relaylog文件,SQL线程读取relaylog文件的内容,执行在从库上)
- 主要作用是:保证当从库断开连接时,可以继续从上一次同步的位置继续同步数据
- 2. master.info 主库信息文件
- (master.info文件记录了主从连接的相关信息,如主库的IP、端口等)
- 3. relaylog.info relaylog应用的信息
- (relay.info文件记录了从库上的中继日志文件的相关信息,如中继日志文件的路径、文件名同步位置等)
- 注意:master.info文件和relaylog.info文件都是用来保证主从同步的正确性和完整性,如果这两个文件信息不正确,会导致主从同步失败或出现数据不一致的情况。
- 线程:
- 主库:
- Binlog_Dump Thread : DUMP_T (将二进制文件的内容发送给从库)
- 从库:
- SLAVE_IO_THREAD : IO_T (从主库上读取二进制文件内容)
- SLAVE_SQL_THREAD : SQL_T (将读取到的二进制文件内容中的SQL语句,执行在从库上)
- 文件:
- 实验环境:
- master:192.168.8.5
- slave:192.168.8.6
- 实验操作:
- 1.两台服务器同时,修改配置文件/etc/my.cnf,开启binlog日志
- cat > /etc/my.cnf << EOF
- [mysqld]
- user=mysql
- basedir=/usr/local/mysql
- datadir=/usr/local/mysql/data
- socket=/tmp/mysql.sock
- server_id=1
- log_bin=/data/binlog/master-bin
- port=3306
- [mysql]
- socket=/tmp/mysql.sock
- prompt=master>
- EOF
- 2.创建数据目录,修改权限:
- mkdir -p /data/binlog
- chown -R mysql.mysql /data
- systemctl restart mysqld
- 3.master创建复制用户:
- grant replication slave on *.* to repl@'192.168.8.%' identified by '123456';
- 4.将master库的历史数据复制到slave库上
- mysqldump -uroot -A --master-data=2 --single-transaction -R -E --triggers >/tmp/full.sql
- scp /tmp/full.sql root@192.168.8.6:/root
- 5.slave库导入master主库的历史数据:
- mysql> set sql_log_bin=0; (不记录日志)
- mysql> source /root/full.sql
- mysql> set sql_log_bin=1;
- 6.查看主服务器当前的二进制日志名和position号
- show master status;
-
- show master status;
- 7.在salve库上连接master库:
- CHANGE MASTER TO
- MASTER_HOST='192.168.8.5',
- MASTER_USER='repl',
- MASTER_PASSWORD='123456',
- MASTER_PORT=3306,
- MASTER_LOG_FILE='master-bin.000001',
- MASTER_LOG_POS=447,
- MASTER_CONNECT_RETRY=10;
- 8.开启复制线程,IO线程下载日志,SQL线程将日志回放
- start slave
- 9.在从库上检查主从复制的状态
- show slave status \G
- 10.测试主从复制是否实现:
- 在master1库上创建库和表,查看slave库上是否同步过来
- 主库:
- create database ms;
- use ms;
- create table t1 (id int,name varchar(20));
- insert into t1 values (1,'z3'),(2,'l4'),(3,'w5');
- 从库:
- show databases;
- use ms;
- select * from t1;
- 可以查看到信息,则代表主从复制成功
- 1.两台服务器同时,修改配置文件/etc/my.cnf,开启binlog日志