使用trace文件重建控制文件时的只读表空间处理

来源:这里教程网 时间:2026-02-27 14:07:02 作者:

使用trace文件重建控制文件的时候会经常忽略其中只读表空间,这种方式重建后的只读表空间的其实在置成读写的时候会出现类似ORA-0

使用trace文件重建控制文件的时候会经常忽略其中只读表空间,,这种方式重建后的只读表空间的其实在置成读写的时候会出现类似
ora-01135: file 6 accessed for dml/query is offline
ora-01111: name for data file 6 is unknown - rename to correct file
ora-01110: data file 6: '/u01/app/oracle/product/10.2.1/db_1/dbs/missing00006'
的错误,大体分类一下:
当存在read only表空间时,重建控制文件分两种情况:
1、重建controlfile的脚本中包含read only所对应的datafile,datafile不需要rename。
2、重建controlfile的脚本中不包含read only所对应的datafile;重建controlfile之后需要rename datafile到正确的位置。
 
测试环境:oracle 10g database:prod
 
演示:
1,查看表空间状态
注意此时oltp表空间是read only状态。
sys@prod>select tablespace_name,status from dba_tablespaces;
 
tablespace_name                status
------------------------------ ---------
system                         online
undotbs                        online
sysaux                         online
temp01                         online
temp02                         online
users                          online
tools                          online
oltp                           read only
mssm                           online
9 rows selected.                                                          
 
2,备份控制文件到trace
sys@prod>alter database backup controlfile to trace;
database altered.                                                         
 
3,开始重建控制文件过程:(停库=>nomount状态=>执行trace重建脚本)
sys@prod>shutdown immediate;
database closed.
database dismounted.
oracle instance shut down.
 
sys@prod>startup nomount;
oracle instance started.
total system global area  314572800 bytes
fixed size                  1219184 bytes
variable size             100664720 bytes
database buffers          209715200 bytes
redo buffers                2973696 bytes
 
4,此处模拟删除唯一的控制文件
sys@prod>show parameter control_files
name                                 type        value
------------------------------------ ----------- ------------------------------
control_files                        string      /u01/app/oracle/oradata/prod/d
                                                 isk1/control1.ctl
 
prod@rhel1$ rm disk1/control1.ctl  
 
5,执行trace脚本
1)如果打开备份产生的trace文件我们可以在后面看到控制文件的重建语句(仔细研究trace文件可以发现很多关于控制文件的重要信息)
产生的trace文件位于$oracle_base/admin/$oracle_sid/udump/目录下,如果不知道是哪个文件可以使用如下语句查找:
 
select
d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name
from
( select p.spid
    from sys.v$mystat m,sys.v$session s,sys.v$process p
    where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,
  ( select t.instance from sys.v$thread  t,sys.v$parameter  v
    where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,
  ( select value from sys.v$parameter where name = 'user_dump_dest') d ;
返回:
trace_file_name
--------------------------------------------------------------------------------
/u01/app/oracle/admin/prod/udump/prod_ora_13341.trc
 或这使用下列方法获取pid
select a.spid from
v$process a,v$session b
where a.addr=b.paddr and b.username = 'sys';
返回:
spid
------------
13341
2)找到trace文件中的这段:
===========================================================
create controlfile reuse database "prod" noresetlogs  archivelog
    maxlogfiles 30
    maxlogmembers 5
    maxdatafiles 100
    maxinstances 1
    maxloghistory 292
logfile
  group 1 (
    '/u01/app/oracle/oradata/prod/disk1/redo01.log',
    '/u01/app/oracle/oradata/prod/disk2/redo01_b.log'
  ) size 100m,
  group 2 (
    '/u01/app/oracle/oradata/prod/disk1/redo02.log',
    '/u01/app/oracle/oradata/prod/disk2/redo02_b.log'
  ) size 100m,
  group 3 (
    '/u01/app/oracle/oradata/prod/disk1/redo03.log',
    '/u01/app/oracle/oradata/prod/disk2/redo03_b.log'
  ) size 100m
-- standby logfile
datafile
  '/u01/app/oracle/oradata/prod/disk1/system01.dbf',
  '/u01/app/oracle/oradata/prod/disk1/undotbs01.dbf',
  '/u01/app/oracle/oradata/prod/disk1/sysaux01.dbf',
  '/u01/app/oracle/oradata/prod/disk1/users_01.dbf',
  '/u01/app/oracle/oradata/prod/disk1/tools_01.dbf',
  '/u01/app/oracle/oradata/prod/disk1/mssm_01.dbf'
character set us7ascii;
===========================================================
==注意此时的trace文件中没有只读表空间的信息,如果在这个脚本的datafile后面加上oltp的正确位置名就没有rename的过程了。
 
3)保存成脚本恢复使用:
prod@rhel1 /home/oracle$ vi con.sql                            

相关推荐