险恶江湖:Oracle的TNS_ADMIN获取与设置混乱误删除案例

在微信群中有朋友提出一个问题:如何获得Oracle的TNS_ADMIN的变量值?

TNS_ADMIN 是Oracle的一个环境变量,指向 SQL*Net 配置文件的位置。常见的配置文件有 sqlnet.ora 和 tnsnames.ora 等。

通常在 Windows 上,环境变量的设置类似如下:

set TNS_ADMIN=%ORACLE HOME%\network\admin

在 Unix/ Linux 设置类似如下:

export TNS_ADMIN=$ORACLE HOME/network/admin

那么是否可以通过其他方式获取当前采用的变量值呢?

我们可以通过DBMS_SYSTEM包来获取,Oracle提供了非常强大的工具。通过dbms_system.get_env可以获取环境变量的当前生效值:

SQL> var envout varchar2(200); SQL> exec dbms_system.get_env('ORACLE_HOME',:envout); PL/SQL procedure successfully completed. SQL> set serveroutput on SQL> exec dbms_system.get_env('ORACLE_HOME',:envout); PL/SQL procedure successfully completed. SQL> print envout ENVOUT --------------------------------------------------------------- /u01/app/oracle/product/11.2.0/dbhome_1 SQL> exec dbms_system.get_env('TNS_ADMIN',:envout); PL/SQL procedure successfully completed. SQL> print envout ENVOUT -------------------------------------------------------------------- /u01/app/oracle/product/11.2.0/dbhome_1/network/admin

当然,如果你在服务器上也有高阶权限,找到后台进程PMON的进程号:

[root@enmoteam1]# ps -ef|grep pmon root 4800 4584 0 15:22 pts/0 00:00:00 grep pmon oracle 9669 1 0 May26 ? 00:05:03 ora_pmon_enmot1

检查该进程的环境变量文件,也可以看到数据库启动所采用的缺省TNS_ADMIN参数值:

[root@enmoteam1]# cd /proc/9669 [root@enmoteam1 9669]# strings environ |grep TNS_ADMIN TNS_ADMIN=/u01/app/oracle/product/11.2.0/dbhome_1/network/admin

TNS_ADMIN 参数重要么?有时候的确非常重要,老熊曾经记录过一个非常危险的案例(Oracle 9i中)。写在这里,供大家警示。

事发经过:一个开发人员,试图通过OEM(Oracle Enterprise Manager)连接到开发库上,删除一个用户。在删除时确认OEM上的连接字符串是正确的,然而很快发现,生产库的数据被删除了。

过程回放:在数据恢复完成后,观看数据库用户被删除时的屏幕录像,从录像中可以看到,操作时的确是连接到开发库的,为什么会删除了生产库上的用户呢?

问题定位:原来进行删除操作的那台客户端机器运行的是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的项添加到树中。

下面是两幅截图所示:

图1中显示的被选中的数据库为“XTY”,图2显示的是这个库的连接字符串。

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

案例警示:事情虽然过去了,但是有很多值得我们深思的地方。软件不可避免地存在Bug,所以在出现问题后,一味抱怨软件的Bug无济于事。我们只有吸取教训,从管理上、技术手段上去防止此类问题的发生,才是有意义的。

数据库的安全防范措施:


1. 开发库和生产库、测试库的密码不能相同,特别是要严格保护生产库的密码,生产库的密码应该定期修改。

2. 开发环境不能有到生产主机的TnsName

3. 通过IP地址来限制可以连接生产库的机器

4. 对于一些重要的特别是危及数据安全的操作,应分步进行。比如删除用户(Drop User)时,应先Lock User;删除表空间时,先将表空间OFFLINE;删除表等其他对象时,先进行改名(rename)操作;完成这些操作后,观察一段时间确认没有问题后,再真正执行删除操作。

5. 通过使用触发器,来限制可以进行的ddl操作

数据库运维,备份重于一切:


1. 有效的备份是在发生数据丢失和损坏后能够进行恢复的基础。每一个数据库DBA都应该切实关注备份问题。曾经有客户,虽然使用VERITAS进行数据库备份,然而在某次阵列出现问题不可用要进行恢复时才发现居然有部分数据文件没有备份,结果可想而知。

2. 进行恢复测试。恢复测试是数据备份恢复策略的重要组成部分。通过恢复测试,一方面检查备份是否有效,同时能够确认恢复流程是否正确、安全,恢复所需要的环境是否能够满足要求,恢复所需要的时间有多长,出现数据丢失或损坏后,能不能在预定的时间内完成恢复。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-06-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维

ELKB5.2.2集群环境部署及优化终极文档

本人陆陆续续接触了ELK的1.4,2.0,2.4,5.0,5.2版本,可以说前面使用当中一直没有太多感触,最近使用5.2才慢慢有了点感觉,可见认知事务的艰难,本...

562
来自专栏张戈的专栏

修改Apache的超时设置,解决长连接请求超时问题

某日,组内后台开发找到我,问我们的 WEB 服务器超时设置是多少。他反馈的问题是,有一个 VLAN 切换任务 cgi 接口经常返回 504 网关超时错误,要我分...

5228
来自专栏GopherCoder

Python: 一周笔记

1333
来自专栏乐沙弥的世界

Oracle RAC 负载均衡测试(结合服务器端与客户端)

        Oracle RAC 负载均衡使得从客户端发起的连接能够有效地分配到监听器负载较小的实例上。有两种方式实现客户端负载均衡,一是通过配置客户端的l...

661
来自专栏数据和云

【12.2新特性】Oracle Sharding分片级别的高可用实现

编辑手记:Oracle Sharding是从12c推出的通过分区技术实现的一种数据库架构,在12.2中这项技术也越来越成熟。release 2中新特性包含:分片...

4047
来自专栏运维前线

CentOS6 脚本自动安装redis sentinel

脚本自动安装redis sentinel(在同一台服务器上) #!/usr/bin/env bash # ---------------------------...

2077
来自专栏Danny的专栏

您的凭据不工作 之前用于连接到******的凭据无法工作。请输入新凭据。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

3213
来自专栏静默虚空的博客

[协议]ICMP协议剖析

1、ICMP简介 ICMP全名为(INTERNET CONTROL MESSAGE PROTOCOL)网络控制消息协议。 ICMP的协议号为1。 ICMP报文就...

2447
来自专栏老安的博客

openstack octavia 简介以及手工安装过程

2742
来自专栏北京马哥教育

万字长文为你深入解读 Linux 用户及用户组管理

运维行业正在变革,推荐阅读:30万年薪Linux运维工程师成长魔法 无论是出于 Linux 本身的多用户多任务分时操作系统的性质,还是出于系统安全的考虑, L...

3405

扫码关注云+社区