暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle数据库日常管理方案

原创 逆风飞翔 2021-12-19
558

1.1.1.1. 查找前十条性能差的sql

SELECT * FROM (select PARSING_USER_ID,EXECUTIONS,SORTS,COMMAND_TYPE, DISK_READS,sql_text FROM v$sqlarea order BY disk_reads DESC )where ROWNUM<10 ;

1.1.1.2. 查询有enqueue等待的事件

SELECT   b.SID, b.serial#, b.username, machine, event, wait_time,CHR (BITAND (p1, -16777216) / 16777215) || CHR (BITAND (p1, 16711680) / 65535) "Enqueue Type" FROM v$session_wait a, v$session b   WHERE a.event NOT LIKE 'SQL*N%' AND a.event NOT LIKE 'rdbms%' AND a.SID = b.SID  AND b.SID > 8  AND a.event = 'enqueue' ORDER BY username;

 

1.1.1.3. 如何确定哪个表空间读写频繁

select name,phyrds,phywrts,readtim,writetim from v$filestat a,v$dbfile b where a.file#=b.file#  order by readtim desc;

 

SELECT s.sid, kglpnmod “Mode”, kglpnreq “Req”, SPID “OS Process” FROM v$session_wait w, x$kglpn p, v$session s ,v$process o WHERE p.kglpnuse=s.saddr AND kglpnhdl=w.p1raw and w.event like ‘%library cache pin%’ and s.paddr=o.addr;

1.1.1.4. 查询全表扫描的表

SQL> col name for a30

SQL> select name,value from v$sysstat    where name in ('table scans (short tables)','table scans (long tables)');

 

NAME                                VALUE

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

table scans (short tables)          18602

table scans (long tables)             111

 

SQL> select count(target),target from v$session_longops where opname = 'Table Scan' group by target;

 

COUNT(TARGET)  TARGET

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

           84 ECM_APPL.RPTLOG

          159 ECM_DCTM_OTHR.DMR_CONTENT_S

            9 ECM_DCTM_OTHR.DM_SYSOBJECT_R

            2 ECM_DCTM_OTHR.DM_SYSOBJECT_S

 

1.1.1.5. 查出全表扫描的表

Select sql_text from v$sqltext t, v$sql_plan p Where t.hash_value=p.hash_value And p.operation=’TABLE ACCESS’ And p.option=’FULL’ Order by p.hash-value, t.piece;

1.1.1.6. 查找Fast Full index 扫描的Sql语句可以这样:

Select sql_text from v$sqltext t, v$sql_plan p Where t.hash_value=p.hash_value And p.operation=’INDEX’ And p.option=’FULL SCAN’ Order by p.hash-value, t.piece;

1.1.1.7. 查询硬语法分析的次数

SQL> select name,value from v$sysstat where name like 'parse count%';

 

NAME                          VALUE

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

parse count (total)                 16103

parse count (hard)                    343

parse count (failures)                  5

该项显示buffer cache大小是否合适。

公式:1-((physical reads-physical reads direct-physical reads direct (lob)) / session logical reads)

执行:

select 1-((a.value-b.value-c.value)/d.value)  from v$sysstat a,v$sysstat b,v$sysstat c,v$sysstat d  where a.name=’physical reads’ and   b.name=’physical reads direct’ and         c.name=’physical reads direct (lob)’ and  d.name=’session logical reads’;

 

1.1.1.8. 显示buffer命中率

公式:1-(physical reads/ (db block gets+consistent gets))

执行:

select 1-(sum(decode(name,'physical reads',value,0)))/(sum(decode(name,'db block gets',value,0))+sum(decode(name,'consistent gets',value,0))) "buffer hit ratio" from v$sysstat;

 

Soft parse ratio:

这项将显示系统是否有太多硬解析。该值将会与原始统计数据对比以确保精确。例如,软解析率仅为0.2则表示硬解析率太高。不过,如果总解析量(parse count total)偏低,这项值可以被忽略。

公式:1 - ( parse count (hard) / parse count (total) )

执行:

select 1-(a.value/b.value)  from v$sysstat a,v$sysstat b  Where a.name='parse count (hard)' and b.name='parse count (total)';

 

In-memory sort ratio:该项显示内存中完成的排序所占比例。最理想状态下,在OLTP系统中,大部分排序不仅小并且能够完全在内存里完成排序。

公式:sorts (memory) / ( sorts (memory) + sorts (disk) )

执行:

select a.value/(b.value+c.value)  from v$sysstat a,v$sysstat b,v$sysstat c  where a.name=’sorts (memory)’ and b.name=’sorts (memory)’ and c.name=’sorts (disk)’;

 

Parse to execute ratio:在生产环境,最理想状态是一条sql语句一次解析多数运行。

公式:1 - (parse count/execute count)

执行:

select 1-(a.value/b.value) from v$sysstat a,v$sysstat b where a.name=’parse count (total)’ and b.name=’execute count’;

 

Parse CPU to total CPU ratio:该项显示总的CPU花费在执行及解析上的比率。如果这项比率较低,说明系统执行了太多的解析。

公式:1 - (parse time cpu / CPU used by this session)

执行:

select 1-(a.value/b.value)  from v$sysstat a,v$sysstat b  where a.name=’parse time cpu’ and   b.name=’CPU used by this session’;

 

Parse time CPU to parse time elapsed:通常,该项显示锁竞争比率。这项比率计算是否时间花费在解析分配给CPU进行周期运算(即生产工作)。解析时间花费不在CPU周期运算通常表示由于锁竞争导致了时间花费。

公式:parse time cpu / parse time elapsed

执行:

select a.value/b.value  from v$sysstat a,v$sysstat b  where a.name=’parse time cpu’ and b.name=’parse time elapsed’;

 

从V$SYSSTAT获取负载间档(Load Profile)数据负载间档是监控系统吞吐量和负载变化的重要部分,该部分提供如下每秒和每个事务的统计信息:logons cumulative, parse count (total), parse count (hard), executes, physical reads, physical writes, block changes, and redo size.

被格式化的数据可检查’rates’是否过高,或用于对比其它基线数据设置为识别system profile在期间如何变化。例如,计算每个事务中block changes可用如下公式:

db block changes / ( user commits + user rollbacks )

执行:

select a.value/(b.value+c.value)  from v$sysstat a,v$sysstat b,v$sysstat c  where a.name=’db block changes’ and  b.name=’user commits’ and c.name=’user rollbacks’;

 

其它计算统计以衡量负载方式,如下:

Blocks changed for each read:这项显示出block changes在block reads中的比例。它将指出是否系统主要用于只读访问或是主要进行诸多数据操作(如:inserts/updates/deletes)

公式:db block changes / session logical reads

执行:

select a.value/b.value  from v$sysstat a,v$sysstat b  where a.name=’db block changes’ and  b.name=’session logical reads’ ;

 

Rows for each sort:数据排序情况

公式:sorts (rows) / ( sorts (memory) + sorts (disk) )

执行:

select a.value/(b.value+c.value)  from v$sysstat a,v$sysstat b,v$sysstat c  where a.name=’sorts (rows)’ and   b.name=’sorts (memory)’ and c.name=’sorts (disk)’;

 

1.1.1.9. 查看某表的约束条件

select constraint_name, constraint_type,search_condition, r_constraint_name from user_constraints  where table_name = upper('&table_name');

 

select c.constraint_name,c.constraint_type,cc.column_name  from user_constraints c,user_cons_columns cc  where c.owner = upper('&table_owner') and c.table_name = upper('&table_name')   and c.owner = cc.owner and c.constraint_name = cc.constraint_name order by cc.position;

 

1.1.1.10. 查看表的信息

Select * from user_tables;

1.1.1.11. 查看表空间的名称及大小

select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size from dba_tablespaces t, dba_data_files d where t.tablespace_name = d.tablespace_name group by t.tablespace_name;

 

select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size  from dba_tablespaces t, dba_data_files d   where t.tablespace_name = d.tablespace_name group by t.tablespace_name;

 

TABLESPACE_NAME                   TS_SIZE

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

CWMLITE                                20

DRSYS                                  20

ODM                                    20

PERFSTAT                               99

SYSTEM                                400

 

1.1.1.12. 查看回滚段名称及大小

select segment_name, tablespace_name, r.status,  (initial_extent/1024) InitialExtent, (next_extent/1024) NextExtent,  max_extents, v.curext CurExtent  From dba_rollback_segs r, v$rollstat v  Where r.segment_id = v.usn(+)  order by segment_name ;

 

1.1.1.13. 移动一个表的多个分区

BEGIN

   FOR x IN (SELECT partition_name

               FROM user_tab_partitions

              WHERE table_name = ‘BIG_TABLE2′)

   LOOP

      EXECUTE IMMEDIATE  ‘alter table big_table2 move partition ‘|| x.partition_name;

   END LOOP;

END;

/

1.1.1.14. 查看LOCK

SELECT /*+ ORDERED USE_HASH(H,R) */

   H.SID HOLD_SID,

   R.SID WAIT_SID,

   decode(H.type,

           ”MR”, ”Media Recovery”,

           ”RT”, ”Redo Thread”,

           ”UN”, ”User Name”,

           ”TX”, ”Transaction”,

           ”TM”, ”DML”,

           ”UL”, ”PL/SQL User Lock”,

           ”DX”, ”Distributed Xaction”,

           ”CF”, ”Control File”,

           ”IS”, ”Instance State”,

           ”FS”, ”File Set”,

           ”IR”, ”Instance Recovery”,

           ”ST”, ”Disk Space Transaction”,

           ”TS”, ”Temp Segment”,

           ”IV”, ”Library Cache Invalidation”,

           ”LS”, ”Log Start or Switch”,

           ”RW”, ”Row Wait”,

           ”SQ”, ”Sequence Number”,

           ”TE”, ”Extend Table”,

           ”TT”, ”Temp Table”,

           H.type) type,

   decode(H.lmode,

           0, ”None”,         1, ”Null”,

           2, ”Row-S (SS)”,   3, ”Row-X (SX)”,

           4, ”Share”,        5, ”S/Row-X (SSX)”,

           6, ”Exclusive”,    to_char(H.lmode)) hold,

    decode(r.request,         0, ”None”,

           1, ”Null”,         2, ”Row-S (SS)”,

           3, ”Row-X (SX)”,   4, ”Share”,

           5, ”S/Row-X (SSX)”,6, ”Exclusive”,

           to_char(R.request)) request,

   R.ID1,R.ID2,R.CTIME

