Gitlab从删库到恢复 - 数据库备份\恢复\容灾\HA的靠谱姿势

标签

PostgreSQL , 节假日巡检 , 监控 , 闪回 , flash back query , trigger , event trigger , 回收站 , recycle bin , pgtranshcan , hook , _PG_init , 事件触发器 , 审计 , 跟踪 , 逻辑复制 , DDL逻辑复制 , UDR , BDR , 数据库安全


背景

如果你是身处数据库行业的朋友,最近可能被朋友圈的各种关于 "炉石数据被删" 、 "mongoDB遭黑客勒索" 的事件刷屏。

而就在今天(2017-02-01)事情再一次升华, "gitlab 数据库的数据文件被rm -rf误删",数据库的恢复过程和细节有直播视频,请参考gitlab的官方解释,以免以讹传讹。   

数据库在是企业中占据非常重要的位置,发生数据库被SQL注入,数据被误删的事情,不仅仅影响业务,还可能造成用户的信息被泄露。

DBA一族就像IT行业的边防战士,守卫数据是DBA的重要职责之一。

但是总有防不胜防的时候,比如失恋了,喝多了,又或者操作界面太多,来回切换过多导致人为失误率上升。    

如何让数据文件被rm -rf后还能愉快的玩耍呢?

多副本 - 可以抵御rm -rf的HA

在很多传统企业中,常见的HA手段是通过多主机挂载共享存储来实现的,实际上数据只有一份,因为存储的可用性相比服务器高很多。  

这种HA方式的弱点很明显,存储存在单点(当然你也可以使用多个存储,物理镜像来解决类似单点),另一方面,由于存储只有一份,或者通过镜像产生的多分,因此数据删除时具备传染性,一删全删,因此无法抵御gitlab的rm -rf操作。

这种HA方式的优点,结构比较简单,数据一致性比较好保证。

多副本HA与容灾

PostgreSQL 从9.1开始就支持了双副本的同步模式流复制,多副本异步的流复制模式,9.6新增了多副本同步模式。

使用这种方式,即使主库的数据文件被rm -rf了,由于同步是基于REDO的,所以操作系统的命令并不会被传染,可以抵御rm -rf的误操作。

参考

《PostgreSQL 数据库HA》

《PostgreSQL 金融行业高可用和容灾解决方案》

《ApsaraDB的左右互搏术 - 解决企业痛处 TP+AP混合需求》

另外还有一重需要注意的点,一定要有异地的备份,以及异地的容灾节点,这样才能抵御单一机房存在的故障隐患。

阿里云 ApsaraDB for PostgreSQL 冷热分离插件

你可以把不会变化的历史数据存储到阿里云提供的外部对象存储中,即节省数据库空间,同时这部分数据又可以免去备份(对象存储本身就是多副本的,当然话虽如此,作为管理员,备份一份到异地或者其他平台也是有必要的)。

正确的备份姿势

1 逻辑备份

库级一致性,备份只能恢复到单一时间点,无法做到增量恢复,无法做到增量的备份。

另一方面还要注意,由于大版本不同的数据库,往往catalog也可能不一样,所以逻辑备份使用的备份客户端pg_dump的版本,建议与数据库的版本一致。否则是可能会有备份异常或者失败的可能(如果没有注意到这一点,就有可能导致逻辑备份失败哦)。    

《PostgreSQL 最佳实践 - 在线逻辑备份与恢复介绍》

2 在线全量+归档备份

最为常见的备份方式,可以在线进行,可以恢复到任意时间点(事务粒度)。

如果忽视了这一点,在使用pg_basebackup备份时,如果目标备份目录已存在,同时目录不为空,备份也会异常。

请参考pg_basebackup手册,已经写明(这么做也许是为了保证每次备份的稳定性,不会受到已有文件的干扰或打断,作为备份工具设计者,鬼知道非空目录会不会有文件冲突呢),平时多看手册还是有帮助的。

       -D directory

       --pgdata=directory

           Directory to write the output to.  pg_basebackup will create the directory and any parent directories if necessary. The directory may already exist, but it is an error if the directory already exists

           and is not empty.

           When the backup is in tar mode, and the directory is specified as - (dash), the tar file will be written to stdout.

           This option is required.

