| « | 七月 2008 | » | ||||
|---|---|---|---|---|---|---|
| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 | |||
SCN(System Chang Number)作为oracle中的一个重要机制,在数据恢复、Data Guard、Streams复制、RAC节点间的同步等各个功能中起着重要作用。理解SCN的运作机制,可以帮助你更加深入地了解上述功能。
在理解SCN之前,我们先看下oracle事务中的数据变化是如何写入数据文件的:
1、 事务开始;
2、 在buffer cache中找到需要的数据块,如果没有找到,则从数据文件中载入buffer cache中;
3、 事务修改buffer cache的数据块,该数据被标识为“脏数据”,并被写入log buffer中;
4、 事务提交,LGWR进程将log buffer中的“脏数据”写入redo log file中;
5、 当发生checkpoint,CKPT进程更新所有数据文件的文件头中的信息,DBWn进程则负责将Buffer Cache中的脏数据写入到数据文件中。
经过上述5个步骤,事务中的数据变化最终被写入到数据文件中。但是,一旦在上述中间环节时,数据库意外宕机了,在重新启动时如何知道哪些数据已经写入数据文件、哪些没有写呢(同样,在DG、streams中也存在类似疑问:redo log中哪些是上一次同步已经复制过的数据、哪些没有)?SCN机制就能比较完善的解决上述问题。
SCN是一个数字,确切的说是一个只会增加、不会减少的数字。正是它这种只会增加的特性确保了Oracle知道哪些应该被恢复、哪些应该被复制。
总共有4中SCN:系统检查点(System Checkpoint)SCN、数据文件检查点(Datafile Checkpoint)SCN、结束SCN(Stop SCN)、开始SCN(Start SCN)。其中其面3中SCN存在于控制文件中,最后一种则存在于数据文件的文件头中。
在控制文件中,System Checkpoint SCN是针对整个数据库全局的,因而之存在一个,而Datafile Checkpoint SCN和Stop SCN是针对每个数据文件的,因而一个数据文件就对应在控制文件中存在一份Datafile Checkpoint SCN和Stop SCN。在数据库正常运行期间,Stop SCN(通过视图v$datafile的字段last_change#可以查询)是一个无穷大的数字或者说是NULL。
在一个事务提交后(上述第四个步骤),会在redo log中存在一条redo记录,同时,系统为其提供一个最新的SCN(通过函数dbms_flashback.get_system_change_number可以知道当前的最新SCN),记录在该条记录中。如果该条记录是在redo log被清空(日志满做切换时或发生checkpoint时,所有变化日志已经被写入数据文件中),则其SCN被记录为redo log的low SCN。以后在日志再次被清空前写入的redo记录中SCN则成为Next SCN。
当日志切换或发生checkpoint(上述第五个步骤)时,从Low SCN到Next SCN之间的所有redo记录的数据就被DBWn进程写入数据文件中,而CKPT进程则将所有数据文件(无论redo log中的数据是否影响到该数据文件)的文件头上记录的Start SCN(通过视图v$datafile_header的字段checkpoint_change#可以查询)更新为Next SCN,同时将控制文件中的System Checkpoint SCN(通过视图v$database的字段checkpoint_change#可以查询)、每个数据文件对应的Datafile Checkpoint(通过视图v$datafile的字段checkpoint_change#可以查询)也更新为Next SCN。但是,如果该数据文件所在的表空间被设置为read-only时,数据文件的Start SCN和控制文件中Datafile Checkpoint SCN都不会被更新。
那系统是如何产生一个最新的SCN的?实际上,这个数字是由当时的timestamp转换过来的。每当需要产生一个最新的SCN到redo记录时,系统获取当时的timestamp,将其转换为数字作为SCN。我们可以通过函数SCN_TO_TIMESTAMP(10g以后)将其转换回timestamp:
SQL> select dbms_flashback.get_system_change_number, SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) from dual; GET_SYSTEM_CHANGE_NUMBER------------------------SCN_TO_TIMESTAMP(DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER)--------------------------------------------------------------------------- 287707675617-AUG-07 02.15.26.000000000 PM
也可以用函数timestamp_to_scn将一个timestamp转换为SCN:
SQL> select timestamp_to_scn(SYSTIMESTAMP) as scn from dual; SCN----------2877078439
最后,SCN除了作为反映事务数据变化并保持同步外,它还起到系统的“心跳”作用——每隔3秒左右系统会刷新一次系统SCN。
下面,在简单介绍一下SCN如何在数据库恢复中起作用。
数据库在正常关闭(shutdown immediate/normal)时,会先做一次checkpoint,将log file中的数据写入数据文件中,将控制文件、数据文件中的SCN(包括控制文件中的Stop SCN)都更新为最新的SCN。
数据库异常/意外关闭不会或者只更新部分Stop SCN。
当数据库启动时,Oracle先检查控制文件中的每个Datafile Checkpoint SCN和数据文件中的Start SCN是否相同,再检查每个Datafile Checkpoint SCN和Stop SCN是否相同。如果发现有不同,就从Redo Log中找到丢失的SCN,重新写入数据文件中进行恢复。具体的数据恢复过程这里就不再赘述。
SCN作为Oracle中的一个重要机制,在多个重要功能中起着“控制器”的作用。了解SCN的产生和实现方式,帮助DBA理解和处理恢复、DG、Streams复制的问题。
最后提一句,利用SCN机制,在Oracle10g、11g中又增加了一些很实用的功能——数据库闪回、数据库负载重现等。
exp: aix+10g R1
imp:hu-ux+10g R2
报错如下:
Export file created by EXPORT:V09.02.00 via conventional path
IMP-00013: only a DBA can import a file exported by another DBA
IMP-00000: Import terminated unsuccessfully
解决:
导出用户是有dba权限的,所以导入用户也应具有dba权限才行,或者将导出用户的dba角色去掉,重新导出
大文件支持的问题,解决方法如下:
1、修改/etc/security/limits这个文件,把fsize 改为-1
2、看文件系统是不是大文件支持的
a、smit jfs,并选中那个文件系统,回车
b、看large file enabled这一项是不是true的,如果是则没问题了
c、如果不是,则把数据备出,删掉那个文件系统,重建时选择大文件支持就可以了。
阵列做映射
cfgmgr(a/b)
chdev -l hdiskxx -a pv=yes(a/b)
smitty hacmp-- add disk(a/b)
smitty clstop ( a/b)
exportvg datavg (b)
varyonvg datavg (a)
添加罗设备 (a)
varyoffvg datavg (a)
importvg datavg (b)
smitty chvg --- no (b)
chown oracle:dba /dev/rdb* (b)
varyoffvg datavg (b)
smitty clstart (a /b)
smitty hacmp---sync(a)
smitty hacmp---take over
参考脚本:
/usr/sbin/mklv -y test1 -e x -T O -w n -s n -r n datavg 1
-e x 去掉 (多个盘的时候起作用)
--一个开发数据库,启动报错:
Mon Nov 27 15:10:02 2006
Database mounted in Exclusive Mode.
Completed: ALTER DATABASE MOUNT
Mon Nov 27 15:10:02 2006
ALTER DATABASE OPEN
Mon Nov 27 15:10:02 2006
Rolling back half complete log switch of thread 1
Mon Nov 27 15:10:05 2006
Errors in file /opt/oracle/admin/orcl/bdump/orcl_lgwr_7508.trc:
ORA-00202: controlfile: '/opt/oracle/oradata/orcl/control01.ctl'
ORA-27091: skgfqio: unable to queue I/O
ORA-27072: skgfdisp: I/O error
Linux-ia64 Error: 5: Input/output error
Additional information: 119
Mon Nov 27 15:10:05 2006
Errors in file /opt/oracle/admin/orcl/bdump/orcl_lgwr_7508.trc:
ORA-00204: error in reading (block 119, # blocks 1) of controlfile
ORA-00202: controlfile: '/opt/oracle/oradata/orcl/control01.ctl'
ORA-27091: skgfqio: unable to queue I/O
ORA-27072: skgfdisp: I/O error
Linux-ia64 Error: 5: Input/output error
Additional information: 119
LGWR: terminating instance due to error 204
Mon Nov 27 15:10:07 2006
Errors in file /opt/oracle/admin/orcl/bdump/orcl_dbw0_7506.trc:
ORA-00204: error in reading (block , # blocks ) of controlfile
Mon Nov 27 15:10:07 2006
Errors in file /opt/oracle/admin/orcl/bdump/orcl_pmon_7504.trc:
ORA-00204: error in reading (block , # blocks ) of controlfile
Instance terminated by LGWR, pid = 7508
三个控制文件在操作系统下cp,也是报io error.
trace控制文件时,用
alter database backup controlfile to trace; 可以
alter database backup controlfile to '.....'; 报io error.
重建控制文件即可.
1:丢失所有的控制文件
分析:
控制文件丢失,必须重建控制文件,重建控制文件可以利用备份的控制文件
使用备份的控制文件试图去打开数据库
恢复步骤:
1:还原备份的控制文件,由于控制文件不是当前的,所有试图启动数据库时失败!
2:SQL>startup
ORACLE 例程已经启动
Total System Global Area 143727516 bytes
Fixed Size 453532 bytes
Variable Size 109051904 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
ORA-01122: 数据库文件 1 验证失败
ORA-01110: 数据文件 1: 'D:ORACLEORADATACSSSYSTEM01.DBF'
ORA-01207: 文件比控制文件更新 - 旧的控制文件
3:关闭数据库
SQL>shutdown immediate
4:将数据库启动到mount状态
SQL>startup mount
ORACLE 例程已经启动。
Total System Global Area 143727516 bytes
Fixed Size 453532 bytes
Variable Size 109051904 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
5:使用TO TRACE备份控制文件(目的为了重建控制文件)
SQL> alter database backup controlfile to trace;
数据库已更改。
6:找到备份的文本文件(假设修改后改名为 rebuild_controlfile.sql),并修改其中内容,只留下如下内容:
如果数据库是shutdown abort,则需要recover database,
如果数据库是shutdown immediate,则不需要recover database;
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "CSS" NORESETLOGS ARCHIVELOG
MAXLOGFILES 50
MAXLOGMEMBERS 5
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 113
LOGFILE
GROUP 1 'D:ORACLEORADATACSSREDO01.LOG' SIZE 100M,
GROUP 2 'D:ORACLEORADATACSSREDO02.LOG' SIZE 100M,
GROUP 3 'D:ORACLEORADATACSSREDO03.LOG' SIZE 100M
DATAFILE
'D:ORACLEORADATACSSSYSTEM01.DBF',
'D:ORACLEORADATACSSUNDOTBS01.DBF',
'D:ORACLEORADATACSSDRSYS01.DBF',
'D:ORACLEORADATACSSEXAMPLE01.DBF',
'D:ORACLEORADATACSSINDX01.DBF',
'D:ORACLEORADATACSSODM01.DBF',
'D:ORACLEORADATACSSTOOLS01.DBF',
'D:ORACLEORADATACSSUSERS01.DBF',
'D:ORACLEORADATACSSXDB01.DBF',
'D:ORACLEORADATACSSSERVICE_DATA.ORA',
'D:ORACLEORADATACSSSERVICE_IDX.ORA'
CHARACTER SET ZHS16GBK
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;
7:再关闭数据库
SQL>shutdown immediate
8: 执行 rebuild_controlfile.sql
SQL>@d:rebuild_controlfile.sql
ORACLE 例程已经启动。
Total System Global Area 143727516 bytes
Fixed Size 453532 bytes
Variable Size 109051904 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
控制文件已创建
ORA-00283: ??????????
ORA-00264: ?????
系统已更改。
数据库已更改。
9:由于系统正常关闭,故不需要介质恢复,所有第8步恢复数据库报错
总结:恢复丢失的所有控制文件(完全恢复)
1:还原控制文件到原位置
2:mount数据库
3:用TO TRACE备份控制文件
4:修改备份处理的TO TRACE 文件
5:关闭数据库
6:重建控制文件(用修改后的TO TRACE 备份)
7:恢复数据库
8:打开数据库
2:丢失所有的联机重做日志文件
分析:
SHUTDOWN IMMEDIATE所有联机日志丢失,如果
方法1:由于数据库是正常关闭,所有数据库处于一致状态,可以强行恢复而不会丢失任何已经写入数据文件的已经提交的事务
SQL>startup mount restrict
SQL>recover database until cancel
SQL>alter database open resetlogs
SQL>alter system disable restricted session
总结:
正常关闭数据库(shutdown immediate shutdown normal ),数据库处于一致状态,可以强行恢复,而不会丢失已经提交的事务.
1 mount数据库
2 使用until cancel恢复数据库
3 用resetlogs打开数据库
方法2:使用备份恢复
SQL>select group#,sequence#,archived,status from v$log;
1 1 No CURRENT
2 2 YES INACTIVE
3 3 YES INACHIVE
SQL>alter database clear unarchived logfile group 1;
ERROR 位于第 1 行:
ORA-00313: 无法打开日志组 1 (线程 1) 的成员
ORA-00312: 联机日志 1 线程 1: 'D:ORACLEORADATACSSREDO01.LOG'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
还原最近一次备份的全部数据文件(控制文件不要还原,保留最新的)
SQL>recover database
选择 auto,尽量恢复可以利用的归档日志,然后再:
recover database until cancel
这次输入cancel,完成不完全恢复,也就是说恢复两次
SQL>recover database until cancel
cancel
利用alter database open resetlogs打开数据库
总结:使用备份恢复会丢失所有未归档的事务,是一个不完全恢复,如果通过方法一恢复数据库失败,可以通过该方法恢复!
1:还原所有的数据文件,控制文件保持最新
2:利用归档日志恢复数据库,(尽量恢复可以利用的归档日志)
3:再用until cancel恢复,选择cancel做不完全恢复
4:用resetlogs打开数据库
注意:由于丢失了日志文件,不能通过重建控制文件来恢复,可以使用当前系统最新的控制文件.
1 SQL>startup nomount
2 SQL>alter database backup controlfile to trace
3 重建控制文件
CREATE CONTROLFILE REUSE DATABASE "CSS" NORESETLOGS ARCHIVELOG
*
ERROR 位于第 1 行:
ORA-01503: CREATE CONTROLFILE ??
ORA-01565: ????'D:ORACLEORADATACSSREDO01.LOG'???
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#
由于丢失了日志文件,重建控制文件失败.
SHUTDOWN ABORT所有联机日志丢失
模拟步骤:
SQL>insert into TEST values(1);
SQL>commit
SQL>insert into TEST values(2);
再起一个连接,执行
SQL>shutdown abort
1:通过上面的方法2可以做数据库不完全恢复.
2:强制恢复
启动数据库,会发现一个类似的错误
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 143727516 bytes
Fixed Size 453532 bytes
Variable Size 109051904 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 2 (线程 1) 的成员
ORA-00312: 联机日志 2 线程 1: 'D:ORACLEORADATACSSREDO02.LOG'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
关闭数据库
SQL> shutdown immediate
mount数据库
SQL> startup nomount
恢复数据库
SQL> recover database until cancel
cancel
打开数据库
SQL> alter database open resetlogs
数据库没有响应,数据库实例崩溃!
---------------------------------------------------------------------------
重复以上的步骤,在恢复时选择
SQL> shutdown immediate
SQL> startup nomount
SQL> recover database until cancel
auto
SQL> alter database open resetlogs
同样,数据库没有响应,数据库实例崩溃!
总结:如果丢失的联机重做日志中还有未提交的事务,也就是如果还有事务来不及提交,数据库就shutdown abort
这样只能通过备份进行不完全恢复了.这样所有未归档的事务都会丢失
3:丢失归档的非当前联机重做日志文件
分析:由于丢失的联机日志文件已经归档,并且不是当前日志文件
故,只需重建该日志文件即可
SQL>select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- --- ----
1 0 YES UNUSED
2 1 NO CURRENT
3 0 YES UNUSED
SQL>alter database clear logfile group 1 [unrecoverable datafile];
如果该日志组还没有归档,则需要用
SQL>alter database clear unarchived logfile group 1 [unrecoverable datafile];
打开数据库,重新备份数据库
SQL>alter database open;
说明:
1 如果丢失的是非当前的联机日志文件,一般只需要clear就可以重建该日志文件,但是如果该数据库
处于归档状态但该日志还没有归档,就需要强行clear.
2 建议clear,特别是强行clear后做一次数据库的全备份
3 此方法适用归档和非归档数据库
4:丢失未归档的非单前联机重做日志文件
分析
丢失未归档的联机非当前日志,必须重建该日志文件,并且需要在重建后做一个数据库全备份.
SQL>select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- --- ----
1 0 YES UNUSED
2 1 NO CURRENT
3 0 YES UNUSED
SQL>alter database clear unarchived logfile group 1 [unrecoverable datafile];
如果丢失的是日志组的一个文件,也可以通过这样的方法来重建
删掉日志组成员文件
SQL> alter database drop logfile menber 'logfileName';
重建日志组成员文件
SQL> alter database add logfile menber 'logfileName' to group n;
5:丢失当前联机重做日志文件
按全部联机重做日志文件都丢失的方法处理
6:丢失所有的控制文件和联机重做日志文件
数据库正常关闭(shutdown immediate)
分析:由于丢失了所有的联机重做日志文件,所以可以用最近的一次有效备份和归档日志来恢复,但这样会丢失所有未被归档的事务.
1)还原最近一次备份的所有数据文件和控制文件
2)mount数据库
SQL>startup mount
3) 使用using backup controlfile选择做不完全恢复
SQL>alter database recover until cancel using backup controlfile;
4) 选择auto,尽可能多的使用归档日志文件
auto
5) 用resetlogs打开数据库
SQL> alter database open resetlogs;
6) 重新做一次数据库的全备份.
(2)只丢失未提交的事务的数据
1)备份所有的数据文件
2)还原最近数据库结构改变后的最新备份控制文件和数据文件,主要是为了生成TO TRACE控制文件备份
如果已经有最近一次的控制文件的TO TRACE备份,则直接跳到4
2)启动数据库到mount状态,生成控制文件的备份
SQL>startup mount
SQL>alter dababase backup controlfile to trace;
3)关闭数据库
SQL>shutdown immediate
4)修改生成的控制文件的备份,保留一下内容,注意RESETLOGS,文件名称为 rebuild_control.sql
CREATE CONTROLFILE REUSE DATABASE "CSS" RESETLOGS ARCHIVELOG
MAXLOGFILES 50
MAXLOGMEMBERS 5
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 113
LOGFILE
GROUP 1 'D:ORACLEORADATACSSREDO01.LOG' SIZE 10M,
GROUP 2 'D:ORACLEORADATACSSREDO02.LOG' SIZE 10M,
GROUP 3 'D:ORACLEORADATACSSREDO03.LOG' SIZE 10M
DATAFILE
'D:ORACLEORADATACSSSYSTEM01.DBF',
'D:ORACLEORADATACSSUNDOTBS01.DBF',
'D:ORACLEORADATACSSDRSYS01.DBF',
'D:ORACLEORADATACSSEXAMPLE01.DBF',
'D:ORACLEORADATACSSINDX01.DBF',
'D:ORACLEORADATACSSODM01.DBF',
'D:ORACLEORADATACSSTOOLS01.DBF',
'D:ORACLEORADATACSSUSERS01.DBF',
'D:ORACLEORADATACSSXDB01.DBF',
'D:ORACLEORADATACSSSERVICE_DATA.ORA',
'D:ORACLEORADATACSSSERVICE_IDX.ORA'
CHARACTER SET ZHS16GBK
;
5)生成控制文件
SQL>startup nomount
SQL>@rebuild_control.sql
6)用生成的控制文件恢复数据库
SQL>recover database until cancel using backup controlfile;
7)取消恢复(目的是可以使用resetlogs打开数据库,生成重做日志文件)
cancel
8)用resetlogs打开数据库
SQL>alter database open resetlogs;
数据库异常关闭(shutdown abort )
只能用第一种方法恢复
7:丢失所有的控制文件和数据文件
分析
由于归档日志文件和联机重做日志文件没有丢失,故可以做完全恢复,任何已经提交的事务的数据都不会丢失.
方法一:使用using backup controlfile做不完全恢复,这样所有未归档的事务都会丢数。
1)还原最近一次备份的所有数据文件和控制文件
2)mount 起数据库
SQL>startup mount
3)恢复数据库
SQL>recover database until cancel using backup controlfile;
4)打开数据库
SQL>alter database open resetlogs
方法二:重建控制文件
1)还原最近一次备份的所有数据文件和控制文件
2)mount 起数据库
SQL> startup mount
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 143727516 bytes
Fixed Size 453532 bytes
Variable Size 109051904 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
ORA-01991: ???????'D:oracleora92DATABASEPWDcss.ORA'
3)根据提示修改密码文件,然后关闭重新mount数据库
SQL>host
Microsoft Windows [版本 5.2.3790]
(C) 版权所有 1985-2003 Microsoft Corp.
找到密码文件的位置,重建它
D:> cd D:oracleora92DATABASE
D:oracleora92DATABASE>del PWDcss.ORA
D:oracleora92DATABASE>orapwd file=PWDcss.ORA password=1234
D:oracleora92DATABASE>exit
SQL>shutdown immediate
SQL>startup mount
4)备份控制文件TO TRACE
SQL>alter database backup controlfile to trace
5)关闭数据库
SQL>shutdown immediate
6)修改备份出来的控制文件,只留下如下内容
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "CSS" NORESETLOGS ARCHIVELOG
-- SET STANDBY TO MAXIMIZE PERFORMANCE
MAXLOGFILES 50
MAXLOGMEMBERS 5
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 113
LOGFILE
GROUP 1 'D:ORACLEORADATACSSREDO01.LOG' SIZE 100M,
GROUP 2 'D:ORACLEORADATACSSREDO02.LOG' SIZE 100M,
GROUP 3 'D:ORACLEORADATACSSREDO03.LOG' SIZE 100M
-- STANDBY LOGFILE
DATAFILE
'D:ORACLEORADATACSSSYSTEM01.DBF',
'D:ORACLEORADATACSSUNDOTBS01.DBF',
'D:ORACLEORADATACSSDRSYS01.DBF',
'D:ORACLEORADATACSSEXAMPLE01.DBF',
'D:ORACLEORADATACSSINDX01.DBF',
'D:ORACLEORADATACSSODM01.DBF',
'D:ORACLEORADATACSSTOOLS01.DBF',
'D:ORACLEORADATACSSUSERS01.DBF',
'D:ORACLEORADATACSSXDB01.DBF',
'D:ORACLEORADATACSSSERVICE_DATA.ORA',
'D:ORACLEORADATACSSSERVICE_IDX.ORA'
CHARACTER SET ZHS16GBK
;
recover database
alter database Open;
7)运行该文件
SQL>@rebuild_control.sql
ORACLE 例程已经启动。
Total System Global Area 143727516 bytes
Fixed Size 453532 bytes
Variable Size 109051904 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
控制文件已创建
完成介质恢复。
数据库已更改。
总结:丢失所有的数据文件和控制文件,可以做完全恢复
1. 拷贝所有的控制文件和数据文件(不包括redo)
2. mount数据库,按照提示重建口令文件
3. 这时,试图完全恢复数据库是不成功的
4. 用to trace备份控制文件
5. 找到并且编辑控制文件
6. 重建控制文件
7. shutdown immediate,然后重新恢复数据库
8. 完全恢复数据库
9. 打开数据库
8:丢失所有的数据文件和联机重做日志文件
分析:由于丢失了所有的数据文件和联机重做日志文件,故只能做不完全恢复,任何没有归档的事务数据都被丢失。
1)还原所有的数据文件
2)mount数据库
SQL>startup mount
3)根据提示重建密码口令文件,然后重新mount起数据库
4)恢复数据库
SQL>recover database until cancel
auto
5)用resetlogs打开数据库
SQL>alter database open resetlogs
9:丢失所有的文件(只有INIT.ORA 和 SPFILE )
分析:由于只有归档日志文件和数据文件的备份,故所有未归档的事务数据都会丢失。
1)还原控制文件和全部数据文件
2)mount数据库
SQL>startup mount
3)根据提示重建密码口令文件,然后重新mount起数据库
4) 用using backup controlfile 恢复数据库
SQL>recover database until cancel using backup controlfile;
auto
5)用resetlogs打开数据库
SQL>alter database open resetlogs
也可以通过重建控制文件来恢复,不过重建控制文件需要使用RESETLOGS选项
10:丢失SYSTEM表空间的一个数据文件
分析:丢失了SYSTEM表空间的文件,只能脱机恢复。
1)还原丢失的文件
2)mount数据库
SQL>startup mount
3)做完全恢复
SQL>recover tablespace system;
或者
SQL>recover database;
或者
SQL>recover datafile '还原文件物理位置'
11:丢失一个普通的数据文件(不包含回滚段)
A:脱机恢复,用10的方法即可
B:联机恢复
分析:需要恢复的数据库文件必须处于脱机状态
方法1:直接操作数据文件
SQL>alter database datafile '文件名称' offline;
SQL>recover datafile '文件名称';
SQL>alter database datafile '文件名称' online;
方法2:通过数据文件所属的表空间操作
SQL>alter tablespace xxxx offline;
SQL>recover tablespace xxxx;
SQL>alter tablespace xxxx online;
12: ORACLE9I在回滚表空间自动管理的情况下丢失一个回滚段表空间的文件(包含回滚段)
A:脱机恢复,用10的方法即可(适用于数据库用shutdown immediate shutdown abort)
B:联机恢复(使需要恢复的回滚段表空间/数据文件脱机(只适用于数据库正常关闭的情况shutdown immediate))
分析:在正常关系的情况下,回滚段里没有活动事务,故数据库在使丢失的文件脱机后可以正常打开
如果是使用shutdown abort关闭,则回滚段中还会有活动事务,数据库在打开是要先做一个崩溃恢复,这时候
需要使用回滚段,但是,这时的回滚段是不能访问的,故恢复失败!
1)还原该文件的备份
2)修改init.ora中有关回滚段设置的参数,将参数undo_management设置未manual
SQL>create pfile='pfile_new.ora' from spfile;
修改pfile_new.ora文件,将参数undo_management设置未manual,同时去掉参数
undo_retention=900
undo_tablespace='UNDOTBS1'
3)重建spfile文件(先备份spfile)
SQL>create spfile from pfile='pfile_new.ora'
4)mount起数据库
SQL>startup mount
5)使丢失的数据文件脱机
SQL>alter database datafile 'd:oracleoradatatesttbsl.ora' offline;
6)打开数据库
SQL>alter database open;
7)联机恢复丢失的数据文件
SQL>recover datafile 'd:oracleoradatatesttbsl.ora' offline;
8) 使文件联机
SQL>alter database datafile 'd:oracleoradatatesttbsl.ora' online;
9)关闭数据库
SQL>shutdown immediate
10)恢复备份的spfile成为当前spfile
11)重新启动数据库
SQL>startup
2)没有备份的强制恢复
1)修改init.ora中有关回滚段设置的参数,将参数undo_management设置未manual
SQL>create pfile='pfile_new.ora' from spfile;
修改pfile_new.ora文件,将参数undo_management设置未manual,同时去掉参数
undo_retention=900
undo_tablespace='UNDOTBS1'
2)重建spfile文件(先备份spfile)
SQL>create spfile from pfile='pfile_new.ora'
3)mount起数据库
SQL>startup mount
4)使丢失的数据文件脱机
SQL>alter database datafile 'd:oracleoradatatesttbsl.ora' offline drop;
5)打开数据库
SQL>alter database open;
6)删除数据文件所在的表空间
SQL>drop tablespace xxxx including contents;
7)重建该表空间
SQL>create tablespace xxxx datafile 'datafilename' size 50M;
13:丢失一个没有备份的数据文件
SQL> conn sys/iamahost@lcss as sysdba
已连接到空闲例程。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 143727516 bytes
Fixed Size 453532 bytes
Variable Size 109051904 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 D:oracleoradatacssarchive
最早的概要日志序列 16
下一个存档日志序列 18
当前日志序列 18
SQL> alter system switch logfile;
系统已更改。
SQL> alter tablespace users add datafile 'd:oracleoradatacssuser_add.ora' size 10M;
表空间已更改。
SQL> alter system switch logfile;
系统已更改。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host
Microsoft Windows [版本 5.2.3790]
(C) 版权所有 1985-2003 Microsoft Corp.
E:>d:
D:>cd d:oracleoradatacss
D:oracleoradatacss>dir
驱动器 D 中的卷是 应用程序
卷的序列号是 C954-72C9
D:oracleoradatacss 的目录
2005-09-08 10:40 <DIR> .
2005-09-08 10:40 <DIR> ..
2005-11-25 14:02 2,002,944 CONTROL01.CTL
2005-11-25 14:02 2,002,944 CONTROL02.CTL
2005-11-25 14:02 2,002,944 CONTROL03.CTL
2005-11-25 14:02 20,975,616 DRSYS01.DBF
2005-11-25 14:02 152,702,976 EXAMPLE01.DBF
2005-11-25 14:02 26,218,496 INDX01.DBF
2005-11-25 14:02 20,975,616 ODM01.DBF
2005-11-25 14:02 104,858,112 REDO01.LOG
2005-11-25 14:02 104,858,112 REDO02.LOG
2005-11-25 13:58 104,858,112 REDO03.LOG
2005-11-25 14:02 209,719,296 SERVICE_DATA.ORA
2005-11-25 14:02 209,719,296 SERVICE_IDX.ORA
2005-11-25 14:02 356,519,936 SYSTEM01.DBF
2005-11-17 17:16 97,521,664 TEMP01.DBF
2005-11-25 14:02 10,489,856 TOOLS01.DBF
2005-11-25 14:02 209,719,296 UNDOTBS01.DBF
2005-11-25 14:02 32,772,096 USERS01.DBF
2005-11-25 14:02 39,981,056 XDB01.DBF
2005-11-25 14:02 10,489,856 USER_ADD.ORA
2005-10-18 15:34 <DIR> archive
2005-11-17 13:37 <DIR> back
2005-11-18 14:27 <DIR> back_new
19 个文件 1,718,388,224 字节
5 个目录 8,426,979,328 可用字节
D:oracleoradatacss>del USER_ADD.ORA
D:oracleoradatacss>exit
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 143727516 bytes
Fixed Size 453532 bytes
Variable Size 109051904 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
SQL> alter database create datafile 'd:oracleoradatacssuser_add.ora' as 'd:oracleoradatacssuser_add.ora';
数据库已更改。
SQL> recover datafile 'd:oracleoradatacssuser_add.ora';
完成介质恢复。
SQL> alter database open;
数据库已更改。
SQL>
说明:alter database create datafile 命令可以用来创建丢失的数据文件
增加数据文件是使用命令
alter tablespace add datafile
1、运行 /home 文件系统的增量备份:
dsmc incremental /home
2、运行 /home/jones 目录的按日期增量备份,请输入:
dsmc incremental -incrbydate /home/jones
3、运行 /home/jones 目录中 proja 文件的选择性备份,请输入:
dsmc selective /home/jones/proja
4、运行 /home/jones 目录的映象备份,请输入:
dsmc backup image /home/jones
5、将 /home/jones/proja 文件恢复到它的原始目录中,请输入:
dsmc restore /home/jones/proja
6、从 /dev/rmt0 磁带设备中恢复备份集,请输入:
dsmc restore backupset "/dev/rmt0" -location=tape
7、使用 archive 命令可归档单个文件、一组文件或一个目录及其子目录中的全部文件。如果要归档一个目录及其子目录中的全部文件,请使用 subdir=yes 选项。如果要 TSM 在文件归档并提交存储后删除这些文件,请使用 deletefiles 选项。 归档 /home/jones/proj 目录及其子目录中的文件,请输入:
dsmc archive /home/jones/proj/ -subdir=yes -deletefiles
在 Archive 命令中可以使用多个文件规范。例如,要归档 /home/jones/h1.doc 和 /home/jones/test.doc 文件,请输入:
dsmc archive /home/jones/h1.doc /home/jones/test.doc
使用 description 选项指定归档的描述,如下所示:
dsmc archive /home/jones/h1.doc -description="Chapter 1, first
version"
expdp/impdp的使用总结
1.使用expdp要先在数据库中创建directory,并给相应的用户read,write权限.
SQL>create directory expdpdir as 'd:';
SQL>grant read,write on directory expdpdir to helios;
2.常用的导出倒入用法
a) 导出导出表:
expdp helios/helios directory=expdpdir dumpfile=11.dmp tables=dep,em,cat
expdp scott/timer DUMPFILE=tmp_200703.dmp DIRECTORY=dmpdir TABLES=tmp QUERY='where status is not null'
impdp helios/helios directory=expdpdir dumpfile=11.dmp tables=dep,em,cat
impdp system/oracle directory=expdpdir dumpfile=11.dmp tables=helios.dep,helios.em,helios.cat
remap_schema=helios:system //倒入到system下面
b) 导出导出schema
expdp helios/helios directory=expdpdir dumpfile=11.dmp schemas=helios
impdp system/oracle directory=expdpdir dumpfile=11.dmp schemas=helios remap_schema=helios:system
c) 导出导出表空间
expdp helios/helios directory=expdpdir dumpfile=11.dmp tablespaces=system,rep_ts
imppdp helios/helios directory=expdpdir dumpfile=11.dmp tablespaces=system,rep_ts
d) 导出导出数据库(导出用户需要dba角色)
expdp helios/helios directory=expdpdir dumpfile=11.dmp full=y
impdp helios/helios directory=expdpdir dumpfile=11.dmp full=y
在使用expdp的时候,提示没有了temp表空间,看来是需要重新建立了。
1、sql>create temporary tablespace temp_ts tempfile 'D:oracleproduct10.2.0oradatafufei1temp01.dbf ' size 100m reuse AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED;
2、alter database default temporary tablespace temp_ts;
3、drop tablespace temp including contents and datafiles;
4、如果还是想使用原来的temp作为临时表空间,继续执行1。2。3
回滚段表空间也可以如法炮制,语句写法如下:
SQL> create undo tablespace undotbs2 datafile '/oracle/app/oradata/smscdb/undotbs2.dbf' size 1000M;
SQL> alter system set undo_tablespace=undotbs2;
SQL> drop tablespace undotbs1 including contents and datafiles;
假设现有三个日志组,每个组内有一个成员,每个成员的大小为1MB,现在想把此三个日志组的成员大小都改为10MB
1、创建2个新的日志组
alter database add logfile group 4 ('D:ORACLEORADATAORADBREDO04_1.LOG') size 1024k;
alter database add logfile group 5 ('D:ORACLEORADATAORADBREDO05_1.LOG') size 1024k;
2、切换当前日志到新的日志组
alter system switch logfile;
alter system switch logfile;
3、删除旧的日志组
alter database drop logfile group 1;
alter database drop logfile group 2;
alter database drop logfile group 3;
4、操作系统下删除原日志组1、2、3中的文件
5、重建日志组1、2、3
alter database add logfile group 1 ('D:ORACLEORADATAORADBREDO01_1.LOG') size 10M;
alter database add logfile group 2 ('D:ORACLEORADATAORADBREDO02_1.LOG') size 10M;
alter database add logfile group 3 ('D:ORACLEORADATAORADBREDO03_1.LOG') size 10M;
6、切换日志组
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
7、删除中间过渡用的日志组4、5
alter database drop logfile group 4;
alter database drop logfile group 5;
8、到操作系统下删除原日志组4、5中的文件
9、备份当前的最新的控制文件
SQL> alter database backup controlfile to trace resetlogs
1、set oracle_sid=fufei
2、set nls_date_format=yyyy-mm-dd hh24:mi:ss
注意:
a) windowns的设置没有但引号
b) unix的设置方式:export NLS_DATE_FORMAT='YYYY-MM-DD:HH24:MI:SS'
3、rman target /
run{
startup mount force;
set until time='yyyy-mm-dd 24hh:mi:ss';
restore database;
recover database;
sql 'alter database open resetlogs';
}