Oracle笔记-备份与恢复

来源:互联网 发布:mac mount samba 编辑:程序博客网 时间:2024/06/14 09:13

在讲备份与恢复的操作之前,请了解ckpt,checkpoint,scn概念,以及oracle体系架构。

checkpoints检查点用于决定数据是从何处开始恢复(recovery)

检查点队列:脏数据的链接表


物理备份

1.冷备

   archive 模式和noarchive模式都可以,但是archive模式下一般都是进行热备,冷备显得没有意义,冷备实际上就是要在数据库关闭的情况下,备份物理系统上的文件。


    用户名、库名和实例名也是不可缺少的,可以使用下列命令进行查看:

       SYS>show user

       SYS>select name from v$database;

       SYS>select instance_name from v$instance;


   要备份的文件有data file,control file,redo log file,password file,pfile(参数文件)。另外还要记得备份临时表空间的文件tempfile,防止恢复时需要排序,却找不到此文件。

   这些文件路径可以执行以下命令一一查看:

       SYS>select name from v$datafile;

       SYS>select name from v$controlfile;       

       SYS>select member from v$logfile;

       SYS>select name from v$tempfile;       

       password file 路径 在$ORACLE_HOME/dbs/orapw$ORACLE_SID    //跟备份关系不大,可以随时生成。

       spfile路径可通过SYS>SELECT VALUE FROM V$PARAMETER WHERE NAME='spfile'; 查询,但是其为二进制文件。

       我们可以通过 SYS>create pfile from spfile;  来得到文本的拷贝文件

       我们可以以脚本形式拷贝,写一个脚本叫bak_original.sql, 通过sys>@script_path/bak_original.sql 将要备份的文件备份至/u02目录下

       内容如下,

         ho mkdir -p /u02/orcl
       spool /u02/bakorcl.sql
       select 'ho cp '||name||' /u02/orcl/' from v$controlfile
       union all
       select 'ho cp '||name||' /u02/orcl/' from v$datafile
       union all
       select 'ho cp '||member||' /u02/orcl/' from v$logfile
       union all
       select 'ho cp '||name||' /u02/orcl/' from v$tempfile;
       spool off
       shutdown immediate
       create pfile='/u02/orcl/initorcl.pfile' from spfile;
       ho cp $ORACLE_HOME/dbs/orapw$ORACLE_SID /u02/orcl/
       ho sed -n '/^ho cp/p' /u02/bakorcl.sql > /u02/bak.sql
       start /u02/bak.sql
       startup
       /


在有冷备文件的情况下,如何restore数据

1.1 丢失数据文件

1.1.1 system 文件丢失

system tablespace出现问题后,则先全备数据库(其他一些表空间是有的,但是因为system tablespace坏了,我们不能查询出来,

但是可以通过第三方软件,将其他表空间信息读取恢复出来);然后使用最近的冷备还原到目的路径;再启动数据库--完成恢复到

冷备时刻 -- 冷备后变化的数据只有在archive mode 下才能恢复到损坏的时刻。由于我们是no archive,所以只能恢复到最近冷备时刻。

a)全备数据库

b)冷备还原(确保没有再做resetlog,重置control file)

ho cp system01.dbf /u01/oracle/oradata/orcl/

alter database open;

recover database;     //如果恢复得了,表明你的日志文件中是有记录的。

alter database open;

create table scott.ee as select * from scott.emp;

alter system switch logfile;   //多切几次日志

ho rm /u01/../system01.dbf   //让日志文件变动大一点来演示recover database失败的状况

c)忽略一致性验证打开数据库

recover database;  // cancel

alter database open;   //需要media recovery

alter system set "_allow_resetlogs_corruption"=true scope=spfile; //忽略一致性验证 

startup force

recover database until cancel;

alter database open resetlogs;   //instance 中断,重新启动数据库即可

alter system set "_allow_resetlogs_corruption"=false scope=spfile;  //重新启动数据库后还原一致性验证

虽然数据库正常启动了,但是数据不能完全恢复,比如scott.ee已经丢失。要想完全恢复,则需要在归档模式下。

d)如还不可以,则把所有的做还原。

1.1.2 sysaux 文件丢失

2种方法

a).数据库启动后,将sysaux数据库文件offline,然后导出数据,再新建数据库,导回数据;

b).冷备数据还原 加隐藏参数来启动数据库(忽略一致性验证)

1.1.3 undo 文件丢失

删除旧的文件,建立新的,这种的就不要用冷备恢复回去了。

1.1.4 自己建立的表空间文件丢失 

offline该数据文件,启动数据库,导出其他可用的数据

1.1.5 temp

建立新的

1.2 日志文件丢失

         a)全备datafile controlfile spfile|pfile(防止一下子修复不过来)

   b)直接通过resetlogs恢复日志文件,千万不要将备份拷贝回去!

         alter database open resetlogs;    //不完全恢复的时候用

         recover database using backup controlfile;

         会报arc缺少,忽略

  alter database open resetlogs;    //需要media recovery,就是一致性验证

         alter system set "_allow_resetlogs_corruption"=true scope=spfile; //忽略一致性验证

startup force mount

alter database open resetlogs;

         //此时日志全部恢复

        alter system set "_allow_resetlogs_corruption"=false scope=spfile; //不要忘记把参数改回来

   1.3 控制文件丢失

建立新的控制文件

        strings contorl01.ctl | grep dbf    //从冷备中的control文件中查询到数据文件个数

        sql> ho cp /u02/orcl/control* /u01/oracle/oradata/orcl/     //得到控制文件创建的语句

        show parameter control_files

alter database mount;

alter database backup controlfile to trace as '/u02/orcl/ctl.sql';  //得到建立控制文件的脚本

