MySQL数据库无完整备份删库,除了跑路还能怎么办?

Wesley13
• 阅读 486

MySQL数据库无完整备份删库,除了跑路还能怎么办?

1.背景

前段时间,由于运维同事的一次误操作,清空了内网核心数据库,导致了公司内部管理系统长时间不可用,大量知识库内容由于没有备份险些丢失。

结合这两天微盟的删库跑路事件,我们可以看到,数据库的备份与恢复显得尤为重要。

本文将对此次内网数据恢复过程做一些整理,介绍删库后的抢救方案。

同时,引发对数据库稳定性的思考。

MySQL数据库无完整备份删库,除了跑路还能怎么办?

2.数据抢修

这份内网数据事先没有特意备份,所以一开始认为需要从磁盘恢复数据了。所以紧急联系了数据恢复公司,希望过来恢复磁盘数据。

这里需要注意,数据恢复公司建议马上关机,避免磁盘数据被覆盖。

联系数据恢复公司的同时,运维同事在内网找到了几个残缺的备份文件,包括去年4月份的一个全量备份数据、今年2月初一个半全量备份数据(备份到r开头的表就失败了,剩余表没有备份),以及近7天到binlog日志文件。

所以立刻进行另一套恢复方案:

1)用今年2月初的半全量数据恢复一个库A

2)用去年4月份的全量数据恢复一个库B

3)将B数据库中r开头之后的表拷贝一份到数据库A中

4)数据库A中重放近3天的binlog。(注意,binlog回放时间截止到drop命令时间之前)

2.1 dump文件恢复

一开始想通过阿里云,把dump文件恢复到rds上。

结果发现需要super权限,而这个权限是阿里云高权限账号(另外还有普通账号)也不具备的,问了阿里云也不提供。因此,无法恢复到rds。

所以我们只能把dump文件恢复到本地数据库。

在ECS上建立一个mysql数据库,然后就是dump文件恢复。

有两种方式:

1)命令行恢复

mysql -u root xxxdb < xxxx-backup.sql

2)在mysql客户端中恢复

用root登陆后

use xxxdb;

source /data/xxxx-backup.sql

2.2 binlog文件重放恢复

基于起止时间恢复数据

sudo mysqlbinlog --start-datetime="2020-02-16 17:00:01" --stop-datetime="2020-02-20 17:00:00" —database=xxxdb mysql-bin.000218 | mysql -f -u root xxxdb

--database 指定了使用binlog中的哪个数据库进行导入,否则,如果binlog中有多个库的操作记录,会大量报错。

更多binlog命令参数见:

https://dev.mysql.com/doc/refman/5.6/en/mysqlbinlog.html#option\_mysqlbinlog\_database

-f 用于mysql命令,重建过程中如果遇到问题会继续执行而不是中断退出。

Actually mysqlbinlog does not stop after error, mysqlbinlog just converts log file to text format, nothing more. The problem is that mysql client stops after error. Please try 'mysql -f'.

3 数据备份

数据备份可以有多种方式,这里介绍三种

3.1 本地dump备份数据文件

比较方便存储,不过用起来限制也比较多,容易中断。

mysqldump --max_allowed_packet=1024M -u root xxxxdv > 20200219.sql

3.2 阿里云dts迁移备份

可以在阿里云上建一个dts迁移任务(迁移任务基本免费,同步任务收费),然后通过dts将源数据库直接迁移到rds、ecs自建数据库、vpc网络下到自建数据等地方。

可以避免dump还原的过程。

需要有个目标库,备份不是以简单的数据文件形式,而是一个备份数据库的形式。

3.3 xtrabackup(简称xbk)

https://www.percona.com/software/mysql-database/percona-xtrabackup

基于拷贝物理文件和redo来实现备份。

4. 数据库稳定性思考

不管是运维的误操作,还是像微盟这样的恶性事件,从根本上反映了企业数据库稳定性管理的不足。

任何事后抢救的措施,都比不上事前的谨慎防范。

如何提高企业数据库的稳定性,避免出现类似这样的事情呢?

1)统一技术栈,使用云厂商的云数据库

从现在云技术的发展来看,以阿里云、华为云等大厂提供的云数据库,能大大降低企业数据库的运维成本。

虽然云数据库可能比自建数据库的价格贵一点,但是,云数据库提供的完整的配套设施,如备份恢复、监控报警、技术支持、数据库高可用等,都会给企业数据库稳定性带来巨大帮助。从长期来看,能够大大节约企业的运维成本和人力成本。

另外,我特意去看了下阿里云的rds数据库,有完整的备份恢复机制,而且七天内的备份数据是不可删除的。

所以,如果使用了云数据库,那基本上不需要担心数据丢失或者被人恶习删除的问题了。

2)自建数据库的完善备份机制

当然,有的公司虽然使用了云数据库,但是出于数据安全性的角度,还是会有自建数据库的可能。

如果使用了自建数据库,那么一定需要有完善的备份机制。

我司自从发生了误操作删除内网数据的事件后,立刻引起重视,重新盘点梳理了核心数据的备份机制,包括云数据库、自建数据库,对于核心数据(包括但不限于生产数据、内部核心数据等)必须实施定期全量备份,同时考虑末日容灾,实施跨机房、跨云厂商的数据备份。

3)更健全的权限管理系统

除了数据备份外,我们还可以看到,数据库权限管理的重要性。

尤其中小企业,数据库权限要么没有管理,开发人员可以任意操作;要么是集中在少数几个运维同事手上。

无论哪种,都不安全。

最好的方式,还是开发一个统一数据库管理操作平台(或者购买类似阿里云DMS产品),在系统层面进行数据库的权限管控。

所有人员都只能通过这个平台操作数据库,同时,禁用危险命令,对高危操作进行分级审核。

原创:阿丸笔记(微信公众号:aone_note),欢迎 分享,转载请保留出处。

扫描下方二维码可以关注哦~~~

MySQL数据库无完整备份删库,除了跑路还能怎么办?

右下角点击  在看,就更棒啦~

本文分享自微信公众号 - 阿丸笔记(aone_note)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Wesley13 Wesley13
3年前
thinkphp 基本配置
12returnarray(34//定义数据库连接信息5'DB\_TYPE''mysql',//指定数据库是mysql67'DB\_HOST''localhost',89'DB\_NAME''uchome',//数据库名1011'DB\_USER''root
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这