《PostgreSQL 最佳实践 - 在线增量备份与任意时间点恢复》

3 块级增量+归档

因为每个数据块的头部都有LSN标记,所以PostgreSQL支持数据文件的块级增量,只备份上一次备份以来,变更过的数据块。同样支持恢复到任意时间点(事务粒度)。相比全量+归档,更节约空间。

《PostgreSQL 最佳实践 - 块级别增量备份(pg_rman baseon LSN)源码浅析与使用》

《PostgreSQL 最佳实践 - pg_rman 以standby为源的备份浅析》

《PostgreSQL 最佳实践 - pg_rman 数据库恢复示例 与 软件限制解说》

https://github.com/postgrespro/pg_probackup

4 文件系统、逻辑卷镜像

除了数据库本身支持的数据文件块级增量备份,如果你使用了支持快照的文件系统或者逻辑卷管理的存储,那么你还有一种增量备份的选择,打快照,注意打快照时需要先执行pg_start_backup(''),让数据库进入在线备份状态,打完快照执行pg_stop_backup()。

《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)方案与实战》

《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)备份集自动校验》

《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)单个数据库采用多个zfs卷(如表空间)时如何一致性备份》

《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)双机HA与块级备份部署》

5 对象存储

把不会变化的历史数据存储到阿里云提供的外部对象存储中,即节省数据库空间,同时对象存储本身就是多副本的。

oss_fdw插件用法参考  

https://help.aliyun.com/document_detail/44461.html

异地备份

备份如果只放在数据库的同一机房,是无法抵御单一机房的风险的,许多公司会将在异地机房有一份备份的存档或者镜像。

对于PostgreSQL数据库,异地备份非常的简便和多样,比如

1. 方法1, 对已经在异地的流式standby节点进行备份,

2. 方法2, 通过文件系统如zfs或存储的快照,将备份传输到异地机房

3. 方法3, 将本地的全量备份异步的传输到异地机房,同时将主机房数据库的redo流式的传输到异地机房,保证两个机房的数据延迟极低,当主机房发生险情(如地震)时,数据丢失率通常能控制在KB或者毫秒内的级别(视带宽和业务情况,即REDO产生的速率与带宽的匹配)。 如果你希望做到异地的0丢失,可以拉专线,使用异地同步流复制,这样的话即使主机房完全挂掉,也不会丢数据了。

4. 方法4, 将本地机房的备份数据,异步或者通过调度的方式,定时的同步到异地机房的存储中。

备份集校验 与 任意时间点恢复(事务粒度)

除了有效的备份,还要保证备份的有效性,例如,可以使用以下方法检验备份+归档,以及快照方法备份的有效性。

《PostgreSQL 最佳实践 - 在线增量备份与任意时间点恢复》

《PostgreSQL 最佳实践 - 任意时间点恢复源码分析》

《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)备份集自动校验》

九阳神功秘籍

除了要有日常的备份,HA,异地备份,异地容灾,备份集合的校验机制。

制定规范,养成良好的习惯也是很重要的。奉上 《DBA一族九阳神功秘籍》 希望对大家有一丝帮助。

DBA一族九阳神功 1 日常篇

作为DBA一族,首当其冲的是守卫数据,让数据库正常运转,所以有些事情是骨子里就应该遵循的。

1. 制定并执行数据库安全规范

2. 制定并执行数据库管理规范

3. 制定并执行数据库开发规范

4. 建立自动化监控系统

5. 建立自动化巡检、备份、HA、异地容灾、异地备份系统、(还有很重要的备份集可用性校验,特别是在磁带库时代)

6. 制定节假日的封网机制、应急机制

这样就建立了一道强有力的封印,可以有效的防止外族入侵。

细节请打开如下文档阅读

《DBA专供 冈本003系列 - 数据库安全第一,过个好年》

《PostgreSQL 数据库安全指南》

《PostgreSQL 数据库开发与管理规范》

《PostgreSQL 数据库巡检》

《PostgreSQL 数据库在上市公司重要应用中的SOX审计》

DBA一族九阳神功 2 重大节假日前篇

1. 春节前,建议增加一次例行的巡检,就好像我们出远门检查一下车子一样。

2. 对可预知的业务数据库、(当然还包括应用服务器等)进行扩容,这个是很有必要的,通常许多业务会在节假日时迎接高峰,例如游戏类业务、社交类业务、电商类业务等。

