您的位置:首页 > 数据库

数据库常用脚本(1)

2015-06-11 19:41 429 查看
以下的脚本检查oratab文件中列出的所有数据库,并且找出该数据库的状态(启动还是关闭)

###################################################################

##           ckinstance.ksh                ##

###################################################################

ORATAB=/var/opt/oracle/oratab

echo "`date` "

echo "Oracle Database(s) Status `hostname` :\n"

db=`egrep -i ":Y|:N" $ORATAB | cut -d":" -f1 | grep -v "\#" | grep -v "\*"`

pslist="`ps -ef | grep pmon`"

for i in $db ; do

echo "$pslist" | grep "ora_pmon_$i" > /dev/null 2>$1

if (( $? )); then

echo "Oracle Instance - $i: Down"

else

echo "Oracle Instance - $i: Up"

fi

done

  使用以下的命令来确认该脚本是可以执行的:

$ chmod 744 ckinstance.ksh

$ ls -l ckinstance.ksh-rwxr-

-r-- 1 oracle dba 657 Mar 5 22:59 ckinstance.ksh*

  以下是实例可用性的报表:

$ ckinstance.ksh

以下有一个类似的脚本检查Oracle监听器。如果监听器停了,该脚本将会重新启动监听器:

#######################################################################

## cklsnr.sh ##

#######################################################################

#!/bin/ksh

DBALIST="primary.dba@company.com,another.dba@company.com";export DBALIST

cd /var/opt/oracle

rm -f lsnr.exist

ps -ef | grep mylsnr | grep -v grep > lsnr.exist

if [ -s lsnr.exist ]

then

echo

else

echo "Alert" | mailx -s "Listener 'mylsnr' on `hostname` is down" $DBALIST

TNS_ADMIN=/var/opt/oracle; export TNS_ADMIN

ORACLE_SID=db1; export ORACLE_SID

ORAENV_ASK=NO; export ORAENV_ASK

PATH=$PATH:/bin:/usr/local/bin; export PATH

. oraenv

LD_LIBRARY_PATH=${ORACLE_HOME}/lib;export LD_LIBRARY_PATH

lsnrctl start mylsnr

fi

  检查Alert日志(ORA-XXXXX)

  每个脚本所使用的一些环境变量可以放到一个profile中:

#######################################################################

## oracle.profile ##

#######################################################################

EDITOR=vi;export EDITOR ORACLE_BASE=/u01/app/oracle; export

ORACLE_BASE ORACLE_HOME=$ORACLE_BASE/product/8.1.7; export

ORACLE_HOME LD_LIBRARY_PATH=$ORACLE_HOME/lib; export

LD_LIBRARY_PATH TNS_ADMIN=/var/opt/oracle;export

TNS_ADMIN NLS_LANG=american; export

NLS_LANG NLS_DATE_FORMAT='Mon DD YYYY HH24:MI:SS'; export

NLS_DATE_FORMAT ORATAB=/var/opt/oracle/oratab;export

ORATAB

PATH=$PATH:$ORACLE_HOME:$ORACLE_HOME/bin:/usr/ccs/bin:/bin:/usr/bin:/usr/sbin:/

sbin:/usr/openwin/bin:/opt/bin:.; export

PATH DBALIST="primary.dba@company.com,another.dba@company.com";export

DBALIST

  以下的脚本首先调用oracle.profile来设置全部的环境变量。如果发现任何的Oracle错误,该脚本还会给DBA发送一个警告的email。

####################################################################

## ckalertlog.sh ##

####################################################################

#!/bin/ksh

.. /etc/oracle.profile

for SID in `cat $ORACLE_HOME/sidlist`

do

cd $ORACLE_BASE/admin/$SID/bdump

if [ -f alert_${SID}.log ]

then

mv alert_${SID}.log alert_work.log

touch alert_${SID}.log

cat alert_work.log >> alert_${SID}.hist

grep ORA- alert_work.log > alert.err

fi

if [ `cat alert.err|wc -l` -gt 0 ]

then

mailx -s "${SID} ORACLE ALERT ERRORS" $DBALIST < alert.err

fi

rm -f alert.err

rm -f alert_work.log

done

  清除旧的归档文件

  以下的脚本将会在log文件达到90%容量的时候清空旧的归档文件:

$ df -k | grep arch

Filesystem kbytes used avail capacity Mounted on

/dev/vx/dsk/proddg/archive 71123968 30210248 40594232 43% /u08/archive

#######################################################################

## clean_arch.ksh ##

#######################################################################

#!/bin/ksh

df -k | grep arch > dfk.result

archive_filesystem=`awk -F" " '{ print $6 }' dfk.result`

archive_capacity=`awk -F" " '{ print $5 }' dfk.result`

if [[ $archive_capacity > 90% ]]

then

echo "Filesystem ${archive_filesystem} is ${archive_capacity} filled"

# try one of the following option depend on your need

find $archive_filesystem -type f -mtime +2 -exec rm -r {} \;

tar

rman

fi

分析表和索引(以得到更好的性能)

  以下我将展示如果传送参数到一个脚本中:

####################################################################

## analyze_table.sh ##

####################################################################

#!/bin/ksh

# input parameter: 1: password # 2: SID

