Oracle备份与恢复

一、Oracle备份

1.故障类型


2.备份分类

全量备份:对数据库完整的备份

  • 优点:可实现数据100%恢复,恢复时间短,操作方便
  • 缺点:备份数据量大,存储空间需求大

增量备份:从最后一次备份后改变的文件

  • 优点:备份数据量小,备份时间短;
  • 缺点:恢复时依赖之前的备份记录,出现问题的风险比较大

差异备份:在最后一次完整后被修改的文件

  • 优点:恢复数据时间短--因此只需要两份数据,最后一次完全备份和最后一次差异备份
  • 缺点:每次备份需要的时间长

建议:一月一次全量,一周一次增量

二、RMAN(恢复管理器)

  • RMAN是 DBA 的一个重要工具,用于备份、恢复 Oracle 数据库
  • 完成对目标数据库的控制文件、数据文件及归档日志文件以及SPFILE的联机备份
  • 能够实现对数据库的完全或不完全的恢复操作  
  • 支持在线热备份、多级增量备份、并行备份,恢复
  • 减少所需要备份量
  • 备份、恢复使用简单

1.恢复目录数据库

  • 恢复目录用于存放RMAN元数据,它是存放RMAN元数据的一个可选设置

恢复目录数据库创建步骤

  • 创建恢复目录
        a创建恢复目录数据库
        b.在恢复目录数据库中创建RMAN 用户并授权
        c.在恢复目录数据库中创建恢复目录 
  • 注册目标数据库到恢复目录
        a.进入RMAN环境
        b.连接目标数据库
        c.连接恢复目录数据库
        d.注册

2.RMAN通道

  • 当使用RMAN在存储设备(磁盘或磁带)上执行备份、转储等操作时,RMAN需要在存储设备和目标数据库之建立连接,该连接被称为通道。
  • 如果不配置通道则使用默认通道

(1)自动通道配置

--指定自动通道并行个数。

CONFIGURE  DEVICE TYPE  sbt/disk PARALLELISM  n;

--指定自动通道的默认设备

CONFIGURE  DEFAULT DEVICE TYPE TOsbt/disk;

(2)手动通道配置

RUN{

ALLOCATE CHANNEL 通道名称 DEVICE TYPE 设备类型;

……}

(3)显示通道配置参数

RMAN>SHOW ALL;

3.RMAN-备份集与备份片

(1)备份集

  • 是一次备份的集合,它包含本次备份的所有备份片,以Oracle专有的格式保存;是一个逻辑数据的集合

(2)备份片

  • 用于存储备份集信息的二进制文件
  • 一个或多个备份片组成一个备份集
  • 一个备份片对应一个OS文件
  • 通常每个备份集只包含一个备份片

(3)RMAN-Format字符串替代变量说明:

%c:备份片的拷贝数(从1开始编号);

%d:数据库名称;

%D:位于该月中的天数 (DD);

%M:位于该年中的月份 (MM);

%F:一个基于DBID 唯一的名称,这个格式的形式为c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII 为该数据库的DBID,YYYYMMDD 为日期,QQ 是一个1-256的序列;

%n:数据库名称,并且会在右侧用x字符进行填充,使其保持长度为8;

%u:是一个由备份集编号和建立时间压缩后组成的8字符名称。利用%u可以为每个备份集生成一个唯一的名称;

%p:该备份集中备份片的编号,从1 开始编号;

%U:是%u_%p_%c的简写形式,利用它可以为每一个备份片生成一个唯一名称,这是最常用的命名方式;

%s:备份集的号;

%t:备份集时间戳;

%T:年月日格式(YYYYMMDD);

注:如果在BACKUP命令中没有指定FORMAT选项,则RMAN默认使用%U为备份片段命名

4.RMAN-备份命令

  • 用于备份数据库文件,可以将多个文件、表空间、整个数据库以备份集形式备份到磁盘或磁带上

在归档方式下备份数据库步骤
  • 在SQLPlus环境下

    ①以SYSDBA身份登录

    ②查看数据库归档方式

    ③如果处于非归档方式,则将数据库处于归档方式下

    ④打开数据库

  • 在RMAN环境下

    ①连接目标数据库和恢复目录数据库

    ②备份数据库和归档日志

5.RMAN恢复命令

使用RMAN备份的数据库页只能使用RMAN提供的恢复命令进行恢复

