MySQL-主从复制:基于二进制文件复制详解

前言

主从复制是指把一个MySQL的数据库服务器作为主服务器(master),然后把master的数据复制到一个或者多个MySQL数据库服务器作为从服务器(slave)。从master到slave的复制一般是异步复制,所以从服务器的复制可以随时停止,也不会影响到主服务器的使用。可以通过配置来决定只复制哪些数据库或者哪些表的数据。

主从复制的优点

  • 读写分离提高负载:master服务器不在负载读操作,只处理写入和更新操作,可显著提升主服务器的写操作的性能。而读操作是通过多个slave服务器来读取数据,多个slave服务器可以分散读操作的压力,减少对单机I/O和带宽的依赖,也可以提升读操作的性能。
  • 数据安全:因为数据是异步复制过来的,可以在slave服务器上进行测试,或者进行数据分析。即不会更改master服务器的数据,也不会影响master服务器的性能
  • 远程数据分发:当你需要在本地使用数据时,可以通过复制功能把数据复制到本地,这样就不需要访问远程master服务器

基于二进制文件(binary log)复制

原理介绍

1、master服务器把对源数据库的写入和更新操作以事件的方式记录到二进制日志文件(binary log)中。不同的操作方式会以不同的日志格式记录到文件中

2、slave服务器开启一个I/O线程连接master服务器去请求binary log,然后写入到本地的中继文件(relay log)中

3、master的开启一个log dump线程读取binary log并传送给slave的I/O线程

4、slave开启一个SQL线程读取relay log中的命令,在slave服务器上执行



线程说明参考

环境准备

操作系统 数据库 ip地址 端口 主/从
window server 2008 r2 mysql 8.0.12 10.119.173.98 3006
window server 2008 r2 mysql 8.0.12 10.119.173.97 3006
window server 2008 r2 mysql 8.0.12 10.119.173.96 3006

1.Master配置

1.需要设置一个唯一的 server-id ,并且设置二进制日志文件 log-bin=[file_name]。

MySQL8.0之前的版本默认log_bin=OFF是关闭日志记录的,设置了log-bin,就会开启记录日志log_bin=ON

编辑master的配置文件my.ini,在[mysqld]下添加如下内容

[mysqld]
server-id=1 #服务器id
log-bin=mysql-bin #二进制日志文件的基名字
#设置需要写日志的数据库的名称,不设置默认所有数据库。一个配置项只能配置一个数据库,如果要设置写多个数据库,那么需要写多份配置项,用逗号来分割多个数据库是无效。
binlog-do-db=test
#binlog-do-db=test1
#binlog-do-db=test2
#设置不需要写日志的数据库的名称,一个配置项只能配置一个数据库,如果要设置写多个数据库,那么需要写多份配置项,用逗号来分割多个数据库是无效。
binlog-ignore-db=mysql
#日志记录格式,默认是ROW行模式。还有STATEMENT语句模式和MIXED混合模式。不同的记录格式会对binlog-do-db和binlog-ignore-db产生影响
#STATEMENT模式:记录执行的SQL语句
#Row模式:记录语句执行后对单个行做的修改,而不是记录执行的语句
binlog-format=ROW

binlog-format的参考

binlog-do-db的说明以及和binlog-format关系的参考

2、在InnoDB存储引擎时,为了获得最大持久性和一致性,需要增加下面两个配置

#控制写入二进制日志的频率。
#0表示mysql服务器依赖与操作系统来把二进制文件写入到磁盘中,这种情况下性能最好。但是在断电或者操作系统崩溃时,服务器可能提交了未同步到二进制文件的事务。
#1表示在提交事务前先把二进制文件写入到磁盘中,可能会对性能有印象
sync_binlog=1
#控制事物提交时ACID的遵守的严格性和性能之间的平衡。默认1时,表示每次事务提交时记录日志的同时马上写入磁盘
innodb_flush_log_at_trx_commit=1

sync_binlog的参考

innodb_flush_log_at_trx_commit的参考

3、在master上给slave创建一个拥有复制权限的账号repl,密码是123456

CREATE USER 'repl'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

2.Slave配置

1、需要给slave设置一个唯一的 server-id ,值不要和master和其他slave重复。如果需要只复制特定的数据库或者排除特定的数据库,可以使用 replicate-do-db 和 replicate-ignore-db 配置。

当启用slave的log-bin日志记录,配合log-slave-updates=ON时,slave会在复制master的数据时也记录到自己的二进制日志中。这样方便以后的主从切换,数据恢复。甚至可以实现更复杂的多级复制拓扑,比如:master->slave->slave

编辑slave的配置文件my.ini,在[mysqld]下添加如下内容