if (($#<1)) then echo "Please enter 'oracle' user password as the first parameter !" exit

0

fi

if (($#<2)) then echo "Please enter instance name as the second parameter!" exit 0

fi

  要传入参数以执行该脚本,输入:

$ analyze_table.sh manager oradb1

  脚本的第一部分产生了一个analyze.sql文件,里面包含了分析表用的语句。脚本的第二部分分析全部的表:

#####################################################################

## analyze_table.sh ##

#####################################################################

sqlplus -s <

oracle/$1@$2

set heading off

set feed off

set pagesize 200

set linesize 100

spool analyze_table.sql

select 'ANALYZE TABLE ' || owner || '.' || segment_name ||

' ESTIMATE STATISTICS SAMPLE 10 PERCENT;'

from dba_segments

where segment_type = 'TABLE'

and owner not in ('SYS', 'SYSTEM');

spool off

exit

!

sqlplus -s <

oracle/$1@$2

@./analyze_table.sql

exit

!

检查表空间的使用

  以下的脚本检测表空间的使用。如果表空间只剩下10%,它将会发送一个警告email。

#####################################################################

## ck_tbsp.sh ##

#####################################################################

#!/bin/ksh

sqlplus -s <

oracle/$1@$2

set feed off

set linesize 100

set pagesize 200

spool tablespace.alert

SELECT F.TABLESPACE_NAME,

TO_CHAR ((T.TOTAL_SPACE - F.FREE_SPACE),'999,999') "USED (MB)",

TO_CHAR (F.FREE_SPACE, '999,999') "FREE (MB)",

TO_CHAR (T.TOTAL_SPACE, '999,999') "TOTAL (MB)",

TO_CHAR ((ROUND ((F.FREE_SPACE/T.TOTAL_SPACE)*100)),'999')||' %'

PER_FREE

FROM (

SELECT TABLESPACE_NAME,

ROUND (SUM (BLOCKS*(SELECT VALUE/1024

FROM V\$PARAMETER

WHERE NAME = 'db_block_size')/1024)

) FREE_SPACE

FROM DBA_FREE_SPACE

GROUP BY TABLESPACE_NAME

) F,

(

SELECT TABLESPACE_NAME,

ROUND (SUM (BYTES/1048576)) TOTAL_SPACE

FROM DBA_DATA_FILES

GROUP BY TABLESPACE_NAME

) T

WHERE F.TABLESPACE_NAME = T.TABLESPACE_NAME

AND (ROUND ((F.FREE_SPACE/T.TOTAL_SPACE)*100)) < 10;

spool off

exit

!

if [ `cat tablespace.alert|wc -l` -gt 0 ]

then

cat tablespace.alert -l tablespace.alert > tablespace.tmp

mailx -s "TABLESPACE ALERT for ${2}" $DBALIST < tablespace.tmp

fi

  警告email输出的例子如下:

TABLESPACE_NAME USED (MB) FREE (MB) TOTAL (MB) PER_FREE

------------------- --------- ----------- ------------------- ------------------

SYSTEM 2,047 203 2,250 9 %

STBS01 302 25 327 8 %

STBS02 241 11 252 4 %

STBS03 233 19 252 8 %

  查找出无效的数据库对象

  以下查找出无效的数据库对象:

#####################################################################

## invalid_object_alert.sh ##

#####################################################################

#!/bin/ksh . /etc/oracle.profile

sqlplus -s <oracle/$1@$2

set feed off

set heading off column object_name format a30

spool invalid_object.alert

SELECT OWNER, OBJECT_NAME, OBJECT_TYPE, STATUS FROM

DBA_OBJECTS WHERE STATUS = 'INVALID' ORDER BY OWNER, OBJECT_TYPE,

OBJECT_NAME;

spool off exit ! if [ `cat invalid_object.alert|wc -l` -gt 0 ] then

mailx -s "INVALID OBJECTS for ${2}" $DBALIST < invalid_object.alert

fi$ cat invalid_object.alert

OWNER OBJECT_NAME OBJECT_TYPE STATUS

----------------------------------------------------------------------

HTOMEH DBMS_SHARED_POOL PACKAGE BODY INVALID

HTOMEH X_$KCBFWAIT VIEW INVALID

IMON IW_MON PACKAGE INVALID

IMON IW_MON PACKAGE BODY INVALID

IMON IW_ARCHIVED_LOG VIEW INVALID

IMON IW_FILESTAT VIEW INVALID

IMON IW_SQL_FULL_TEXT VIEW INVALID

IMON IW_SYSTEM_EVENT1 VIEW INVALID

IMON IW_SYSTEM_EVENT_CAT VIEW INVALIDLBAILEY

CHECK_TABLESPACE_USAGE PROCEDURE INVALID

PATROL P$AUTO_EXTEND_TBSP VIEW INVALID

SYS DBMS_CRYPTO_TOOLKIT PACKAGE INVALID

SYS DBMS_CRYPTO_TOOLKIT PACKAGE BODY INVALID

SYS UPGRADE_SYSTEM_TYPES_TO_816 PROCEDURE INVALID

SYS AQ$_DEQUEUE_HISTORY_T TYPE INVALID

SYS HS_CLASS_CAPS VIEW INVALID

SYS HS_CLASS_DD VIEW INVALID

  监视用户和事务(死锁等)

  以下的脚本在死锁发生的时候发送一个警告e-mail:

###################################################################

## deadlock_alert.sh ##

###################################################################

#!/bin/ksh

.. /etc/oracle.profile

sqlplus -s <

oracle/$1@$2

set feed off

set heading off

spool deadlock.alert

SELECT SID, DECODE(BLOCK, 0, 'NO', 'YES' ) BLOCKER,

DECODE(REQUEST, 0, 'NO','YES' ) WAITER

FROM V$LOCK

WHERE REQUEST > 0 OR BLOCK > 0

ORDER BY block DESC;

spool off

exit

!

if [ `cat deadlock.alert|wc -l` -gt 0 ]

then

mailx -s "DEADLOCK ALERT for ${2}" $DBALIST < deadlock.alert

fi

  结论

0,20,40 7-17 * * 1-5 /dba/scripts/ckinstance.sh > /dev/null 2>&1

0,20,40 7-17 * * 1-5 /dba/scripts/cklsnr.sh > /dev/null 2>&1

0,20,40 7-17 * * 1-5 /dba/scripts/ckalertlog.sh > /dev/null 2>&1

30 * * * 0-6 /dba/scripts/clean_arch.sh > /dev/null 2>&1

* 5 * * 1,3 /dba/scripts/analyze_table.sh > /dev/null 2>&1

* 5 * * 0-6 /dba/scripts/ck_tbsp.sh > /dev/null 2>&1

* 5 * * 0-6 /dba/scripts/invalid_object_alert.sh > /dev/null 2>&1

0,20,40 7-17 * * 1-5 /dba/scripts/deadlock_alert.sh > /dev/null 2>&1

  通过以上的脚本,可大大减轻你的工作。你可以使用这些是来做更重要的工作,例如性能调整。

declare

cursor c_pol_main is

select a.* from tab_aaaa a ;

v_pol_main c_pol_main%rowtype;

begin

open c_pol_main;

loop

fetch c_pol_main

into v_pol_main;

exit when c_pol_main%notfound;

insert into aaa.aaa

values (v_pol_main.a,

v_pol_main.aa,

v_pol_main.aaa,

v_pol_main.aaaa,

v_pol_main.aaaaa);

if mod(c_pol_main%rowcount, 5000) = 0 then

commit;

end if;

end loop;

commit;

close c_pol_main;

exception

when others then

close c_pol_main;

dbms_output.put_line(substr(sqlerrm, 1, 200));

dbms_output.put_line(v_pol_main.polno || '出错!');

end;

/

查找存储过程OPERATIONDATA_IMP被哪些session锁住而无法编译

select * FROM dba_ddl_locks where name =upper('OPERATIONDATA_IMP');

从而得到session_id,然后通过

select t.sid,t.serial# from v$session t where t.sid=&session_id;

得到sid和serial#最后用

alter system kill session 'sid,serial#';

kill 相关session即可。

select * from dba_datapump_jobs t where t.owner_name like 'SYS' and t.state='EXECUTING';

Oracle常用dump命令

ALTER SESSION SET EVENTS 'immediate trace name global_area

level n';

1 包含PGA 2 包含SGA 4 包含UGA 8 包含indrect

memory

1).Global Area

ALTER SESSION SET EVENTS 'immediate trace name library_cache

level n';

1 library cache统计信息 2 包含hash table histogram

3 包含object handle 4 包含object结构(Heap 0)

2).Library Cache

ALTER SESSION SET EVENTS 'immediate trace name row_cache

level n';

1 row cache统计信息 2 包含hash table histogram 8 包含

object结构

3).Row Cache

ALTER SESSION SET EVENTS 'immediate trace name buffers level n';

1 buffer header 2 level 1 + block header

3 level 2 + block contents 4 level 1 + hash chain

5 level 2 + hash chain 6 level 3 + hash chain

8 level 4 + users/waiters 9 level 5 + users/waiters

10 level 6 + users/waiters

4).Buffers