RMAN恢复数据库用到了两个命令:

  • RESTORE 命令:从备份中还原数据库文件
  • RECOVER 命令:通过应用归档日志文件中记录的更改来恢复已还原文件

(1)恢复数据库步骤

①保证数据库在MOUNT模式下启动

②在RMAN环境下

  • 连接目标数据库
  • 执行RESTORE命令
  • 执行RECOVE命令
  • 再打开数据库

6.RMAN案例

(1)开启archivelog

    su -oracle

    sqlplus-s sys/pwd123 as sysdba

    SQL>shutdown immediate;

    SQL> startupmount;

    SQL> alterdatabase archivelog; 

    SQL> alterdatabase open;

    SQL> archivelog list;

(2)创建用户并授权

    SQL> createtablespace rmants datafile '/opt/oracle/oradata/rmants.ora' size 20M;

    SQL> createuser rman identified by rman default tablespace rmants temporary tablespacetemp;

    SQL> grantconnect,resource to rman;

    SQL> grantrecovery_catalog_owner to rman;

    SQL> quit;

(3)注册到目录数据库,并创建通道

    rmancatalog rman/rman

    RMAN> createcatalog tablespace rmants;

    rmantarget sys/pwd123

    RMAN> connectcatalog rman/rman

    RMAN> registerdatabase;

run {

allocate channel ch1 device type disk;

allocate channel ch2 device type disk;

allocate channel ch3 device type disk;

};

    RMAN> quit;

(4)备份

    mkdir -p/opt/oracle/rmanbak

    rman catalog rman/rman

    RMAN> connecttarget sys/pwd123;

    RMAN> backupdatabase format '/opt/oracle/rmanbak/%d_%T.%U';

    RMAN> backup database plus archivelog delete input;

(5)恢复

     rman catalog rman/rman

    RMAN> connecttarget sys/pwd123;

    RMAN> shutdown immediate;

    RMAN> startupmount;

    RMAN> restoredatabase;

    RMAN> recoverdatabase;

    RMAN> alterdatabase open;

三、数据泵导入与导出


1.基于命令行的数据泵导出步骤

  • 连接Oracle数据库
  • 创建一个操作目录
  • 授予用户操作dump_dir目录的权限
  • 使用命令expdp导出数据, 使用命令impdp导入数据

2.案例

创建工作目录

    mkdir -p/opt/oracle/backup

    sqlplussys as sysdba;

    

    SQL>create directory dump_dir as '/opt/oracle/backup';

    SQL> grantread,write on directory dump_dir to scott;

    SQL>quit;

    

    expdpscott/pwd123 directory=dump_dir dumpfile=scotttab-$(date +%F).dmptables=emp,dept;

    

    sqlplussys as sysdba;

    SQL> connscott/pwd123;

    SQL> droptable emp;

    SQL> quit;

    

    impdp scott/pwd123 directory=dump_dirdumpfile=scotttab-2017-12-18.dmp tables=scott.emp

    

    sqlplus sys as sysdba;

    SQL> connscott/pwd123;

    SQL> select* from emp;

    

四、闪回技术


注意

  • 闪回数据库是基于闪回恢复区(FlashRecovery Area)特性实现的,如果要使用闪回数据库技术,还需要启用闪回恢复区
  • 闪回删除是基于回收站(RecycleBin)特性实现的,如果要使用闪回删除技术,还需要启用回收站
  • 闪回查询、闪回版本查询、闪回事务查询以及闪回表主要是基于撤销表空间中的回滚信息实现的

1.闪回恢复区

  • 闪回恢复区为控制文件备份、归档重做日志、闪回日志和数据库备份提供了一个统一存储位置

操作步骤

①启用归档模式,闪回数据库只能处于归档模式

②建立闪回恢复区

  • 指定闪回恢复区的大小
  • 指定闪回恢复区的位置
  • 指定闪回恢复区中数据的保留时间

③启用闪回日志

④查询是否成功启用闪回恢复区

⑤查询是否成功启用归档

⑥查询是否成功启用闪回数据库

2.闪回数据库

闪回数据库基本语法

FLASHBACK  DATABASE [database] TO    [SCN|TIMESTAMP expression]|

[SCN|TIMESTAMP expression]|

[BEFORE SCN|TIMESTAMPexpression]

