|
------- redo synch writes 2 redo synch time 0 redo entries 76 redo size 19412 redo buffer allocation retries 0 redo wastage 5884 redo writer latching time 0 redo writes 22 redo blocks written 51 redo write time 0 redo log space requests 0 redo log space wait time 0 redo log switch interrupts 0 redo ordering marks 0 SQL> select (19412+5884)/51 + 16 ''''"Redo black(byte)" from dual; Redo black(byte) ------------------ 51286.如果发现表中有坏块,如何检索其它未坏的数据 [A]首先需要找到坏块的ID(可以运行dbverify实现),假设为,假定文件编码为。运行下面的查询查找段名: SELECT segment_name,segment_type,extent_id,block_id, blocks from dba_extents t where file_id = AND between block_id and (block_id + blocks - 1) 一旦找到坏段名称,若段是一个表,则最好建立一个临时表,存放好的数据。若段是索引,则删除它,再重建。 create table good_table as select from bad_table where rowid not in (select rowid from bad_table where substr(rowid,10,6) = ) 在这里要注意8以前的受限ROWID与现在ROWID的差别。 还可以使用诊断事件10231 SQL> ALTER SYSTEM SET EVENTS ''''10231 trace name context forever,level 10''''; 创建一个临时表good_table的表中除坏块的数据都检索出来 SQL>CREATE TABLE good_table as select * from bad_table; 最后关闭诊断事件 SQL> ALTER SYSTEM SET EVENTS ''''10231 trace name context off ''''; 关于ROWID的结构,还可以参考dbms_rowid.rowid_create函数 87.怎么样备份控制文件 在线备份为一个二进制的文件 alter database backup controlfile to ''''$BACKUP_DEPT/controlfile.000'''' [reuse]; 备份为文本文件方式 alter database backup controlfile to trace [resetlogs|noresetlogs]; 88.控制文件损坏如何恢复 <1>、如果是损坏单个控制文件 只需要关闭数据库,拷贝一个好的数据文件覆盖掉坏的数据文件即可 或者是修改init.ora文件的相关部分 <2>、如果是损失全部控制文件,则需要创建控制文件或从备份恢复 创建控制文件的脚本可以通过alter database backup controlfile to trace获取。 89.怎么样热备份一个表空间 <1>Alter tablespace 名称 begin backup; host cp 这个表空间的数据文件 目的地; Alter tablespace 名称 end backup; 如果是备份多个表空间或整个数据库,只需要一个一个表空间的操作下来就可以了。 90.怎么快速得到整个数据库的热备脚本 <1>可以写一段类似的脚本 SQL>set serveroutput on begin dbms_output.enable(10000); for bk_ts in (select distinct t.ts#,t.name from v$tablespace t,v$datafile d where t.ts#=d.ts#) loop dbms_output.put_line(''''--''''||bk_ts.name); dbms_output.put_line(''''alter tablespace ''''||bk_ts.name||'''' begin backup;''''); for bk_file in (select file#,name from v$datafile where ts#=bk_ts.ts#) loop dbms_output.put_line(''''host cp ''''||bk_file.name||'''' $BACKUP_DEPT/''''); end loop; dbms_output.put_line(''''alter tablespace ''''||bk_ts.name||'''' end backup;''''); end loop; end; / 91.丢失一个数据文件,但是没有备份,怎么样打开数据库 如果没有备份只能是删除这个数据文件了,会导致相应的数据丢失。 SQL>startup mount --ARCHIVELOG模式命令 SQL>Alter database datafile ''''file name'''' offline; --NOARCHIVELOG模式命令 SQL>Alter database datafile ''''file name'''' offline drop; SQLl>Alter database open; 注意:该数据文件不能是系统数据文件 92.丢失一个数据文件,没有备份但是有该数据文件创建以来的归档怎么恢复 保证如下条件 a. 不能是系统数据文件 b. 不能丢失控制文件 如果满足以上条件,则 SQL>startup mount SQL>Alter database create datafile ''''file name'''' as ''''file name'''' size ... reuse; SQL>recover datafile n; -文件号 或者 SQL>recover datafile ''''file name''''; 或者 SQL>recover database; SQL>Alter database open; 93.联机日志损坏如何恢复 <1>、如果是非当前日志而且归档,可以使用 Alter database clear logfile group n来创建一个新的日志文件 如果该日志还没有归档,则需要用 Alter database clear unarchived logfile group n <2>、如果是当前日志损坏,一般不能clear,则可能意味着丢失数据 如果有备份,可以采用备份进行不完全恢复 如果没有备份,可能只能用_allow_resetlogs_corruption=true来进行强制恢复了,但是,这样的方法是不建议的,最好在有Oracle support的指导下进行。 94.怎么样创建RMAN恢复目录 首先,创建一个数据库用户,一般都是RMAN,并给予recovery_catalog_owner角色权限 sqlplus sys SQL> create user rman identified by rman; SQL> alter user rman default tablespace tools temporary tablespace temp; SQL> alter user rman quota unlimited on tools; SQL> grant connect, resource, recovery_catalog_owner to rman; SQL> exit; 然后,用这个用户登录,创建恢复目录 rman catalog rman/rman RMAN> create catalog tablespace tools; RMAN> exit; 最后,你可以在恢复目录注册目标数据库了 rman catalog rman/rman target backdba/backdba RMAN> register database; 95.怎么样在恢复的时候移动数据文件,恢复到别的地点 给一个RMAN的例子 run { set until time ''''Jul 01 1999 00:05:00''''; allocate channel d1 type disk; set newname for datafile ''''/u04/oracle/prod/sys1prod.dbf'''' to ''''/u02/oracle/prod/sys1prod.dbf''''; set newname for datafile ''''/u04/oracle/prod/usr1prod.dbf'''' to ''''/u02/oracle/prod/usr1prod.dbf''''; set newname for datafile ''''/u04/oracle/prod/tmp1prod.dbf'''' to ''''/u02/oracle/prod/tmp1prod.dbf''''; restore controlfile to ''''/u02/oracle/prod/ctl1prod.ora''''; replicate controlfile from ''''/u02/oracle/prod/ctl1prod.ora''''; restore database; sql "alter database mount"; switch datafile all; recover database; sql "alter database open resetlogs"; release channel d1; } 96.怎么从备份片(backuppiece)中恢复(restore)控制文件与数据文件 可以使用如下方法,在RMAN中恢复备份片的控制文件 restore controlfile from backuppiecefile; 如果是9i的自动备份,可以采用如下的方法 restore controlfile from autobackup; 但是,如果控制文件全部丢失,需要指定DBID,如SET DBID=? 自动备份控制文件的默认格式是%F,这个格式的形式为 c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII就是DBID 至于恢复(restore)数据文件,oracle 816开始有个包dbms_backup_restore 在 nomount 状态下就可以执行,可以读 815甚至之前的备份片,读出来的文件用于恢复 可以在SQLPLUS中运行,如下 SQL>startup nomount SQL> DECLARE 2 devtype varchar2(256); 3 done boolean; 4 BEGIN 5 devtype := dbms_backup_restore.deviceallocate('''''''', params=>''''''''); 6 dbms_backup_restore.restoresetdatafile; 7 dbms_backup_restore.restorecontrolfileto(''''E:\Oracle\oradata\penny\control01.ctl''''); 8 dbms_backup_restore.restoreDataFileto(1,''''E:\Oracle\oradata\penny\system01.dbf''''); 9 dbms_backup_restore.restoreDataFileto(2,''''E:\Oracle\oradata\penny\UNDOTBS01.DBF''''); 10 dbms_backup_restore.restoreDataFileto(3,''''E:\ORACLE\ORADATA\PENNY\USERS01.DBF''''); 11 dbms_backup_restore.restorebackuppiece(''''D:\orabak\BACKUP_1_4_04F4IAJT.PENNY'''',done=>done); 12 END; 13 / PL/SQL 过程已成功完成。 SQL> alter database mount; [Q]Rman的format格式中的%s类似的东西代表什么意义 [A]可以参考如下 %c 备份片的拷贝数 %d 数据库名称 %D 位于该月中的第几天 (DD) %M 位于该年中的第几月 (MM) %F 一个基于DBID唯一的名称,这个格式的形式为c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII为该数据库的DBID,YYYYMMDD为日期,QQ是一个1-256的序列 %n 数据库名称,向右填补到最大八个字符 %u 一个八个字符的名称代表备份集与创建时间 %p 该备份集中的备份片号,从1开始到创建的文件数 %U 一个唯一的文件名,代表%u_%p_%c %s 备份集的号 %t 备份集时间戳 %T 年月日格式(YYYYMMDD) 97.执行exec dbms_logmnr_d.build(''''Logminer.ora'''',''''file directory''''),提示下标超界,怎么办 完整错误信息如下, SQL> exec dbms_logmnr_d.build(''''Logminer.ora'''',''''file directory'''') BEGIN dbms_logmnr_d.build(''''Logminer.ora'''',''''file directory''''); END; * ERROR 位于第 1 行: ORA-06532: 下标超出限制 ORA-06512: 在"SYS.DBMS_LOGMNR_D", line 793 ORA-06512: 在line 1 解决办法为: <1>.编辑位于"$ORACLE_HOME/rdbms/admin"目录下的文件"dbmslmd.sql" 改变行: TYPE col_desc_array IS VARRAY(513) OF col_description; 为 TYPE col_desc_array IS VARRAY(700) OF col_description; 并保存文件 <2>. 运行改变后的脚本 SQLPLUS> Connect internal SQLPLUS> @$ORACLE_HOME/rdbms/admin/dbmslmd.sql <3>.重新编译该包 SQLPLUS> alter package DBMS_LOGMNR_D compile body; 98.执行execute dbms_logmnr.start_logmnr(DictFileName=>''''DictFileName'''')提示ORA-01843:无效的月份,这个是什么原因 我们分析start_logmnr包 PROCEDURE start_logmnr( startScn IN NUMBER default 0 , endScn IN NUMBER default 0, startTime IN DATE default TO_DATE(''''01-jan-1988'''',''''DD-MON-YYYY''''), endTime IN DATE default TO_DATE(''''01-jan-2988'''',''''DD-MON-YYYY''''), DictFileName IN VARCHAR2 default '''''''', Options IN BINARY_INTEGER default 0 ); 可以知道,如果TO_DATE(''''01-jan-1988'''',''''DD-MON-YYYY'''')失败,将导致以上错误 所以解决办法可以为 <1>、Alter session set NLS_LANGUAGE=American <2>、用类似如下的方法执行 execute dbms_logmnr.start_logmnr (DictFileName=> ''''f:\temp2\TESTDICT.ora'''', starttime => TO_DATE( ''''01-01-1988'''',''''DD-MM-YYYY''''), endTime=>TO_DATE(''''01-01-2988'''',''''DD-MM-YYYY''''));
上一页 [1] [2] [3] [4] [5] [6] [网页制作]为 DBA 推荐几个邮件列表 [SyBase][推荐]对 Sybase ASE DBA 的建议!你能做到吗? [ORACLE]ORACLE DBA常用SQL脚本工具-管理篇(1) [ORACLE]Oracle DBA Interview Questions
|