帮忙解决一个数据库无法启动的问题,数据库处于非归档模式,没有物理备份和逻辑备份。由于磁盘坏块导致数据库无法正常启动。
得知这种情况,先做了最坏的打算,由于不知道磁盘的问题会影响哪些数据文件,很可能数据库根本无法启动。
登陆数据库服务器后,首先检查了一下alert文件,检查最后出现的错误信息:
Fri Feb 15 15:22:40 2008
ORACLE V9.2.0.1.0 - Production vsnsta=0
vsnsql=12 vsnxtr=3
Windows 2000 Version 5.0 Service Pack 4, CPU type 586
Fri Feb 15 15:22:40 2008
Starting ORACLE instance (normal)
LICENSE_MAX_SESSION = 0
LICENSE_SESSIONS_WARNING = 0
SCN scheme 2
Using log_archive_dest parameter default value
LICENSE_MAX_USERS = 0
SYS auditing is disabled
Starting up ORACLE RDBMS Version: 9.2.0.1.0.
System parameters with non-default values:
processes = 150
timed_statistics = TRUE
shared_pool_size = 134217728
sga_max_size = 420551900
large_pool_size = 8388608
java_pool_size = 33554432
control_files = D:oracleoradataserverCONTROL01.CTL, D:oracleoradataserverCONTROL02.CTL, D:oracleoradataserverCONTROL03.CTL
db_block_size = 8192
db_cache_size = 134217728
compatible = 9.2.0.0.0
db_file_multiblock_read_count= 32
fast_start_mttr_target = 300
undo_management = AUTO
undo_tablespace = UNDOTBS1
undo_retention = 10800
remote_login_passwordfile= EXCLUSIVE
db_domain =
instance_name = server
dispatchers = (PROTOCOL=TCP) (SERVICE=serverXDB)
job_queue_processes = 10
hash_join_enabled = TRUE
hash_area_size = 1048576
background_dump_dest = D:oracleadminserverbdump
user_dump_dest = D:oracleadminserverudump
core_dump_dest = D:oracleadminservercdump
sort_area_size = 1048576
db_name = server
open_cursors = 300
star_transformation_enabled= TRUE
query_rewrite_enabled = TRUE
pga_aggregate_target = 33554432
aq_tm_processes = 1
PMON started with pid=2
DBW0 started with pid=3
LGWR started with pid=4
CKPT started with pid=5
SMON started with pid=6
RECO started with pid=7
CJQ0 started with pid=8
QMN0 started with pid=9
Fri Feb 15 15:22:54 2008
starting up 1 shared server(s) ...
starting up 1 dispatcher(s) for network address '(ADDRESS=(PARTIAL=YES)(PROTOCOL=TCP))'...
Fri Feb 15 15:23:04 2008
alter database mount exclusive
Fri Feb 15 15:23:10 2008
Successful mount of redo thread 1, with mount id 4154651352.
Fri Feb 15 15:23:10 2008
Database mounted in Exclusive Mode.
Completed: alter database mount exclusive
Fri Feb 15 15:23:10 2008
alter database open
ORA-1110 signalled during: alter database open...
Dump file d:oracleadminserverbdumpalert_server.log
查询Oracle的ERROR参考手册,发现ORA-1110错误描述为:
ORA-01110 data file string: 'string'
Cause: This message reports the file name involved with other messages.
Action: See the associated messages for a description of the problem.
这个错误只是整个错误信息中的一部分,仅凭这个错误无法确定具体的问题。
看来数据库已经处于MOUNT状态,尝试打开数据库:
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01122: 数据库文件 3 验证失败
ORA-01110: 数据文件 3: 'D:ORACLEORADATASERVERCWMLITE01.DBF'
ORA-01251: 文件号3的未知文件标题版本读取
很不错,问题既不是出在SYSTEM系统表空间中,也不是出现在用户表空间中,而是出自相对“无害”的CWMLITE表空间。可以确定,当前系统是不需要使用这个表空间的。
不过,现在不能确定,是否其他数据文件还存在问题,在动手解决问题之前,首先对现有环境进行备份。
数据库处于MOUNT状态,可以查询V$DATAFILE视图和V$LOGFILE视图,手工备份所有的数据文件和日志文件,并根据SHOW PARAMETER CONTROL的结果备份当前的控制文件。
执行完备份操作,尝试删除数据文件的方式来打开数据库:
SQL> alter database datafile 'D:ORACLEORADATASERVERCWMLITE01.DBF' offline drop;
数据库已更改。
SQL> alter database open;
数据库已更改。
由于数据库处于非归档模式,只能采用OFFLINE DROP的方式,幸运的是,出现问题的只有一个数据文件CWMLITE01.DBF,删除后,数据库顺利打开。
数据库打开后删除OLAPSYS用户和CWMLITE表空间,然后确实要恢复到原来的情况,可以考虑使用dbca来添加OLAPSYS用户。
数据库打开后,对业务用户进行逻辑备份,避免磁盘的坏块造成进一步的损失。
整个恢复过程并没有什么技术含量,而且“运气”很好,不过并不是所有出现问题的数据库都会有如此好的运气,只有有效的备份才是最保险的。