oracle手工完全恢复

广大2年前技术文章476

一)基本概念

1)完全恢复的步骤

1)restore: OS拷贝命令还原所有或部分datafile

2)recover:SQL*PLUS利用归档日志和当前的redo日志做恢复

2)完全恢复可以基于三个级别

recover database: 所有或大部分datafile损坏,一般是在mount状态完成

recover tablespace: 非关键表空间损坏,表空间下某些数据文件不能访问,一般是在open下完成

recover datafile: 单一或少量数据文件损坏,可以在mount或open 状态完成

3)什么是关键文件

如果关键文件损坏,数据库将不能维持在open状态,或崩溃或死机!

哪些文件是关键文件:system01 file,undotbs file,control file,current log file

4)恢复过程可以查看的视图:

1)v$recover_file 查看需要恢复的datafile

2)v$recovery_log 查看recover 需要的redo 日志

3)v$archvied_log 查看已经归档的日志

二)适用场景

1)recover database (所有或大部分数据文件损坏,mount或open下进行)

OS:使用cp 还原受损的dbf(不一定是全部,v$recover_file记录的都需要还原)

SQLPLUS:

recover database;

alter database open;

示例1:recover database (如果是system01.dbf损坏只能在mount下恢复。)
sys:
    SQL> create table scott.test (id number(6,2)) ;
    Table created.
    SQL> insert into  scott.test (id) values (1);
    1 row created.
    SQL> commit;
    Commit complete.
    SQL> select * from scott.test;
    ID
    ----------
    1
    
    SQL> select * from scott.test;
    ID
    ----------
    1
    
    在这个状态下先在OS下做一个数据文件和控制文件的冷备。
    SQL> shutdown immediate
    [oracle@orcl  ~] $cp /u01/app/oracle/oradata_std/orcl/*.dbf  /u01/back/
    [oracle@orcl  ~] $cp /u01/app/oracle/oradata_std/orcl/*.ctl  /u01/back/
    [oracle@orcl  ~] $startup
    SQL> insert into scott.test values(2);
    SQL> commit;
    SQL> insert into scott.test values(3);
    SQL> select * from scott.test;
    ID
    ----------
    2
    3     这条记录未提交,恢复时会回滚掉
    1
    
    1)模拟介质失败
    [oracle@orcl  ~]$ rm /u01/app/oracle/oradata_std/orcl/system01.dbf   数据库在打开的情况下就删除关键文件
    [oracle@orcl  ~]$ rm /u01/app/oracle/oradata_std/orcl/users01.dbf
    
    $sqlplus / as sysdba   换个session登录,然后关闭数据库
    SQL> shutdown abort   数据库直接abort才能关闭
    
    2)启动database,报错!
    SQL> startup
    ORACLE instance started.
    
    Total System Global Area 3206836224 bytes
    Fixed Size                  2257520 bytes
    Variable Size             721423760 bytes
    Database Buffers         2466250752 bytes
    Redo Buffers               16904192 bytes
    Database mounted.
    ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
    ORA-01110: data file 1: '/u01/app/oracle/oradata_std/orcl/system01.dbf'  
    
    SQL> set linesize 200;
    col error for a30;
    col name for a50;
    select a.file#,a.error,b.name from v$recover_file a,v$datafile b where a.file#=b.file#;
    
    FILE# ERROR                          NAME
    ---------- ------------------------------ --------------------------------------------------
    1 FILE NOT FOUND                 /u01/app/oracle/oradata_std/orcl/system01.dbf
    4 FILE NOT FOUND                 /u01/app/oracle/oradata_std/orcl/users01.dbf
    
    3)还原损坏的三个数据文件
    [oracle@orcl  ~]$ cp /u01/back/system01.dbf /u01/app/oracle/oradata_std/orcl/
    [oracle@orcl  ~]$ cp /u01/back/users01.dbf  /u01/app/oracle/oradata_std/orcl/
    
    
    4)比较控制文件和数据文件头的SCN,恢复数据库
    SQL> select file#,checkpoint_change# from v$datafile;
    SQL> select file#,checkpoint_change# from v$datafile_header;
    SQL> recover database;   
    SQL> select file#,checkpoint_change# from v$datafile;
    
    5)打开数据库
    SQL> alter database open;
    6)验证
    SQL> select * from scott.test;
    ID
    ----------
    2
    1

2)recover tablespace (针对表空间的非关键数据文件损坏,一般是open下进行

OS:使用cp 还原该表空间XXX下的所有数据文件

SQLPLUS:

alter tablespace XXX offline immediate;

recover tablespace XXX;

alter tablespace XXX online;

示例2:recover tablespace(状态:database open)
针对的是非关键表空间的损坏,基于表空间的完全恢复实际上还是对其下的datafile的恢复
模拟这种情形非常实用,通常是某个非关键表空间下的数据文件受损,但并没有造成Oracle崩溃,我们只需针对个别有问题的tablespace去做单独的在线恢复操作,也就是说恢复时数据库整体是online的,而局部表空间是offline的,数据库不需要shutdown。

恢复表空间(删除了tablespace下的所有的datafile)

前提:在这个状态下先在OS下做一个数据文件和控制文件的冷备。
SQL> shutdown immediate
[oracle@orcl  ~] $cp /u01/app/oracle/oradata_std/orcl/*.dbf  /u01/back
[oracle@orcl  ~] $cp /u01/app/oracle/oradata_std/orcl/*.ctl  /u01/back
[oracle@orcl  ~] $startup

1)了解一下当前状态,在users表空间上建立scott.t1表,
SQL> create table scott.t1 (id int) tablespace users;
SQL> insert into scott.t1 values(1);
SQL> commit;
SQL> select * from scott.t1;
NAME
--------------------------------------------------
1

2)模拟表空间损坏,数据库open下,直接删除表空间下的数据文件
[oracle@orcl  ~]$ rm /u01/app/oracle/oradata_std/orcl/users01.dbf

3)查证该表空间上的表不可访问了
SQL> alter system flush buffer_cache;   清除data buffer
SQL> conn / as sysdba   换个session登陆,访问t1表,因内存里已清除了buffer块,只好去做物理读,所以报错!
SQL> select * from scott.t1;
select * from scott.t1
*
ERROR at line 1:
    ORA-01116: error in opening database file 4
    ORA-01110: data file 4: '/u01/app/oracle/oradata_std/orcl/users01.dbf'
    ORA-27041: unable to open file
    Linux-x86_64 Error: 2: No such file or directory
    Additional information: 3
    
4)看看scn的情况
SQL> select file#,checkpoint_change# from v$datafile;
select file#,checkpoint_change# from v$datafile_header;

5)将test表空间offline
SQL> alter tablespace users offline immediate;    immediate使表空间能立即脱机,不需要Oracle对任何数据文件做检查

6)数据库open下,使用备份还原这个表空间下的所有数据文件
[oracle@orcl  ~]$ cp /u01/back1/test01.dbf /u01/oradata/prod
7)恢复tablespace
SQL> recover tablespace users;

8)使表空间online
SQL> alter tablespace users online;   此时数据库状态一直是open的

9)验证
SQL> select * from scott.t1;
ID
--------------------------------------------------
1

3)recover datafile (单个或几个数据文件损坏,关键文件在mount下进行,非关键文件在open下进行)

第一种情形

OS:使用cp 还原相关的关键数据文件(mount)

SQLPLUS:

recover datafile 6,8;

alter database open;

第二种情形

OS:使用cp 还原相关的非关键数据文件(open)

SQLPLUS:

alter database datafile 6,8 offline;

recover datafile 6,8;

alter database datafile 6,8 online;

示例3:recover datafile(database mount或open状态)
恢复datafile, 同范例2不同的是模拟UNDO文件损坏: 因UNDO数据文件也是关键文件,所以只能在mount状态下恢复。

前提:在这个状态下先在OS下做一个数据文件和控制文件的冷备。
SQL> shutdown immediate;
[oracle@orcl  ~]$ cp /u01/app/oracle/oradata_std/orcl/*.dbf  /u01/back
[oracle@orcl  ~]$ cp /u01/app/oracle/oradata_std/orcl/*.ctl  /u01/back
[oracle@orcl  ~]$ startup

1)模拟环境:
SQL> insert into scott.t1 values(2);       插入一行记录是为了使t1和备份有区别
SQL> commit;
SQL> select * from scott.t1;
ID
--------------------------------------------------
1
2

SQL> delete scott.t1;   注意:删掉了t1但并没有提交,老值在UNDO里。并且记了日志(这点非常关键)。

2)在open 状态下删除datafile
[oracle@orcl  ~]$ rm /u01/app/oracle/oradata_std/orcl/undotbs01.dbf

3)关闭数据库
SQL> shtudown abort

4)启动数据库mount
SQL> startup
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 3 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 3: '/u01/app/oracle/oradata_std/orcl/undotbs01.dbf'

5)还原并恢复UNDO数据文件
[oracle@orcl ]$ cp /u01/back/undotbs01.dbf /u01/app/oracle/oradata_std/orcl
SQL> recover datafile 3;
完成介质恢复。

6)打开数据库(会完成UNDO表空间数据的回滚)
SQL> alter database open;
数据库已更改

7)验证
SQL> select * from scott.t1;
ID
--------------------------------------------------
1
2


相关文章

win2016系统新增辅助网卡无法访问公网

win2016系统新增辅助网卡无法访问公网

问题现象:一台阿里云win2016系统服务器,在主网卡已绑定弹性公网ip之后,再新增了一块辅助网卡,无法访问公网。另外,使用NAT网关做了dnat到辅助网卡的映射。该台服务器网卡信息为:主网卡:172...

mysql 事务隔离级别

mysql 事务隔离级别

一、事务隔离级别介绍多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性。事务隔离级别      MySQL隔离级别定义了事务与事务之间的隔离程度  二...

使用Sqoop将数据从Hive导入MySQL(一)

使用Sqoop将数据从Hive导入MySQL(一)

使用Sqoop将数据从Hive导入MySQL首先查看csv数据类型创建类似的hive表并导入数据CREATE TABLE data (    province STRING,    code INT,...

大数据集群二次开发及调优使用指导(三)-Hive

大数据集群二次开发及调优使用指导(三)-Hive

1.   业务调优:Hive业务的业务主要以批量处理作业为主,批处理主要特点是耗时时间长,消耗的资源比较多,主要的调优和设计推荐如下:1.   &nb...

netca报错UnsatisfiedLinkError exception loading native library

1、netca报错:UnsatisfiedLinkError exception loading native library: njni11报错:[oracle@test-db ~]$ netca...

NetworkManager和常用工具和基本用法

NetworkManager和常用工具和基本用法

现代人的生活越来越依赖网络,对于一个操作系统来讲,网络功能的支持和管理就更为重要了,本节课我们一起来看一下在CentOS8中如何对网络进行管理NetworkManager和常用工具和基本用法Netwo...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。