昨日杭州电销jira有个数据库出现问题,运维人员说由于前天机房停电,数据库停机,昨日来了启动数据库,但是启动不了,报错。
alert文件如下:
Errors in file /u01/app/oracle/admin/oracle10/bdump/oracle10_dbw0_3493.trc:
ORA-01157: cannot identify/lock data file 5 - see DBWR trace file
ORA-01110: data file 5: '/u01/app/oracle/oradata/oracle10/abcc.dbf'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
Tue Dec 28 22:33:18 2010
Errors in file /u01/app/oracle/admin/oracle10/bdump/oracle10_dbw0_3493.trc:
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01110: data file 6: '/u01/app/oracle/oradata/oracle10/cardbfile.dbf'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
Tue Dec 28 22:33:18 2010
Errors in file /u01/app/oracle/admin/oracle10/bdump/oracle10_dbw0_3493.trc:
ORA-01157: cannot identify/lock data file 9 - see DBWR trace file
ORA-01110: data file 9: '/u01/app/oracle/oradata/oracle10/undotbs01.DBF'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
Tue Dec 28 22:36:19 2010
我查了下,两个数据表空间的数据文件均已丢失,undo表空间的一个数据文件丢失。
经过和运维人员交流,得知,这两个数据表空间已经早就不用了。据我推测,可能是
运维人员想删掉这两个表空间,就在系统上直接rm了数据文件,以为这样表空间就删了。
undo的数据文件也可能是这样。
解决办法如下:
查了一些资料。按照二 进行的操作。如红字部分。
大体解决方案,首先重建undo表空间,使系统能启动,再对那两个没有数据文件的表空间进行删除。
UNDO损坏修复------使用到了第二条,abort的情况
undo损坏后的修复分为以下三种情况:
一、数据库正常关闭immediate或normal
①、创建pfile并使用pfile启动数据库
startup nomount
create pfile=
from spfile;
shutdown abort
startup mount restrict pfile=
②、尝试恢复文件
select name,file#,status from v$datafile;
recover datafile ;
③、创建新的undo表空间替换损坏的undo表空间
alter database datafile offline drop;
alter database open;
CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE '' SIZE 10M AUTOEXTEND ON RETENTION NOGUARANTEE;
shutdown immediate;
④、修改pfile:
undotablespace=UNDOTBS2
⑤、删除损坏undo表空间并创建新的SPFILE
startup pfile=
drop tablespace UNDOTBS1 including contents and datafile;
create spfile from pfile=''shshutdown immediate
startup
二、abort或crash
①、创建pfile
startup nomount
create pfile= from spfile;
②、修改pfile
undo_tablespace='SYSTEM'
undo_management='MANUAL'
*._allow_resetlogs_corruption=true
(注:允许在数据库文件SCN不一致的情况下启动数据库)
*._corrupted_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)
(注:允许在rollback segments损坏的情况下启动数据库)
(注:rollback的名称要与已经损坏的undo表空间的rollback segment号保持一致,不然导致无法删除损坏的undo表空间)
③、使用修改后pfile启动数据库
startup mount restrict pfile=''
④、修改损坏数据文件状态
select name,file#,status from v$datafile;
alter database datafile offline drop;
④、打开数据库
alter database open;
⑤、并创建新的undo表空间并关闭数据库
CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE '' SIZE 10M AUTOEXTEND ON RETENTION NOGUARANTEE;
shutdown immediate;
⑥、修改pfile
undo_tablespace='UNDOTBS2'
undo_management='AUTO'
⑦、启动数据库并删除损坏undo表空间
startup restrict pfile=
修改损坏undo表空间状态
alter tablespace undotbs1 offline immediate;
删除损坏undo表空
drop tablespace UNDOTBS1 including contents and datafiles;
三、online
①、创建新的undo表空间
CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE '' SIZE 10M AUTOEXTEND ON RETENTION NOGUARANTEE;
②、改变默认undo表空间
ALTER SYSTEM SET UNDO_TABLESPACE='';
③、删除损坏undo表空间
DROP TABLESPACE INCLUDING CONTENTS AND DATAFILE;
四、相关视图:
v$datafile
v$rollname
v$rollstat
v$tablespace
dba_rollback_segs
dba_data_files
dba_talbespaces
dba_segments
(以上也是从网上搜索的资料)
经过上面的修复,undo的问题解决了。
再解决数据表空间的问题。
数据文件被删除了,想要删除表空间但报错-----如下:
SQL> drop tablespace carspace including contents and datafiles;
drop tablespace carspace including contents and datafiles
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 2
ORA-31496: must use DBMS_CDC_PUBLISH.DROP_CHANGE_TABLE to drop change tables
ORA-06512: at "SYS.DBMS_CDC_IPUBLISH", line 12
ORA-06512: at line 5
SQL> select change_table_name from CHANGE_TABLES ;
CHANGE_TABLE_NAME
------------------------------
J$COMMENT_USER
J$PAYDATATB
J$LPDATATB
J$LCRECORDTB
SQL> desc CHANGE_TABLES
Name Null? Type
----------------------------------------- -------- ----------------------------
CHANGE_TABLE_SCHEMA NOT NULL VARCHAR2(30)
CHANGE_TABLE_NAME NOT NULL VARCHAR2(30)
CHANGE_SET_NAME NOT NULL VARCHAR2(30)
SOURCE_SCHEMA_NAME NOT NULL VARCHAR2(30)
SOURCE_TABLE_NAME NOT NULL VARCHAR2(30)
CREATED NOT NULL DATE
CREATED_SCN NUMBER
CAPTURED_VALUES NOT NULL VARCHAR2(1)
PUB_ID NOT NULL NUMBER
SQL> select change_table_name,CHANGE_TABLE_SCHEMA from CHANGE_TABLES ;
CHANGE_TABLE_NAME CHANGE_TABLE_SCHEMA
------------------------------ ------------------------------
J$COMMENT_USER CARUSER
J$PAYDATATB CARUSER
J$LPDATATB CARUSER
J$LCRECORDTB CARUSER
使用一下包,进行删除那些change的表。然后在进行删除表空间。
exec dbms_cdc_publish.drop_change_table('CARUSER','J$COMMENT_USER','Y');
exec dbms_cdc_publish.drop_change_table('CARUSER','J$PAYDATATB','Y');
exec dbms_cdc_publish.drop_change_table('CARUSER','J$LPDATATB','Y');
exec dbms_cdc_publish.drop_change_table('CARUSER','J$LCRECORDTB','Y');
(以上也是从网上搜索的解决方案使用这个包。)
删除损坏数据表空间:
drop tablespace carspace including contents and datafiles;
成功。
经验教训:
这次也尝试了rman 的restore和recover的工作,但是需要归档文件,需要rman的备份片,但
都已经不存在。逻辑备份也一个多月没做了。
1。备份,再备份,再再备份,再再再备份。
2。在系统上根本就不要使用rm命令,对于不懂数据库的人更应该遵守。不要轻易删除那些名字怪异的文件。有可能是关键文件。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22782896/viewspace-682759/
,如需转载,请注明出处,否则将追究法律责任。