ITPub博客

首页 > 数据库 > 数据库开发技术 > 练习:数据库恢复案例

练习:数据库恢复案例

原创 数据库开发技术 作者:therorawt 时间:2008-03-04 01:00:29 0 删除 编辑

在网上找了些备份与恢复练习,自己动手操作了遍,现把具体步骤与操作过程中遇到的问题记录如下:

目录
No.1 非归档模式下的备份与恢复

No.2 归档模式下丢失或损坏一个数据文件
--OS备份方案
--RMAN备份方案

No.3 丢失多个数据文件,实现整个数据库的恢复
--OS备份方案
--RMAN备份方案

[@more@]

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/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 看球前的感言
请登录后发表评论 登录
全部评论
  • 博文量
    38
  • 访问量
    47438