开发者社区> jeanron100> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

关于Oracle中重启数据库的一个bug

简介: 关于drop database在oracle中是致命的操作,这个操作自己在测试环境中体验过,会完全删除数据文件,因此这个操作非常敏感但是实用性不强,不过话说过来,这个操作也不是随便就能执行的,除了操作敏感的权限之外,其实还是有一些前提条件的。
+关注继续查看
关于drop database在oracle中是致命的操作,这个操作自己在测试环境中体验过,会完全删除数据文件,因此这个操作非常敏感但是实用性不强,不过话说过来,这个操作也不是随便就能执行的,除了操作敏感的权限之外,其实还是有一些前提条件的。
在数据库open状态,是无法运行这个命令的。
SQL> drop database TEST;
drop database TEST
              *
ERROR at line 1:
ORA-00933: SQL command not properly ended

需要重启到mount阶段。
SQL> alter database mount exclusive;
Database altered.

SQL> drop database TEST;
drop database TEST
              *
ERROR at line 1:
ORA-00933: SQL command not properly ended
同时还要保证处于exclustrict模式。
SQL> drop database;--要执行还是不容易的。
drop database
*
ERROR at line 1:
ORA-12719: operation requires database is in RESTRICTED mode
SQL> alter system enable restricted session;
System altered.
SQL> drop database;
Database dropped.

今天网友提供了一个精简的两个命令。就把停库,重启到Mount,设置restrict mode,drop database的步骤都完成了。
自己在本地的测试库中也尝试了一下,看看能不能启动到restrict模式下.,结果运行的时候报了一个ORA错误就退出了。
idle>  startup force  mount restrict;
ORA-00000: normal, successful completion
其实对于这个问题,oerr的解释感觉有些牵强,至少对于我来说是不可接受的。
$ oerr ora 00000
00000, 00000, "normal, successful completion"
// *Cause:  Normal exit.
// *Action: None.
顺着这个问题在metalink上看了一圈,突然有一个帖子引起了我的注意,就是关于钱包的一个设置。
关于钱包的设置,可以参考我之前对比MySQL和Oracle无密码登录的案例。http://blog.itpub.net/23718752/viewspace-1659551/
metalink中相关的文章是Bug 11706168 - ORA-00000 during STARTUP with SQLNET.WALLET_OVERRIDE=TRUE (Doc ID 11706168.8)
由此可见很可能就是我碰到的这个bug.
我们来简单验证和复现一下。
如果启用钱包的这个override特性,就出出现问题。
sys@TEST11G> startup force
ORA-00000: normal, successful completion
sys@TEST11G> !cat sqlnet.ora|grep SQLNET
SQLNET.WALLET_OVERRIDE=true
如果禁用,就会发现能够正常重启了。
idle> startup force
ORACLE instance started.
Total System Global Area  435224576 bytes
Fixed Size                  1337044 bytes
Variable Size             272632108 bytes
Database Buffers          155189248 bytes
Redo Buffers                6066176 bytes
Database mounted.
Database opened.
idle> !cat sqlnet.ora|grep SQLNET
#SQLNET.WALLET_OVERRIDE=true
对于这个问题的测试还没有完,我们可以深究一下,这个问题在什么场景下还会出现。
其实在同一个session中进行数据库的重启也是会有问题的。
我们在同一个session内重启,停库
idle> startup
ORACLE instance started.
Total System Global Area  435224576 bytes
Fixed Size                  1337044 bytes
Variable Size             272632108 bytes
Database Buffers          155189248 bytes
Redo Buffers                6066176 bytes
Database mounted.
Database opened.
idle> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
当再次重启的时候,就会出现这个问题了,当然这个问题还是和钱包相关的。
idle> startup
ORA-00000: normal, successful completion
idle> !cat sqlnet.ora|grep SQLNET
SQLNET.WALLET_OVERRIDE=true

最后亮出那个精简的命令,看看效果。
sys@TEST11G> startup force mount restrict;
ORACLE instance started.
Total System Global Area  435224576 bytes
Fixed Size                  1337044 bytes
Variable Size             272632108 bytes
Database Buffers          155189248 bytes
Redo Buffers                6066176 bytes
Database mounted.
可以看到数据库可以很快的重启到Mount阶段,然后设置为restrict模式。
当然,startup force也就是个人本地测试环境玩玩,工作中的环境中一概要撇清关系,因为后果是很严重的,别说破坏性操作,就算新特性的使用都是谨慎又谨慎的,这也是我们DBA存在的一种意义和价值所在。



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Oracle数据仓库创建教程
Oracle数据仓库创建教程。如何创建一个数据仓库,创建实例,以为毕业设计要求,最近开始Oracle的数仓建模实践,详细记录了图形界面下的 Oracle database 12C 数据仓库创建过程。 本教程在Linux环境和Windows环境均可成功创建。 注意:不论是Linux下还是Windows下,前提是你已经正确安装了Oracle database 12C。
1599 0
tnsping是否可以证明Oracle数据库可用?
监听器是Oracle基于服务器端的一种网络服务,主要用于监听客户端向数据库服务器端提出的连接请求。Oracle官方对其的定义为:A process that listens for incoming client connection requests and manages network traffic to the database.​​本地服务名是Oracle客户端网络配置的一种,另外还有Oracle名字服务器(Oracle Names Server)等。
681 0
关于oracle中的反连接
在之前的章节中见到讨论过oracle中的半连接 http://blog.itpub.net/23718752/viewspace-1334483/ 与半连接相对应的是反连接,简而言之半连接就是查询条件中的in,exists,反连接就是not in, not exists这种类型的连接。
772 0
关于Oracle数据库中SQL空值排序的问题
在Oracle中进行查询排序时,如果排序字段里面有空值的情况下,排序结果可能会达不到自己想要的结果。   如 select * from tableTest order by VISITS desc   上图可以看到表示服务访问次数的“VISITS”字段上的空值记录排序时放在前面,和实际逻辑不对   将原来的sql语句改写为:select * from tableTest order by VISITS desc nulls last,   "nulls last"控制将空值记录放在后面,当然,你也可以用"nulls first"将控制记录放在前面。
632 0
+关注
jeanron100
Oracle ACE,《Oracle DBA工作笔记》作者 现就职于国内某互联网公司,擅长数据管理,数据迁移,性能优化,目前专注于开源技术,运维自动化和性能优化。
1178
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载