[mysqld]
server-id=2 #服务器id
log-bin=mysql-bin #二进制日志文件的基名字
#当开启了log-bin时,并且log-slave-updates=ON时slave复制master的数据时也记录到自己的二进制日志中,默认值ON
log-slave-updates=ON
#中继日志的基名称
relay-log=mysql-relay
#设置需要复制的数据库的名称,不设置默认所有数据库。一个配置项只能配置一个数据库,如果要设置写多个数据库,那么需要写多份配置项,用逗号来分割多个数据库是无效,效果同binlog-do-db。
replicate-do-db=test
#设置不需要复制的数据库的名称,一个配置项只能配置一个数据库,如果要设置写多个数据库,那么需要写多份配置项,用逗号来分割多个数据库是无效,效果同binlog-ignore-db。
replicate-ignore-db=mysql
#告诉slave服务器在启动时不开启复制功能,默认值OFF
skip-slave-start=OFF

其他slave服务器配置一样,只有server-id不同

slave的配置参考

3.配置和开启复制功能

1、查询master当前的状态

因为是InnoDB,首先在master上执行FLUSH TABLES WITH READ LOCK;语句,关闭所有打开的表,刷新缓存。并且用全局读锁锁住所有的表。

然后在master上执行下面sql获取binary log的文件名称和当前写入的坐标

SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 115 | test | mysql |
+------------------+----------+--------------+------------------+

2、复制master库的数据到slave库
如果在slave开启复制之前,master的test库已经有数据了,那么需要先把master的数据快照dump下来,然后复制到slave服务器。如果是新库没有数据要复制,可以跳过此步骤到下一步。
使用mysqldump工具命令如下:

mysqldump -h[IP地址] -P[端口号] -u[用户名] -p[密码] --databases test > dump.sql
mysqldump -h10.119.173.98 -P3006 -uroot -p123456 --databases test > dump.sql

复制数据快照参考

3、释放master上的全局读锁

UNLOCK TABLES;

4、导入master的test库数据到slave服务器,导入第2步中dump.sql文件。如果是新库没有数据导入,则跳过此步骤,进行到第5步。

mysql -h[IP地址] -P[端口号] -u[用户名] -p[密码] < dump.sql
mysql -h10.119.173.96 -P3006 -uroot -p123456 < dump.sql

5、在slave服务器上配置slave要复制的文件和开始的坐标

CHANGE MASTER TO
MASTER_HOST='10.119.173.98',
MASTER_PORT=3006,
MASTER_USER='repl',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=115;

MASTER_LOG_FILE=3.配置复制功能第1步查询出来的File

MASTER_LOG_POS=3.配置复制功能第1步查询出来的Position

CHANGE MASTER TO参考

6.开启复制功能

在slave服务器上执行START SLAVE语句,开启slave的复制功能。

START SLAVE;

7.查看从库的复制状态信息

SHOW SLAVE STATUS

Slave_IO_Running和Slave_SQL_Running都=Yes,就表明复制功能正常运行

Slave_IO_Running:从master读取二进制文件,写入到slave的中继日志的I/O线程。yes表示正常

Slave_SQL_Running:从中继日志中读取新的命令执行到slave的库中的SQL线程。yes表示正常

Master_Log_File:表示I/O线程当前正在读取的master的二进制文件名称

Read_Master_Log_Pos:表示I/O线程当前正在读取的master的二进制文件中的位置信息

Relay_Log_File:当前在执行的中继日志名称

Relay_Log_Pos:当前在执行的中继日志中执行到的位置

Last_Errno:最后一次复制失败的错误日志号

Last_Error:最后一次复制失败的错误日志

当slave服务器停止了复制功能,要重新开始时,要从停止前读取的位置开始继续复制命令。第5步中MASTER_LOG_FILE=Master_Log_File的值,MASTER_LOG_POS=Read_Master_Log_Pos的值

SHOW SLAVE STATUS参考

这样就配置好了一个master->slave的主从复制,多个从库的配置可以重复【3.配置和开启复制功能的4-7步】即可。

后记

如果想配置成复杂的多级复制拓扑,比如A->B->C,那么先配置A作为master,B作为slave,B复制A的数据。然后在配置B作为master,C作为slave,C复制B的数据。

