导读:对于任何一个企业来说,数据安全的重要性不言而喻。凡是涉及数据的问题,都是会造成惨重损失的大问题。能够影响数据安全的事件,都是极小概率的事件,但这些事件一旦发生,我们的业务就会遭受惨重损失。

所谓防患于未然,一个系统从设计的第一天起,就需要考虑今后在出现各种问题的时候,如何保证该系统的数据安全性。本文就来讲解如何做好提前预防,以尽量将由数据安全类问题而导致的损失降到最低。

保证数据安全,最简单且有效的方法就是定期备份数据,这样无论因为出现何种问题而导致的数据损失,都可以通过备份来恢复数据。但是,如何备份才能最大程度地保证数据安全,并不是一件简单的事情。

2018年曾出现过一次重大故障,某著名云服务商因为硬盘损坏,导致多个客户数据全部丢失。通常来说,一个大的云服务商,数据通常都会有多个备份,即使硬盘损坏,也不会导致数据丢失的重大事故,但是因为各种各样的原因,最终的结果是数据的三个副本都被删除,数据丢失无法找回。

所以,并不是简单地定期备份数据就可以高枕无忧了。下面就以最常用的MySQL为例来讲解,如何更安全地实现数据的备份和恢复。

最简单的备份方式就是全量备份。备份的时候,把所有的数据复制一份,存放到文件中,恢复的时候再把文件中的数据复制回去,这样就可以保证恢复之后,数据库中的数据与备份时的数据是完全一样的。在MySQL中,我们可以使用mysqldump命令执行全量备份。

比如,全量备份数据库test的命令如下:

1$mysqldump -uroot -p test > test.sql

备份出来的文件是一个SQL文件,文件的内容就是创建数据库、表,写入数据等之类的SQL语句,如果要恢复数据,则直接执行这个备份的SQL文件就可以了:

1$mysql -uroot test < test.sql

不过,全量备份的代价非常高,为什么这么说呢?

首先,备份文件包含了数据库中的所有数据,占用的磁盘空间非常大;其次,每次备份操作都要拷贝大量的数据,备份过程中会占用数据库服务器大量的CPU和磁盘IO资源。同时,为了保证数据一致性,备份过程中很有可能会锁表。这些都会导致在备份期间,数据库本身的性能严重下降。所以,我们不能频繁地对数据库执行全量备份操作。

一般来说,在生产系统中,每天执行一次全量备份就已经是非常频繁的了。这就意味着,如果数据库中的数据丢失了,就只能恢复到最近一次全量备份的那个时间点,这个时间点之后的数据是无法找回的。也就是说,因为全量备份的代价比较高,不能频繁地执行备份操作,所以全量备份不能做到完全无损的恢复。

既然全量备份代价太高,不能频繁执行,那么有没有代价较低的备份方法,能让我们的数据少丢失甚至不丢失呢?增量备份可以达到这个目的。相比于全量备份,增量备份每次只用备份相对于上一次备份发生了变化的那部分数据,所以增量备份的速度更快。

MySQL自带的Binlog,就是一种实时的增量备份工具。Binlog所记录的就是MySQL数据变更的操作日志。开启Binlog之后,MySQL中数据的每次更新操作,都会记录到Binlog中。Binlog是可以回放的,回放Binlog,就相当于是把之前对数据库中所有数据的更新操作,都按顺序重新执行一遍,回放完成之后,数据自然就恢复了。这就是Binlog增量备份的基本原理。很多数据库都有类似于MySQL Binlog的日志工具,原理也与Binlog相同,备份和恢复的方法也与之类似。

下面就来通过一个例子,讲解如何使用Binlog进行备份和恢复。首先,使用“show variables like '%log_bin%'”命令确认一下是否开启了Binlog功能:

1mysql> show variables like '%log_bin%';23+---------------------------------+-----------------------------------+45| Variable_name                   | Value                             |67+---------------------------------+-----------------------------------+89| log_bin                         | ON                                |
10
11| log_bin_basename                | /usr/local/var/mysql/binlog       |
12
13+---------------------------------+-----------------------------------+
14
15mysql> show master status;
16
17+-------------+--------+------------+----------------+-----------------+
18
19| File        |Position|Binlog_Do_DB|Binlog_Ignore_DB|Executed_Gtid_Set|
20
21+-------------+--------+------------+----------------+-----------------+
22
23|binlog.000001|   18745|            |                 |                 |
24
25+-------------+--------+------------+----------------+-----------------+
26