ho rm /u01/oracle/oradata/orcl/control*

        shutdown abort

!

vim ctl.sql

@ ctl.sql      //执行该脚本

将该脚本中的注释和空格都去除掉即可。此法仅适用于冷备后控制文件无改变。

1.4 参数文件丢失

        用冷备恢复即可

1.5 密码文件丢失

用冷备恢复,或者自己建立密码文件(orapwd 命令)

                

2.热备  ----控制scn不变  拷贝的前后需要冻结头文件,备份完后解冻头文件

热备数据库,热备表空间,热备控制文件。

alter database begin backup;

alter database end backup;

alter tablespace <> begin backup;   //临时表空间不需要备份

demo:

alter database archivelog;

archive log list;

alter system switch logfile;

archive log list; //查看sequence是否有变化,没有则不正常

select tablespace_name from dba_data_files;  //查看表空间有哪些

select name from v$datafile;

alter database begin backup;

mkdir /u02/hot_oracl

select 'ho cp '||name||' /u02/hot_orcl/' from v$datafile;

 将输出的语句执行,即完成拷贝了数据文件。

alter database end backup;

alter database backup controlfile to '/u02/hot_orcl/control01.ctl';

create pfile='/u02/hot_orcl/initorcl.ora' from spfile;

编写成脚本进行热备,如下:

vim /u02/hot_bak.sql

spool /tmp/hot.sql

select 'ho cp '||name||' /u02/hot_orcl/' from v$datafile;

spool off

sed -n '/^ho cp/p' /tmp/hot.sql >/tmp/hotorcl.sql

alter database begin backup;

start /tmp/hotorcl.sql

alter database end backup;

ho rm /tmp/hot*.sql

alter database backup controlfile to '/u02/horcl/control01.ctl';

create pfile='/u02/hot_orcl/initorcl.ora' from spfile;

 2.2 使用表空间的方式进行备份 //低版本中不可以用2.1的方式备份

select tablespace_name,file_name from dba_data_files;

alter tablespace test begin backup;

ho cp /../test.dbf /../..

alter tablespace test end backup;

写成脚本的形式

vim hot2.sql

set heading off

spool /tmp/hot.sql

select 'alter tablespace '||tablespace_name||' begin backup; '||chr(10) ||'ho cp ' || file_name || ' /u02/hot_orcl' || chr(10) || 'alter tablespace '||tablespace_name||' end backup; ' from dba_data_files order by tablespace_name;

spool off

start /tmp/hot.sql

alter database backup controlfile to '/u02/hot_oral/control01.ctl';

create pfile='/u02/hot_orcl/initorcl.ora' from spfile;


2.3 热备情况下,如何restore

2.3.1

controlfile-- 还原备份的控制文件-- recover database using backup controlfile;

        在instance状态下,ho cp 热备的control file到oracle 对应目录下,这样才可以启动到mount状态

然后再启动到open状态下,提示要做media recovery

recover database using backup controlfile;   //提示缺少归档日志,请指定redolog位置进行恢复。

alter database open resetlogs;

重新全备数据库

2.3.2

数据文件丢失

a)可以offline的,在线还原恢复

demo:

users文件坏掉

select file#,status,enabled from v$datafile;  //通过file id查看其状态

alter database 4 offline;

select file#,status,enabled from v$datafile;  //RECOVER状态了

ho cp /u02/../users01.dbf /u01/..../users01.dbf  //先还原,即拷贝到报错提示的路径下

alter database  datafile 4 online; //提示需要media recovery

recover datafile 4;

alter database datafile 4 online;


b)不可以offline,只能到mount阶段恢复

系统文件丢失

启动到mount阶段(shutdown abort,或者startup force mount )

还原文件 ho cp /u02/.../system01.dbf /u01/.../system01.dbf

recover datafile 1;

alter database open;

不需要再做热备。

注意:如果执行了resetlogs来打开数据库,或者重新建立了控制文件,就必须重新全备

2.3.3

日志文件丢失-参照日志管理

2.3.4

temp丢失

不影响数据库的启动,只是影响数据库的使用。

2.3.5

参数文件,密码文件 丢失-参照管理方法


3.不完全恢复

将数据库恢复到过去的某一个时刻。

4种情况下需要进行不完全恢复

a)redo log 丢失,没有镜像redo log,并且日志没来得及归档,数据文件也丢失。no archive模式下联机日志的cancel恢复。

b)用户误操作,恢复到误操作前一时刻。比如提交了用错误的WHERE子句更新的数据。如果有逻辑恢复,还是可以完全恢复的,不然只能做不完全恢复。

c) 丢失归档

d)丢失控制文件,建议大家重建控制文件比较好,最好不要进行不完全恢复。


常见类型:

a)基于时间点的恢复

注意不要在目标庫上操作,除非有全备。

b)基于cancel的恢复

建议日志文件做成冗余,并做归档日志,可以避免

c)基于更改的恢复

找到scn号,比较复杂。


其操作步骤:

不在当前需要恢复的庫上操作,到另外的庫上去操作,找到想要的数据导出,再导入到目标庫中。


三种方式

a)基于用户的管理sqlplus

b)RMAN

c)flashback

打开flashback数据库


在没有必要的情况下就不要去做,消耗的时间长,成本高。日志挖掘也可以做不完全恢复。


4.RMAN备份  ----基于块级的备份,仅仅备份使用过的块

                     -----将使用large pool,不然只能是用共享池,要保证足够的内存

                     -----locate log  记录在control file

                      -----catolog log  C/S架构,集中管理和维护


5.逻辑备份 ----导入导出

三个级别:

a.全备

b.用户备份

c.表备


6.物理备库,逻辑备库


7.flash recovery