实现MySQL数据库的实时备份

使用MySQL Replication

吴剑 2018-08-03

原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian

吴剑 http://www.cnblogs.com/wu-jian

前言

数据库实时备份的需求很常见,MySQL本身提供了 Replication 机制,摘译官方介绍如下:

MySQL Replication 可以将一个主数据库中的数据同步到一个或多个从数据库中。并且这个同步过程默认以异步方式工作,不需要保持主从数据库的实时连接(即允许连接中断)。同时允许自定义配置需同步的数据库及数据表。

MySQL Replication 的优点及应用场景如下:

1、通过 MySQL Replication 实现负载均衡与读写分离(主数据库仅更新,从数据库仅读取),提升数据库性能。

2、通过 MySQL Replication 实现数据的实时备份,保证数据安全。

3、通过 MySQL Replication 实现数据的离线分析(主数据库生成数据,从数据库分析计算不影响主数据库性能)。

4、数据分发。

MySQL Replication完整的官方文档请参阅:https://dev.mysql.com/doc/refman/5.7/en/replication.html

剑 http://www.cnblogs.com/wu-jian

工作原理

1、Master中的所有数据库变更事件写入Binary Log文件

2、当在Slave中执行“SLAVE START”命令时,开启Slave I/O Thread,并连接Master

3、Master侦测到Slave I/O Thread的连接,开启Log Jump Thread进行响应

4、Master Binary Log经Master Log Jump Thread和Slave I/O Thread传输至Slave Relay Log

5、Slave SQL Thread将Relay Log还原至数据,同步完成

注:可使用“SHOW PROCESSLIST”命令在Master和Slave中查看对应线程的运行情况

吴剑 http://www.cnblogs.com/wu-jian

配置Master

开启Binary Log并设置ServerID,ServerID必须唯一,取值范围1至232-1

[mysqld]
# 开启Binary Log
log-bin=mysql-bin
# 设置全局ID
server-id=1 # 指定需同步的数据库(因为数据库名称可能包含逗号,因此多个数据库必须重复配置多次而不能以逗号分隔)
binlog-do-db=database_name
# 指定禁止同步的数据库
binlog-ignore-db=database_name
# 指定Binary Log格式
binlog_format=MIXED

创建同步帐号

因为每个Slave均需要使用帐号密码连接至主数据库,所以在主数据库上必须提供帐号。建议使用一个独立帐号,仅授权数据同步权限。

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

获取Binary Log信息

Slave启动I/O Thread时需要传入Binary Log部分信息,因此需要获取一下Binary Log信息:

SHOW MASTER STATUS;

使用“SHOW MASTER STATUS”命令获取Binary Log信息,并记录File和Position字段值。

同步前保证Master与Slave的数据一致

在Slave启动I/O Thread前,需确保Master与Slave的数据一致,因此先对Master进行锁定(防止数据变更),手动同步并确保数据一致后再解锁。

FLUSH TABLES WITH READ LOCK;

手动数据同步相关操作略...

UNLOCK TABLES;

配置Slave

设置ServerID,可不必开启BinLog:

[mysqld]
# 设置全局ID
server-id=2 # 指定同步的数据库
replicate-do-db=database_name
# 指定禁止同步的数据库
replicate_ignore_db=database_name

设置Master信息,执行如下命令:

mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name',
-> MASTER_PORT='master_host_port',
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;

启动I/O Thread

START SLAVE;

查看同步状态:

SHOW SLAVE STATUS;

吴剑 http://www.cnblogs.com/wu-jian

Master的binlog_format 参数

binlog_format用于配置Binary Log的格式,支持如下三种类型:

Row

按数据行的变化进行记录,该模式与SQL语句、存储过程、函数、触发器等无关,它只关心每一行的数据是否发生变化,如变化则记录,因此Row模式是准确度最高的。但它的缺点是某些情况下会产生大量内容而导致效率下降,比如表结构发生变更时。

Statement

按SQL语句进行记录,很明显这个解决了Row模式的短板,但问题是准确度不够高,因为SQL语句可以非常复杂并且容易出现意外情况。

Mixed

Row与Statement混合模式,由MySQL自动决定什么时候使用Row,什么时候使用Statement,这也是默认模式。

吴剑 http://www.cnblogs.com/wu-jian

replicate-do-db注意事项

当在Slave中使用replicate-do-db和replicate-ignore-db配置项时,需特别注意,跨数据库的SQL语句将不会被同步,如:

replicate-do-db=a
use b;
update a.some_table set some_field = 'some value';

解决方案是使用replicate_wild_do_table和replicate_wild_ignore_table,如:

replicate_wild_do_table=database_name.%
replicate_wild_ignore_table=database_name.%

吴剑 http://www.cnblogs.com/wu-jian

<全文完>

吴剑 http://www.cnblogs.com/wu-jian

如果您觉得本文对您有所帮助,可扫描两侧的二维码向作者打赏。您的支持是原创的源动力!
作者:吴剑
出处:http://www.cnblogs.com/wu-jian/
本文版权归作者所有,欢迎转载,但必需注明出处,并且在转载页面明显位置给出原文连接,否则保留追究法律责任的权利。