ALTER SESSION SET EVENTS 'immediate trace name buffer level n';

n为某个指定block的rdba,该命令可以转储某个block在buffer中的所有版

本。

5).Buffer

ALTER SESSION SET EVENTS 'immediate trace name heapdump

level level';

1 PGA摘要 2 SGA摘要 4 UGA摘要

8 Current call(CGA)摘要 16 User call(CGA)摘要 32 Large

call(LGA)摘要

1025 PGA内容 2050 SGA内容 4100 UGA内容

8200 Current call内容 16400 User call内容 32800 Large

call内容

6).Heap

ALTER SESSION SET EVENTS 'immediate trace name

heapdump_addr level n';

若n为subheap的地址,转储的是subheap的摘要信息

若n为subheap的地址+1,转储的则是subheap的内容

Oracle 9.0.1版本之前

Oracle 9.2.0版本之后

7).Sub Heap

一 . Memory Dumps

2011年7月10日

22:09

分区 oracle学习 的第 1 页

ALTER SESSION SET EVENTS 'immediate trace name

heapdump_addr level n, addr m';

其中m为subheap的地址,n为1转储subheap的摘要,n为2转储

subheap的内容

Oracle 9.2.0版本之后

ALTER SESSION SET EVENTS 'immediate trace name processstate

level n';

8).Process State

ALTER SESSION SET EVENTS 'immediate trace name systemstate

level n';

9).System State

ALTER SESSION SET EVENTS 'immediate trace name errorstack

level n';

0 Error stack 1 level 0 + function call stack

2 level 1 + process state 3 level 2 + context area

10).Error State

ALTER SESSION SET EVENTS 'immediate trace name hanganalyze

level n';

11).Hang Analysis

ALTER SESSION SET EVENTS 'immediate trace name

workareatab_dump level n';

1 SGA信息 2 Workarea Table摘要信息 3 Workarea Table详

细信息

12).Work Area

ALTER SESSION SET EVENTS 'immediate trace name latches level

n';

1 latch信息 2 统计信息

13).Latches

ALTER SESSION SET EVENTS 'immediate trace name events level

n';

1 session 2 process 3 system

14).Events

ALTER SESSION SET EVENTS 'immediate trace name locks level n';

15).Locks

ALTER SESSION SET EVENTS 'immediate trace name

shared_server_state level n';

n取值为1~14

16).Shared Server Process

ALTER SESSION SET EVENTS 'immediate trace name bg_messages

level (pid+1)';

17).Background Messages

ALTER SYSTEM DUMP DATAFILE file# BLOCK block#;

ALTER SYSTEM DUMP DATAFILE file# BLOCK MIN min # BLOCK

MAX max #;

1).Block

ALTER SESSION SET EVENTS 'immediate trace name treedump

level object_id';

2).Tree Dump

ALTER SYSTEM DUMP UNDO_HEADER 'segment_name';

3).Undo Segment Header

4).Undo for a Transaction

二 . File Dumps

分区 oracle学习 的第 2 页

ALTER SYSTEM DUMP UNDO BLOCK 'segment_name' XID xidusn

xidslot xidsqn;

4).Undo for a Transaction

ALTER SESSION SET EVENTS 'immediate trace name file_hdrs level

n';

1 控制文件中的文件头信息 2 level 1 + 文件头信息

3 level 2 + 数据文件头信息 10 level 3

5).File Header

ALTER SESSION SET EVENTS 'immediate trace name controlf level

n';

1 文件头信息 2 level 1 + 数据库信息 + 检查点信息

3 level 2 + 可重用节信息 10 level 3

6).Control file

ALTER SESSION SET EVENTS 'immediate trace name redohdr level

n';

1 控制文件中的redo log信息 2 level 1 + 文件头信息

3 level 2 + 日志文件头信息 10 level 3

7).Redo log Header

ALTER SYSTEM DUMP LOGFILE 'FileName';

ALTER SYSTEM DUMP LOGFILE 'FileName'

SCN MIN MinSCN SCN MAX MaxSCN TIME MIN MinTime TIME MAX

MaxTime

LAYER Layer OPCODE Opcode

DBA MIN File#.Block# DBA MAX File#.Block#

RBA MIN LogFileSequence#.Block# RBA MAX

LogFileSequence#.Block#;

其中time = ((((yyyy - 1988) * 12 + mm - 1) * 31 + dd - 1) * 24 +

hh) * 60 + mi) * 60 + ss;

8).Redo log

ALTER SESSION SET EVENTS 'immediate trace name loghist level

n';

1 dump控制文件中最早和最迟的日志历史项 >1 dump 2^n个日志历

史项

Oracle跟踪文件分为三种类型,一种是后台报警日志文件,记录数据库在启