MySQL 主从复制:基于二进制文件复制配置详解的更多相关文章

  1. 基于 CentOS Mysql 安装与主从同步配置详解

    CentOS Mysql 安装 Mysql (Master/Slave) 主从同步 1.为什么要使用主从同步 1.如果主服务器出现问题,可以快速切换到从服务器提供的服务 2.可以在从服务器上执行查询操 ...

  2. binlog之四:mysql中binlog_format模式与配置详解,binlog的日志格式详解

    mysql复制主要有三种方式:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复 ...

  3. mysql中binlog_format模式与配置详解

    mysql复制主要有三种方式:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复 ...

  4. 集群技术(二) MySQL集群简介与配置详解

    when?why? 用MySQL集群? 减少数据中心结点压力和大数据量处理(读写分离),采用把MySQL分布,一个或多个application对应一个MySQL数据库.把几个MySQL数据库公用的数据 ...

  5. MySQL优化之my.conf配置详解

    最近项目不太忙,所以有时间静心来研究下mysql的优化,对于MySQL的设置是否合理优化,直接影响到网站的速度和承载量!同时,MySQL也是优化难度最大的一个部分,不但需要理解一些MySQL专业知识, ...

  6. PHP学习之[第02讲]PHP5.4 Apache Mysql 搭配与多站点配置详解

    小编用的是MAC系统,SO安装的是MAMP 知识点: 1.配置多站点:httpd.conf打开httpd-vhosts.conf,并在httpd-vhosts.conf设置多IP及端口指向,最后修改/ ...

  7. MySQL集群简介与配置详解

    1. 先了解一下你是否应该用MySQL集群. 减少数据中心结点压力和大数据量处理,采用把MySQL分布,一个或多个application对应一个MySQL数据库.把几个MySQL数据库公用的数据做出共 ...

  8. MySQL个人用户的安装配置详解

    1. 我的版本是 MySQL 5.7.26.0 ,因为据说 MySQL 8 的性能虽然强悍,但是兼容性还是有问题,而且发布时间不够长,没有普及,就暂时用着5.7版本. (1) 下载地址,选择使用msi ...

  9. 基于php-fpm的配置详解

    php5.3自带php-fpm/usr/local/php/etc/php-fpm.confpid = run/php-fpm.pidpid设置,默认在安装目录中的var/run/php-fpm.pi ...

随机推荐

  1. Hbase 整合 Hadoop 的数据迁移

    上篇文章说了 Hbase 的基础架构,都是比较理论的知识,最近我也一直在搞 Hbase 的数据迁移, 今天就来一篇实战型的,把最近一段时间的 Hbase 整合 Hadoop 的基础知识在梳理一遍,毕竟 ...

  2. [vijos1725&bzoj2875]随机数生成器<矩阵乘法&快速幂&快速乘>

    题目链接:https://vijos.org/p/1725 http://www.lydsy.com/JudgeOnline/problem.php?id=2875 这题是前几年的noi的题,时间比较 ...

  3. java Jsoup.clean 处理入参时,会将换行符解析成空字符串问题

    Json 中clean方法有两个: 一:会格式化入参,将换行符替换成空格 clean(String bodyHtml, String baseUri, Whitelist whitelist) 二:n ...

  4. CentOS下的Docker-Compose离线安装

    公司服务器已经安装了 Docker 环境,但没有安装 Docker Compose,使用起来十分不便.由于服务无法连接外网,下面演示如何离线安装 Docker Compose. (1)首先访问 doc ...

  5. 系统警告,Bronya请求支援(两遍最短路)

    系统警告,Bronya请求支援 Description 休伯利安号的一行人来到了由逆熵镇守的前文明遗迹[海渊城],他们准备用巨大的传送装置[海渊之眼]进入量子之海,寻找丢失的渴望宝石.然而在行动前夜爱 ...

  6. 《Java基础复习》—常识与入门

    突然发现自己Java基础的底子不到位,复习! 所记知识会发布在CSDN与博客网站jirath.cn <Java基础复习>-常识与入门 一.Java语言的知识体系图 分为三部分 编程语言核心 ...

  7. [ddt01篇]十年测试老鸟帮您解析:ddt数据驱动实现自动化测试入门基础应用

    一.什么是DDT数据驱动框架 ​ 全称:data driver test数据驱动测试框架,可以完美的应用于unittest框架实现数据驱动.ddt使用简介: 1.测试数据为多个字典的list类型 2. ...

  8. 活久见!Linux命令行居然也可以用来查看图像?

    在 Linux 中有很多 GUI 应用程序可以查看图像,但是这对经常使用命令行来工作的人可能会觉得很繁琐.今天要介绍的是 3 个实用的 CLI 图像查看器来在终端上查看图像,让那些使用 CLI 的朋友 ...

  9. C语言 文件操作(六)

    一.fseek() int fseek(FILE * stream, long offset, int whence); 1.参数stream 为已打开的文件指针. 2.参数offset 是偏移量,该 ...

  10. .bundle文件如何安装

    1. sudo chmod +x X.bundle 2. sudo X.bundle