一个客户的重要生产系统,一个USER被删除了,USER下所有的对象都被删除了。还好是下班时间,也有有效的备份,数据得以完全恢复,也没有对生产造成重大影响。

引起这个事故的,除了人为因素之外,ORACLE的BUG要负一半的责任。通过操作录像(客户对系统内做系统管理的所有机器的操作都作了录像,这点非常好),我们搞清楚了数据被删除的经过。

一个开发人员,通过OEM(Oracle Enterprise Manager Console)连接到数据库上,经过他确认OEM上的那个连接字符串是正确的,然后对USER做了删除操作,但很快发现,生产库的数据被删除了。操作录像也证明那个连接字符串是正确的,那么问题出在哪里呢?

操作的那台机器(Windows系统),在系统环境变量(我的电脑=>属性=>高级=>环境变量=>系统变量)中设置了TNS_ADMIN,指向了另外的目录。现在,TNS_ADMIN指向的目录(下面简称TNS_ADMIN目录)和%ORACLE_HOME%\NETWORK\ADMIN(下面简称ORACLE目录)下都有TNSNAMES.ORA这个文件。在TNS_ADMIN中,TNSNAMES.ORA有一TNSNAME,指向生产库。在ORACLE目录中,TNSNAMES.ORA中有一同样的名称的TNSNAME指向开发库。

OEM在处理TNS_ADMIN上是有问题的。OEM在启动后,在左边的数据库目录树,是从ORACLE目录的TNSNAMES.ORA中解析出来的,完全忽略了TNS_ADMIN环境变量,就算是执行”将数据库添加到树“操作,也是完全忽略了TNS_ADMIN变量,操作的是ORACLE目录中的TNSNAMES.ORA文件,显示的连接字符串信息也是从那个文件中得到的。下面是显示信息的截图:

然而,在用这个TNSNAME进行连接数据库时,却是按照TNS_ADMIN目录中的TNSNAMES.ORA文件的配置进行连接的,如果这两个TNSNAMES.ORA都有这个TNSNAME,那么不幸就发生了,本来我们期望是连接到OEM中显示的那个数据库上,结果却连接到了另一个库上。这可以是说OEM的重大BUG。

这里谈到的OEM是9i的版本,NetCA也有这个问题,但Net Manager没有这个问题。

事情虽然过去了,但是以下几件事情我们仍然值得我们牢记:

  • 有效的备份,特别是归档模式下的有效物理备份,是保证数据不会被丢失的前提。
  • 数据库用户权限的管理,需要遵循”最少权限“的原则,不可忽视。很多数据库管理人员为了方便,给Oracle用户太大的权限,甚至是DBA角色权限。这是非常危险的。
  • 有了备份仍然不够,需要做恢复测试,避免出现问题发现备份不能恢复,否则悔之晚矣。这次事故中,由于第三方的备份软件问题,导致数据恢复至少多花了三个小时的时间。要是之前有做过完整的测试,则会发现备份软件的问题。
  • 一些危险的操作,如删除用户,删除表等操作,一定要有规范的流程,确认无误后再执行。

还有以下我的一些个人观点:

  • 数据库管理时,尽量少用图形化的软件,一次DEL按键就能葬送整个系统。
  • 尽量将生产系统、测试系统与开发库隔离,比如禁止在开发机器上直接连接生产库,开发完成后,需要部署到生产库时,遵循专门的流程进行。也就是要规范开发流程。
Trackback

6 comments untill now

  1. 不错的案例,不过这个连生产与连开发的数据库,用户的密码是不是设成了相同的?如果改成了不同,应该也可以避免这个问题吧。
    一般生产的环境的密码比较复杂,而开发、测试环境的秘码总是相对简单些

  2. 这的确也是管理上的漏洞

  3. 1:管理的混乱是造成这种问题的根本,首先,开发库和生产库密码相同;
    2:开发环境有到生产主机的tns
    3:删除用户这样的权限给到了开发使用的用户

    说说这样的问题在我们这怎么管理吧:
    1:开发数据库和生产数据库的用户密码完全没有联系,且生产保密;
    2:非生产网段不能使用生产用户登录数据库;
    3:开发人员对于开发系统的删除用户这样的操作,必须得到dba的支持;
    4:开发环境没有到生产的tns
    5:正常流程,drop user这样的操作,应该先lock user,观察最少3小时,至于drop tablespace等都是先offline,删除表的操作先rename;

  4. 你们的流程不错。不过,能有你们这样严格管理的,能有多少呢?

  5. 我们这边情况是这样:
    1.开发环境和生产环境密码不同,生产密码只有dba知道
    并定期修改.
    2.数据库有logon trigger,并用一张表维护可以登陆生产数据库的ip,就算知道密码,但如果你的ip不在维护表里,登陆一样会受到阻碍。
    3.ip表里有ins,upd,del,del列,如果你的ip相应的某列比如ddl列为0,一样有schema级的ddl trigger阻止你做ddl操作.

  6. 我们这边除了本机访问,TNS监听不对其它任何IP开放。

Add your comment now