DBA生存警示:防范频发的数据误删除操作

编辑手记:对于资深的老DBA们,他们在漫长的职业生涯中养成了很多稀奇古怪的守则,以在复杂多变的环境中“幸存”,这源于无数血泪的教训,我曾经在《数据安全警示录》一书收录了大量现实案例,现在整理分享给大家,共为警示。


在数据库日常管理过程中,有些威胁来自数据库外部,而有些威胁则来自数据库内部,对于数据库外部,破坏性的操作有rm,而在数据库内部,同样有破坏性操作,如Truncate。

案例分享



误删除数据表

原来接手一个部门的所有数据库,结果漏了一个,也没人告诉我,所以我不知道这个数据库存在。一天一个程序人员误按了一个按钮,把大量的数据全部删除,找到我后,发现数据库没有归档,也没有任何备份。结果是程序人员补了几天的数据,我的奖金也直接泡汤。

误删除用户

刚从事DBA不久,可已经犯了个让我终生难忘的错误。原本是要将测试环境的一个user给删掉,由于桌面上开了多个窗口,结果drop user XXX cascade,直接将正式环境的一个user给drop了,刚按下enter,就感觉怪怪的,心想不会吧!!已经来不急了,还好这个user的信息是从另外一台服务器上同步过来的,要不然死定了。以后做什么动作我都习惯先看看是在哪个DB上那个服务器上,千万别搞错了。

误删除表数据

以前公司,有一个程序员写好的脚本,一个实施人员去执行,脚本里面带了 delete * from xxx; commit; 啥备份,归档都没有。结果我们公司全部人员出动,抱着笔记本,台式机,去北京某区县所有的机关单位上门录了一星期人员信息。至今记忆犹新。

误删除数据表

测试环境导出的腳本中包含drop語句,結果看都沒看就直接在生產環境中做了,一下子物料表就沒了,整个生产停线,后来做了恢复,丢了半天的数据。教训:执行的脚本一定要认真检查。

防范建议



1.通过触发器约束或禁用特定的DDL操作

对于TRUNCATE等高风险的数据库DDL操作,可以考虑通过触发器进行禁用,防止未授权的操作损害数据。 很多轻忽的数据灾难都来自于Truncate,这个类似于系统级别的rm命令极具破坏性,而且DDL不可以回退,即便发现已经为时过晚。所以我们建议用户可以考虑使用DDL触发器来禁用Truncate之类的危险操作,以达到安全防范的目的。

2.以最小权限原则进行授权

过度授权即是为数据库埋下安全隐患,在进行用户授权时一定要遵循最小权限授予原则,避免因为过度授权而带来的安全风险。

3.明确用户职责

应当明确不同的数据库用户能够用于的工作范围,应当使用普通用户身份的,就绝对不应该使用DBA的用户身份,只有职权相称,才能够避免错误。 即便是拥有管理员职责的用户,也应当遵循以不同身份执行不同任务的习惯,比如SYS和SYSTEM用户的使用就应当进行区分和界定。

4.在任何数据破坏之前进行备份

在进行数据表的截断、删除之前,进行备份,将备份养成一种习惯,这样才能够避免误操作之后的措手不及。

5.以重命名代替删除操作

不论操作系统级别还是数据库级别的删除操作,尽量以重命名替代删除,如重命名数据表,重命名数据文件,然后通过一段时间的观察和确认后再彻底删除。 Oracle10g中引入的回收站功能,就是将我们执行的DROP操作变更为重命名进行保护,当我们发现了失误之后,可以通过回收站找回,但是注意回收站保存对象的时间和空间有关,如果存储空间不足,对象会被自动释放。 我们在管理中借鉴这个回收站思想是很有帮助的。

6.尽量争取充足的时间

不要低估任何一次简单的维护操作,因为一个意外就可能大幅延长你的维护时间。所以,应当尽量争取充足的时间,包括做好充足的准备工作,加快无关紧要步骤的执行,减少不必要的时间消耗,时间越充裕,你用来应对可能出现的故障的时间就越多。

7.审核你的剪贴板

很多错误是由于粘贴剪贴板的内容引起的,所以,当你准备向一个窗口或者命令行粘贴你看不到的内容时,提高你的警惕性。在Windows上,有很多剪贴板增强工具,可以帮助我们记录和展现剪贴板的内容,可以考虑选用。 审核你的剪贴板,确保其中的内容是你期望的。

8.没有认真看过的脚本就绝不要执行

对于DBA来说,如果一个脚本你从来没有认真读取了解过,就不要去执行,脚本中的一个错误就可能导致严重的数据灾难。我们遇到过案例,由于脚本中的一个变量错误,导致所有数据文件被删除,教训惨痛。 如果实在无法审核脚本的内容,那么在进行重要操作之前,备份你的数据。

以上内容摘录自盖国强《OracleDBA手记4数据安全警示录》。


文章转自数据和云公众号,原文链接

时间: 2024-12-04 00:37:03

DBA生存警示:防范频发的数据误删除操作的相关文章

DBA生存警示:主备环境误操作案例及防范建议

