pulf

欢迎来到pulf>>   | 首页 资源中心 | 基础技术 | 基础技术 | 备份恢复 | 物化视图 | Unix与阵列 | 10/11g新特性 | DataGuard | JOB/Stream | RAC | 安装迁移 | 高级复制 | 结构体系 | 性能优化 | ITPUB论坛

Oracle SCN机制解析

发表人:pulf | 发表时间: 2008年七月01日, 14:36

SCNSystem Chang Number)作为oracle中的一个重要机制,在数据恢复、Data GuardStreams复制、RAC节点间的同步等各个功能中起着重要作用。理解SCN的运作机制,可以帮助你更加深入地了解上述功能。

在理解SCN之前,我们先看下oracle事务中的数据变化是如何写入数据文件的:

1、 事务开始;

2、 buffer cache中找到需要的数据块,如果没有找到,则从数据文件中载入buffer cache中;

3、 事务修改buffer cache的数据块,该数据被标识为“脏数据”,并被写入log buffer中;

4、 事务提交,LGWR进程将log buffer中的“脏数据”写入redo log file中;

5、 当发生checkpointCKPT进程更新所有数据文件的文件头中的信息,DBWn进程则负责将Buffer Cache中的脏数据写入到数据文件中。

经过上述5个步骤,事务中的数据变化最终被写入到数据文件中。但是,一旦在上述中间环节时,数据库意外宕机了,在重新启动时如何知道哪些数据已经写入数据文件、哪些没有写呢(同样,在DGstreams中也存在类似疑问:redo log中哪些是上一次同步已经复制过的数据、哪些没有)?SCN机制就能比较完善的解决上述问题。

SCN是一个数字,确切的说是一个只会增加、不会减少的数字。正是它这种只会增加的特性确保了Oracle知道哪些应该被恢复、哪些应该被复制。

总共有4SCN:系统检查点(System CheckpointSCN、数据文件检查点(Datafile CheckpointSCN、结束SCNStop SCN)、开始SCNStart SCN)。其中其面3SCN存在于控制文件中,最后一种则存在于数据文件的文件头中。

在控制文件中,System Checkpoint SCN是针对整个数据库全局的,因而之存在一个,而Datafile Checkpoint SCNStop SCN是针对每个数据文件的,因而一个数据文件就对应在控制文件中存在一份Datafile Checkpoint SCNStop SCN。在数据库正常运行期间,Stop SCN(通过视图v$datafile的字段last_change#可以查询)是一个无穷大的数字或者说是NULL

在一个事务提交后(上述第四个步骤),会在redo log中存在一条redo记录,同时,系统为其提供一个最新的SCN(通过函数dbms_flashback.get_system_change_number可以知道当前的最新SCN),记录在该条记录中。如果该条记录是在redo log被清空(日志满做切换时或发生checkpoint时,所有变化日志已经被写入数据文件中),则其SCN被记录为redo loglow SCN。以后在日志再次被清空前写入的redo记录中SCN则成为Next SCN

当日志切换或发生checkpoint(上述第五个步骤)时,从Low SCNNext 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转换过来的。每当需要产生一个最新的SCNredo记录时,系统获取当时的timestamp,将其转换为数字作为SCN。我们可以通过函数SCN_TO_TIMESTAMP10g以后)将其转换回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)
---------------------------------------------------------------------------
              2877076756
17-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 SCNStop SCN是否相同。如果发现有不同,就从Redo Log中找到丢失的SCN,重新写入数据文件中进行恢复。具体的数据恢复过程这里就不再赘述。

SCN作为Oracle中的一个重要机制,在多个重要功能中起着“控制器”的作用。了解SCN的产生和实现方式,帮助DBA理解和处理恢复、DGStreams复制的问题。

最后提一句,利用SCN机制,在Oracle10g11g中又增加了一些很实用的功能——数据库闪回、数据库负载重现等。


exp/imp故障

发表人:pulf | 发表时间: 2008年五月14日, 18:48

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角色去掉,重新导出


aix的2g限制问题

发表人:pulf | 发表时间: 2008年五月04日, 14:32

大文件支持的问题,解决方法如下:
1、修改/etc/security/limits这个文件,把fsize 改为-1

2、看文件系统是不是大文件支持的
a、smit jfs,并选中那个文件系统,回车
b、看large file enabled这一项是不是true的,如果是则没问题了
c、如果不是,则把数据备出,删掉那个文件系统,重建时选择大文件支持就可以了。

hacmp增加共享裸设备过程

发表人:pulf | 发表时间: 2008年四月30日, 23:22

阵列做映射
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 去掉 (多个盘的时候起作用)


一个控制文件的报错

发表人:pulf | 发表时间: 2008年四月26日, 02:55

--一个开发数据库,启动报错:

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.

重建控制文件即可.


oracle 恢复试验

发表人:pulf | 发表时间: 2008年四月15日, 16:11

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

TSM客户端命令

发表人:pulf | 发表时间: 2008年四月15日, 15:51

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的使用总结

发表人:pulf | 发表时间: 2008年四月11日, 15:15

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


重建临时表空间和undo表空间

发表人:pulf | 发表时间: 2008年四月11日, 11:19

在使用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;


修改日志文件的大小

发表人:pulf | 发表时间: 2008年四月10日, 09:51

假设现有三个日志组,每个组内有一个成员,每个成员的大小为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

rman基于时间的恢复中的问题

发表人:pulf | 发表时间: 2008年四月09日, 16:53

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';

}


Valid XHTML 1.0 Strict and CSS. Powered by pLog
Design by Blog.lvwo.com