您的位置:首页 > 数据库 > MySQL

MySQL主从复制

2019-01-17 15:39 781 查看

MySQL主从复制简介
Mysql的

主从复制
方案,都是
数据传输
的,只不过MySQL无需借助第三方工具,而是自带的同步
复制功能
,MySQL的
主从复制
并不是磁盘上文件直接同步,而是将
binlog
日志发送给从库,由从库将
binlog
文件里的内容写入本地数据库。

在生产环境中,MySQL主从复制都是异步方式同步,即不是实时同步数据。

MySQL主从复制原理:

从库
读取
master.info
文件中的信息(连接参数,最后一次请求binlog的位置点),向
主库
请求binlog文件,
主库
接受到
从库
发送过来的信息后(验证通过),将本地对应的
binlog
日志发送至
从库
从库
接收到binlog文件后,会存储到
TCP/IP缓存
中,并发送ACK给
主库
,告诉
主库
自己已经收到
binlog
日志了,那么
主库
收到ACK后接着干别的事了,
从库
TCP/IP缓存
中的内容写入到本地的
relaylog
日志文件中,
从库
会将最后一次获取到的binglog位置点更新至master.info文件,然后
IO线程
读取relay-log.info中的最后一次执行到的
relaylog
位置点(以这个位置点为起点,往后执行中继日志),最后将
relaylog
日志文件中对应的位置点的内容写入(恢复)
数据库
中,执行完数据写入后,将最后最后一次执行数据写入(恢复)的
relaylog
位置点更新至relay-log.info文件

每一次binlog请求都是按照上面所写的循序来执行

MySQL主从复制部署

MySQL主从复制条件

  1. 两台以上mysql实例(多台物理机或多个mysql实例)
  2. 开启
    binlog
    功能,确保所有实例
    server-id
    不同
  3. 主库建立
    同步账号
    replication slave
    特殊的权限)
  4. 将全备文件恢复到
    从库
    上(需人为操作)
  5. 从库配置
    master.info
    (change master..),复制的binlog位置点(需人为操作)
  6. start
    slave
    复制开关

1.环境规划
所有机器统一centos7.4系统环境,并且都已经安装好了mysql 5.7.20

主机名 IP地址 服务
db01 10.0.0.51 mysql 主库
db02 10.0.0.52 mysql 从库

2.所有mysql都开启binlog功能,确保所有mysql的

server-id
不同

需要添加的配置如下:

#主库 /etc/my.cnf
[mysqld]
server_id=1
log-bin=/application/mysql/data/mysql-bin
sync_binlog = 1
binlog_format = row
skip-name-resolve   #关闭域名解析

#从库 /etc/my.cnf
[mysqld]
server_id=2
log-bin=/application/mysql/data/mysql-bin
sync_binlog = 1
binlog_format = row
skip-name-resolve

提示:从库的relay-log路径可自定义,默认在data目录下以主机为前缀保存

server-id 用于全网唯一标识一台mysql机器

2.主库授权主从复制用户
replication slave 一个特殊的权限,专门用于主从复制

mysql> grant replication slave on *.* to rep@'10.0.0.%' identified by '123456';

3.主库将数据库数据做全备,然后将备份文件推送至从库

  • 主和从同时搭建新的环境,就不需要备份主库数据,恢复从库了,直接从第一个binlog(mysql-bin.000001)开头位置(120)
  • 如果主库已经工作了很长时间了,那么需要备份主库数据,恢复到从库,然后从库从备份的时间点起,自动进行复制
#1.将数据库的数据全备到/backup目录下
[root@db01 ~]# mysqldump -uroot -p123456  -A -B -R --master-data=2 --single-transaction |gzip >/backup/full_$(date +%F).sql.gz

#2.将全备通过scp推送到从库的/backup目录下
[root@db01 ~]# scp /backup/full_2019-01-15.sql.gz  root@10.0.0.52:/backup

提示:/backup 目录请自行创建

4.从库将备份文件恢复至数据库

#1.解压备份文件
[root@db02 ~]# gunzip /backup/full_2019-01-15.sql.gz

#2.进入数据库,将备份文件导入到本地数据库
mysql> source /backup/full_2019-01-15.sql

#3.检查数据是否恢复成功
mysql> show databases;

5.从库上都找到binlog位置点
虽然全备文件已经恢复到了从库,但是全备之后的数据的变化是没有进行备份的,所以从库还需要指定binlog位置点,这样从库才知道该从哪里开始同步数据

#直接在从库的全备文件中找到binlog位置点
[root@db02 /]# sed -n '22p' /backup/full_2019-01-15.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;

6.从库配置master info
master info就是指配置一系列主从复制参数,该参数为change master to,来实现主从复制

#1.进入数据库配置 change master to
change master to
master_host='10.0.0.51',
master_port=3306,
master_user='rep',
master_password='123456',
master_log_file='mysql-bin.000001',
master_log_pos=154;

#2.开启主从同步功能(开启IO和SQL线程),
mysql> start slave;

#3.查看主从复制的状态(截取部分)
#当在slave状态中可以看到如下参数,都为yes表明成功,(从库有一个IO和一个SQL)
mysql> show slave status\G
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...

change master to参数解释:
master_host='10.0.0.51',    #主库的IP地址
master_port=3306,    #主库的端口
master_user='rep',   #主库上创建的用于复制的用户rep
master_password='123456',      #rep用户的密码
master_log_file='mysql-bin.000001', #二进制日志文件的名称
master_log_pos=154;  #二进制日志偏移量

提示:mysql> help change master to 可获取配置案例

slave的操作命令:

mysql> stop slave; #停止slave
mysql> reset slave; #清空slave的配置参数(change master to)

从库的master.info和relay-log.info文件

#执行完change master to命令后,会自动生成master.info文件,保存change master to的参数和最后一次获取binlog日志文件名和对应的位置点
ls /application/mysql/data/master.info

#执行完start slave命令后,会自动生成relay-log.info文件,保存已执行过的relaylog的位置点
ls /application/mysql/data/relay-log.info

7.主库创建数据库,在到从库验证数据是否同步

#1.主库创建数据库:sample
mysql> create database sample;

#2.从库查看数据是否同步
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| case1              |
| case2              |
| mysql              |
| performance_schema |
| sample             |
| sys                |
| test               |
| xmh                |
+--------------------+

从库去向主库请求的binlog日志会保存在从库本地的relaylog日志中

[root@db02 /]# ls /application/mysql/data/db02-relay-bin.*
/application/mysql/data/db02-relay-bin.000001
/application/mysql/data/db02-relay-bin.000002
/application/mysql/data/db02-relay-bin.index

扩展:从库开启记录binlog功能

从库
需要记录
binlog
的应用场景为:当前的从库还需要作为其它从库的主库,例如:级联复制和双主互为主从场景的情况下

#从库的my.cnf中加入如下参数,然后重启服务生效即可
log-slave-updates  #开启从库记录binlog功能
log-bin = /application/mysql/data/mysql-bin
expire_logs_days = 7  #bin-log保留时间(只保留7天)

MySQL主从复制故障
主从复制状态信息介绍

mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_IO_Errno: 0   #记录最后一次IO的错误代码
Last_IO_Error:     #显示导致IO的错误原因
Last_SQL_Errno: 0  #记录最后一次SQL的错误代码
Last_SQL_Error:    #显示导致SQL的错误原因
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息