3. 预备一批硬件standby,以便应对春节的即时需要

4. 封网,停止变更,通常需要提前数天停止变更,减少因为变更带来的潜在问题。

例如应用程序变更后,可能新增了一些SQL语句,这些SQL语句本身可能没有优化好,又或者无法预知业务对这些SQL语句的请求量并发量等,导致数据库在重大节假日存在潜在的炸弹。

5. 排班。安排好值日,做到7*24小时有DBA可以响应,保持手机畅通,同时确保值班的童鞋可以连接网络。

6. 通常值日生在节假日期间一个人要负责的业务比平时负责的业务更广泛,所以对值日生进行值班内容、业务的培训也是很有必要的。

因此平时的DBA轮岗机制也是很重要的,要绝对避免这样的现象:一个业务只有一位DBA熟悉。

7. 宣导,向公司业务方敲锣打鼓的宣导,要进入封网期间了,请大家遵循封网规则,不要在封网期间做越界的事情(比如变更、发布)。

虽然在制度上和某些IT手段上控制了封网期间的行为,但是难免有漏网之鱼,所以宣导也是很重要的。

DBA一族九阳神功 3 重大节假日中篇

1. 值班,通常分为在线和离线值班,在线和上班差不多,可能要随时关注一些NOC平台的指标,间歇性的填写一些值班报告。

离线值班指被动的接收告警短信,邮件,发生问题时上线处理。

2. 交接班,交接班是非常重要的,通常上一个班的同事会发现一些异常,交代给下一位值班的同事,如果真的遇到问题响应速度和判断效率也更高。

DBA一族九阳神功 4 重大节假日后篇

封网结束后,一切又回归正常了。但是有一件很重要的事情别忘记了。

1. 复盘

复盘通常指对封网期间的系统状态进行回顾,要达到几个目的

1.1 扩容预估是否合理,同时建议反馈给业务方相应的数据

1.2 是否有故障,什么原因导致的,将来如何避免

1.3 监控系统是否存在疏漏,将来如何避免

1.4 是否有违规变更、发布,将来如何避免

小结

相信很多公司都有类似的制度,DBA一族加油,做到尽量的避免rm -rf事件,即使真的发生了,也可以做到心里不慌,用户不慌。

关于《gitlab从删库到恢复》事件,就不作评论了,大家有兴趣的话,建议参考Gitlab的官方回应,以免以讹传讹。 

同时,在任何时候,建立健全的制度,都是非常重要的。操作时也务必保持清醒的头脑,尽量少犯人为的错误。    

如果有哪些写得不对或者不够完善,也感谢指出。

时间: 2024-12-31 09:41:30

Gitlab从删库到恢复 - 数据库备份\恢复\容灾\HA的靠谱姿势的相关文章

通过Copy Data Virtualization实现数据库备份和容灾一体化解决方案

  11月10日,由Actifio中国区服务总监廖良茂老师在"DBA+上海群"进行了一次关于"通过Copy Data Virtualization实现数据库备份和容灾一体化解决方案"的线上主题分享.小编特别整理出其中精华内容,供大家学习交流.    嘉宾简介    DBA+原创专家团成员: Oracle9iOCP.10gOCM.Exadata认证专家: 超过10年的Oracle数据库管理经验,曾在Oracle ACS工作5年,期间在Exadata白金服务工作一年:

MySQL 数据库备份恢复和乱码问题 续

在我转到wordpress之后第一个考虑的是它的数据库备份恢复问题,因为写bloger都知道,自己的blog记录的都是自己需要的宝贵的资料和文字,如果因为各种未知因素导致数据库崩溃或者空间商出了问题,丢失了数据的话,无疑是一种非常巨大的痛苦和损失. 所以在我blog里面有好几篇资料文章或者自己心得文章来讨论mysql数据库备份恢复和乱码问题. 之前那些文章讨论结果已经暂时能满足我数据库备份和恢复问题了,但是始终有个让我不能完全安心的地方,那就是用PMA恢复的时候,使用的是上传机制,那么PHP默认

再谈MySQL数据库备份恢复和乱码问题

