oracle faq----3

第三部分、备份与恢复

[Q]如何开启/关闭归档
[A]
如果开启归档,请保证log_archive_start=true开启自动归档,否则只能手工归档,如果是关闭了归档,则设置该参数为false
注意:如果是OPS/RAC环境,需要先把parallel_server = true注释掉,然后执行如下步骤,最后用这个参数重新启动
1
、开启归档
a.
关闭数据库shutdown immediate
b. startup mount
c. alter database archivelog
d. alter database opne
2
、禁止归档
a.
关闭数据库shutdown immediate
b. startup mount
c. alter database noarchivelog
d. alter database open
归档信息可以通过如下语句查看
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination E:/oracle/ora92/database/archive
Oldest online log sequence 131
Next log sequence to archive 133
Current log sequence 133

[Q]怎样设置定时归档
[A]9i
以上版本,保证归档的最小间隔不超过n
设置Archive_lag_target = n
单位:秒 范围:0~7200

[Q]不同版本怎么导出/导入
[A]
导出用低版本,导入用当前版本
如果版本跨越太大,需要用到中间版本过渡

[Q]不同的字符集之前怎么导数据
[A]a.
前条件是保证导出/导入符合其他字符集标准,如客户环境与数据库字符集一致。
b.
修改dmp文件的23字节为目标数据库的字符集,注意要换成十六进制。
参考函数(以下函数中的ID是十进制的):
nls_charset_name
根据字符集ID获得字符集名称
nls_charset_id
根据字符集名称获得字符集ID

[Q]怎么样备份控制文件
[A]
再线备份为一个二进制的文件
alter database backup controlfile to '$BACKUP_DEPT/controlfile.000' [reuse];
备份为文本文件方式
alter database backup controlfile to trace [resetlogs|noresetlogs];

[Q]控制文件损坏如何恢复
[A]1
、如果是损坏单个控制文件
只需要关闭数据库,拷贝一个好的数据文件覆盖掉坏的数据文件即可
或者是修改init.ora文件的相关部分
2
、如果是损失全部控制文件,则需要创建控制文件或从备份恢复
创建控制文件的脚本可以通过alter database backup controlfile to trace获取。

[Q]怎么样热备份一个表空间
[A]Alter tablespace
名称 begin backup;
host cp
这个表空间的数据文件 目的地;
Alter tablespace
名称 end backup;
如果是备份多个表空间或整个数据库,只需要一个一个表空间的操作下来就可以了。

[Q]怎么快速得到整个数据库的热备脚本
[A]
可以写一段类似的脚本
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;
/

[Q]丢失一个数据文件,但是没有备份,怎么样打开数据库
[A]
如果没有备份只能是删除这个数据文件了,会导致相应的数据丢失。
SQL>startup mount
--ARCHIVELOG
模式命令
SQL>Alter database datafile 'file name' offline;
--NOARCHIVELOG
模式命令
SQL>Alter database datafile 'file name' offline drop;
SQLl>Alter database open;
注意:该数据文件不能是系统数据文件

[Q]丢失一个数据文件,没有备份但是有该数据文件创建以来的归档怎么恢复
[A]
保证如下条件
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;

[Q]联机日志损坏如何恢复
[A]1
、如果是非当前日志而且归档,可以使用
Alter database clear logfile group n
来创建一个新的日志文件
如果该日志还没有归档,则需要用
Alter database clear unarchived logfile group n
2
、如果是当前日志损坏,一般不能clear,则可能意味着丢失数据
如果有备份,可以采用备份进行不完全恢复
如果没有备份,可能只能用_allow_resetlogs_corruption=true来进行强制恢复了,但是,这样的方法是不建议的,最好在有Oracle support的指导下进行。

[Q]怎么样创建RMAN恢复目录
[A]
首先,创建一个数据库用户,一般都是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;

[Q]怎么样在恢复的时候移动数据文件,恢复到别的地点
[A]
给一个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;
}

[Q]怎么从备份片(backuppiece)中恢复(restore)控制文件与数据文件
[A]
可以使用如下方法,在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/p enny/system01.dbf');
9 dbms_backup_restore.restoreDataFileto(2,'E:/Oracle/oradata/p enny/UNDOTBS01.DBF');
10 dbms_backup_restore.restoreDataFileto(3,'E:/ORACLE/ORADATA/P ENNY/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]Rmanformat格式中的%s类似的东西代表什么意义
[A]
可以参考如下
%c
备份片的拷贝数
%d
数据库名称
%D
位于该月中的第几天 (DD)
%M
位于该年中的第几月 (MM)
%F
一个基于DBID唯一的名称,这个格式的形式为c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII为该数据库的DBIDYYYYMMDD为日期,QQ是一个1-256的序列
%n
数据库名称,向右填补到最大八个字符
%u
一个八个字符的名称代表备份集与创建时间
%p
该备份集中的备份片号,从1开始到创建的文件数
%U
一个唯一的文件名,代表%u_%p_%c
%s
备份集的号
%t
备份集时间戳
%T
年月日格式(YYYYMMDD)

[Q]执行exec dbms_logmnr_d.build('Logminer.ora','file directory'),提示下标超界,怎么办
[A]
完整错误信息如下,
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;

[Q]执行execute dbms_logmnr.start_logmnr(DictFileName=>'DictFileName')提示ORA-01843:无效的月份,这个是什么原因
[A]
我们分析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'));

你可能感兴趣的:(oracle学习)