我们可以看到,当前这个数据库已经开启了Binlog,log_bin_basename表示Binlog文件在服务器磁盘上的具体位置。然后,我们用“show master status”命令查看当前Binlog的状态,结果显示了正在写入的Binlog文件,以及其当前的位置。假设我们每天凌晨用mysqldump做一个全量备份,然后开启Binlog,借助于这些备份操作,我们可以把数据恢复到全量备份之后的任意一个时刻。

下面就来做一个简单的备份恢复演示。我们先模拟一次“删库跑路”的场景,直接把账户余额表清空:

1mysql> truncate table account_balance;
2
3Query OK, 0 rows affected (0.02 sec)
4
5mysql> select * from  account_balance;
6
7Empty set (0.00 sec)
8

然后进行数据恢复,首先执行一次全量恢复,把数据库恢复到当天凌晨的状态:

1$mysql -uroot test < dump.sql23mysql> select * from  account_balance;45+---------+---------+---------------------+--------+67| user_id | balance | timestamp           | log_id |89+---------+---------+---------------------+--------+
10
11|       0 |     100 | 2020-02-13 20:24:33 |      3 |
12
13+---------+---------+---------------------+--------+

可以看到,表里面的数据已经恢复了,但还是比较旧的数据。接下来,我们再用Binlog把数据恢复到“删库跑路”之前的那个时刻:

1$mysqlbinlog --start-datetime "2020-02-20 00:00:00" --stop-datetime "2020-02-20 15:09:00" /usr/local/var/mysql/binlog.000001 | mysql -uroot23mysql> select * from  account_balance;45+---------+---------+---------------------+--------+67| user_id | balance | timestamp           | log_id |89+---------+---------+---------------------+--------+
10
11|       0 |     200 | 2020-02-20 15:08:12 |      0 |
12
13+---------+---------+---------------------+--------+
14

由恢复结果可以看出,数据已经恢复到当天的15点了。

通过定期的全量备份,配合Binlog,我们可以把数据恢复到任意一个时间点,再也不怕程序员“删库跑路”了。详细的命令,可以参考MySQL官方文档中的“备份和恢复”相关章节。

在执行备份和恢复的时候,大家需要特别注意如下两个要点。

第一,也是最重要的,“不要把所有的鸡蛋放在同一个篮子中”,无论是全量备份还是Binlog,都不要与数据库存放在同一个服务器上。最好能存放到不同的机房,甚至不同城市,离得越远越好。这样即使出现机房着火、光缆被挖断甚至地震也不怕数据丢失。

第二,在回放Binlog的时候,指定的起始时间可以比全量备份的时间稍微提前一点儿,这样可以确保全量备份之后的所有操作都在恢复的Binlog范围内,从而保证数据恢复的完整性。

因为回放Binlog的操作是具备幂等性的(为了确保回放的幂等性,需要将Binlog的格式设置为ROW格式)。

关于作者:李玥,美团基础技术部高级技术专家,极客时间《后端存储实战课》《消息队列高手课》等专栏作者。曾在当当网、京东零售等公司任职。从事互联网电商行业基础架构领域的架构设计和研发工作多年,曾多次参与双十一和618电商大促。专注于分布式存储、云原生架构下的服务治理、分布式消息和实时计算等技术领域,致力于推进基础架构技术的创新与开源。

听听作者怎么说