参数说明:

  • TO SCN:将数据库恢复到指定SCN的状态
  • TO TIMESTAMP:将数据库恢复到指定的时间点
  • TO BEFORE SCN:将数据库恢复到指定SCN的前一个SCN状态
  • TO BEFORE TIMESTAMP:将数据库恢复到指定时间点前的状态

案例

a.设置闪回恢复区

    sqlplussys as sysdba

    SQL> shutdownimmediate;

    SQL>startup mount;

   SQL> alter database archivelog;    //启用归档模式,闪回数据库只能处于归档模式

    

    SQL> altersystem set db_recovery_file_dest='/opt/oracle/flash_recovery_area' scope=both;    //设置闪回恢复区位置

    SQL> altersystem set db_recovery_file_dest_size=3G scope=both;    //设置闪回恢复区大小

    SQL> altersystem set db_flashback_retention_target=1440;    //设置闪回恢复区数据保留时间为一天,单位为min

    

    SQL> shutdownimmediate;

    SQL>startup mount;

    SQL>alter database flashback on;    //启用闪回日志

    SQL> alterdatabase open;

    

    SQL> showparameter db_recovery_file;    //查询是否成功请闪回恢复区

    SQL> archivelog list;

    

    SQL> selectflashback_on from v$database;    //查询是否成功启用闪回数据库

    

b.闪回数据库操作

闪回数据库操作的限制

  • 数据文件损坏或丢失等介质故障不能使用闪回数据库进行恢复
  • 闪回数据库只能基于当前正常运行的数据文件闪回数据库功能启动后,如果发生数据库控制文件重建或利用备份恢复控制文件,则不能使用闪回数据库
  • 不能使用闪回数据库进行数据文件收缩操作
  • 不能使用闪回数据库将数据库恢复到在闪回日志中可获得最早的SCN之前的SCN,因为闪回日志文件在一定条件下被删除,而不是始终保存在闪回恢复区中
方式一:

    SQL> SELECTCURRENT_SCN FROM V$DATABASE;    //查看当前的SCN

    

    SQL>create table test1 (id number,name char(20));    //创建测试表

    

    SQL>insert into test1 values(1,'database');    //插入数据

    

    SQL> commit;

    SQL> shutdownimmediate;

    SQL> startupmount;

    

    SQL>flashback database to scn 1032024;    //闪回到SCN

    

    SQL> alterdatabase open resetlogs;    //开数据库

    

    SQL> select* from test1;    //查询报错

    

方式二:

    SQL>alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';    //设置显示时间

    

    SQL> selectoldest_flashback_scn, oldest_flashback_time from  v$flashback_database_log;    //查询数据库中当前的闪回SCN和时间

    

    SQL> selectsysdate from dual;    //查询当前系统时间

    

    SQL> settime on    //改变数据库当前时间状态

17:04:58 SQL> create table test2(id number,name char(20));    //创建测试表

17:05:22 SQL> insert into test2 values(1,'database');    //插入测试数据

17:05:44 SQL> commit;

    

17:05:48 SQL> shutdown immediate;

17:06:05 SQL> startup mount;

    

17:06:20 SQL> flashback database totimestamp(to_timestamp('2015-09-27 22:22:06','YYYY-MM-DD HH24:MI:SS'));    

//闪回到指定时间

    

17:07:16 SQL> alter database open resetlogs;    //开启数据库

    

17:07:31 SQL> select * from test2;    //查询测试

    

3.闪回表

  • 闪回表可将表恢复到特定的时间点或者指定的SCN
  • 闪回表实际上是对表进行DML操作的过程
  • 数据库保持联机


必须满足下列条件

  • 用户具有FLASHBACKANY TABLE系统权限,或者具有所操作表的FLASHBACK对象权限
  • 用户具有所操作表的SELECT,INSERT,DELETE,ALTER对象权限
  • 启动被操作表的ROWMOVEMENT特性,可以采用下列方式进行

    ALTER TABLE table ENABLE ROWMOVEMENT;

闪回表操作的基本语法为

FLASHBACK TABLE [schema.]table TO

SCN|TIMESTAMP expression

[ENABLE|DISABLE TRIGGERS]

参数说明:

SCN:将表恢复到指定的SCN时状态

TIMESTAMP:将表恢复到指定的时间点

ENABLE|DISABLE TRIGGER:在恢复表中数据的过程中,表上的触发器是激活还是禁用(默认为禁用)