FROM VLOCK H,VLOCK R WHERE H.BLOCK = 1 AND R.BLOCK=0 and H.TYPE <> ”MR” AND R.TYPE <> ”MR”  AND H.ID1 = R.ID1 AND H.ID2 = R.ID2

 

1.1.1.15. 找ORACLE字符集

select * from sys.props$ where name='NLS_CHARACTERSET';

1.1.1.16. 查看ORACLE运行的OS平台

SQL> run

    begin

    dbms_output.put_line(dbms_utility.port_string);

    end;

   /

1.1.1.17. 查看空间详细使用情况

CREATE OR REPLACE PROCEDURE show_space (

   p_segname     IN   VARCHAR2,

   p_owner       IN   VARCHAR2 DEFAULT USER,

   p_type        IN   VARCHAR2 DEFAULT 'TABLE',

   p_partition   IN   VARCHAR2 DEFAULT NULL   )

AS

   l_total_blocks         NUMBER;

   l_total_bytes          NUMBER;

   l_unused_blocks        NUMBER;

   l_unused_bytes         NUMBER;

   l_lastusedextfileid    NUMBER;

   l_lastusedextblockid   NUMBER;

   l_last_used_block      NUMBER;

 PROCEDURE  p (p_label IN VARCHAR2, p_num IN NUMBER)

   IS

   BEGIN

      DBMS_OUTPUT.put_line (RPAD (p_label, 40, '.') || p_num);

   END;

BEGIN

   DBMS_SPACE.unused_space

               (segment_owner                  => p_owner,

                segment_name                  => p_segname,

                segment_type                   => p_type,

                partition_name                  => p_partition,

                total_blocks                    => l_total_blocks,

                total_bytes                     => l_total_bytes,

                unused_blocks                  => l_unused_blocks,

                unused_bytes                   => l_unused_bytes,

                last_used_extent_file_id         => l_lastusedextfileid,

                last_used_extent_block_id         => l_lastusedextblocki

  last_used_block                 => l_last_used_block

           );

   p ('Total Blocks', l_total_blocks);

   p ('Total Bytes', l_total_bytes);

   p ('Unused Blocks', l_unused_blocks);

   p ('Unused Bytes', l_unused_bytes);

   p ('Last Used Ext FileId', l_lastusedextfileid);

   p ('Last Used Ext BlockId', l_lastusedextblockid);

   p ('Last Used Block', l_last_used_block);

END;

/

1.1.1.18. 显示缓冲区的相关SQL

SELECT tch, file#, dbablk,

       CASE

          WHEN obj = 4294967295

             THEN 'rbs/compat segment'

ELSE (SELECT MAX ( '('|| object_type|| ') '|| owner|| '.'|| object_name) || DECODE (COUNT (*), 1, '', ' maybe!')  FROM dba_objects   WHERE data_object_id = x.obj)

       END what