编辑手记:对于资深的老DBA们,他们在漫长的职业生涯中养成了很多稀奇古怪的守则,以在复杂多变的环境中"幸存",这源于无数血泪的教训,我曾经在<数据安全警示录>一书收录了大量现实案例,现在整理分享给大家,共为警示. 在数据库日常管理过程中,有些威胁来自数据库外部,而有些威胁则来自数据库内部,对于数据库外部,破坏性的操作有rm,而在数据库内部,同样有破坏性操作,如Truncate. 案例分享 生产与测试环境错误 开了两个PL/SQL DEVELOPE窗口,一个生产的,一

DBA生存警示:系统级误删除案例及防范建议

编辑手记:对于资深的老DBA们,他们在漫长的职业生涯中养成了很多稀奇古怪的守则,以在复杂多变的环境中"幸存",这源于无数血泪的教训,我曾经在<数据安全警示录>一书收录了大量现实案例,现在整理分享给大家,共为警示. 案例分享 误删除Oracle软件 硬件维护人员删除归档日志的时候,把节点2的整个ORACLE_HOME都删除了.在删除的时候没有注意到目录改变了,还键盘做了一个向上的动作,刚好就是刚刚使用的 rm -rf *,然后一个下意识的动作回车就这么按下去了. 空格导致的误

DBA生存警示:保护现场不要让事情更糟

张乐奕 云和恩墨副总经理 Oracle ACE 总监 ITPUB Oracle数据库管理版版主.Oracle高可用版版主.ACOUG联合创始人 今天收到一个发过来请求帮助的 case,Oracle 数据库无法启动,请求帮助恢复.仔细阅读了发过来的告警日志,这是一个典型的"事情越弄越糟"的案例. 作为一个专业的DBA,在遇到问题时,一定要思考:如何保护现场,不让事情变得更糟.这是基本要求,保护现场以使得其他人接手工作时,可以从原有状态开始. 以下就来根据告警日志,一条一条地回顾这位 DB

DBA生存指南:以严谨防范事故

每逢假期,我们总会接收到很多数据库故障救急请求,因此我甚至经常发出以前的一个总结:警惕数据库假期综合症,呼吁大家提高警惕,防范疏忽下发生的故障和问题. 在这个元旦假期中,我们同样收到了很多的紧急援助请求,这其中大多是熟悉的问题,包括: 数据库回滚段问题导致的ORA-01555错误: SYSTEM表空间坏块导致的BootStrap失败,2662错误: 误删除导致的数据丢失: 空间不足导致的归档挂起: 阳光之下,并无新事,这些问题大都是我们以前曾经面对过的,很多专家已经写过了很多案例,如果大家对类似

数据操纵语言中数据的操作

  --表数据的操作 --输入数据 select * from 学生 --说明 :用在insert与表名之间的into是一个可选关键字 insert into 学生 (学号,姓名,性别,年龄,专业) values ('003','杨丽','女',18,'计科') insert into 学生 (学号,姓名,性别,年龄,专业) values ('004','杨丽','女',18,'计科') delete 学生 where 学号 = '004' alter table 学生 add constrai

json操作-怎么获取json数据及操作

问题描述 怎么获取json数据及操作 var PacsData = [ { "Path": ["F:1231debugData979372PACS100126725274152DX_e3b0eb90f7fdf110052b16bfb046a76363ee787eb18278c105de27bc786cbc9a5667f7507dde0a9b5ad0097523b20b48_007332_000001.dcm.icon.jpg", "F:1231debugD

c++-为什么说C不能很好的实现数据与操作的分离

问题描述 为什么说C不能很好的实现数据与操作的分离 今天看钱能的教材是,第一章里的第二页中,有写到,程序中的数据与分离不能很好的被C实现了? 解决方案 这主要是说,C不支持面向对象,不能像C++那样定义类,把数据和对应的操作封装成独立的实体. 在C语言中,所有的数据和函数都混合在一起. 但是注意,这个是从语法层面来说的.从设计层面说,你同样可以将数据和操作分离,编写良好风格的C代码,只是你需要更多的代码和更多的注意.你可以人肉去实现面向对象的代码. 相反,用C++也不意味着你一定能做到数据和操作

ci-CI框架中对数据的操作有问题

问题描述 CI框架中对数据的操作有问题 我向下寻找报错的493行字段为 $data = $this->daoModel->salver_db->get($tableNamePix);,提示的错误为表中没有这个字段我是知道的,我想知道再往下我想修改sql语句去哪里看代码

急!C++文件的中的数据的操作

问题描述 急!C++文件的中的数据的操作 txt文件中有下列几行数据:33663 333 33313254 664 89721346 666 888我的目标是根据第一列元素的特征来选择整行元素,将他们赋到一个类中进行操作,这个应该怎么实现(不要太过纠结上面的数据) 想了快一下午了没有个结果,求大神帮帮忙!! 解决方案 C++基础:数据文件操作 解决方案二: 循环遍历,然后判断你所谓的特征.http://blog.chinaunix.net/uid-20564678-id-3424272.html