在我转到wordpress之后第一个考虑的是它的数据库备份恢复问题,因为写bloger都知道,自己的blog记录的都是自己需要的宝贵的资料和文字,如果因为各种未知因素导致数据库崩溃或者空间商出了问题,丢失了数据的话,无疑是一种非常巨大的痛苦和损失. 所以在我blog里面有好几篇资料文章或者自己心得文章来讨论mysql数据库备份恢复和乱码问题. 之前那些文章讨论结果已经暂时能满足我数据库备份和恢复问题了,但是始终有个让我不能完全安心的地方,那就是用PMA恢复的时候,使用的是上传机制,那么PHP默认

DockOne微信分享(八十一):唯品会数据库备份恢复容器化项目实践经验总结

本文讲的是DockOne微信分享(八十一):唯品会数据库备份恢复容器化项目实践经验总结[编者的话]本文分享了唯品会数据库Docker的异地容灾项目实践经验,项目中针对用户数据库的异地恢复场景的需求进行开发和测试,整合了网络,存储.调度.监控,镜像等多个模块.在实施完成后,从技术上总结关于选型.开发.踩坑.测试等方面的经验. 项目背景 数据库Docker的异地备份恢复容灾项目,针对用户数据库的异地备份恢复场景的需求进行开发和测试,整合了容器网络.存储.调度.监控.镜像等多个模块.同时针对数据库的日

数据库"负载均衡,备份,异地容灾"设计

数据库"负载均衡,备份,异地容灾"设计 Author: DigoalPS - 纯属个人看法,仅供参考. 1. 数据对象按分类放到不同的SCHEMA  为了方便实施数据库层面的备份和容灾,必须将数据对象按内容进行逻辑分类设计.  例如:  (某下载系统)    1.tbl_app_info 表 - 存储应用信息,新应用部署时需要插入该表,应用下线时需要更新或删除该表的记录,用户下载时需要查询该表,还有等等一些其他操作;数据增长缓慢,数据量视应用数决定.    2.tbl_download

现代数据中心的备份与容灾保护

尽管移动和云计算平台相对较新,然而专业IT人士已经留意数据中心几十年了.而为什么备份问题一直没有得到解决?至少还有两个主要原因说明数据中心的数据保护问题仍在挑战IT:一个是恢复需求和保护机制的变化,还有一个是巨量的生产和保护所需要的存储空间. 现代化备份和容灾保护三部曲系列中的第一部分,呈现的是数据中心备份和容灾保护是如何进化的. 保护和恢复的需求正在发生改变 当我们的生产系统平台发生变化的时候,对应的保护方式必须做相应的改变.作为一个典型的例子,随着虚拟化的大规模普及,许多传统的备份服务器数据

数据库备份/恢复方案

备份|恢复|数据|数据库 利用SQL语言,实现数据库的备份/恢复的功能 体现了SQL Server中的四个知识点: 1.   获取SQL Server服务器上的默认目录 2.   备份SQL语句的使用 3.   恢复SQL语句的使用,同时考虑了强制恢复时关闭其他用户进程的处理 4.   作业创建SQL语句的使用   /*1.--得到数据库的文件目录  @dbname 指定要取得目录的数据库名   如果指定的数据不存在,返回安装SQL时设置的默认数据目录   如果指定NULL,则返回默认的SQL备

Oracle数据库备份恢复的概念:错误类型、实例恢复方法等

1.明确Oracle数据库中可能发生的错误类型;  2.描述实例恢复的方法;  3.明确checkpoints,redo log files和archive log files的重要性;  4.配置快速闪回区;  5.配置归档模式; Part of Your Job DBA的职责就是要保证数据库是可使用的而且是高效的;  1.避免数据库发生常规错误:比如用户无权限,表空间不足等等;  2.增加MTBF(Mean Time Between Failures),即两次发生故障的时间间隔;  3.使用

oracle数据库备份恢复概述

1.备份的意义 1)保护数据,避免因为各种故障而丢失数据 2.基本术语介绍 Mean Time Between Failure      --MTBF Mean Time To Repair            --MTTR Mean Time To Failure           --MTTF (1)MTBF--全称是Mean Time Between Failure,即平均故障间隔时间. 就是从新的产品在规定的工作环境条件下开始工作到出现第一个故障的时间的平均值.MTBF越长表示可靠性