当前位置: 首页 > 科技观察

说说PG数据库防止误删的问题

时间:2023-03-20 01:46:58 科技观察

作为DBA这20年,误删数据是最头疼的事情。我早期遇到过一个案例。当时有一个可视化开发工具,把所有的代码都存储在一个Oracle数据库中,这个数据库放在普通PC上,没有任何备份。一次不小心,有人删除了一个用户的所有数据。现在这个政府部门的业务系统不能运行了。我花了几天时间来恢复大部分数据,并且我设法恢复了大部分应用程序。Oracle的各种防误删方法,国内的第三方服务公司都研究得很透彻。这些近几年出现的问题,大部分都可以通过一些工具或者特殊的方法来恢复。但是现在许多公司正在将他们的数据库转移到开源和本地化环境中。在这些新环境中,数据恢复仍然是一种刚需。今天简单说一下PG数据库的误删和恢复,因为国内很多数据库都是和PG同源的,或者是基于PG社区版定制的。防止误操作的底线是使用备份来恢复数据,而数据库备份也是数据库运维的底线。如果没有办法恢复在线库中的数据,那么利用备份集来恢复数据就显得非常重要了。可能有朋友会说,我们有主备库,不用备份。这种看法是错误的。主备数据库只是高可用方案,不能替代备份。当你误删了一张表,备库也会被误删。只有备份才能通过离线恢复恢复您需要的所有数据。为了保证备份集的可靠性,还需要至少保留两个完整备份。除了备份,我们还可以通过规范一些操作,实现更方便的误删恢复。与Oracle不同,PG的DDL是可以回滚的。在PG数据库中,当TRUNCATE、DROP等操作开始时,会保留原来的文件。比如TRUNCATETABLE时,会先新建一个文件作为数据存储,原文件会保留。当您执行回滚时,可以轻松恢复原始数据。但是一旦提交,旧的数据文件将从操作系统级别删除。基于此,要实现PG数据库可以通过DROP/TRUNCATE数据恢复,还需要考虑操作系统的恢复。我们在选择文件系统的时候,一定要选择带有日志的可恢复文件系统,比如XFS/EXT。并打开和设置日志。开启文件系统日志可能会对写操作产生一些性能影响,但对于大多数系统来说,这种影响是完全可以接受的。为了保证安全,需要开启日志。另外,我们还需要准备OS层面的UNDELETE工具。一旦遇到需要恢复数据的东西,我们会立即通过UNDELETE工具恢复被删除的数据文件。一旦恢复了数据文件,就可以很容易地从文件中导出数据。目前在GIT上,有大量的开源工具可以用来从PG数据文件中下载数据。因此,对于企业来说,在部署PG数据库的时候,应该考虑准备好反删除工具,将PG数据库部署在文件系统上,有比较靠谱的反删除工具。其实,在用更复杂的方式恢复数据之前,我们还是有更好的解决办法的。比如使用psql工具时,关闭自动提交。这样我们也可以使用DDLROLLBACK来实现最简单的恢复。养成良好的习惯或规范操作行为也是避免重大事故发生的最佳途径。最后,相对于Oracle数据库的段管理方式,PG的整个元数据相对比较复杂。有时如果我们手头有完整的历史元数据信息,在数据恢复时可以快速找到需要恢复的文件,这样我们就可以在备份集中快速找到需要恢复的数据,并使用工具完成快速恢复。所以,为了避免数据恢复过于复杂,定期备份PG的关键元数据也很重要。