一个案例讲明白!如何更安全地实现数据备份和恢复相关推荐

  1. 一个案例两种分析方法告诉你数据涨跌异动该如何处理?附送涨跌问题常见五种假设

    前言 说到数据涨跌,平时我们可能更多的是去关注跌了多少,因为人之本性,大家都是比较怕失去的,一旦跌了之后,我们往往要通过分析找到跌的原因,然后呢,再采取一些具体的动作来减缓这个跌的趋势,或者是直接把这 ...

  2. 一个案例告诉你,GIS技术与数据可视化结合能帮助我们什么?

    之前我的很多文章都在描述数据可视化对企业管理或者是个人数据分析的作用,但是实际上数据可视化的用途不仅仅如此. 从社会层面上看的话,数据可视化还可以帮助我们来进行社会治理和公共健康保障.比如当数据可视化 ...

  3. linux mysql清除缓存_案例:通过shell脚本实现mysql数据备份与清理

    导读 Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行,实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核,不仅如此 ...

  4. 【机器学习】从一个风控案例讲起-古老而经典的朴素贝叶斯

    今天给大家带来的文章,关于朴素贝叶斯的,一个古老而经典的算法,充分的理解有利于对风控特征或者识别的开拓新的思路. 一.从一个案例讲起 假如我们的目标是判断邮件是否是垃圾邮件,邮件内容是[代开增值税发票 ...

  5. 什么是物联网?有哪些应用?终于有人讲明白了

    作者:佩里·利(Perry Lea) 来源:大数据DT(ID:hzdashuju) 我们将从连接设备的角度来研究物联网,这些设备之前未必相互连接或接入互联网.它们可能一直没有太多的计算或通信能力.我们 ...

  6. 分享丨终于有人把云计算、大数据和人工智能讲明白了!

    导 读 本文作者凭借其天马行空的脑回路,用最深入浅出,清晰化的文字逻辑,讲明白了云计算.大数据和人工智能三者之间的关系. 故事里面三个角色: 兼具经济效益与情怀的云计算:努力把信息变为智慧的大数据:模 ...

  7. 玩转ECS第7讲 | ECS数据保护-数据备份新特性与最佳实践

    简介:本文中,阿里云智能弹性计算专家余初武(悟元)将结合阿里云近期推出的数据备份新特性(快照极速备份.一致性快照组)来介绍云上环境如何做数据备份的最佳实践:适合需要构建云上架构的工程师,架构师和云上实 ...

  8. 发现在创建云服务器ecs实例的磁盘快照时_玩转ECS第7讲|ECS数据保护-数据备份新特性与最佳实践...

    简介: 本文中,阿里云智能弹性计算专家余初武(悟元)将结合阿里云近期推出的数据备份新特性(快照极速备份.一致性快照组)来介绍云上环境如何做数据备份的最佳实践:适合需要构建云上架构的工程师,架构师和云上 ...

  9. 如何让图表更有说服力?6大准则和1个经典案例给你讲明白

    导读:以正确的格式将正确的想法传达给正确的人. 作者:斯科特·贝里纳托(Scott Berinato) 来源:大数据DT(ID:hzdashuju) 让人们从数据中理解你的想法是件好事,但让人们因为他 ...

最新文章

  1. PicoBlaze 设计实例
  2. 部分和模板的复杂嵌套
  3. Spring Boot实践教程(二):SpringApplication分析
  4. java8新特性lambda表达式、函数式编程、方法引用和接口默认方法以及内部类访问外部变量
  5. 南开100题计算机三级网络技术,计算机三级网络技术上机南开100题T46-50 -.pdf
  6. 武汉大学计算机2019转专业,武汉大学可以转专业吗,武汉大学新生转专业政策
  7. 网页占满整个屏幕_网页打开后占满了全部电脑屏幕怎么办
  8. 微信小程序input输入框屏蔽非法字符
  9. 有关计算机专业的对联,有趣的电脑对联(微软亚洲研究院自然语言计算组研发)...
  10. 关于IE无法打开站点XX已终止操作问题
  11. 苹果手机上下载的文件在哪里?
  12. AndroidStudio安装apk到vivo手机时提示安装失败
  13. 升级pip出现拒绝访问
  14. map、set、multimap和multiset的使用【STL】
  15. 如何添加共享计算机用户,如何设置电脑联机共享
  16. 覆盖vue.js样式_使用Vue.js和Cloudinary在化身上覆盖眼镜/面罩
  17. vue+ts项目中import图片时报错Cannot find module ‘xxx‘ or its corresponding type declarations
  18. Linux 压缩、解压、打包详解
  19. 【高德地图】易采坑合集
  20. matlab 谱分析函数,科学网—经典谱分析(Power Spectrum Analysis) - 刘磊的博文

热门文章

  1. torch中.data和.detach()的区别
  2. 07 技术扩展-软件工程Server服务器知识点
  3. 低代码如何助力广播媒体行业构建数字系统
  4. 电视节目播放实现播放 Android开发
  5. JZOJ-senior-5920. 【NOIP2018模拟10.21】风筝
  6. Android 仪器化单元测试(instrumented unit tests) Androidx kotlin版本
  7. matlab knots,chronux_2_12.v02 chrounx是matlab的一个工具包(a toolbox for matlab) - 下载 - 搜珍网...
  8. js编写带阴历的日历
  9. 如何培养优秀的销售人员?
  10. 蓦然回首,那人却在灯火阑珊处----如何读入多行带空格的字符串