以下输出显示了绑定变量, 这个 SQL 更新了 TS$字典表,将表空间 2(ts# = 1)更新 name=’WANGBB’, Online$=3,完成了这一步骤的操作:
以下文本截取部分txt文件
可以看到数据库更新
..........................................
接下来的操作更新了 file$字典表,可以看到将此表空间的状态更改状态;
可以查看file$表,看到此时的file#=10 的文件状态已经更改为1了。
而此时查询 dba_tablespaces 视图时,是看不到这些状态位 3 的表空间信息的:
这是因为在创建视图时, Oracle 对 online$字段进行了过滤:
如果我们进一步的创建一个新的表空间, Oracle 会重用之前 file$中删除的文件号:
而如果我们重建的表空间与之前删除的同名,则 Oracle 会重用之前的表空间信息
了解此操作的详细过程可在遇到问题时更快的找到真相
例如模拟数据库的00600错误;
查看ts$表相关内容,然后将测试表空间的相关信息删除;
测试表空间删除,使用正常语句drop tablespace 删除测试表空间。此时数据库的反映与数据库的版本有关。
数据库环境
操作系统:windows
数据库 :10.2.0.1
截取告警日志:
数据库操作:
数据库此时将运行一段时间然后崩溃;
查看数据库告警日志:
1. 如果此时我们将 16 号回滚段标记为损坏,则可以避免回滚时出现的问题,正常无误的启
动数据库:
SQL> alter system set "_corrupted_rollback_segments"='_SYSSMU16$' scope=spfile;
系统已更改。
SQL> alter system set "_offline_rollback_segments"='_SYSSMU16$' scope=spfile;
系统已更改。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
.......
如果此时尝试 DROP 回滚段,则数据库还会出现 600 错误:
2. SQL> drop rollback segment "_SYSSMU6$";
drop rollback segment "_SYSSMU6$"
* 第
1 行出现错误:
ORA-00607: 当更改数据块时出现内部错误
ORA-00600: 内部错误代码, 参数: [kddummy_blkchk], [2], [89], [38508], [], [], [], []
3. SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;
系统已更改。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1298160 bytes
Variable Size 167772432 bytes
Database Buffers 436207616 bytes
Redo Buffers 7090176 bytes
数据库装载完毕。
4. SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 1011115 (在 08/09/2010 17:52:04 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\ORACLE\10.2.0\RDBMS\ARC00006_0726573063.001
ORA-00280: 更改 1011115 (用于线程 1) 在序列 #6 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> alter database open resetlogs;
数据库已更改。
5. SQL> create undo tablespace undotbs2 datafile size 10M;
表空间已创建。
SQL> alter system set undo_tablespace=undotbs2;
系统已更改。
6. SQL> alter tablespace undotbs1 offline;
表空间已更改。
SQL> drop tablespace undotbs1;
表空间已删除。
SQL> drop tablespace WBBTEST;
表空间已删除。
11G环境
操作系统:linux6.8
数据库 :11.2.0.4
drop tablespace WBBTEST
*
ERROR at line 1:
ORA-00959: tablespace 'WBBTEST' does not exist
此时尝试关闭数据库
此时数据库不会有任何报错,但是wbbtest表空间已不存在。就像蒸发了一样。查询不到
有意思的是,如果数据库中有表存在此表空间中的话表名将直接隐藏。但是却不影响其他对表的dml操作。即虽然从相应的视图中看不到对象,但对象确实实际存在并且是可以操作的。
此实验只是提供了解决问题的一种思路。更深的理解oracle运行原理,遇到类似的问题才不会慌。