动、关闭和运行期间后

台进程的活动情况,如表空间创建、回滚段创建、某些alter命令、日志切换、

错误消息等。在数据库出现故障时,应首先查看该文件,但文件中的信息与任

何错误状态没有必然的联系。后台报警日志

文件保存BACKGROUND_DUMP_DEST参数指定的目录中,文件格式为

SIDALRT.LOG。另一种类型是DBWR、LGWR、SMON等后台进程创建的后

台跟踪文件。后台跟踪文件根据后台进程运行情况产生,后台跟踪文件也保存

在BACKGROUND_DUMP_DEST参数指定的目录中,文件格式为

siddbwr.trc、sidsmon.trc等。还有一种类型是由连接到Oracle的用户进程

(Server Processes)生成的用户跟踪文件。这些文件仅在用户会话期间遇到错

误时产生。此外,用户可以通过执行oracle跟踪事件(见后面)来生成该类文

件,用户跟踪文件保存在USER_DUMP_DEST参数指定的目录中,文件格式

为oraxxxxx.trc,xxxxx为创建文件的进程号(或线程号)。

9).Loghist

二、Oracle跟踪事件

Oracle提供了一类命令,可以将Oracle各类内部结构中所包含的信息转储(dump)

到跟踪文件中,以便用户能根据文件内容来解决各种故障。设置跟踪事件有两种方

法,一种是在init.ora文件中设置事件,这样open数据库后,将影响到所有的会

话。设置格式如下:

EVENT="eventnumber trace name eventname [forever,] [level

分区 oracle学习 的第 3 页

EVENT="eventnumber trace name eventname [forever,] [level

lv#] : ......."

通过:符号,可以连续设置多个事件,也可以通过连续使用event来设置多个事件。

另一种方法是在会话过程中使用alter session set events命令,只对当前会话有

影响。设置格式如下:

alter session set events '[event# |immediate] trace name eventname

[forever] [, level levelnumber] : .......'

通过:符号,可以连续设置多个事件,也可以通过连续使用alter session set

events 来设置多个事件。

格式说明:

event# 指触发dump的事件号,事件号可以是Oracle错误号(出现相应错误时

跟踪指定的事件)或oralce内部事件号,内部事件号在10000到10999之间,不能

与immediate关键字同用。

immediate 关键字表示命令发出后,立即将指定的结构dump到跟踪文件中,这

个关键字只用在altersession语句中,并且不能与 eventnumber、forever关键字

同用。

trace name 是关键字。

eventname 指事件名称(见后面),即要进行dump的实际结构名。若

eventname为context,则指根据内部事件号进行跟踪。

forever 关键字表示事件在实例或会话的周期内保持有效状态,不能与

immediate同用。

level 为事件级别关键字。但在dump错误栈(errorstack)时不存在级别。

levelnumber 表示事件级别号,一般从1到10,1表示只dump结构头部信

息,10表示dump结构的所有信息。

alter session set events 'immediate trace name blockdump level

66666'; --表示dump块地址为6666的数据块。

在Oracle 8以后该命令已改为:

alter system dump datafile 11 block 9; --表示dump数据文件号为11中

的第9个数据块。

2、blockdump事件:dump数据文件、索引文件、回滚段文件结构

alter session set events 'immediate trace name controlf level 10'; --

表示dump控制文件的所有内容。

3、controlf事件:dump控制文件结构

alter session set events 'immediate trace name redohdr level 1'; --

表示dump redo日志头部的控制文件项。

alter session set events 'immediate trace name redohdr level 2'; --

表示dump redo日志的通用文件头。

alter session set events 'immediate trace name redohdr level 10'; --

表示dump redo日志的完整文件头。

注意:redo日志的内容dump可以采用下面的语句:

alter system dump logfile 'logfilename';

5、redohdr事件:dump redo日志的头部信息

alter session set events 'immediate trace name loghist level 1'; --表

示只dump最早和最迟的日志历史项。

levelnumber大于等于2时,表示2的levelnumber次方个日志历史项。

alter session set events 'immediate trace name loghist level 4'; --表

示dump 16个日志历史项。

6、loghist事件:dump控制文件中的日志历史项

alter session set events 'immediate trace name file_hdrs level 1'; --

表示dump 所有数据文件头部的控制文件项。

alter session set events 'immediate trace name file_hdrs level 2'; --

表示dump 所有数据文件的通用文件头。

7、file_hdrs事件:dump 所有数据文件的头部信息

分区 oracle学习 的第 4 页

表示dump 所有数据文件的通用文件头。

alter session set events 'immediate trace name file_hdrs level

10'; --表示dump 所有数据文件的完整文件头。

8、errorstack事件:dump 错误栈信息,通常Oracle发生错误时前台进程

将得到一条错误信息,但某些情况下得不到错误信息,可以采用这种方式得到

Oracle错误。

alter session set events '604 trace name errorstack forever'; --表示

当出现604错误时,dump 错误栈和进程栈。

alter session set events 'immediate trace name systemstate level

10'; --表示dump 所有系统状态和进程状态。

9、systemstate事件:dump所有系统状态和进程状态

levelnumber以十六进制表示时,两个高位字节表示自由区间数目,两个低位

字节表示表空间号,如0x00050000表示dump系统表空间中的5个自由区

间,转换成十进制就是327680,即:

alter session set events 'immediate trace name coalesec level

327680';

10、coalesec事件:dump指定表空间中的自由区间

alter session set events 'immediate trace name processsate level

10';

11、processsate事件:dump进程状态

alter session set events 'immediate trace name library_cache level

10';

12、library_cache事件:dump library cache信息

alter session set events 'immediate trace name heapdump level 1';

13、heapdump事件:dump PGA、SGA、UGA中的信息

alter session set events 'immediate trace name row_cache level 1';

14、row_cache事件:dump数据字典缓冲区中的信息

三 、 内部事件号

1、10013:用于监视事务恢复 2、10015:转储UNDO SEGMENT头部

3、10029:用于给出会话期间的登陆信息 4、10030:用于给出会话期间的注销信



5、10032:转储排序的统计信息 6、10033:转储排序增长的统计信息

7、10045:跟踪Freelist管理操作 8、10046:跟踪SQL语句

9、10053:转储优化策略 10、10059:模拟redo日志中的创建和清除

错误

11、10061:阻止SMON在启动时清除临时段 12、10079:转储 SQL*NET统计