实现MySQL数据库的实时备份的更多相关文章

  1. MySQL数据库的定时备份

    1. 创建shell脚本 vim backupdb.sh 创建脚本内容如下: #!/bin/sh db_user="root" db_passwd=" db_name=& ...

  2. Mysql数据库如何自动备份

    Mysql数据库如何自动备份 一.总结 一句话总结:用navicat配合windows的批处理即可 navicat windows批处理 二.Mysql数据库自动备份 参考:Mysql数据库自动备份 ...

  3. 知识点:Navicet Mysql数据库电脑本地备份

    Navicet Mysql数据库电脑本地备份 1.打开navicat客户端,连上mysql后,双击左边你想要备份的数据库.点击“计划”,再点击“新建批处理作业”.     2.双击上面的可用任务,它就 ...

  4. Navicet Mysql数据库电脑本地备份

    Navicet Mysql数据库电脑本地备份 1.打开navicat客户端,连上mysql后,双击左边你想要备份的数据库.点击"计划",再点击"新建批处理作业" ...

  5. linux下应用crontab对mysql数据库进行定时备份

    linux下应用crontab对mysql数据库进行定时备份 @(编程) mysql数据库提供了备份命令mysqldump,可以结合crontab命令进行定时备份. 我写了一个mysqlbackup. ...

  6. Mysql数据库自动定时备份软件推荐--MySqlBackupFTP(免费,亲测可用,附使用图示)

    MySqlBackupFTP是一款Mysql数据库自动定时备份软件,免费版本就基本上可以满足我们的需求,不需要什么破解版,可直接官网下载安装使用. 先看结果(日志): 软件界面: 可以设定计划任务,每 ...

  7. 阿里云 如何减少备份使用量? mysql数据库的完整备份、差异备份、增量备份

    RDS for MySQL备份.SQL审计容量相关问题_MYSQL使用_技术运维问题_云数据库 RDS 版-阿里云 https://help.aliyun.com/knowledge_detail/4 ...

  8. Linux下实现mysql数据库每天自动备份

    Linux下实现mysql数据库每天自动备份 1.基本操作步骤 a.创建备份目录 mkdir -m 777 /home/wwwroot/backup b.创建备份脚本sh vim /home/wwwr ...

  9. Linux实现MYSQl数据库的定时备份

    今天给大家分享一下如何在Linux下实现MYSQl数据库的定时备份. 前提需要保证你的Linux服务器已经安装了MYSQl数据库服务. 1.创建shell脚本 vim backupdb.sh 创建脚本 ...

随机推荐

  1. Spring学习(五)——集成MyBatis

    本篇我们将在上一篇http://www.cnblogs.com/wenjingu/p/3829209.html的Demo程序的基础上将 MyBatis 代码无缝地整合到 Spring 中. 数据库仍然 ...

  2. expect+scp传输文件发现文件丢失

    背景 使用expect+scp去跨机器传输文件,(别问我为什么,因为公司的测试机器都是通过堡垒机的,无法绕开堡垒机,只能暂时使用这个方法了),结果发现从A传递到B的tar.gz文件大小不一致了的,当时 ...

  3. iOS 添加字体

    1. 将字体(ttf 文件)导入项目. 2. 在项目plist 文件里的 Fonts provided by application 添加新导入的字体. 3. 代码中的调用 [aLabel setFo ...

  4. Gogland配置- 去掉Go源代码中的参数提示

    Gogland处于好意,在Go源代码中对每个参数提示类型,这或许方便大家处理源代码,但是我觉得对于正常阅读源代码反而造成一种负担,我决定去掉这个功能! Gogland默认配置状态,有参数提示: 下面是 ...

  5. 【OCP-12c】CUUG 071题库考试原题及答案解析(23)

    23.choose the best answer View the Exhibits and examine PRODUCTS and SALES tables. You issue the fol ...

  6. 如何在WS系统的DOS命令台打印JAVA_HOME变量

    echo %JAVA_HOME% 查看环境变量 path 新增临时环境变量 path D:\test;%path% 注意是反斜杆 cls 清空 F7 显示历史CMD指令

  7. 关于找不到stdafx.h头文件问题(pass)

    代码: #include "stdafx.h" #include "stdlib.h" char* getcharBuffer() { return " ...

  8. TCP Server有两个套接字

     TCP服务器有一个特殊的套接字,欢迎运行在任意主机上的客户进程的某些初始接触. 三次握手期间,客户进程敲服务器的欢迎之门.该服务器"听到"敲门时,它将生成一个新的TCP套接字对 ...

  9. iOS --高仿QQ空间页面

    1.首先分析一下qq空间页面的主要2个功能: 1)随着TableView的向上滑动导航栏的颜色渐变,变化过程是从透明变成白色. 2)随着TableView的向下滑动,图片随着offset放大. 2.首 ...

  10. CentOS 7 分区方案

    通常系统盘都会选择性能较好SSD,一般在500G左右,这里就以500G硬盘为例,以下为CentOS 自动分区方案: 分区应该按照实际服务器用途而定,自动分区方案将 /home 空间分配太多了,多数情况 ...