FROM (SELECT tch,file#,dbablk,obj FROM x$bh WHERE state <> 0 ORDER BY tch DESC) x

WHERE ROWNUM <= 5;

 

1.1.1.19. 获取生成的根据文件名

select c.value ||'/' || d.instance_name || '_ora_' ||a.spid || '.trc' trace from v$process a,v$session b,v$parameter c,v$instance d where a.addr=b.paddr and b.audsid=userenv('sessionid') and c.name='user_dump_dest' ;

 

在v$session_longops视图中,sofar字段表示已经扫描的块数,totalwork表示总得需要扫描的块数,所以我们即可以对正在运行的长查询进行监控,比如在索引创建时,查看索引创建的进度,也可以查看系统中以往的长查询。

col opname format a32

col target_desc format a32

col perwork format a12

set lines 131

select sid,OPNAME,TARGET_DESC,sofar,TOTALWORK,trunc(sofar/totalwork*100,2)||'%' as perwork from v$session_longops where sofar!=totalwork;

 

set lines 121

set pages 999

col opname format a29

col target format a29

col target_desc format a12

col perwork format a12

col remain format 99

col start_time format a21

col sofar format 99999999

col totalwork format 99999999

col sql_text format a101

col bufgets format 99999999

 

select opname,target,to_char(start_time,'yy-mm-dd:hh24:mi:ss') start_time,elapsed_seconds elapsed,executions execs,buffer_gets/decode(executions,0,1,executions) bufgets,module,sql_text from v$session_longops sl,v$sqlarea sa where sl.sql_hash_value = sa.hash_value and upper(substr(module,1,4)) <> 'RMAN' and substr(opname,1,4) <> 'RMAN' and module <> 'SQL*Plus' and sl.start_time>trunc(sysdate) order by start_time;

1.1.1.20. IO事件监控

1. 监控事例的等待

select event,sum(decode(wait_Time,0,0,1)) "Prev",    sum(decode(wait_Time,0,1,0)) "Curr",count(*) "Tot" from v$session_Wait     group by event order by 4;

2. 回滚段的争用情况

select name, waits, gets, waits/gets "Ratio"     from v$rollstat a, v$rollname b     where a.usn = b.usn;

3. 监控表空间的 I/O 比例

select df.tablespace_name name,df.file_name "file",f.phyrds pyr,    f.phyblkrd pbr,f.phywrts pyw, f.phyblkwrt pbw    from v$filestat f, dba_data_files df    where f.file# = df.file_id    order by df.tablespace_name;

4. 监控文件系统的 I/O 比例

select substr(a.file#,1,2) "#", substr(a.name,1,30) "Name",     a.status, a.bytes, b.phyrds, b.phywrts     from v$datafile a, v$filestat b     where a.file# = b.file#;

1.1.1.21. 在某个用户下找所有的索引

select user_indexes.table_name, user_indexes.index_name,uniqueness, column_name from user_ind_columns, user_indexes where user_ind_columns.index_name=user_indexes.index_name and user_ind_columns.table_name = user_indexes.table_name order by user_indexes.table_type, user_indexes.table_name, user_indexes.index_name, column_position;

1.1.1.22. 监控 SGA 的命中率

select a.value + b.value "logical_reads", c.value "phys_reads", round(100* ((a.value+b.value)-c.value) / (a.value+b.value)) "BUFFER HIT RATIO" from v$sysstat a, v$sysstat b, v$sysstat c    where a.statistic# = 38 and b.statistic# = 39  and c.statistic# = 40;

1.1.1.23. 监控 SGA 中字典缓冲区的命中率   

select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 "miss ratio",    (1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio"    from v$rowcache     where gets+getmisses <>0    group by parameter, gets, getmisses;

 

监控 SGA 中共享缓存区的命中率,应该小于1%

select sum(pins) "Total Pins", sum(reloads) "Total Reloads",    sum(reloads)/sum(pins) *100 libcache    from v$librarycache;    select sum(pinhits-reloads)/sum(pins) "hit radio",sum(reloads)/sum(pins) "reload percent"     from v$librarycache;

 

显示所有数据库对象的类别和大小

  select count(name) num_instances ,type ,sum(source_size) source_size , sum(parsed_size) parsed_size ,sum(code_size) code_size ,sum(error_size) error_size, sum(source_size) +sum(parsed_size) +sum(code_size) +sum(error_size) size_required  from dba_object_size     group by type order by 2;

 

监控 SGA 中重做日志缓存区的命中率,应该小于1%   

SELECT name,gets,misses,immediate_gets, immediate_misses,Decode(gets,0,0,misses/gets*100) ratio1, Decode(immediate_gets+immediate_misses,0,0, immediate_misses/(immediate_gets+ immediate_misses)*100) ratio2  FROM v$latch WHERE name IN ('redo allocation', 'redo copy');

 

监控内存和硬盘的排序比率,最好使它小于 .10,增加 sort_area_size:

SELECT name, value FROM v$sysstat WHERE name IN ('sorts (memory)', 'sorts (disk)');

 

监控当前数据库谁在运行什么SQL语句

SELECT osuser, username, sql_text from v$session a, v$sqltext b where a.sql_address =b.address order by address, piece;

 

监控字典缓冲区

select (sum(pins - reloads)) / sum(pins) "lib cache" from v$librarycache;    select (sum(gets - getmisses - usage - fixed)) / sum(gets) "row cache" from v$rowcache;    select sum(pins) "executions", sum(reloads) "cache misses while executing" from v$librarycache;

后者除以前者,此比率小于1%,接近0%为好。

select sum(gets) "dictionary gets",sum(getmisses) "dictionary cache get misses"  from v$rowcache;

 

1.1.1.24. 监控 MTS

select busy/(busy+idle) "shared servers busy" from v$dispatcher;

此值大于0.5时,参数需加大。

select sum(wait)/sum(totalq) "dispatcher waits" from v$queue where type='dispatcher';

select count(*) from v$dispatcher;

select servers_highwater from v$mts;

servers_highwater接近mts_max_servers时,参数需加大

1.1.1.25. 碎片程度

select tablespace_name,count(tablespace_name) from dba_free_space group by tablespace_name     having count(tablespace_name)>10;

alter tablespace name coalesce;

alter table name deallocate unused;

create or replace view ts_blocks_v  as

select tablespace_name,block_id,bytes,blocks,'free space' segment_name from dba_free_space    union all

select tablespace_name,block_id,bytes,blocks,segment_name from dba_extents;

select * from ts_blocks_v;

select tablespace_name,sum(bytes),max(bytes),count(block_id) from dba_free_space  group by tablespace_name;

 

1.1.1.26. 查看碎片程度高的表

SELECT segment_name table_name , COUNT(*) extents FROM dba_segments WHERE owner NOT IN ('SYS', 'SYSTEM') GROUP BY segment_name HAVING COUNT(*) = (SELECT MAX( COUNT(*) ) FROM dba_segments GROUP BY segment_name);

 

1.1.1.27. 表、索引的存储情况检查

select segment_name,sum(bytes),count(*) ext_quan from dba_extents where tablespace_name ='&tablespace_name' and segment_type='TABLE' group by tablespace_name, segment_name;

select segment_name,count(*) from dba_extents where segment_type='INDEX' and owner='&owner'  group by segment_name;

 

1.1.1.28. 找使用CPU多的用户session

cpu used by this session:查找各回话连接的CPU使用率

select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value  from v$session a,v$process b,v$sesstat c  where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr order by value desc;

1.1.1.29. 寻找CPU使用过量的session

SELECT sql_text FROM v$sqltext a WHERE (a.hash_value, a.address) IN (SELECT decode(sql_hash_value, 0, prev_hash_value, sql_hash_value), decode(sql_hash_value, 0, prev_sql_addr, sql_address)  FROM v$session b WHERE b.paddr = (SELECT addr FROM v$process c  WHERE c.spid = '&pid'))  ORDER BY piece ASC;

 

1.1.1. 数据库巡检管理

1.1.1.1. 日常检测

1.1.1.1.1. 检测系统卷状态

df -k可以看到系统各个卷的使用情况; 如果文件系统的剩余空间小于 20% ,需删除不用的文件以释放空间。 或找系统管理员调整空间大小。

 

1.1.1.1.2. 检查表空间的使用情况

SELECT  tablespace_name, max_m, count_blocks free_blk_cnt, sum_free_m, to_char(100*sum_free_m/sum_m, '99.99') || '%' AS pct_free FROM ( SELECT tablespace_name, sum(bytes)/1024/1024  AS  sum_m FROM dba_data_files  GROUP BY  tablespace_name), ( SELECT tablespace_name AS fs_ts_name, max(bytes)/1024/1024 AS max_m, count(blocks)  AS  count_blocks, sum(bytes/1024/1024)  AS  sum_free_m FROM dba_free_space GROUP BY tablespace_name )  WHERE  tablespace_name = fs_ts_name:

 

select sum(bytes)/(1024*1024) as free_space,tablespace_name  from dba_free_space  group by tablespace_name;

1.1.1.1.3. 检测表空间状态

DBA_FREE_SPACE是数据库的一个视图,可以看到数据库的空间使用信息。

SELECT tablespace_name ,sum(bytes)/1024/1024 "MB Free" FROM dba_free_space WHERE tablespace_name <>'TEMP' GROUP BY tablespace_name;

 

1.1.1.1.4. 检测Oracle运行状态

ORACLE的状态可以通确认所有的 INSTANCE 状态正常

登陆到所有数据库或例程 , 检测 ORACLE 后台进程:

$ps –ef|grep ora来查看;

 

1.1.1.1.5. 检查数据库版本信息

sqlplus  “/ as sysdba”

select * from v$version;

 

1.1.1.1.6. 检查日志文件和 trace 文件记录 alert 和 trace 文件中的错

连接到每个需管理的系统,使用' telnet '登陆,对每个数据库 ,cd 到 bdump 目录 , 通常是 $ORACLE_BASE/<SID>/bdump,使用 Unix ‘tail' 命令来查看 alert_<SID>.log 文件,如果发现任何新的 ORA- 错误 , 记录并解决。

 

1.1.1.1.7. 查看会话挂起情况

关闭不必要的会话

命令如下:

select sid,serial#,username,program,machine,status from v$session;

手工断开某个会话,则执行:

alter system kill session 'SID,SERIAL#';

 

1.1.1.1.8. 检查数据库当日备份的有效性

对 RMAN 备份方式:

检查第三方备份工具的备份日志以确定备份是否成功

对 EXPORT 备份方式:

检查 exp 日志文件以确定备份是否成功。

对其他备份方式:

检查相应的日志文件。

1.1.1.1.9. 检查数据文件的状态记录状态

不是“ online” 的数据文件需做恢复。

Select file_name from dba_data_files where status='OFFLINE';

1.1.1.2. 定期检测

1.1.1.2.1. 系统健康检查

检查以下内容:

init<sid>.ora

controlfile

redo log file

archiving

sort area size

tablespace(system,temporary,tablespace fragment)

datafiles(autoextend,location)

object(number of extent,next extent,index)

rollback segment

logging &tracing(alert.log,max_dump_file_size,sqlnet)

1.1.1.2.2. 检查无效的数据库对象

SELECT owner, object_name, object_type FROM dba_objects WHERE status= ' INVALID ';

1.1.1.2.3. 检查不起作用的约束

SELECT owner, constraint_name, table_name, constraint_type, status FROM dba_constraints WHERE status = 'DISABLED' AND constraint_type = 'P';

1.1.1.2.4. 检查无效的 trigger

select owner,trigger_name,table_name,status from dba_triggers where status= 'DISABLED';

1.1.1.3. Oracle数据库巡检样本

1. ORACLE 数据库常规检查

1. ORACLE 常规检查

Database Overview

DB Name

ORCL

Global Name

ORCL.REGRESS.RDBMS.DEV.US.ORACLE.COM

Host Name

Localhost

Instance Name

Orcl

Instance Start Time

18-Nov-2008 14:14:01

Restricted Mode

NO

Archive Log Mode

ARCHIVELOG

V$Version

Banner

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi

PL/SQL Release 10.2.0.1.0 – Production

CORE 10.2.0.1.0 Production

TNS for Linux: Version 10.2.0.1.0 – Production

NLSRTL Version 10.2.0.1.0 – Production

2.基本参数配置

Parameter Name

Value

Modified

audit_file_dest

/oracle/admin/orcl/adump

FALSE

background_dump_dest

/oracle/admin/orcl/bdump

FALSE

Compatible

10.2.0.1.0

FALSE

control_files

/oracle/oradata/orcl/control01.ctl, /oracle/oradata/orcl/control02.ctl, /oracle/oradata/orcl/control03.ctl

FALSE

core_dump_dest

/oracle/admin/orcl/cdump

FALSE

db_block_size

8192

FALSE

db_domain

Null value

FALSE

db_file_multiblock_read_count

16

FALSE

db_name

Orcl

FALSE

db_recovery_file_dest

/oracle/flash_recovery_area

FALSE

db_recovery_file_dest_size

21474836480

FALSE

Dispatchers

(PROTOCOL=TCP) (SERVICE=orclXDB)

FALSE

job_queue_processes

6

FALSE

log_archive_dest_1

location=/oracle/backupArchivelog

FALSE

log_archive_dest_10

location=use_db_recovery_file_dest

FALSE

log_archive_min_succeed_dest

2

FALSE

open_cursors

300

FALSE

pga_aggregate_target

819986432

FALSE

Processes

150

FALSE

remote_login_passwordfile

EXCLUSIVE

FALSE

sga_target

2147483648

FALSE

statistics_level

TYPICAL

FALSE

timed_statistics

TRUE

FALSE

undo_management

AUTO

FALSE

undo_tablespace

UNDOTBS1

FALSE

user_dump_dest

/oracle/admin/orcl/udump

 

3.ORACLE 用户配置文件

 #vi .profile

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

        . ~/.bashrc

fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

unset USERNAME

#for oracle

export ORACLE_SID=orcl

export ORACLE_BASE=/oracle

export ORACLE_HOME=/oracle/10g

export PATH=$ORACLE_HOME/bin:$PATH

export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

2. 数据库关键性能检查及分析

1 数据库性能检查

DB Block Buffer Hit Ratio

99.99%

OLTP环境下,命中率应该高于90%,否则需要增加DB_BLOCK_BUFFERS以提高性能

Library Cache Hit Ratio

99.56%

该命中率用于提供Shared SQL Buffers性能。应该高于95%

Soft Parse

98.55 %

软解析率 应该高于95%

In-memory Sort

100 %

此为排序操作,如果指标值过低说明过多的排序操作影响了性能,建议进行SQL优化

Execute to Parse 

73.10 %

执行分析比率,不应该低于0 否则shared poll 可能有问题

Parse CPU to Parse Elapsd 

94.20 %

这2项值代表了解析所用的cpu时间,Parse CPU to Parse Elapsd 不到100%说明有有其他问题影响了,解析时间并不是全部都消耗在cpu上

Non-Parse CPU

95.34 %

2 数据库响应时间分析

 响应时间是非常重要的数据库性能指标,

 Top 5 Timed Events

Event

Waits

Time(s)

Avg Wait(ms)

% Total Call Time

Wait Class

CPU time

 

1,454

 

92.0

 

RMAN backup & recovery I/O

25,006

461

18

29.1

System I/O

os thread startup

8,672

459

53

29.0

Concurrency

log file parallel write

148,211

245

2

15.5

System I/O

control file parallel write

192,426

223

1

14.1

System I/O

从以上信息可以看出,RMAN备份占用的大量的时间

3. 备份恢复策略检查和维护

1.RMAN 配置情况

  RMAN configuration parameters are:

CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;

CONFIGURE BACKUP OPTIMIZATION ON;

CONFIGURE DEFAULT DEVICE TYPE TO DISK;

CONFIGURE CONTROLFILE AUTOBACKUP ON;

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'orclcongrol_%F';

CONFIGURE DEVICE TYPE DISK PARALLELISM 2 BACKUP TYPE TO COMPRESSED BACKUPSET;

CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

CONFIGURE CHANNEL 1 DEVICE TYPE DISK MAXPIECESIZE 100 M MAXOPENFILES 8 RATE 40 M;

CONFIGURE CHANNEL 2 DEVICE TYPE DISK MAXPIECESIZE 100 M MAXOPENFILES 8 RATE 40 M;

CONFIGURE MAXSETSIZE TO UNLIMITED; # default

CONFIGURE ENCRYPTION FOR DATABASE OFF; # default

CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default

CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default

CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/oracle/10g/dbs/snapcf_orcl.f'; # default

2.备份策略描述

 选用RMAN 多级备份策略,以每个星期作为一个周期

    星期1     数据库全备  0级

    星期2     增量备份    1级

    星期3     增量备份    1级

    星期4     累积增量备份 1c级

    星期5     数据库全备  0级

    星期6     增量备份    1级

    星期天     增量备份    1级

基于以上策略,任何时间点的数据恢复只需要做最多1次0级恢复和2次1级恢复.加上 当日的归档日志可以实现快速的完全恢复

3.备份策略实施

  Cat /etc/crontab

  SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/

 

# run-parts

01 * * * * root run-parts /etc/cron.hourly

02 4 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

 

00 4 * * 1 oracle /oracle/scripts/rman/backupweek1.cmd &

00 4 * * 2 oracle /oracle/scripts/rman/backupweek2.cmd &

00 4 * * 3 oracle /oracle/scripts/rman/backupweek3.cmd &

00 4 * * 4 oracle /oracle/scripts/rman/backupweek4.cmd &

00 4 * * 5 oracle /oracle/scripts/rman/backupweek5.cmd &

00 4 * * 6 oracle /oracle/scripts/rman/backupweek6.cmd &

00 4 * * 7 oracle /oracle/scripts/rman/backupweek7.cmd &

4.备份检查 和每日备份脚本日志检查

  使用crosscheck backupset 检查。所有备份集的备份片都为  AVAILABLE

  每日脚本日志输出正常,使用report obsolete 检查并无过期的备份信息。

5.对当前策略的总结

  当前脚本能正常准时完成每日制定的备份策略,总体运行情况良好。备份集信息完整,并且包含了归档日志,逻辑检查完好,可以正常执行恢复。

4. 关键性SQL语句定位及分析

  SQL>select rownum,d.* from 

(select hash_value,disk_reads,executions,buffer_gets,ROWS_PROCESSED from v$sqlarea b order by b.disk_reads desc ) d where rownum<11;

    ROWNUM HASH_VALUE DISK_READS EXECUTIONS BUFFER_GETS ROWS_PROCESSED

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

         1  909091134       4140          1       12108              7

         2 4260389146       1189       2327       16113           5306

         3 1088876619        692          1      227543           2276

         4 3543108934        505          1        6824              0

         5 1684122946        361       2327        7489           1423

         6 2812844157        199       8038       76429          24673

         7 1292502613        188       1190      128012           1190

         8 3993603298        168       8038       58649          21285

         9  864012087        134      19393       55468          16090

        10 2328831744        133       2327        9237           2504

SQL> select sql_text from v$sqltext where hash_value=&1 order by piece;

5. 近期警告日志及相关分析

1.orcl_ora_8727.trc

 

-rw-r----- 1 oracle dba 944  Dec  6 20:00 2008  Dec  6 20:00 2008  orcl_ora_8727.trc

/oracle/admin/orcl/udump/orcl_ora_8727.trc

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production

With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options

ORACLE_HOME = /oracle/10g

System name: Linux

Node name: localhost

Release: 2.6.9-34.ELsmp

Version: #1 SMP Fri Feb 24 16:56:28 EST 2006

Machine: x86_64

Instance name: orcl

Redo thread mounted by this instance: 1

Oracle process number: 21

Unix process pid: 8727, image: oracle@localhost (TNS V1-V3)

 

*** 2008-12-07 04:00:28.002

*** ACTION NAME:(0000221 STARTED111) 2008-12-07 04:00:28.001

*** MODULE NAME:(backup archivelog) 2008-12-07 04:00:28.001

*** SERVICE NAME:(SYS$USERS) 2008-12-07 04:00:28.001

*** SESSION ID:(157.7513) 2008-12-07 04:00:28.001

*** ACTION NAME:(0000244 STARTED16) 2008-12-07 04:00:32.421

*** MODULE NAME:(backup full datafile) 2008-12-07 04:00:32.421

*** ACTION NAME:(0000248 STARTED111) 2008-12-07 04:00:33.703

 

2 orcl_ora_8727.trc

-rw-r----- 1 oracle dba 944  Dec  6 20:00 2008  Dec  6 20:00 2008  orcl_ora_8727.trc

/oracle/admin/orcl/udump/orcl_ora_8727.trc

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production

With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options

ORACLE_HOME = /oracle/10g

System name: Linux

Node name: localhost

Release: 2.6.9-34.ELsmp

Version: #1 SMP Fri Feb 24 16:56:28 EST 2006

Machine: x86_64

Instance name: orcl

Redo thread mounted by this instance: 1

Oracle process number: 21

Unix process pid: 8727, image: oracle@localhost (TNS V1-V3)

 

*** 2008-12-07 04:00:28.002

*** ACTION NAME:(0000221 STARTED111) 2008-12-07 04:00:28.001

*** MODULE NAME:(backup archivelog) 2008-12-07 04:00:28.001

*** SERVICE NAME:(SYS$USERS) 2008-12-07 04:00:28.001

*** SESSION ID:(157.7513) 2008-12-07 04:00:28.001

*** ACTION NAME:(0000244 STARTED16) 2008-12-07 04:00:32.421

*** MODULE NAME:(backup full datafile) 2008-12-07 04:00:32.421

*** ACTION NAME:(0000248 STARTED111) 2008-12-07 04:00:33.703

 

总结,可以发现,2个警告日志都是对数据库进行全备份产生的,并无其他的警告日志。

6. 小结

   整个数据库运行情况良好,响应时间较为稳定,备份策略能很好的执行并且运行正常,各备份集信息完整。整个数据库得到有效的保护。

 

1.1.2. 数据库备份与恢复

数据库备份恢复管理原则:

经常同步恢复目录

确认删除不需要的归档日志

备份策略简单原则

Oracle的备份与恢复有三种标准的模式,大致分为两大类:备份恢复(物理上的)以及导入导出(逻辑上的),而备份恢复又可以根据数据库的工作模式分为非归档模式(Nonarchivelog-style)和归档模式(Archivelog-style),通常,我们把非归档模式称为冷备份,而相应的把归档模式称为热备份,他们的关系如下所示:

 

三种方式各有优点,如下表:

比较

逻辑备份

物理备份

导入和导出

冷备份

热备份

优点

能够针对对象进行备份,能够跨平台进行数据备份工作,可以不需要关闭数据库。

备份和恢复速度快,执行效率高,具有高安全、低维护的优点。

可以根据日志恢复到上一秒的操作,不需要关闭数据库。

缺点

导出方式并不能防止介质上的失效,它只是一种逻辑上的备份。

单独使用时,只能恢复某一时间点的数据,不能按照表和按用户来恢复。而且必须关闭数据库。

过程教其他方法复杂,需要不小空间存放归档文件,操作不允许失误,否则恢复不能进行。

使用时机

一般用于有规律的日常备份。

数据库可以暂时关闭或者需要配合热备份使用。

数据访问量小或需要更精确备份以及需要备份表空间和库文件

1.1.2.1. 逻辑备份恢复方式

利用Export可将数据从数据库中提取出来,利用Import则可将提取出来的数据送回到Oracle数据库中去。

理论基础:Oracle提供的Export和Import具有三种不同的操作方式(就是备份的数据输出(入)类型):

表方式(T)        可以将指定的表导出备份;

全库方式(Full)    将数据库中的所有对象导出;

用户方式(U)      可以将指定的用户相应的所有数据对象导出;

在导入导出备份方式中,提供了很强大的一种方法,就是增量导出/导入,但是它必须作为System来完成增量的导入导出,而且只能是对整个数据库进行实施。增量导出又可以分为三种类别:

完全增量导出(Complete Export):

这种方式将把整个数据库文件导出备份;exp system/manager inctype=complete file=20041125.dmp(为了方便检索和事后的查询,通常我们将备份文件以日期或者其他有明确含义的字符命名)

增量型增量导出(Incremental Export):

这种方式将只会备份上一次备份后改变的结果。

exp system/manager inctype=incremental file=20041125.dmp

累积型增量导出(Cumulate Export):

这种方式的话,是导出自上次完全增量导出数据库变化的信息。

exp system/manager inctype=cumulative file=20041125.dmp

通常情况下,DBA们所要做的,就是按照企业指定或者是自己习惯的标准(如果是自己指定的标准,建议写好计划说明),一般,我们采用普遍认可的下面的方式进行每天的增量备份:

Mon: 完全备份(A)

Tue:  增量导出(B)

Wed: 增量导出(C)

Thu: 增量导出(D)

Fri:  累计导出(E)

Sat:  增量导出(F)

Sun:  增量导出(G)

这样,我们可以保证每周数据的完整性,以及恢复时的快捷和最大限度的数据损失。恢复的时候,假设事故发生在周末,DBA可按这样的步骤来恢复数据库:

第一步:用命令CREATE DATABASE重新生成数据库结构;

第二步:创建一个足够大的附加回滚。

第三步:完全增量导入A:

imp system/manager inctype=RESTORE FULL=y FILE=A

第四步:累计增量导入E:

imp system/manager inctype=RESTORE FULL=Y FILE=E

第五步:最近增量导入F:

imp system/manager inctype=RESTORE FULL=Y FILE=F

通常情况下,DBA所要做的导入导出备份就算完成,只要科学的按照规律作出备份,就可以将数据的损失降低到最小,提供更可靠的服务。另外,DBA最好对每次的备份做一个比较详细的说明文档,使得数据库的恢复更加可靠。

1.1.2.2. 物理冷备份恢复

执行数据库物理冷备份恢复要求数据库使用的是文件系统模式,而不能是裸设备方式,因为冷备份管理的是基于操作系统的文件系统的。当数据库可以暂时处于关闭状态时,我们需要将它在这一稳定时刻的数据相关文件转移到安全的区域,当数据库遭到破坏,再从安全区域将备份的数据库相关文件拷贝回原来的位置,这样,就完成了一次快捷安全等数据转移。由于是在数据库不提供服务的关闭状态,所以称为冷备份。冷备份具有很多优良特性,比如上面图中我们提到的,快速,方便,以及高效。一次完整的冷备份步骤应该是:

首先关闭数据库(shutdown normal)

拷贝相关文件到安全区域(利用操作系统命令拷贝数据库的所有的数据文件、日志文件、控制文件、参数文件、口令文件等(包括路径))

重新启动数据库(startup)

以上的步骤我们可以用一个脚本来完成操作:

#su – oracle <      sqlplus /nolog

Sql>connect / as sysdba

Sql>shutdown immediate;

Sql>!cp 文件   备份位置(所有的日志、数据、控制及参数文件);

Sql>startup;

Sql>exit;

 这样,我们就完成了一次冷备份,请确定你对这些相应的目录(包括写入的目标文件夹)有相应的权限。恢复的时候,相对比较简单了,我们停掉数据库,将文件拷贝回相应位置,重启数据库就可以了,当然也可以用脚本来完成。

恢复数据库则很简单,如上述操作的命令一样,先停止数据库,删除或改名异常的数据库文件,然后拷贝备份的数据库文件到数据库运行位置,最后启动数据库即可完成。注意一点就是恢复的内容和备份的内容一样,包括数据库数据文件、日志文件、控制文件、参数文件、口令文件等。

1.1.2.3. 物理热备份恢复

当我们需要做一个精度比较高的备份,而且我们的数据库不可能停掉(少许访问量)时,这个情况下,我们就需要归档方式下的备份,就是下面讨论的热备份。热备份可以非常精确的备份表空间级和用户级的数据,由于它是根据归档日志的时间轴来备份恢复的,理论上可以恢复到前一个操作,甚至就是前一秒的操作。具体步骤如下:

通过视图v$database,

查看数据库是否在Archive模式下:       

SQL> select log_mode from v$database;

如果不是Archive模式则设定数据库运行于归档模式下:

SQL>shutdown immediate

SQL>startup mount

SQL> alter database archivelog;

SQL> alter database open;

如果Automaticarchival显示为“Enabled”,则数据库归档方式为自动归档。否则需要手工归档,或者将归档方式修改为自动归档,如:

正常shutdown数据库,在参数文件中init.ora中加入如下参数

SQL>shutdown immediate

修改init.ora:

LOG_ARCHIVE_START=TRUE

LOG_ARCHIVE_DEST1=ORACLE_HOME/admin/o816/arch(归档日值存放位置可以自己定义)

SQL>startup

然后,重新启动数据库,此时Oracle数据库将以自动归档的方式工作在Archive模式下。其中参数LOG_ARCHIVE_DEST1是指定的归档日志文件的路径,建议与Oracle数据库文件存在不同的硬盘,一方面减少磁盘I/O竞争,另外一方面也可以避免数据库文件所在硬盘毁坏之后的文件丢失。归档路径也可以直接指定为磁带等其它物理存储设备,但可能要考虑读写速度、可写条件和性能等因素。

注意:当数据库处在ARCHIVE模式下时,一定要保证指定的归档路径可写,否则数据库就会挂起,直到能够归档所有归档信息后才可以使用。另外,为创建一个有效的备份,当数据库在创建时,必须履行一个全数据库的冷备份,就是说数据库需要运行在归档方式,然后正常关闭数据库,备份所有的数据库组成文件。这一备份是整个备份的基础,因为该备份提供了一个所有数据库文件的拷贝。(体现了冷备份与热备份的合作关系,以及强大的能力)

1.1.2.3.1. 备份表空间文件:

修改表空间文件为备份模式  ALTER TABLESPACE tablespace_name     BEGIN BACKUP;

拷贝表空间文件到安全区域 !CP tablespace_name D_PATH;

将表空间的备份模式关闭    ALTER TABLESPACE tablespace_name END BACKUP;

3,对归档日志文件的备份:

停止归档进程-->备份归档日志文件-->启动归档进程

如果日志文档比较多,我们将它们写入一个文件成为一个恢复的参考:$   files `ls <归档文件路径>/arch*.dbf`;export files

1.1.2.3.2. 备份控制文件:

SQL> alter database backup controlfile to 'controlfile_back_name(一般用2004-11-20的方式)' reuse;

当然,我们也可以将上面的语句写为一个脚本,在需要的时候执行就可以了.

脚本范例:

#su – oracle <  sqlplus /nolog

Sql>connect / as sysdba

Sql>ALTER TABLESPACE tablespace_name BEGIN BACKUP

Sql>!CP tablespace_name D_PATH

sql>ALTER TABLESPACE tablespace_name END BACKUP

sql>alter database backup controlfile to 'controlfile_back_name(一般用2004-11-20的方式)' reuse;!files `ls <归档文件路径>/arch*.dbf`;export files

1.1.2.3.3. 热备份的恢复

对于归档方式数据库的恢复要求不但有有效的日志备份还要求有一个在归档方式下作的有效的全库备份。归档备份在理论上可以无数据丢失,但是对于硬件以及操作人员的要求都比较高。在我们使用归档方式备份的时候,全库物理备份也是非常重要的。归档方式下数据库的恢复要求从全备份到失败点所有的日志都要完好无缺。

恢复步骤:LOG_ARCHIVE_DEST_1

shutdown数据库。

将全备份的数据文件放到原来系统的目录中。

将全备份到失败点的所有归档日志放到参数LOG_ARCHIVE_DEST_1所指定的位置。

利用sqlplus登陆到空实例。(connect / as sysdba)

然后  startup mount

set autorecovery on

recover database;

alter database open;

1.1.2.4. RMAN方式备份恢复

1.1.2.4.1. 建立恢复目录

第一步,在目录数据库中创建恢复目录所用表空间:

SQL> create tablespace rman_ts datafile 'd:\oracle\oradata\rman\rman_ts.dbf' size 20M;

表空间已创建。

第二步,在目录数据库中创建RMAN 用户并授权:

SQL> create user rman identified by rman default tablespace rman_ts temporary tablespace temp quota unlimited on rman_ts;

用户已创建。

SQL> grant recovery_catalog_owner to rman ;

授权成功。

SQL> grant connect, resource to rman ;

授权成功。

第三步,在目录数据库中创建恢复目录

C:\>rman catalog rman/rman

恢复管理器:版本8.1.6.0.0 - Production

RMAN-06008:连接到恢复目录数据库

RMAN-06428:未安装恢复目录

RMAN>create catalog tablespace rman_ts;

RMAN-06431:恢复目录已创建

注意:虽然使用RMAN不一定必需恢复目录,但是推荐使用。因为恢复目录记载的信息大部分可以通过控制文件来记载,RMAN在恢复数据库时使用这些信息。不使用恢复目录将会对备份恢复操作有限制。

1.1.2.4.2. 启动RMAN

RMAN为交互式命令行处理界面,也可以从企业管理器中运行。

为了使用下面的实例,先检查环境符合:

the target database is called "his" and has the same TNS alias user rman has been granted "recovery_catalog_owner "privileges

目标数据库的连接用户为internal帐号,或者以其他SYSDBA类型帐号连接

the recovery catalog database is called "rman" and has the same TNS alias the schema containing the recovery catalog is "rman" (same password)

在使用RMAN前,设置NLS_DATE_FORMAT 和NLS_LANG环境变量,很多RMAN LIST命令的输出结果是与日期时间相关的,这点在用户希望执行以时间为基准的恢复工作也很重要。

下例是环境变量的示范:

NLS_LANG= SIMPLIFIED CHINESE_CHINA.ZHS16GBK

NLS_DATE_FORMAT=DD-MON-YYYY HH24:MI:SS

为了保证RMAN使用时能连接恢复目录,恢复目录数据库必须打开,目标数据库至少要STARTED(unmount),否则RMAN会返回一个错误,目标数据库必须置于归档模式下。

(1)使用不带恢复目录的RMAN

设置目标数据库的 ORACLE_SID ,执行:

% rman nocatalog

RMAN> connect target

RMAN> connect target internal/<password>@his

(2).使用带恢复目录的RMAN

% rman rman_ts rman/rman@rman

RMAN> connect target

% rman rman_ts rman/rman@rman target internal/<password>@his

(3).使用RMAN

  一旦连接到目标数据库,可以通过交互界面或者事先存储的脚本执行指定RMAN命令, 下面是一个使用RMAN交互界面的实例:

RMAN> resync catalog;

RMAN-03022:正在编译命令:resync

RMAN-03023:正在执行命令:resync

RMAN-08002:正在启动全部恢复目录的 resync

RMAN-08004:完成全部 resync

使用脚本的实例:

RMAN> execute script alloc_1_disk;

  创建或者替代存储的脚本:

RMAN> replace script alloc_1_disk {

2> allocate channel d1 type disk;

3> }

1.1.2.4.3. 注册或者注销目标数据库

注册目标数据库

数据库状态:打开

恢复目录状态:打开

目标数据库:加载或者打开

目标数据库在第一次使用RMAN之前必须在恢复目录中注册:

第一步,启动恢复管理器,并且连接目标数据库:

C:\>rman target internal/oracle@his catalog rman/rman@rman

  恢复管理器:版本8.1.6.0.0 - Production

RMAN-06005:连接到目标数据库:HIS (DBID=3021445076)

RMAN-06008:连接到恢复目录数据库

第二步,注册数据库:

RMAN> register database;

RMAN-03022:正在编译命令:register

RMAN-03023:正在执行命令:register

RMAN-08006:注册在恢复目录中的数据库

RMAN-03023:正在执行命令:full resync

RMAN-08002:正在启动全部恢复目录的resync

RMAN-08004:完成全部resync

(2)注销目标数据库

RMAN提供了一个注销工具,叫DBMS_RCVCAT工具包,请注意一旦注销了该目标数据库,就不可以使用恢复目录中含有的备份集来恢复数据库了。

为了能注销数据库,需要获得数据库的标识码(DB_ID)和数据库键值(DB_KEY)。其中连接目标数据库时将会获得DB_ID。

C:\>rman target internal/oracle@his catalog rman/rman@rman

恢复管理器:版本8.1.6.0.0 – Production

RMAN-06005:连接到目标数据库:HIS (DBID=3021445076)

RMAN-06008:连接到恢复目录数据库

其中DBID=3021445076,利用DBID=3021445076查询数据库键值码:

连接到目标数据库,查询db表:

SQL> select * from db;

DB_KEY DB_ID CURR_DBINC_KEY

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

1 3021445076 2

  获得DB_KEY=1,这样,该目标数据库DB_KEY=1,DBID=3021445076,利用两个值使用DBMS_RCVCAT工具包就可以注销数据库:

SQL> execute dbms_rcvcat.unregisterdatabase(1,3021445076);

PL/SQL 过程已成功完成。至此,注销数据库操作完成。

1.1.2.4.4. 操作已有的备份

(1).加入目录数据库

数据库状态:

恢复目录:打开

目标数据库:加载或者打开

  如果存在8.x版本以前创建的备份数据想注册到目标数据库,可以采用如下手工方式加入到恢复目录中。

RMAN> catalog datafilecopy '/oracle/ .... /system01.dbf';

使用如下命令显示恢复目录中包含的文件

RMAN> list copy of database;

(2).从目录数据库中删除

第一步:查看备份信息:

RMAN>list backup;

RMAN-03022:正在编译命令:list

备份集列表

关键字 Recid 标记 LV 集合标记 集合计数 完成时间

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

1104 2 501364455 0 501364446 2 06-8月 -03

备份段列表

关键字 Pc# Cp# 状态 完成时间 段名

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

1106 1 1 AVAILABLE 06-8月 -03 D:\ORACLE\ORA81\DATABASE\

02EU4DMU_1_1

数据文件包括列表

文件 名称 LV 类型 检查点SCN 检查点时间

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

3 D:\ORACLE\ORADATA\HIS\USERS01.DBF 0 Full 160052 06-8月 -03

 备份集的关键字为1104。

第二步:定义delete通道:

RMAN>allocate channel for delete type disk;

RMAN-03022:正在编译命令:allocate

RMAN-03023:正在执行命令:allocate

RMAN-08030:分配的通道:delete

RMAN-08500:通道 delete:sid=19 devtype=DISK

第三步:删除backupset备份集

RMAN>change backupset 1104 delete;

RMAN-03022:正在编译命令:change

RMAN-08073:已删除备份段

RMAN-08517:备份段 handle=D:\ORACLE\ORA81\DATABASE\02EU4DMU_1_1 recid=2 stamp=50

1364447

RMAN-03023:正在执行命令:partial resync

RMAN-08003:启动部分恢复目录的 resync

RMAN-08005:完成部分 resync

注意:部分执行删除备份集、备份片或者维护恢复目录的命令,需要先指定通道,如:RMAN>allocate channel for delete type disk;或者RMAN>allocate channel for maintenance type disk;

1.1.2.4.5. 在非归档模式下备份

数据库状态:

恢复目录: 打开

目标数据库:例程启动或者数据库加载

  恢复目录数据库需要打开,目标数据库必须启动(或者加载)。因为目标数据库不在归档模式下,所以当进行备份恢复操作的时候数据库无法打开。不可以将表空间置于热备份模式上进行等同于文件系统级的拷贝,如果在非归档模式,数据库打开的状态下不能进行数据文件的备份。

(1).数据库完全备份

RMAN> run {

2> # backup the complete database to disk

3> allocate channel dev1 type disk;

4> backup

5> full

6> tag full_db_backup

7> format '/oracle/backups/db_t%t_s%s_p%p'

8> (database);

9> release channel dev1;

10> }

行#: 表明该行为注释行(#是注释符)

3&9: See section 15 - Channels通道定义

5: Full backup (default if full or incremental not specified)完全备份模式(缺省模式)

6: Meaningful string (<=30 chars)(备份集标识,<=30个字符)

7: Filename to use for backup pieces, including substitution variables. 备份片使用的文件名,可以包含代替变量。

8: Indicates all files including controlfiles are to be backed up表明备份所有数据文件包括控制文件

通过下面的命令显示恢复目录中记载的备份集信息:

RMAN> list backupset of database;

(2).备份表空间

RMAN> run {

2> allocate channel dev1 type disk;

3> backup

4> tag tbs_users_read_only

5> format '/oracle/backups/tbs_users_t%t_s%s'

6> (tablespace users)

7> }

使用下列命令来显示恢复目录中该表的备份信息:

RMAN> list backupset of tablespace users;

  假设USERS表空间在备份后被置为READ ONLY表空间,以后的全库备份就可以不用备份该表空间,为了达到这个目的,可以在以后的备份中指定'skip readonly'。

  注意,目标数据库不需要一定打开,只要加载就可以,因为表空间的信息存储在控制文件中。

(3).备份单独数据文件

RMAN> run {

2> allocate channel dev1 type 'SBT_TAPE';

3> backup

4> format '%d_%u'

5> (datafile '/oracle/dbs/sysbigdb.dbf');

6> release channel dev1;

7> }

行#

2: 使用MML(media manager layer)分配磁带驱动器,必须指定类型为SBT_TAPE;

注意因为没有指定标识,所以标识为空;

使用下面的命令显示恢复目录中备份的表空间:

RMAN> list backupset of datafile 1;

(4).备份数据文件

RMAN> run {

2> allocate channel dev1 type 'SBT_TAPE';

3> copy datafile '/oracle/dbs/temp.dbf' to '/oracle/backups/temp.dbf';

4> release channel dev1;

5> }

  使用下面的命令显示恢复目录中的文件拷贝:

RMAN> list copy of datafile '/oracle/dbs/temp.dbf';

  拷贝数据文件和备份数据文件是不一样的,数据文件拷贝是一个该文件的镜像。文件的备份产生一个备份集。

(5).备份控制文件

RMAN> run {

2> allocate channel dev1 type 'SBT_TAPE';

3> backup

4> format 'cf_t%t_s%s_p%p'

5> tag cf_monday_night

6> (current controlfile);

7> release channel dev1;

8> } 注意:数据库完全备份将自动备份控制文件。

1.1.2.4.6. 归档模式下的备份

数据库状态:

恢复目录:打开

目标数据库:例程启动,数据库加载或者打开

备份操作使用的命令与非归档模式下基本一样。

(1). Backing up archived logs 备份归档日志

下面的脚本备份归档日志:

RMAN> run {

2> allocate channel dev1 type disk;

3> backup

4> format '/oracle/backups/log_t%t_s%s_p%p'

5> (archivelog all);

6> release channel dev1;

7> }

下面的脚本归档日志从# 90 to 100:

RMAN> run {

2> allocate channel dev1 type disk;

3> backup

4> format '/oracle/backups/log_t%t_s%s_p%p'

5> (archivelog from logseq=90 until logseq=100 thread 1);

6> release channel dev1;

7> }

  下面的脚本备份在24小时内产生的归档日志,在备份完成后会自动删除归档日志。如果备份失败,归档日志不会被删除。

RMAN> run {

2> allocate channel dev1 type disk;

3> backup

4> format '/oracle/backups/log_t%t_s%s_p%p'

5> (archivelog from time 'sysdate-1' all delete input);

6> release channel dev1;

7> }

  使用下面的命令显示恢复目录中的归档日志:

RMAN> list backupset of archivelog all;

  注意:RMAN找到归档日志后会备份指定日志,如果无法找到日志,它也不会返回错误信息。

(2). Backing up the online logs 备份联机日志

联机日志不能用RMAN来备份,必须先将其归档。

为了实现这点,必须在RMAN中执行如下SQL语句:

RMAN> run {

2> allocate channel dev1 type disk;

3> sql "alter system archive log current";

4> backup

5> format '/oracle/backups/log_t%t_s%s_p%p'

6> (archivelog from time 'sysdate-1' all delete input);

7> release channel dev1;

8> }

  上面的脚本可以在执行完一个完整的联机数据库备份后执行,确保所有的重做日志可以将数据库恢复到一个一致性的状态。

注意:不可以标识归档日志备份集。

1.1.2.4.7. 增量备份

N级别增量备份备份从最近的N级别或者更小级别以来的所有更改过的数据块内容。增量备份分为两种,一种是累积增量备份,一种是非累积增量备份。

累积增量备份包括自最后一次在更低级别进行备份以来所有改动过的数据块。

非累积增量备份包括自前一次在同级或者更低级别进行备份以来改动过的数据块。

(1). Level 0--增量备份策略的基础

Level 0 是增量备份策略的基础--the basis of the incremental backup strategy

RMAN> run {

2> allocate channel dev1 type disk;

3> backup

4> incremental level 0

5> filesperset 4

6> format '/oracle/backups/sunday_level0_%t'

7> (database);

8> release channel dev1;

9> }

Line#

4: 0级备份

5: 定义每个backupset 的最大文件数

使用LIST语句查看,数据库备份集的列表显示中, 'type' 将显示 'Incremental','LV'列将显示'0' 。

(2). 使用增量备份的案例

  一个典型的增量备份案例如下:

   星期天晚上 - level 0 backup performed

   星期一晚上 - level 2 backup performed

   星期二晚上 - level 2 backup performed

   星期三晚上 - level 1 backup performed

   星期四晚上 - level 2 backup performed

   星期五晚上 - level 2 backup performed

   星期六晚上 - level 2 backup performed

   星期天晚上 - level 0 backup performed

1.1.2.4.8. 恢复

恢复案例如下:

(1). Database open,datafile deleted 数据库打开时,文件被删除数据文件在数据库打开时被删除。有两种方法可以对打开的数据库进行恢复:还原数据文件或者表空间。下面两个实例显示了该方法:

  (a) Datafile recovery 数据文件恢复

RMAN> run {

2> allocate channel dev1 type disk;

3> sql "alter tablespace users offline immediate";

4> restore datafile 4;

5> recover datafile 4;

6> sql "alter tablespace users online";

7> release channel dev1;

8> }

(b) Tablespace recovery 表空间恢复

RMAN> run {

2> allocate channel dev1 type disk;

3> sql "alter tablespace users offline immediate";

4> restore tablespace users;

5> recover tablespace users;

6> sql "alter tablespace users online";

7> release channel dev1;

8> }

  注意:如果还原系统表空间文件,数据库必须关闭,因为系统表空间不可以脱机

(2). Complete restore (lost online redo) and rollforward - database closed 完全还原(丢失联机日志)并且前滚 - 数据库关闭

RMAN> run {

2> allocate channel dev1 type disk;

3> set until logseq=105 thread=1;

4> restore controlfile to '/oracle/dbs/ctrltargdb.ctl';

5> replicate controlfile from '/oracle/dbs/ctrltargdb.ctl';

6> restore database;

7> sql "alter database mount";

8> recover database;

9> sql "alter database open resetlogs";

10> release channel dev1;

11> }

  Notes:

  'set until' 命令指明恢复到指定的日志文件。这一点在数据文件恢复时很重要,否则RMAN将试图恢复最近的数据文件,该数据文件可能在指定的日志以前。 'replicate controlfile' 复制还原的控制文件到INIT.ORA指定的控制文件。

  如果数据库使用WITH RESETLOGS打开,则需要使用RESET DATABASE命令注册改变后的数据库。在使用RESETLOGS命令打开数据库后强烈建议做一个完全的数据库备份。

(3). 还原数据文件的子集,完全恢复

RMAN> run {

2> allocate channel dev1 type disk;

3> sql "alter database mount";

4> restore datafile 2;

5> restore datafile 3;

6> restore archivelog all;

7> recover database;

8> sql "alter database open";

9> release channel dev1;

10> }

1.1.2.4.9.  脚本

创建或者取代脚本:

RMAN> create script alloc_disk {

2> # Allocates one disk

3> allocate channel dev1 type disk;

4> setlimit channel dev1 kbytes 2097150 maxopenfiles 32 readrate 200;

5> }

RMAN> replace script rel_disk {

2> # releases disk

3> release channel dev1;

5> }

RMAN> replace script backup_db_full {

2> # Performs a complete backup

3> execute script alloc_disk;

4> backup

5> .....<backup commands here>

6> execute script rel_disk;

7> }

  前两个脚本分别用来分配和回收通道。

  alloc_disk 脚本还额外指定了备份片的最大兆字节数,备份时可以同时打开的输入文件的最大数目,以及每秒钟读每个输入文件的数据缓冲区的最大数目。第三个脚本调用先前存储的两个脚本进行数据库备份。

运行存储脚本的示范:

RMAN> run {

2> execute script backup_db_full;

3> }

  注意:存储的脚本必须在{ .... execute <script>; ....}命令中调用。

1.1.2.4.10.  Corruption detection

  RMAN可以备份包含损坏数据块的数据文件,查询视图V$BACK_CORRUPTION和V$COPY_CORRUPTION可以获得有关坏数据的信息。

  通过设置 set maxcorrupt 可以跳过指定个数的坏块来避免备份失败。

RMAN> replace script backup_db_full {

2> # Performs a complete backup

3> execute script alloc_disk;

4> set maxcorrupt for datafile 1 to 0;

5> backup

6> .....<backup commands here>

7> execute script rel_disk;

8> }

  上面的脚本maxcorrupt for datafile 1 to 0设置为0,所以如果有错误数据块在数据文件1中发现,上面的脚本执行就会失败。

1.1.2.4.11. 通道

  一个通道是RMAN和目标数据库之间的一个连接,'allocate channel'命令在目标数据库启动一个服务器进程,同时必须定义服务器进程执行备份或者恢复操作使用的I/O类型

   通道控制命令可以用来:

   控制RMAN使用的O/S资源

  影响并行度

   指定I/O带宽的限制值(设置limit read rate参数)

   定义备份片大小的限制(设置limit kbytes)

  指定当前打开文件的限制值(设置limit maxopenfiles)

1.1.2.4.12. Report & list commands

(1). List

list命令查询恢复目录并且产生格式化的查询内容:

RMAN> list backupset of datafile 1;

Key File Type LV Completion_time Ckp SCN Ckp Time

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

165 1  Full Oct 03 11:24 32022 Oct 03 11:24

208 1  Full Oct 24 14:27 52059 Oct 24 14:26

219 1  Full Oct 24 14:31 52061 Oct 24 14:31

<< other entries here >>

 

RMAN> list backupset of archivelog all;

 

Key Thrd Seq Completion time

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

179 1 94 Oct 03 11:26

179 1 95 Oct 03 11:26

<< other entries here >>

(2). Report

REPORT命令同样可以查询恢复目录,但是REPORT命令语法可以构建获得更为有用的信息的指令,REPORT命令输出可以保存到消息日志文件中,但是必须在连接恢复目录时指定MSGLOG或者LOG选项。

可以列出所有数据库中不能恢复的文件列表:

RMAN> report unrecoverable database;

显示全部数据文件:

RMAN>report schema;

RMAN-03022:正在编译命令:report

数据库模式报表

文件

千字节

表空间

RB segs 名称

1

121472

SYSTEM

YES D:\ORACLE\ORADATA\HIS\SYSTEM01.DBF

2

327680

RBS

YES D:\ORACLE\ORADATA\HIS\RBS01.DBF

3

110592

USERS

NO D:\ORACLE\ORADATA\HIS\USERS01.DBF

4

73728

TEMP

NO D:\ORACLE\ORADATA\HIS\TEMP01.DBF

5

12288

TOOLS

NO D:\ORACLE\ORADATA\HIS\TOOLS01.DBF

6

59392

INDX

NO D:\ORACLE\ORADATA\HIS\INDX01.DBF

 

1.1. 数据库物理结构故障处理

Oracle物理结构故障是指构成数据库的各个物理文件损坏而导致的各种数据库故障。这些故障可能是由于硬件故障造成的,也可能是人为误操作而引起。所以我们首先要判断问题的起因,如果是硬件故障则首先要解决硬件问题。在无硬件问题的前提下我们才能按照下面的处理方发来进一步处理。

1.1.1. 控制文件损坏

控制文件记录了关于oracle的重要配置信息,如数据库名、字符集名字、各个数据文件、日志文件的位置等等信息。控制文件的损坏,会导致数据库异常关闭。一旦缺少控制文件,数据库也无法启动,这是一种比较严重的错误。

可以通过查询数据库的日志文件来定位损坏了的控制文件。日志文件位于$ORACLE_BASE/admin/bdump/alert_ORCL.ora.

1.1.1.1. 损坏单个控制文件:

1. 确保数据库已经关闭,如果没有用下面的命令来关闭数据库:

svrmgrl>shutdown immediate;

2. 查看初始化文件$ORACLE_BASE/admin/pfile/initORCL.ora,确定所有控制文件的路径。

3. 用操作系统命令将其它正确的控制文件覆盖错误的控制文件。

4. 用下面的命令重新启动数据库

svrmgrl>startup;

5. 用适当的方法进行数据库全备份。

1.1.1.2. 损坏所有的控制文件:

1. 确保数据库已经关闭,如果没有用下面的命令来关闭数据库:

svrmgrl>shutdown immediate;

2. 从相应的备份结果集中恢复最近的控制文件。对于没有采用带库备份的点可以直接从磁带上将最近的控制文件备份恢复到相应目录;对于采用带库备份的点用相应的rman脚本来恢复最近的控制文件。

3. 用下面的命令来创建产生数据库控制文件的脚本:

svrmgrl>startup mount;

svrmgrl>alter database backup controlfile to trace noresetlogs;

4. 修改第三步产生的trace文件,将其中关于创建控制文件的一部分语句拷贝出来并做些修改,使得它能够体现最新的数据库结构。假设产生的sql文件名字为createcontrol.sql.

注意:

Trace文件的具体路径可以在执行完第3)步操作后查看$ORACLE_BASE/admin/bdump/alert_ORCL.ora文件来确定。

5. 用下面命令重新创建控制文件:

svrmgrl>shutdown abort;

svrmgrl>startup nomount;

svrmgrl>@createcontrol.sql;

6. 用适当的方法进行数据库全备份。

1.1.2. 重做日志文件损坏:

数据库的所有增、删、改都会记录入重做日志。如果当前激活的重做日志文件损坏,会导致数据库异常关闭。非激活的重做日志最终也会因为日志切换变为激活的重做日志,所以损坏的非激活的重做日志最终也会导致数据库的异常终止。在ipas/mSwitch中每组重做日志只有一个成员,所以在下面的分析中只考虑重做日志组损坏的情况,而不考虑单个重做日志成员损坏的情况。

确定损坏的重做日志的位置及其状态:

1. 如果数据库处于可用状态:

select * from v$logfile;

svrmgrl>select * from v$log;

2. 如果数据库处于已经异常终止:

svrmlgr>startup mount;

svrmgrl>select * from v$logfile;

svrmgrl>select * from v$log;

其中,logfile的状态为INVALID表示这组日志文件出现已经损坏;log状态为Inactive:表示重做日志文件处于非激活状态;Active: 表示重做日志文件处于激活状态;Current:表示是重做日志为当前正在使用的日志文件。

1.1.2.1. 损坏的日志文件处于非激活状态:

1. 删除相应的日志组:

svrmgrl>alter database drop logfile group group_number;

2. 重新创建相应的日志组:

svrmgrl>alter database add log file group group_number ('log_file_descritpion',…) size log_file_size;

损坏的日志文件处于激活状态且为非当前日志:

1. 清除相应的日志组:

svrmgrl>alter database clear unarchived logfile group group_number;

损坏的日志文件为当前活动日志文件:

用命令清除相应的日志组:

svrmgrl>alter database clear unarchived logfile group group_number;

如果清除失败,则只能做基于时间点的不完全恢复。

打开数据库并且用适当的方法进行数据库全备份:

svrmgrl>alter database open;

1.1.3. 数据库文件损坏

1.1.3.1. 部分数据文件损坏:

若损坏的数据文件属于非system表空间,则数据库仍然可以处于打开状态可以进行操作,只是损坏的数据文件不能访问。这时在数据库打开状态下可以单独对损坏的数据文件进行恢复。若是system表空间的数据文件损坏则数据库系统会异常终止。这时数据库只能以Mount方式打开,然后再对数据文件进行恢复。可以通过查看数据库日志文件来判断当前损坏的数据文件到底是否属于system表空间。

非system表空间的数据文件损坏

1. 确定损坏的文件名字:

svrmgrl>select name from v$datafile where status='INVALID';

2. 将损坏的数据文件处于offline状态:

svrmgrl>alter database datafile 'datafile_name' offline;

3. 从相应的备份结果集中恢复关于这个数据文件的最近的备份。对于没有采用带库备份的点可以直接从磁带上恢复;对于用带库备份的点用相应的rman脚本来恢复。

4. 恢复数据文件:

svrmgrl>alter database recover datafile 'file_name';

5. 使数据库文件online:

svrmgrl>alter database datafile 'datafile_name' online;

6. 用适当的方法进行数据库全备份。

system表空间的数据文件损坏:

1. 以mount方式启动数据库

svrmgrl>startup mount;

2. 从相应的备份结果集中恢复关于这个数据文件的最近的备份。对于没有采用带库备份的点可以直接从磁带上恢复;对于用带库备份的点用相应的rman脚本来恢复。

3. 恢复system表空间:

svrmgrl>alter database recover datafile 'datafile_name';

4. 打开数据库:

svrmgrl>alter database open;

5. 用适当的方法进行数据库全备份。

1.1.3.2. 表空间损坏:

若非system表空间已经损坏,则数据库仍然可以处于打开状态可以进行操作,只是损坏的表空间不能访问。这样在数据库打开状态下可以单独对损坏的表空间进行恢复。若是system表空间损坏则数据库系统会异常终止。这时数据库只能以Mount方式打开,然后再对表空间进行恢复。可以通过查看数据库日志文件来判断当前损坏的表空间是否是system表空间.

非system表空间损坏:

1. 将损坏的表空间处于offline状态:

svrmgrl>alter tablespace 'tablespace_name' offline;

2. 从相应的备份结果集中恢复关于这个表空间最近的备份。对于没有采用带库备份的点可以直接从磁带上恢复;对于用带库备份的点用相应的rman脚本来恢复。

3. 恢复表空间:

svrmgrl>alter database recover tablespace 'tablespace_name';

4. 使表空间online:

svrmgrl>alter tablespace 'tablespace_name' online;

5. 用适当的方法进行数据库全备份.

system表空间损坏:

1. 以mount方式启动数据库

svrmgrl>startup mount;

2. 从相应的备份结果集中恢复system表空间最近的备份。对于没有采用带库备份的点可以直接从磁带上恢复;对于用带库备份的点用相应的rman脚本来恢复。

3. 恢复system表空间:

svrmgrl>alter database recover tablespace system;

4. 打开数据库:

svrmgrl>alter database open;

5. 用适当的方法进行数据库全备份。

1.1.3.3. 整个数据库的所有文件损坏:

整个数据库所有文件的损坏一般是在共享磁盘阵列发生无法恢复的灾难时才发生,这种情况下只能对数据库进行恢复。若数据库的归档目录也已经丢失,则数据库不可能做完全恢复,会有用户数据的丢失。

没采用带库备份的现场:

1. 将最近的备份从磁带上把各个文件解包到相应的目录下。

2. 以mount方式打开数据库:

svrmgrl>startup mount;

3. 恢复数据库:

svrmgrl>recover database until cancel;

4. 打开数据库:

svrmgrl>alter database open resetlogs;

5. 用适当的方法进行数据库全备份。

采用带库备份的现场:

1. 以nomount方式打开数据库:

svrmgrl>startup nomount;

2. 通过相应的rman脚本进行数据库软恢复。

$rman cmdfile=hot_database_restore.rcv

3. 打开数据库:

svrmgrl>alter database open resetlogs;

4. 用适当的方法进行数据库全备份。

存在最近的数据库完整冷备份前提下的一些经典紧急情况的处理:

数据文件,归档重作日志和控制文件同时丢失或损坏:

无新增archives 时的状况:

条件和假设:自上次镜像备份以来尚未生成新的archive log(s); Archivelog Mode; 有同步的datafile(s) 和control file(s) 的镜像(冷)拷贝

1.1.4. 恢复步骤:

1. 将镜像拷贝的datafile(s) 和control file(s) 抄送回原始地点:

$ cp /backup/good_one.dbf /orig_loc/bad_one.dbf

$ cp /backup/control1.ctl /disk1/control1.ctl

2. 以mount 选项启动数据库:

$ svrmgrl

svrmgrl> connect internal

svrmgrl> startup mount

3. 以旧的control file 来恢复数据库:

svrmgrl> recover database using backup controlfile until cancel;

*** 介质恢复完成

(必须马上cancel )

4. Reset the logfiles (对启动而言不可省略):

svrmgrl> alter database open resetlogs;

5. 关闭数据库并做一次全库冷备份。

新增archives 时的状况:

条件和假设:自上次镜像备份以来已经生成新的archive log(s); Archivelog Mode; 有同步的datafile(s) 和control file(s) 的镜像(冷)拷贝;archive log(s) 可用。

恢复步骤:

1. 如果数据库尚未关闭,则首先把它关闭:

$ svrmgrl

svrmgrl> connect internal

svrmgrl> shutdown abort

2. 将备份文件抄送回原始地点:

所有Database Files

所有Control Files(没有archive(s) 或redo(s) 的情况下,control files 的更新无任何意义)

所有On-Line Redo Logs (Not archives)

init.ora file(选项)

3. 启动数据库:

$ svrmgrl

svrmgrl> connect internal

svrmgrl> startup

数据文件, 重作日志和控制文件同时丢失或损坏:

条件和假设:Archivelog Mode; 有同步的所有所失文件的镜像(冷)拷贝;archive log(s) 可用

恢复步骤(必须采用不完全恢复的手法):

1. 如果数据库尚未关闭,则首先把它关闭:

$ svrmgrl

svrmgrl> connect internal

svrmgrl> shutdown abort

2. 将备份文件抄送回原始地点:

所有Database Files

所有Control Files

所有On-Line Redo Logs(Not archives)

init.ora file(选项)

3. 启动数据库然而并不打开:

svrmgrl>startup mount

4. 做不完全数据库恢复,应用所有从上次镜像(冷)备份始积累起来的archives:

svrmgrl> recover database until cancel using backup controlfile;

......

......

cancel

5. Reset the logfiles (对启动而言不可省略):

svrmgrl> alter database open resetlogs;

6. 关闭数据库并做一次全库冷备份。

数据文件和控制文件同时丢失或损坏:

条件和假设:Archivelog Mode; 有同步的datafile(s) 和control file(s) 的冷拷贝;archive log(s) 可用

恢复步骤:

1. 将冷拷贝的datafiles(s) 和control file(s) 抄送回原始地点:

$ cp /backup/good_one.dbf /orig_loc/bad_one.dbf

$ cp /backup/control1.ctl /disk1/control1.ctl

2. 以mount 选项启动数据库:

$ svrmgrl

svrmgrl> connect internal

svrmgrl> startup mount

3. 以旧的control file 来恢复数据库:

svrmgrl> recover database until cancel using backup controlfile;

*** 介质恢复完成

(须在应用完最后一个archive log 后cancel )

4. Reset the logfiles (对启动而言不可省略):

svrmgrl> alter database open resetlogs;

重作日志和控制文件同时丢失或损坏时:

条件和假设:Control Files 全部丢失或损坏;Archivelog Mode; 有Control Files 的镜像(冷)拷贝

恢复步骤:

1. 如果数据库尚未关闭,则首先把它关闭:

$ svrmgrl

svrmgrl> connect internal

svrmgrl> shutdown abort

svrmgrl>exit

2. 以Control File 的镜像(冷)拷贝覆盖损坏了的Control File:

$ cp /backup/control1.ctl /disk1/control1.ctl

3. 启动数据库然而并不打开:

$ svrmgrl

svrmgrl> connect internal

svrmgrl> startup mount

4. Drop 坏掉的redo log (排除硬件故障):

svrmgrl> alter database drop logfile group 2;

5. 重新创建redo log:

svrmgrl> alter database add logfile group 2 "/orig_loc/log2.dbf" size 10M;

6. 以旧的control file 来恢复数据库:

svrmgrl> recover database until cancel using backup controlfile;

(必须马上cancel )

7. Reset the logfiles (对启动而言不可省略):

svrmgrl> alter database open resetlogs;

8. 关闭数据库并做一次全库冷备份

只发生归档重作日志丢失或损坏时:

根据不同环境和情况,选择下述手段之一:

a. 马上backup 全部datafiles (如果系统采用一般热备份或RMAN 热备份)

b. 马上正常关闭数据库并进行冷备份(如果系统采用冷备份)

c. 冒险前进!不做备份而让数据库接着跑,直等到下一个备份周期再做备份。这是在赌数据库在下一个备份周期到来之前不会有需要恢复的错误发生。

注意:冒险前进的选择:如果发生错误而需要数据库恢复,则最多只能恢复到出问题archive log 之前的操作现场。从另一个角度讲,archive log(s) 出现问题时,数据库若不需要恢复则其本身并没有任何问题。

 

1.2. 数据库逻辑结构故障处理

逻辑结构的故障一般指由于人为的误操作而导致重要数据丢失的情况。在这种情况下数据库物理结构是完整的也是一致的。对于这种情况采取对原来数据库的全恢复是不合适的,我们一般采用三种方法来恢复用户数据。

采用exp/imp工具来恢复用户数据:

如果丢失的数据存在一个以前用exp命令的备份,则可以才用这种方式。

1. 在数据库内创建一个临时用户:

svrmgrl>create user test_user identified by test;

svrmgrl>grant connect,resource to test_user;

2. 从以前exp命令备份的文件中把丢失数据的表按照用户方式倒入测试用户:

$imp system/manager file=export_file_name tables=(lost_data_table_name…) fromuser=lost_data_table_owner touser=test_user constraint=n;

3. 用相应的DML语句将丢失的数据从测试用户恢复到原用户。

4. 将测试用户删除:

svrmgrl>drop user test_user cascede;

采用logminer来恢复用户数据:

Logminer是oracle提供的一个日志分析工具。它可以根据数据字典对在线联机日志、归档日志进行分析,从而可以获得数据库的各种DML操作的历史记录以及各种DML操作的回退信息。根据这些用户就可以将由于误操作而丢失的数据重新加入数据库内。

1. 确认数据库的utl_file_dir参数已经设置,如果没有则需要把这个参数加入oracle的初始化参数文件,然后重新启动数据库。下面例子中假设utl_file_dir='/opt/oracle/db01';

2. 创建logminer所需要的数据字典信息,假设生成的数据字典文本文件为dict.ora:

svrmgrl>execute dbms_logmnr_d.build(dictionary_filename=>"dict.ora", dictionary_location=>"/opt/oracle/db01');

3. 确定所需要分析的日志或者归档日志的范围。这可以根据用户误操作的时间来确定大概的日志范围。假设用户误操作时可能的日志文件为/opt/oracle/db02/oradata/ORCL/redo3.log和归档日志'/opt/oracle/arch/orcl/orclarc_1_113.ora'。

4. 创建要分析的日志文件列表,按日志文件的先后顺序依次加入:

svrmgrl>execute dbms_logmnr.add_logfile(logfilename=>'/opt/oracle/arch/orcl/orclarc_1_113.ora',options=>dbms_logmnr.NEW);

svrmgrl> execute dbms_logmnr.add_logfile(logfilename=>' /opt/oracle/db02/oradata/ORCL/redo3.log',options=>dbms_logmnr.ADDFILE);

5.分析日志,假设需要分析的时间在'2003-06-28 12:00:00'和'2003-06-28 13:00:00'之间:

svrmgrl>execute dbms_logmnr.start_logmnr(dictfilename=>' /opt/oracle/db01/dict.ora',starttime=>to_date(' 2003-06-28 12:00:00','YYYY-MM-DD HH:MI:SS'),endtime=>to_date(to_date('2003-06-28 13:00:00','YYYY-MM-DD HH:MI:SS'));

6. 获取分析结果:

svrmgrl>select operation,sql_redo,sql_undo from v$logmnr_contents;

7. 根据分析结果修复数据。

8.结束logmnr:

svrmgrl>dbms_logmnr.end_logmnr;

9. 用适当的方法对原数据库进行数据库全备份。

1.2.1. 利用备份恢复用户数据:

采用这种方法时并不是在原数据库进行恢复,而是利用数据库备份在新的机器上重新建立一个新的数据库。通过备份恢复在新机器上将数据库恢复到用户误操作前,这样就可以获得丢失的数据将其恢复到原数据库。

1. 在新的机器上安装数据库软件。

2. 对于采用带库备份的现场,需要在新的数据库服务器上安装调试相应的备份管软件。

3. 根据用户误操作的时间点进行基于时间点的数据库恢复操作。对于没有采用带库备份的现场,可以选取用户误操作前最近的备份磁带进行恢复;对于才用带库备份的点可以通过基于时间恢复点恢复的rman脚本来进行恢复。

4.重新打开数据库:

svrmgrl>alter database open resetlogs;

5. 从新的数据库中获取丢失的用户数据,通过DML操作将其恢复到原数据库中。

6. 用适当的方法对原数据库进行数据库全备份。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论