信息

13、10081:转储高水标记变化 14、10104:转储Hash连接统计信息

15、10128:转储分区休整信息 16、10200:转储一致性读信息

17、10201:转储一致性读中Undo应用 18、10209:允许在控制文件中模拟错误

19、10210:触发数据块检查事件 20、10211:触发索引检查事件

21、10213:模拟在写控制文件后崩溃

22、10214:模拟在控制文件中的写错误,lv#1-9表示产生错误的块号,否则则每个控

制文件将出错

23、10215:模拟在控制文件中的读错误 24、10220:转储Undo头部变化

25、10221;转储Undo变化 26、10224:转储索引的分隔与删除

27、10225:转储基于字典管理的区间的变化 28、10229:模拟在数据文件上的

I/O错误

alter session set events '10231 trace name context off';

event = "10231 trace name context forever, level 10";

29、10231:设置在全表扫描时忽略损坏的数据块

30、10232:将设置为软损坏(DBMS_REPAIR包设置或DB_BLOCK_CHECKING为

分区 oracle学习 的第 5 页

数据块dump到跟踪文件

30、10232:将设置为软损坏(DBMS_REPAIR包设置或DB_BLOCK_CHECKING为

TRUE时设置)

alter session set events '10235 trace name context forever,

level 1';

31、10235:用于内存堆检查

32、10241:转储远程SQL执行 33、10246:跟踪PMON进程

34、10248:跟踪dispatch进程 35、10249:跟踪MTS进程

36、10252:模拟写数据文件头部错误 37、10253:模拟写redo日志文件错误

alter session set events '10262 trace name context forever,

level 300';

38、10262:允许连接时存在内存泄漏

39、10270:转储共享游标 40、10285:模拟控制文件头部损坏

41、10286:模拟控制文件打开错误 42、10287:模拟归档出错

43、10357:调试直接路径机制 44、10500:跟踪SMON进程

45、10608:跟踪位图索引的创建 46、10704:跟踪enqueues

47、10706:跟踪全局enqueues 48、10708:跟踪RAC的buffer cache

49、10710:跟踪对位图索引的访问 50、10711:跟踪位图索引合并操作

51、10712:跟踪位图索引OR操作 52、10713:跟踪位图索引AND操作

53、10714:跟踪位图索引MINUS操作 54、10715:跟踪位图索引向ROWID的转



55、10716:跟踪位图索引的压缩与解压 56、10719:跟踪位图索引的修改

57、10731:跟踪游标声明 58、10928:跟踪PL/SQL执行

59、10938:转储PL/SQL执行统计信息

最后要说明的是,由于版本不同以上语法可能有些变化,但大多数还是可用的。

附完整的跟踪事件列表,event No.10000 to 10999

SET SERVEROUTPUT ON

DECLARE

err_msg VARCHAR2(120);

BEGIN

dbms_output.enable (1000000);

FOR err_num IN 10000..10999

LOOP

err_msg := SQLERRM (-err_num);

IF err_msg NOT LIKE '%Message '||err_num||' not found%' THEN

dbms_output.put_line (err_msg);

END IF;

END LOOP;

END;

/

2、 Event分类

诊断事件大体上可以分为四类:

a. 转储类事件:它们主要用于转储Oracle的一些结构,例如转储一下控制文件、数据

文件头等内容。

b. 捕捉类事件:它们用于捕捉一些Error事件的发生,例如捕捉一下ORA-04031发生

时一些Rdbms信息,以判断是Bug还是其它原因引起的这方面的问题。

c. 改变执行途径类事件:它们用于改主一些Oracle内部代码的执行途径,例如设置

10269将会使Smon进程不去合并那些Free的空间。

d. 跟踪类事件:这们用于获取一些跟踪信息以用于Sql调优等方面,最典型的便是

10046了,将会对Sql进行跟踪。

4、 其它说明:

a. 如果immediate放在第一个说明是无条件事件,即命令发出即转储到跟踪文件。

分区 oracle学习 的第 6 页

a. 如果immediate放在第一个说明是无条件事件,即命令发出即转储到跟踪文件。

b. trace name位于第二、三项,除它们外的其它限定词是供Oracle内部开发组用的。

c. level通常位于1-10之间(10046有时用到12),10意味着转储事件所有的信息。例

如当转储控制文件时,level1表示转储控制文件头,而level 10表明转储控制文件全部内

容。

d. 转储所生成的trace文件在user_dump_dest初始化参数指定的位置。

3、 使用DBMS_SYSTEM.SET_EV的方法

a. 过和定义如下

EV Binary_integer,LE Binary_integer,

NM Binary_integer);