注意:SYS或以AS SYSDBA身份登录的用户不能执行闪回表操作

案例

    SQL> grantselect any dictionary to scott;

    

    SQL> quit;

    sqlplusscott;

    SQL> settime on

    17:28:28 SQL> alter session set NLS_DATE_FORMAT='YYYY-MM-DDHH24:MI:SS';    //更新日期显示格式

    

    17:28:44 SQL> select sysdate from dual;

    

    17:28:55 SQL> create table test3(id number primary key, name char(30));    //插入测试数据

    

    17:29:42 SQL> insert into test3 values(1,'zhang');

    17:30:07 SQL> insert into test3 values(2,'zhao');

    17:30:15 SQL> insert into test3 values(3,'wang');

    17:30:23 SQL> commit;

    

    

   17:54:55 SQL> select current_scn fromv$database;    //查询当前scn号

    

   17:55:14 SQL> update test3 set name='liu'where id=1;   ##更新数据

   17:55:33 SQL> commit ;

    

   17:55:36 SQL> select * from test3;

    

   17:31:51 SQL> alter table test3 enablerow movement;    //启动test3表的ROW MOVEMENT特性

    

   17:55:42 SQL> flashback table test3 totimestamp to_timestamp('2017-12-18 23:17:49','YYYY-MM-DD HH24:MI:SS');

//恢复表到指定时间

    

   17:56:02 SQL> select * from test3;

    

4.闪回删除

  • 闪回删除可恢复使用DROP TABLE语句删除的表,是一种对意外删除的表的恢复机
  • 闪回删除功能的实现主要是通过数据库中的“回收站”(Recycle Bin)技术实现的
  • 为了使用闪回删除技术,必须开启数据库的“回收站”

闪回删除的基本语法

FLASHBACK TABLE [schema.]table TO BEFOREDROP [RENAME TO table]

注意:不支持SYS用户,SYSTEM表空间下的对象也不能从回收站里拿到。故使用SYS或者SYSTEM用户登录时,查询为空

案例

    sqlplus sys as sysdba

    SQL> alter system set recyclebin=on deferred;    //启动回收站

    

    SQL> showparameter recyclebin;    //查看回收站是否启用

    

    sqlplusas scott

   SQL> create table exampe(id numberprimary key, name char(20));

   SQL> insert into exampe values(1,'beforedrop');

   SQL> commit;

    

   SQL> drop table exampe;

   SQL> flashback table exampe to beforedrop rename to new_example;

   SQL> select *from new_example;

    

   SQL> purge recyclebin;    //清空回收站

    

   SQL> selectobject_name,original_name,type from user_recyclebin;    //查询是否为空

    

5.闪回查询

闪回查询:使用闪回查询功能,可以执行截止到特定时间的查询

语法

select column_name[,...]

from table_name

[as of scn | timestamp expression]

[where condition]

案例

    sqlplus scott;

   SQL> alter session setnls_date_format='YYYY-MM-DD HH24:MI:SS';

   SQL> set time on;

   18:01:38 SQL> select empno,sal fromscott.emp where empno=7844;    //查询目前表记录值

    

   18:01:50 SQL> update scott.emp setsal=2000 where empno=7844;    //第一次更新数据

   18:02:05 SQL> commit;

    

   18:02:17 SQL> select empno,sal fromscott.emp where empno=7844;    //查询第一次更改值

    

   18:02:29 SQL> update scott.emp setsal=3000 where empno=7844;    //第二次更新数据

   18:02:36 SQL> commit;

    

   18:02:43 SQL> select empno,sal fromscott.emp where empno=7844;    //查询第二次更改值

    

   18:02:47 SQL> select empno,sal fromscott.emp as of timestamp to_timestamp('2017-12-18 12:24:14','YYYY-MM-DDHH24:MI:SS') where empno=7844;

//删除查询未更改数据之前的数据值

    

   18:03:31 SQL> select empno,sal fromscott.emp as of timestamp to_timestamp('2017-12-18 12:24:47','YYYY-MM-DDHH24:MI:SS') where empno=7844;

//删除查询第一次数据更改的数据值

    

   18:04:32 SQL> select empno,sal fromscott.emp where empno=7844;    //查询当前数据值

    

posted @ 2020-08-31 20:12  lclc  阅读(612)  评论(0编辑  收藏  举报