全部博文(101)
分类: Oracle
2012-11-16 10:39:39
本次实验的重点对oracle 数据库进行备份,如果出现介质损坏,利用数据库的备份集对数据库基于时间点的恢复,以用来对生产数据库得到一个及时有效的预案。
例如 2012/07/19 下午15:17对数据库进行了全库备份,之后数据库损坏要求恢复到下午16:22数据,具体的操作步骤如下:
1 对数据库的备份的脚本如下
run {
CROSSCHECK ARCHIVELOG ALL;---检查是否有无效的归档日志
allocate channel ch1 device type disk ;
allocate channel ch2 device type disk ;
backup spfile format='/oracle/rman/spfile_%d_%s_%p_%t';--备份初始化文件
backup full filesperset=20 tag='Full_%d' format='/oracle/rman/Full_%d_%s_%p_%t'
database include current controlfile;--备份数据文件.
backup filesperset=10 format='/oracle/rman/Arch_%d_%s_%p_%t'
ARCHIVELOG ALL NOT BACKED UP 1 TIMES;--备份归档日志文件,如果归档日志文件已经备份过,就不用再备份。
DELETE NOPROMPT ARCHIVELOG UNTIL TIME '(SYSDATE-7)';--删除7天之前的归档日志的备份
backup format='/oracle/rman/Cntl_%d_%s_%p_%t' current controlfile;--备份控制文件。
release channel ch1;
release channel ch2;
}
2 恢复之前表 COM_FINAEXPENSES中的数据量为
SQL> select count(*) from COM_FINAEXPENSES;
COUNT(*)
----------
172289
3 在下午的15:17对数据已经备份结束,这时对表插入三条记录
insert into COM_FINAEXPENSES (ID, COMCODE, PUBDATE, REPORTDATE, ORDERNUMBER, EXPENSEITEM, VALBEGINNING, VALENDING, REMARK, ENTRYTIME, UPDATETIME, GROUNDTIME, UPDATEID, RESOURCEID, RECORDID)
values (1, 1, null, to_date('19-07-2012', 'dd-mm-yyyy'), null, '1', 1.0000, 1.0000, '1', to_date('19-07-2012', 'dd-mm-yyyy'), to_date('19-07-2012', 'dd-mm-yyyy'), to_date('19-07-2012', 'dd-mm-yyyy'), 1, 'CHZX', '1');
insert into COM_FINAEXPENSES (ID, COMCODE, PUBDATE, REPORTDATE, ORDERNUMBER, EXPENSEITEM, VALBEGINNING, VALENDING, REMARK, ENTRYTIME, UPDATETIME, GROUNDTIME, UPDATEID, RESOURCEID, RECORDID)
values (2, 2, null, to_date('19-07-2012', 'dd-mm-yyyy'), null, '2', 2.0000, 2.0000, '2', to_date('19-07-2012', 'dd-mm-yyyy'), to_date('19-07-2012', 'dd-mm-yyyy'), to_date('19-07-2012', 'dd-mm-yyyy'), 2, 'CHZX', '1');
insert into COM_FINAEXPENSES (ID, COMCODE, PUBDATE, REPORTDATE, ORDERNUMBER, EXPENSEITEM, VALBEGINNING, VALENDING, REMARK, ENTRYTIME, UPDATETIME, GROUNDTIME, UPDATEID, RESOURCEID, RECORDID)
values (3, 3, null, to_date('19-07-2012', 'dd-mm-yyyy'), null, '3', 3.0000, 3.0000, '3', to_date('19-07-2012', 'dd-mm-yyyy'), to_date('19-07-2012', 'dd-mm-yyyy'), to_date('19-07-2012', 'dd-mm-yyyy'), 3, 'CHZX', '3');
查看表的数据量为
SQL> select count(*) from COM_FINAEXPENSES;
COUNT(*)
----------
172292
4 切换一个redolog日志
alter system switch logfile;
生成的归档日志以后需要
5 破环数据库 用dbca 图示化界面删除数据库--这里只是删除oracle database ,oracle 软件不必删除。
6 开始恢复到下午16:22的数据库的状态
6.1 创建恢复需要的目录文件
mkdir -p /oracle/app/oracle/admin/centerdb/bdump
mkdir -p /oracle/app/oracle/admin/centerdb/cdump
mkdir -p /oracle/app/oracle/admin/centerdb/udump
mkdir -p /oracle/app/oracle/admin/centerdb/adump
mkdir –p /oracle/data
mkdir –p /oracle/archive
mkdir –p /oracle/redolog
mkdir –p /oracle/controlfile
6.2 将spfile 文件copy 到路径$ORACLE_HOME/dbs路径下,登陆数据库
创建pfile文件
SQL>create pfile from spfile;
SQL>sqlplus /nolog
SQL>conn / as sysdba
SQL>startup nomount ;
$ rman
RMAN>connect target
RMAN>run{
allocate channel c1 type disk;
restore controlfile from '/oracle/rman/Cntl_CENTERDB_21_1_789059873 ';--这是备份的控制文件的备份片
release channel c1;
}
SQL>alter database mount;
RMAN>run{
allocate channel c1 type disk;
allocate channel c2 type disk;
restore database;
release channel c1;
release channel c2;
}---恢复数据文件
RMAN>run{
allocate channel c1 type disk;
allocate channel c2 type disk;
restore archivelog all;
release channel c1;
release channel c2;
}---恢复归档日志文件
SQL>recover database using backup controlfile until time '2012-07-19 16:22:00’;--基于时间点的恢复
选择auto
alter database open resetlogs;
7 查看表COM_FINAEXPENSES的数据量
SQL> select count(*) from COM_FINAEXPENSES;
COUNT(*)
----------
172293
其中插入的三条记录都存在。