DBMS_SYSTEM.SET_EV( SI Binary_integer,SE Binary_integer,

SI : 即v$session中的sid SE : 即v$session中的serial#

EV : 要设置的事件 LE : 要设置事件的级别 NM : 名称

SQL> EXECUTE SYS.DBMS_SYSTEM.SET_EV(sid,serial#,10046,12,'');

注意不要用oradug去跟踪oracle的smon,pmon等几个进程,操作不当可能会杀掉这几

个后台进引起宕库。

1、 我如何知道在系统中设置了哪些event?

b. Michael R.Ault给的SQL

serveroutput on size 1000000

declare

event_level number;

begin

for i in 10000..10999 loop

sys.dbms_system.read_ev(i,event_level);

if (event_level > 0) then

dbms_output.put_line('Event '||to_char(i)||' set at level '||

to_char(event_level));

end if;

end loop;

end;

/

回答: a. 如果你的事件是在init.ora中设置的可以用show parameter event;来查看

archive log 日志已满

ORA-00257: archiver error. Connect internal only, until freed 错误的处理方法

1. 用sys用户登录

sqlplus sys/pass@tt as sysdba

2. 看看archiv log所在位置

SQL> show parameter log_archive_dest;

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

log_archive_dest string

log_archive_dest_1 string

log_archive_dest_10 string

3. 一般VALUE为空时,可以用archive log list;检查一下归档目录和log sequence

SQL> archive log list;

Database log mode Archive Mode

Automatic archival Enabled

Archive destination USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence 360

Next log sequence to archive 360

Current log sequence 362

4. 检查flash recovery area的使用情况,可以看见archivelog已经很大了,达到96.62

SQL> select * from V$FLASH_RECOVERY_AREA_USAGE;

FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES

------------ ------------------ ------------------------- ---------------

CONTROLFILE .13 0 1

ONLINELOG 2.93 0 3

ARCHIVELOG 96.62 0 141

BACKUPPIECE 0 0 0

IMAGECOPY 0 0 0

FLASHBACKLOG 0 0 0

5. 计算flash recovery area已经占用的空间

SQL> select sum(percent_space_used)*3/100 from v$flash_recovery_area_usage;

SUM(PERCENT_SPACE_USED)*3/100

-----------------------------

2.9904

6. 找到recovery目录, show parameter recover

SQL> show parameter recover;

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

db_recovery_file_dest string /u01/app/oracle/flash_recovery_area

db_recovery_file_dest_size big integer 5G

recovery_parallelism integer 0

7 上述结果告诉我们,归档位置用的是默认值,放在flash_recovery_area下(db_recovery_file_dest目录=/u01/app/oracle/flash_recovery_area)

[root@sha3 10.2.0]# echo $ORACLE_BASE

/u01/app/oracle

[root@sha3 10.2.0]# cd $ORACLE_BASE/flash_recovery_area/tt/archivelog

转移或清除对应的归档日志, 删除一些不用的日期目录的文件,注意保留最后几个文件(比如360以后的)

---------------------------------------------------------------------------------------

注意:

在删除归档日志后,必须用RMAN维护控制文件,否则空间显示仍然不释放。

---------------------------------------------------------------------------------------

8. rman target sys/pass

[root@sha3 oracle]# rman target /

Recovery Manager: Release 10.2.0.4.0 - Production on Tue Jan 20 01:41:26 2009

Copyright (c) 1982, 2007, Oracle. All rights reserved.

connected to target database: tt (DBID=4147983671)

9. 检查一些无用的archivelog

RMAN> crosscheck archivelog all;

10. 删除过期的归档

RMAN> delete expired archivelog all;

delete archivelog until time 'sysdate-9' ; 删除截止到前一天的所有archivelog

11. 再次查询,发现使用率正常,已经降到23.03

SQL> select * from V$FLASH_RECOVERY_AREA_USAGE;

FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES

------------ ------------------ ------------------------- ---------------

CONTROLFILE .13 0 1

ONLINELOG 2.93 0 3

ARCHIVELOG 23.03 0 36

BACKUPPIECE 0 0 0

IMAGECOPY 0 0 0

FLASHBACKLOG 0 0 0

其它有用的Command:

----------------------------------

如果archive log模式下不能正常startup,则先恢复成noarchive log,startup成功后,再shutdown;

shutdown immediate;

startup mount;

alter database noarchivelog;

alter database open;

shutdown immediate;

再次startup以archive log模式

shutdown immediate;

startup mount;

show parameter log_archive_dest;

alter database archivelog;

archive log list;

alter database open;

如果还不行,则删除一些archlog log

SQL> select group#,sequence# from v$log;

GROUP# SEQUENCE#

---------- ----------

1 62

3 64

2 63

原来是日志组一的一个日志不能归档

SQL> alter database clear unarchived logfile group 1;

alter database open;

最后,也可以指定位置Arch Log, 请按照如下配置

select name from v$datafile;

alter system set log_archive_dest='/opt/app/oracle/oradata/usagedb/arch' scope=spfile

或者修改大小

SQL> alter system set db_recovery_file_dest_size=3G scope=both;

--Step1: 创建名称为STS_NAME_1030的SQL_SET.

---------------------------------------------------

BEGIN

DBMS_SQLTUNE.CREATE_SQLSET(SQLSET_NAME => 'STS_NAME_0225',

DESCRIPTION => 'COMPLETE APPLICATION WORKLOAD',

SQLSET_OWNER =>'DDDA');

END;

/

---------------------------------------------------

--Step2: 初始加载当前数据库中的SQL.

---------------------------------------------------

DECLARE

STSCUR DBMS_SQLTUNE.SQLSET_CURSOR;

v_cnt NUMBER;

BEGIN

OPEN STSCUR FOR

SELECT VALUE (P)

FROM TABLE (

DBMS_SQLTUNE.SELECT_CURSOR_CACHE (

'( sql_text LIKE ''%AAAA%'' or sql_text LIKE ''%%'') and PARSING_SCHEMA_NAME <> ''SYS''',

'ALL')) P;

-- POPULATE THE SQLSET

DBMS_SQLTUNE.LOAD_SQLSET (SQLSET_NAME => 'STS_NAME_1030',

POPULATE_CURSOR => STSCUR,

commit_rows => 100,

SQLSET_OWNER => 'DDDA');

CLOSE STSCUR;

COMMIT;

EXCEPTION

WHEN OTHERS

THEN

RAISE;

END;

/

---------------------------------------------------

--Step3: 增量抓取数据库中的SQL, 会连续抓取一天,每小时抓取一次,在后台执行

---------------------------------------------------

BEGIN

DBMS_SQLTUNE.CAPTURE_CURSOR_CACHE_SQLSET(SQLSET_NAME=>'STS_NAME_1030',

TIME_LIMIT=> 86400,

REPEAT_INTERVAL=>3600,

CAPTURE_OPTION=>'MERGE',

CAPTURE_MODE =>DBMS_SQLTUNE.MODE_ACCUMULATE_STATS,

BASIC_FILTER=>

'( sql_text LIKE ''%AAAAA%''

or sql_text LIKE ''%BBBBBB%''

)

and PARSING_SCHEMA_NAME <> ''SYS''' ,

SQLSET_OWNER => 'AAAA');

END;

/

--step1:

EXEC DBMS_SQLTUNE.CREATE_STGTAB_SQLSET('STGTAB_0225','AAAA');

--step2:

EXEC DBMS_SQLTUNE.PACK_STGTAB_SQLSET('STS_NAME_0225','AAAA','STGTAB_0225','AAAA');

--step3:

--导出DBMGR.STGTAB_SQLSET_0000表

EXP直接导出压缩问津,IMP直接导入压缩文件的方法 .

在10G之前,甚至在10G的Oracle环境中,有很多数据量不大,重要性不太高的系统依然采用EXP/IMP逻辑导出备份方式,或者,作为辅助备份方式。

通常情况下,我们都是这样操作的:

1.exp导出

2.gzip压缩

3.gzip解压

4.imp导入

这样操作有如下两个不好的地方:

1.占用大量磁盘空间,磁盘剩余空间必须大于导出的,未压缩的文件大小加上压缩后的文件大小。如果设置计划任务,每日定时导出的话,很有可能因为磁盘空间不足导致备份失败。由于这种备份方式磁盘使用率的剧烈抖动,即使有监控工具,也不能很好的提供趋势分析

2.系统资源浪费,在导出时,大部分都在等待IO。而压缩时,又大部分等待CPU,整体利用率不高。

那么,有没有办法直接导出成压缩文件?并直接从压缩文件导入呢?

EXP导出:

$ mknod p p

$ gzip < p > test.dmp.gz & exp system/xxxx tables=TEST buffer=31457280 CONSISTENT=Y COMPRESS=N file=p

[3] 24532

Export: Release 10.2.0.5.0 - Production on 星期四 1月 19 10:27:45 2012

Copyright (c) 1982, 2007, Oracle. All rights reserved.

连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production

With the Partitioning, Data Mining and Real Application Testing options

已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集

即将导出指定的表通过常规路径...

当前的用户已更改为 SYSTEM

. . 正在导出表 TEST导出了 1875063 行

成功终止导出, 没有出现警告。

[1] Done gzip < p > test.dmp.gz

[2]- Done gzip < p > test.dmp.gz

[3]+ Done gzip < p > test.dmp.gz

$ rm -rf p

IMP导入:

$ mknod p p

$ gunzip < test.dmp.gz > p & imp system/xxx file=p full=y buffer=31457280

[2] 24572

Import: Release 10.2.0.5.0 - Production on 星期四 1月 19 10:29:16 2012

Copyright (c) 1982, 2007, Oracle. All rights reserved.

连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production

With the Partitioning, Data Mining and Real Application Testing options

经由常规路径由 EXPORT:V10.02.01 创建的导出文件

已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入

. 正在将 SYSTEM 的对象导入到 SYSTEM

. . 正在导入表 "TEST"导入了 1875063 行

成功终止导入, 没有出现警告。

[1] Done gzip < p > test.dmp.gz

[2]+ Done gunzip < test.dmp.gz > p

异机恢复数据库

有些时候因为测试环境需要,我们需要使用生产库的备份集在另外一台新的机器上做恢复(前提是新机器事先安装Oracle软件,版本跟原库一致),下面是恢复过程.

1.在原库上做全备(在原库上操作)

run{

allocate channel c1 device type disk;

allocate channel c2 device type disk;

backup format '/u02/rman_backup/full_backup/full_backup_%T_%s' database;

sql 'alter system archive log current';

backup format '/u02/rman_backup/full_backup/arc_backup_%T_%s' archivelog all;

release channel c1;

release channel c2;

}

2.查看原库的DBID(在原库上操作)

因为在做恢复的过程中需要设定DBID,这里需要找到原库的DBID

SQL> select dbid from v$database;

DBID

----------

1820932955

-----以下的操作没有特殊说明,全部在目的库上操作-----

3.使用ftp将原库上的备份集拷贝到目的库的目录/u02/ftp/(具体操作省略)

4.在新机器上创建如下目录

mkdir /u02/mydb

mkdir -p /u02/mydb/oracl/{adump,bdump,cdump,dpdump,udump,pfile}

mkdir -p /u02/mydb/oradata/oracl

mkdir -p /u02/mydb/flash_recovery_area

5.创建密码文件

orapwd file=/u01/app/oracle/product/10.2.0/db_1/dbs/orapworacl.ora password=oracle

6.恢复参数文件

[oracle@hxlbak ~]$ rman target /

Recovery Manager: Release 10.2.0.1.0 - Production on Fri Jun 29 06:51:54 2012

Copyright (c) 1982, 2005, Oracle. All rights reserved.

connected to target database (not started)

RMAN>set dbid 1820932955 -- 这里的dbid需要跟原库保持一致

RMAN> startup nomount

startup failed: ORA-01078: failure in processing system parameters

LRM-00109: could not open parameter file '/u01/app/oracle/product/10.2.0/db_1/dbs/initoracl.ora'

starting Oracle instance without parameter file for retrival of spfile

Oracle instance started

Total System Global Area 159383552 bytes

Fixed Size 1218268 bytes

Variable Size 54528292 bytes

Database Buffers 100663296 bytes

Redo Buffers 2973696 bytes

RMAN> restore spfile to pfile '/u01/app/oracle/product/10.2.0/db_1/dbs/initoracl.ora' from '/u02/ftp/full_backup_20120628_37';

Starting restore at 29-JUN-12

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=36 devtype=DISK

channel ORA_DISK_1: autobackup found: /u02/ftp/full_backup_20120628_37

channel ORA_DISK_1: SPFILE restore from autobackup complete

Finished restore at 29-JUN-12

备份集full_backup_20120628_3里7包含了参数文件,我们在备份数据的时候会默认备份参数文件,可以在原库使用list backup查看,list backup输出部分内容如下:

BS Key Type LV Size Device Type Elapsed Time Completion Time

------- ---- -- ---------- ----------- ------------ ---------------

35 Full 80.00K DISK 00:00:01 28-JUN-12

BP Key: 35 Status: AVAILABLE Compressed: NO Tag: TAG20120628T184555

Piece Name: /u02/rman_backup/full_backup/full_backup_20120628_37

SPFILE Included: Modification time: 28-JUN-12

恢复了参数文件initoracl.ora后,因为原库和目的库各文件保存的路径不一致,这个时候需要修改参数文件,修改的地方如下,各文件路径指向新目录:

*.audit_file_dest='/u02/mydb/oracl/adump'

*.background_dump_dest='/u02/mydb/oracl/bdump'

*.control_files='/u02/mydb/oradata/oracl/control01.ctl','/u02/mydb/oradata/oracl/control02.ctl','/u02/mydb/oradata/oracl/control03.ctl'

*.core_dump_dest='/u02/mydb/oracl/cdump'

*.db_recovery_file_dest='/u02/mydb/flash_recovery_area'

*.user_dump_dest='/u02/mydb/oracl/udump'

7.使用编辑好的参数文件启动数据库到nomount状态并恢复控制文件

SQL> startup nomount pfile=/u01/app/oracle/product/10.2.0/db_1/dbs/initoracl.ora

ORACLE instance started.

Total System Global Area 1048576000 bytes

Fixed Size 1223368 bytes

Variable Size 310379832 bytes

Database Buffers 734003200 bytes

Redo Buffers 2969600 bytes

SQL>

恢复控制文件

RMAN> restore controlfile from '/u02/ftp/full_backup_20120628_36';

Starting restore at 29-JUN-12

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=155 devtype=DISK

channel ORA_DISK_1: restoring control file

channel ORA_DISK_1: restore complete, elapsed time: 00:00:05

output filename=/u02/mydb/oradata/oracl/control01.ctl

output filename=/u02/mydb/oradata/oracl/control02.ctl

output filename=/u02/mydb/oradata/oracl/control03.ctl

Finished restore at 29-JUN-12

跟参数文件一样,在备份数据的时候会默认备份了控制文件,备份集full_backup_20120628_36中包含了控制文件,同样可以在原库使用list backup查看,list backup输出部分内容如下:

BS Key Type LV Size Device Type Elapsed Time Completion Time

------- ---- -- ---------- ----------- ------------ ---------------

34 Full 6.98M DISK 00:00:02 28-JUN-12

BP Key: 34 Status: AVAILABLE Compressed: NO Tag: TAG20120628T184555

Piece Name: /u02/rman_backup/full_backup/full_backup_20120628_36

Control File Included: Ckp SCN: 1545845 Ckp time: 28-JUN-12

8.启动数据库到mount状态并注册备份集

RMAN> alter database mount;

database mounted

released channel: ORA_DISK_1

注册备份集,因为控制文件中的保留的备份信息是原库的,我们这里需要重新注册新库路径下的备份集

RMAN> catalog start with '/u02/ftp/';

Starting implicit crosscheck backup at 29-JUN-12

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=155 devtype=DISK

Crosschecked 29 objects

Finished implicit crosscheck backup at 29-JUN-12

Starting implicit crosscheck copy at 29-JUN-12

using channel ORA_DISK_1

Finished implicit crosscheck copy at 29-JUN-12

searching for all files in the recovery area

cataloging files...

no files cataloged

searching for all files that match the pattern /u02/ftp/

List of Files Unknown to the Database

=====================================

File Name: /u02/ftp/full_backup_20120628_35

File Name: /u02/ftp/full_backup_20120628_37

File Name: /u02/ftp/full_backup_20120628_34

File Name: /u02/ftp/arc_backup_20120628_38

File Name: /u02/ftp/arc_backup_20120628_40

File Name: /u02/ftp/full_backup_20120628_36

File Name: /u02/ftp/full_backup_20120628_31

File Name: /u02/ftp/full_backup_20120628_33

File Name: /u02/ftp/arc_backup_20120628_39

File Name: /u02/ftp/full_backup_20120628_32

File Name: /u02/ftp/full_backup_20120628_30

Do you really want to catalog the above files (enter YES or NO)? yes

cataloging files...

cataloging done

List of Cataloged Files

=======================

File Name: /u02/ftp/full_backup_20120628_35

File Name: /u02/ftp/full_backup_20120628_37

File Name: /u02/ftp/full_backup_20120628_34

File Name: /u02/ftp/arc_backup_20120628_38

File Name: /u02/ftp/arc_backup_20120628_40

File Name: /u02/ftp/full_backup_20120628_36

File Name: /u02/ftp/full_backup_20120628_31

File Name: /u02/ftp/full_backup_20120628_33

File Name: /u02/ftp/arc_backup_20120628_39

File Name: /u02/ftp/full_backup_20120628_32

File Name: /u02/ftp/full_backup_20120628_30

9.列出当前的所有数据文件

SQL> column name format a60;

SQL> select file# as "file/grp#", name from v$datafile;

file/grp# NAME

---------- ------------------------------------------------------------

1 /u01/app/oracle/oradata/oracl/system01.dbf';

2 /u01/app/oracle/oradata/oracl/undotbs01.dbf';

3 /u01/app/oracle/oradata/oracl/sysaux01.dbf';

4 /u01/app/oracle/oradata/oracl/users01.dbf';

5 /u01/app/oracle/oradata/oracl/hxl01.dbf';

6 /u01/app/oracle/oradata/oracl/hxl02.dbf';

7 /u01/app/oracle/oradata/oracl/hxl03.dbf';

8 /u01/app/oracle/oradata/oracl/hxl04.dbf';

9 /u01/app/oracle/oradata/oracl/hxl05.dbf';

10 /u02/app/oracle/oradata/oracl/hxl06.dbf';

11 /u02/app/oracle/oradata/oracl/hxl07.dbf';

file/grp# NAME

---------- ------------------------------------------------------------

12 /u02/app/oracle/oradata/oracl/hxl08.dbf';

13 /u02/app/oracle/oradata/oracl/hxl09.dbf';

14 /u02/app/oracle/oradata/oracl/hxl10.dbf';

可以看到,当前控制文件中记录的数据文件的路径是原来的路径,我们在做恢复的时候需要指向新的路径.

10.恢复数据库

RMAN> run{

set newname for datafile 1 to '/u02/mydb/oradata/oracl/system01.dbf';

set newname for datafile 2 to '/u02/mydb/oradata/oracl/undotbs01.dbf';

set newname for datafile 3 to '/u02/mydb/oradata/oracl/sysaux01.dbf';

set newname for datafile 4 to '/u02/mydb/oradata/oracl/users01.dbf';

set newname for datafile 5 to '/u02/mydb/oradata/oracl/hxl01.dbf';

set newname for datafile 6 to '/u02/mydb/oradata/oracl/hxl02.dbf';

set newname for datafile 7 to '/u02/mydb/oradata/oracl/hxl03.dbf';

set newname for datafile 8 to '/u02/mydb/oradata/oracl/hxl04.dbf';

set newname for datafile 9 to '/u02/mydb/oradata/oracl/hxl05.dbf';

set newname for datafile 10 to '/u02/mydb/oradata/oracl/hxl06.dbf';

set newname for datafile 11 to '/u02/mydb/oradata/oracl/hxl07.dbf';

set newname for datafile 12 to '/u02/mydb/oradata/oracl/hxl08.dbf';

set newname for datafile 13 to '/u02/mydb/oradata/oracl/hxl09.dbf';

set newname for datafile 14 to '/u02/mydb/oradata/oracl/hxl10.dbf';

restore database;

switch datafile all;

recover database;

}

11.打开数据库

alter database open resetlogs;

-- The End --
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: