在网上找了些备份与恢复练习,自己动手操作了遍,现把具体步骤与操作过程中遇到的问题记录如下:
目录
No.1 非归档模式下的备份与恢复
No.2 归档模式下丢失或损坏一个数据文件
--OS备份方案
--RMAN备份方案
No.3 丢失多个数据文件,实现整个数据库的恢复
--OS备份方案
--RMAN备份方案
No.4 不完全恢复案例
--OS备份下的基于时间的恢复
--RMAN备份下的基于改变的恢复
--------------------------------------
No.1非归档模式下的备份与恢复
1. 改为非归档模式
SQL> conn sys/sys as sysdba
SQL> shutdown immediate
SQL> startup mount
SQL> archive log list
SQL> alter database noarchivelog;
SQL> alter database open;
SQL> conn sys/sys as sysdba;
2. 新建测试用户
--要删除数据文件,必须删除数据文件所在的表空间。
SQL> drop user therorawt cascade;
--cascade: Specify CASCADE to drop all objects in the user's schema before dropping the user.
SQL> drop tablespace test01 including contents;
--including contents: Specify INCLUDING CONTENTS to drop all the contents of the tablespace.
--新建表空间
SQL> CREATE TABLESPACE test01 DATAFILE 'F:oracleoradatamydbTEST01.DBF' SIZE 10M MINIMUM EXTENT 500K DEFAULT STORAGE (INITIAL 128K NEXT 128K) LOGGING;
--新建用户
SQL> CREATE USER therorawt IDENTIFIED BY passwd DEFAULT TABLESPACE test01;
SQL> GRANT CONNECT,RESOURCE,DBA TO therorawt;
SQL> conn therorawt/passwd
--建测试数据
SQL> create table test(a int);
SQL> insert into test values(1);
SQL> commit;
3. 正常关闭数据库,备份测试表空间
SQL> conn sys/sys as sysdba;
SQL> shutdown immediate
拷贝所有数据文件、控制文件,重做日志文件
4. 打开数据库,给TEST表再插入条数据
SQL> startup
SQL> conn therorawt/passwd
SQL> insert into test values(2);
5. 关闭数据库,删除表空间TEST01对应的数据文件
SQL> conn sys/sys as sysdba
SQL> shutdown immediate
删除表空间TEST01对应的数据文件
6. 重启数据库,发现错误
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 12 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 12: 'F:ORACLEORADATAMYDBTEST01.DBF'
7. 拷贝备份复原到原来的位置(restore过程)
C:>xcopy E:backupTEST01.DBF F:oracleoradatamydbTEST01.DBF
目标 F:oracleoradatamydbTEST01.DBF 是文件名
还是目录名
(F = 文件,D = 目录)? f
E:backupTEST01.DBF
复制了 1 个文件
8. 打开数据库,检查数据
SQL> startup
//SQL> recover --进行介质恢复(如果就备份当数据文件,那么需要这一步来进行介质恢复,如果备份所有数据文件、控制文件、重做日志文件,那么就不需要这一步)
SQL> alter database open;
SQL> conn therorawt/passwd
SQL> select * from test;
--备份成功恢复--
执行过程遇到的问题:
1. 在第3步中,需要备份所有数据文件、控制文件、重做日志文件。
如果备份单个文件,需要执行recover,从redofile进行自动恢复,不过,多执行几次alter system switch logfile就无法恢复了。
/***********************************************************/
No.2归档模式下丢失或损坏一个数据文件
OS备份方案
1. 改为归档模式
sqlplus "/ as sysdba"
SQL> shutdown immediate
SQL> startup mount
SQL> archive log list
SQL> alter database archivelog; --改为归档模式
SQL> alter database open;
SQL> conn therorawt/passwd
SQL> select * from test;
COL
----------
1
2
3
4
5
6
2. 备份数据库
SQL> @"C:Documents and Settingsuser桌面hotbak.sql"
--脚本见附1
3. 删除测试表
SQL> conn therorawt/pass
SQL> delete from test where col not in(3,5);
SQL> select * from test;
COL
----------
3
5
SQL> commit;
SQL> conn sys/sys as sysdba
SQL> alter system switch logfile;
SQL> alter system switch logfile;
4. 关闭数据库
SQL> shutdown immediate
删除数据文件TEST01.DBF
5. 启动数据库错误,脱机该数据文件
SQL> startup
--ORA-01157: 无法标识/锁定数据文件 12 - 请参阅 DBWR 跟踪文件
--ORA-01110: 数据文件 12: 'F:ORACLEORADATAMYDBTEST01.DBF'
查看告警文件F:oracleadminmydbbdump,或动态视图v$recover_file
SQL> select * from v$recover_file;
--确认文件12的状态
SQL> select * from v$datafile;
--脱机数据文件
--不脱机,数据库启不来
SQL> alter database datafile 12 offline drop;
6. 打开数据库,进行restore(拷贝)、recover(恢复)
--restore、recover操作在数据文件脱机的状态下进行
SQL> alter database open;
SQL> recover datafile 12
AUTO
--恢复成功,联机该数据文件
SQL> alter database datafile 12 online;
7. 检查数据库的数据(完全恢复)
SQL> conn therorawt/passwd
SQL> select * from test;
COL
----------
3
5
--备份成功恢复--
执行中遇到的问题:
1.
--sql*plus中可用 $ 或host来切换到dos方式;
--svrmgrl 中可用 ! 或host来切换到dos方式。
----------------------------------------
RMAN备份方案
1. 查看测试数据
SQL> conn therorawt/passwd
SQL> select * from test;
COL
----------
3
5
7
2. 备份表空间TEST01
C:>rman target therorawt/passwd@mydb
RMAN> run{
2> allocate channel c1 type disk;
3> backup tag 'tstest01' format 'e:backuptstest01_%u_%s_%p'
4> tablespace test01;
5> release channel c1;
6> }
3. 在测试表中插入记录
SQL> insert into test values(7);
SQL> commit;
SQL> select * from test;
COL
----------
7
5
SQL> alter system switch logfile;
SQL> alter system switch logfile;
4. 关闭数据库,模拟丢失数据文件
SQL> shutdown immediate
删除数据文件test01.dbf
5. 启动数据库,检查错误
SQL> startup
--ORA-01157: 无法标识/锁定数据文件 12 - 请参阅 DBWR 跟踪文件
--ORA-01110: 数据文件 12: 'F:ORACLEORADATAMYDBTEST01.DBF'
6. 先打开数据库
SQL> alter database datafile 12 offline drop;
SQL> alter database open;
7. 恢复该表空间
C:>rman target therorawt/passwd
RMAN> run{
2> allocate channel c1 type disk;
3> restore datafile 12;
4> recover datafile 12;
5> sql 'alter database datafile 12 online';
6> release channel c1;
7> }
8. 检查数据是否完整
SQL> conn therorawt/passwd
已连接。
SQL> select * from test;
COL
----------
7
5
--备份成功恢复--
执行过程遇到的问题:
1. 当执行alter system switch logfile时,没响应。
解决:
数据库如果运行在归档模式下的,初始化参数里面没有把log_archive_start设为true的话,归档进程就不会自动启动,这时候如果日志文件都写满的话,由于没有归档进程将日志文件及时归档,数据库会挂起来。改变这种状态就是执行alter system archive log start命令手工启动归档进程。事实上,正是这个原因造成。非归档模式日志文件循环使用,不进行归档,不存在这个问题。
2. 延伸出的问题:查询v$session_wait,怎么看这视图的数据 ?
3. 更改参数
--true不需要加引号
SQL> alter system set log_archive_start = true scope = spfile;
4. 查看系统使用spfile还是pfile
--如果以下语句返回为空,那么说明使用pfile
SQL> SHOW PARAMETER spfile;
/***********************************************************/
No.3 丢失多个数据文件,实现整个数据库的恢复
OS备份方案
1. 查看备份前的数据
SQL> conn therorawt/passwd
SQL> select * from test;
COL
----------
57
2. 备份数据库,备份除临时数据文件后的所有数据文件
SQL> @hotbak.sql
--脚本见附1
3. 继续在测试表中插入记录
SQL> insert into test values (35);
SQL> select * from test;
COL
----------
57
35
SQL> commit;
SQL> alter system switch logfile;
SQL> alter system switch logfile;
4. 关闭数据库,模拟数据文件丢失
SQL> conn sys/sys as sysdba
SQL> shutdown immediate
删除数据文件JFK_DATA01.DBF、TEST01.DBF、SYSTEM01.DBF
5. 启动数据库,检查错误
SQL> startup
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 1 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 1: 'F:ORACLEORADATAMYDBSYSTEM01.DBF'
--查询需要恢复的数据文件
SQL> select * from v$recover_file;
6. 拷贝备份回到原地点(restore),开始恢复数据库(recover)
拷贝数据文件JFK_DATA01.DBF、TEST01.DBF、SYSTEM01.DBF。
--恢复数据库
SQL> recover database
SQL> alter database open;
7. 检查数据库的恢复
SQL> conn sys/sys as sysdba
SQL> select * from dba_data_files;
SQL> conn therorawt/passwd
已连接。
SQL> select * from test;
COL
----------
57
35
--备份成功恢复--
----------------------------------------
RMAN备份方案
RMAN备份归档模式下损坏(丢失)多个数据文件,进行数据库的恢复
1. 检查测试数据
SQL> conn therorawt/passwd
已连接。
SQL> select * from test;
COL
----------
57
35
2. 进行RMAN备份
C:>rman target therorawt/passwd@mydb
RMAN> run{
2> allocate channel c1 type disk;
3> backup full tag 'dbfull' format 'e:backupfull%u_%s_%p' database
4> include current controlfile;
5> sql 'alter system archive log current';
6> release channel c1;
7> }
3. 改变测试数据
SQL> delete from test where col = 35;
SQL> select * from test;
COL
----------
57
SQL> commit;
SQL> alter system switch logfile;
SQL> alter system switch logfile;
4. 关闭数据库,模拟数据库文件丢失
SQL> conn sys/sys as sysdba
SQL> shutdown immediate
删除数据文件USERS01.DBF、TEST01.DBF、JFK_DATA01.DBF
5. 启动数据库,查看错误
SQL> startup
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 1 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 1: 'F:ORACLEORADATAMYDBUSERS01.DBF'
6. 用RMAN进行恢复
C:>rman target therorawt/passwd@mydb
RMAN> run{
2> allocate channel c1 type disk;
3> restore database;
4> recover database;
5> sql 'alter database open';
6> release channel c1;
7> }
7. 查看恢复后数据
SQL> conn therorawt/passwd
已连接。
SQL> select * from test;
COL
----------
57
--备份成功恢复--
/***********************************************************/
No.4 不完全恢复案例
--OS备份下的基于时间的恢复
1. 查看测试数据
SQL> show user
USER 为"THERORAWT"
SQL> select * from test;
COL
----------
57
2. 进行备份,脚本见附1 hotbak.sql
SQL> @hotbak.sql
3. 改变测试数据,然后删除测试表TEST,记下时间点
SQL> insert into test values(35);
SQL> select * from test;
COL
----------
57
35
SQL> commit;
SQL> alter system switch logfile;
SQL> alter system switch logfile;
--T1时间
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2008-03-04 18:14:14
SQL> truncate table test;
SQL> drop table test;
4. 重启数据库,查看错误
SQL> conn sys/sys as sysdba
SQL> shutdown immediate
SQL> startup
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: 'F:ORACLEORADATAMYDBSYSTEM01.DBF'
5. 不完全恢复数据库到T1时间
SQL> recover database until time '2008-03-04 18:14:14';
auto
--不完全恢复之后,都必须用resetlogs的方式打开数据库。
SQL> alter database open resetlogs;
SQL> conn therorawt/passwd
SQL> select * from test;
COL
----------
57
35
----------------------------------------
--RMAN备份下的基于改变的恢复
1. 查看测试数据
SQL> conn therorawt/passwd
SQL> select * from test;
COL
----------
57
35
2. 进行RMAN备份
C:>rman target therorawt/passwd@mydb
RMAN> run{
2> allocate channel c1 type disk;
3> restore database;
4> recover database until scn 3120753;
5> sql 'alter database open resetlogs';
6> release channel c1;
7> }
3. 删除测试表
SQL> delete from test where col = 35;
SQL> select * from test;
COL
----------
57
SQL> commit;
SQL> alter system switch logfile;
SQL> alter system switch logfile;
--获取SCN
SQL> conn sys/sys as sysdba
SQL> select max(ktuxescnw*power(2,32)+ktuxescnb) scn from x$ktuxe;
SCN
----------
3120753
SQL> truncate table therorawt.test;
SQL> drop table therorawt.test;
4. 关闭数据库,启动到mount状态下,恢复到SCU 3120753
SQL> shutdown immediate
SQL> startup mount
C:>rman target therorawt/passwd@mydb
--不完全恢复一样,必须在mount下,restore所有备份数据文件,需要resetlogs
RMAN> run{
2> allocate channel c1 type disk;
3> restore database;
4> recover database until scn 3120753;
5> sql 'alter database open resetlogs';
6> release channel c1;
7> }
5. 检查测试数据
SQL> show user
USER 为"SYS"
SQL> select * from therorawt.test;
COL
----------
57
--备份成功恢复--
/***********************************************************/
----------------------------------------
附1 hotbak.sql
--------------
/*hotbak.sql*/
--archive
alter system archive log current;
--start
alter tablespace XDB begin backup;
$xcopy F:oracleoradatamydbXDB01.DBF e:backup/H/R;
alter tablespace XDB end backup;
alter tablespace USERS begin backup;
$xcopy F:oracleoradatamydbUSERS01.DBF e:backup/H/R;
alter tablespace USERS end backup;
alter tablespace UNDOTBS1 begin backup;
$xcopy F:oracleoradatamydbUNDOTBS01.DBF e:backup/H/R;
alter tablespace UNDOTBS1 end backup;
alter tablespace TOOLS begin backup;
$xcopy F:oracleoradatamydbTOOLS01.DBF e:backup/H/R;
alter tablespace TOOLS end backup;
alter tablespace TEST01 begin backup;
$xcopy F:oracleoradatamydbTEST01.DBF e:backup/H/R;
alter tablespace TEST01 end backup;
alter tablespace SYSTEM begin backup;
$xcopy F:oracleoradatamydbSYSTEM01.DBF e:backup/H/R;
alter tablespace SYSTEM end backup;
alter tablespace ODM begin backup;
$xcopy F:oracleoradatamydbODM01.DBF e:backup/H/R;
alter tablespace ODM end backup;
alter tablespace JFK_DATA01 begin backup;
$xcopy F:oracleoradatamydbJFK_DATA01.DBF e:backup/H/R;
alter tablespace JFK_DATA01 end backup;
alter tablespace INDX begin backup;
$xcopy F:oracleoradatamydbINDX01.DBF e:backup/H/R;
alter tablespace INDX end backup;
alter tablespace EXAMPLE begin backup;
$xcopy F:oracleoradatamydbEXAMPLE01.DBF e:backup/H/R;
alter tablespace EXAMPLE end backup;
alter tablespace DRSYS begin backup;
$xcopy F:oracleoradatamydbDRSYS01.DBF e:backup/H/R;
alter tablespace DRSYS end backup;
alter tablespace CWMLITE begin backup;
$xcopy F:oracleoradatamydbCWMLITE01.DBF e:backup/H/R;
alter tablespace CWMLITE end backup;
--end
--bak control file
--binary
alter database backup controlfile to 'e:backupcontrolbinbak.000';
--ascii
alter database backup controlfile to trace;
alter system archive log current;
--------------
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9896745/viewspace-1000355/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9896745/viewspace-1000355/