软件资讯

软件资讯应用资讯游戏资讯有问必答图文教程官方活动Mac资讯
您现在的位置:天极下载>软件问答>oracle rman全备份丢失数据怎么办

oracle rman全备份丢失数据怎么办

天极网天极下载2015-05-06 17:07我要吐槽

  RMAN可以用来备份和还原数据库文件、归档日志和控制文件。它也可以用来执行完全或不完全的数据库恢复。注意:RMAN不能用于备份初始化参数文件和口令文件。RMAN启动数据库上的Oracle服务器进程来进行备份或还原。备份、还原、恢复是由这些进程驱动的。

  一.RMAN备份及还原

  RMAN可以进行增量备份:数据库,表空间,数据文件

  只有使用过的block可以被备份成backup set

  表空间与数据文件对应关系:dba_data_files / v$datafile_header

  在noarchivelog模式下,可以使用RMAN备份read-only和offline的表空间

  ORACLE RMAN停机备份:

  备份

  RMAN连接上ORACLE,WINDOWS下在命令模式下

  RMAN TARGET /

  连接本地数据库用的是本地认证模式。RMAN连接数据库必须在dedicate模式下。因此在share模式下的数据库应配置一个dedicate的连接用于RMAN连接。

  如果要把控制文件、参数文件也一起备份

  configure controfile autobackup on;//打开autobackup

  configure controfile autobackup off;//关闭autobackup

  关闭数据库

  RMAN>shutdown immediate

  mount 数据库RMAN的备份必须在MOUNT模式下,这也就是控制文件备份的重要。

  RMAN>startup mount

  最简单的备份

  RMAN>backup database

  就这一句就OK了

  这样的备份,备份集在数据库默认位置。%oracle_home%/ora92/database

  当然你也可以用run来灵活的定义你的备份。

  RMAN>run{

  allocate chennel d1 type disk; //分配通道

  backup full database //全备份数据库

  include current controlfile //包括当前的controlfile

  format 'e:\oracle\orders\db_%d_%s_%p_%t_%T'; //备份文件位置和文件名格式

  release channel d1;//释放通道

  }

  恢复

  1、数据文件损坏,而控制文件是好,或者已经恢复

  RMAN连上数据库

  startup mount

  restore database

  recover database noredo;

  alter database open resetlogs;

  recover database noredo该命令指示RMAN执行最后的恢复操作以准备打开这个数据库。因为是在NOARCHIVELOG模式下并且不应用任何归档的重做日志并且丢失了联机重做日志,所以要求在这条命令中使用noredo参数。

  最后使用alter database open resetlogs打开数据库。由于已经还原了控制文件并且需要重新构建重做日志,所以必须用resetlogs。

  2、还原控制文件

  startup nomount;

  set dbid =

  restore controlfile from autobackup ;

  alter database mount;

  restore database;

  recover database noredo;

  alter database open resetlogs;

  alter database open;

  在这个例子中有一个DBID这个可以

  select * from v$database中查到。但是一个数据库在控制文件坏掉了不能OPEN如何能看的到呢这就在平时把这个DBID记下来。

  这是最简单的用RMAN备份与恢复的例子,但从中可以看到RMAN备份与恢复的梗概。

  ORACLE RMAN在线备份:

  ORACLE RMAN在线备份之前需要切换日志方式为归档日志;

  a. 关闭数据库

  SQL> shutdown immediate;

  b. 启动数据库到mount状态

  SQL> startup mount;

  c. 启用归档模式

  SQL> alter database archivelog;

  d. 查看修改后的数据库备份和恢复策略及归档文件的位置

  SQL> archive log list;

  注意:修改成archive模式之后,之前所有的数据库备份均无效。

  e. 修改相应的初始化参数

  Oracle10g之前,你还需要修改初始化参数使数据库处于自动归档模式。

  可用SQL> show parameter log_archive_start;查看

  NAME TYPE VALUE

  ------------------------------------ ----------- --------------

  log_archive_start boolean FALSE

  SQL> alter system set log_archive_start=true scope=spfile;

  重启数据库此参数生效,此时数据库处于自动归档模式。

  当然你也可以不做第5步,直接

  SQL>archive log start

  使数据库启用自动归档,但是重启后数据库仍然处于手工归档模式。

  运行:RMAN target /

  RMAN信息保存:默认保存在control file中,保存周期7天

  调整:alter system set control_file_record_keep_time=天数;

  搭建独立数据库保存RMAN备份信息

  由于只有一个数据库,就建在本身数据库上

  a. 创建表空间RC:create tablespace rc datafile size 10M autoextend on next 1M

  b. 创建用户RC:

  CREATE USER rc IDENTIFIED BY rc TEMPORARY TABLESPACE temp DEFAULT TABLESPAC rc QUOTA UNLIMITED ON rc;

  c. 授权RC: GRANT RECOVERY_CATALOG_OWNER TO rc;

  d. 搭建:

  rman catalog rc/rc@orcl

  RMAN>create catalog;

  RMAN>exit

  rman target / catalog rc/rc@orcl

  RMAN>register database;

  e. 使用:

  rman target / catalog rc/rc@orcl

  这种连接方式后,数据就会在控制文件和catalog各存一份

  全局参数配置:

  查看:show all;

  修改:configure 参数名称 具体设置

  例如:修改是否自动保存control file:configure controlfile autobackup on;

  恢复默认值:configure 参数名称 clear;

  关键参数:

  a. 保存周期:retention policy

  默认是redundancy 1:保留一个备份;

  可用值:recovery window of 7 days:保留可以满足7天恢复周期的备份

  根据条件检查:report obsolete:RMAN会根据保存周期参数来列出可以删除的备份

  删除多于备份:delete obsolete

  b. 优化备份:backup optimization:RMAN会自动忽略已经备份过的内容(数据文件,归档日志,备份块)

  前提:备份指定同一个channel

  c. 默认备份渠道:default device type to disk:默认备份到磁盘,路径为flash recovery area

  渠道类型:

  disk:文件系统路径

  flash recovery area:默认路径

  sbt:磁带设备

  修改到磁盘其他路径:configure channel device type disk format '路径/%U';

  例如:configure channel device type disk format '/tmp/movedata/%U';

  备份结果

  backupset:backup (as backupset) 备份内容,里面分割成一个或多个backup piece,只有该类型备份可以进行压缩。

  copy:backup as copy 备份内容

  按类型查看:

  backupset 查看:list backup summary(list backupset summary)

  查看详情:list backupset BS

  copy查看:list copy

  按内容查看:

  整个数据库:list backup of database;

  tablespace:list backup of tablespace users;

  数据文件:list backup of datafile n;

  控制文件:list backup of controlfile;

  归档日志:list archivelog all;

  按规则查看:

  查看根据保存规则可删除文件:report obsolete;

  查看根据保存规则需要备份内容:report

  RMAN和OS结合检查:corsscheck 内容;

  备份方式

  full:全备;

  Incremental:增量备份

  可以增量备份的类型:数据库,数据文件,表空间

  a. 首先需要做level 0备份作为基础。例如:backup incremental level 0 备份内容;(备份内容:所有使用过的data block,和image copy不同)

  b. 增量类型:

  累计增量:backup cumulative level 1 备份内容;

  差异增量:backup incremental level 1 备份内容;

  区别:累计增量始终是基于level 0的备份;

  第一次差异增量是基于level 0的备份;从第二开始就是基于前一次增量备份

  c. Image备份增量方式:

  第一次:以Image全备为基础;

  第二次:基于全备,做增量备份;完成后合成成一个Image全备

  第三次:基于第二次的Image全备,做增量备份;完成后合成成一个Image全备

  实现:

  例如:针对tablespace example

  RUN {

  RECOVER COPY OF tablespace example WITH TAG 'incr_update';

  BACKUP INCREMENTAL LEVEL 1 FOR RECOVER OF COPY WITH TAG 'incr_update'

  tablespace example;

  }

  d. 开启参数"block change tracking",可以提高速度

  查看状态:SELECT status FROM v$block_change_tracking;

  默认值:DISABLED

  开启:ALTER DATABASE ENABLE BLOCK CHANGE TRACKING;(默认存放路径OMF中的DB_CREATE_FILE_DEST)

  设置文件路径:

  ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '/u01/oradata/MYSID/rman_change_track.f' REUSE;

  关闭:ALTER DATABASE DISABLE BLOCK CHANGE TRACKING;

  备份并检查:bakcup check logical 备份内容;

  不备份只是检查文件:backup validate 备份内容;

  如果检查有报错,查看:v$backup_corruption;v$copy_corruption

  备份内容:

  整个数据库:RMAN>backup database;

  经典整库备份:backup as compressed backupset database include current controlfile plus archivelog delete input;

  tablespace:RMAN>backup tablespace 名字;

  数据文件:RMAN>backup datafile n; (n:具体的数据文件编号select file_name,file_id,tablespace_name from dba_data_files;)

  控制文件:RMAN>backup current controlfile;

  或者RMAN>backup database include current controlfile;

  日志文件:RMAN>backup archivelog all;

  或者RMAN>backup database plus archivelog;

  参数文件:RMAN>backup spfile;

  还原

  a. 完全恢复

  方法一:从最近的备份集恢复整个数据库,数据库会自动运行redo和archive日志(完全恢复):

  SQL>shutdown immediate

  SQL>startup mount

  RMAN>restore database;

  RMAN>recover database;

  RMAN>sql 'alter database open';

  方法二:从tag恢复整个数据库,数据库也会运行redo 和archive 日志(完全恢复),结果与上面的脚本一样:

  查看标签:

  RMAN> list backupset summary;

  Key TY LV S Device Type Completion Time #Pieces #Copies Compressed Tag

  ------- -- -- - ----------- --------------- ------- ------- ---------- ---

  25 B A A DISK 25-JUL-11 1 1 NO TAG20110725T104634

  28 B 0 A DISK 25-JUL-11 1 1 NO TAG20110725T104645

  29 B A A DISK 25-JUL-11 1 1 NO TAG20110725T104711

  30 B F A DISK 25-JUL-11 1 1 NO TAG20110725T104713

  31 B A A DISK 25-JUL-11 1 1 NO TAG20110725T105333

  32 B A A DISK 25-JUL-11 1 1 NO TAG20110725T105350

  33 B 1 A DISK 25-JUL-11 1 1 NO TAG20110725T105353

  34 B A A DISK 25-JUL-11 1 1 NO TAG20110725T105408

  35 B F A DISK 25-JUL-11 1 1 NO TAG20110725T105411

  36 B A A DISK 25-JUL-11 1 1 NO TAG20110725T111403

  37 B 1 A DISK 25-JUL-11 1 1 NO TAG20110725T111405

  38 B A A DISK 25-JUL-11 1 1 NO TAG20110725T111421

  39 B F A DISK 25-JUL-11 1 1 NO TAG20110725T111423

  还原数据库:

  SQL>shutdown immediate;

  SQL>startup mount;

  RMAN>restore database from tag TAG20110725T104645;

  RMAN> recover database from tag TAG20110725T104645;

  RMAN> alter database open;

  b. 不完全恢复:

  SQL>shutdown immediate;

  SQL>startup mount;

  RMAN>restore database from tag TAG20110725T104645;

  RMAN>recover database until time "to_date('2011-08-04 15:37:25','yyyy/mm/dd hh24:mi:ss')";

  RMAN>alter database open resetlogs;

  注意:使用后所有的备份集都无效了,确保安全需要重新对数据库进行全备(ORACLE10G之后,resetlog之前的备份还是可以用的)

  关键表空间恢复(system / undotbs1 / sysaux):

  SQL>shutdown abort

  SQL>startup mount

  RMAN>restore tablespace 名字;

  RMAN>recover tablespace 名字;

  RMAN>sql 'alter database open';

  非关键表空间恢复(example / users ):

  select * from v$datafile_header; 表空间与数据文件对应关系

  SQL>alter database datafile 数字 offline;

  RMAN>restore tablespace 名字;

  RMAN>recover tablespace 名字;

  SQL>alter database datafile 数字 online;

  删除备份

  所有backup备份集:delete backup;

  所有copy备份机:delete copy;

  特定备份机:delete backupset 19;

  删除根据保存规则可删除文件:delete obsolete;

  删除过期的备份:

  delete expired backupset;

  delete expired copy;

  RUN块

  例如:

  RMAN> RUN {

  ALLOCATE CHANNEL c1 DEVICE TYPE sbt;

  ALLOCATE CHANNEL c2 DEVICE TYPE sbt;

  ALLOCATE CHANNEL c3 DEVICE TYPE sbt;

  BACKUP

  INCREMENTAL LEVEL = 0

  FORMAT '/disk1/backup/df_%d_%s_%p.bak'

  (DATAFILE 1,4,5 CHANNEL c1)

  (DATAFILE 2,3,9 CHANNEL c2)

  (DATAFILE 6,7,8 CHANNEL c3);

  ALTER SYSTEM ARCHIVE LOG CURRENT;

  }

  12. 外部变量:

  语言:set nls_lang=american

  日期:set nls_date_format=yyyy-mm-dd....

  RMAN sciprt

  前提条件:有catalog

  写法:(global表示可以由多个数据库调用)

  create global script 名

  comment "备注说明"

  {脚本内容}

  例如:

  create global script abc

  comment "test"

  {backup current controlfile;}

  调用:run {execute script 名}

  例如:run {execute script abc;}

  查看:print script 名

  改写:

  replace global script 名

  comment "备注说明"

  {脚本内容}

  删除:delete script 名;

  永久保留备份

  条件是备份不能保留在flash recovery area中;

  a. 创建备份:

  RUN

  {

  ALLOCATE CHANNEL c1 DEVICE TYPE disk format '/tmp/autobackup/%U';

  BACKUP tablespace example;

  }

  b. 查找该备份:

  list backupset of tablespace example;

  c. 修改属性为永久

  change backupset 编号 keep forever nologs;

  建立多个固定大小的备份

  例如:example 测试备份大小是大于50M

  run

  {

  allocate channel c1 device type disk maxpiecesize 10M format '/tmp/autobackup/%U';

  backup tablespace example;

  }

  /tmp/autobackup目录下有六个文件

  16.运行脚本:backup recovery area

  备份内容:

  a. control file autobackup;

  b. incremental backup sets

  17.block change tracking

  a. 针对整个数据库;

  b. 默认存放路径:background_dump_dest

  二.Oracle快速插入数据append

  1:用merge into 进行匹配更新和插入,

  2: 开启并行,提高速度

  3: 如果可以的话加NOLOGING 不写入日志

  4:如果数据有规律的话,分批次执行

  1.使用marge快速插入;

  MERGE /*+ append */

  INTO A d

  USING (select * B where ...) f

  ON (d.account_no = f.account_no)

  WHEN MATCHED THEN

  update set acc_date = f.acc_date,...

  WHEN NOT MATCHED THEN

  insert values ( f.account_no,f.acc_date..)

  /

  commit;

  SQL> INSERT ALL

  2 INTO toms values(1)

  3 into toms values(2)

  4 select * from dual;

  已创建2行。

  SQL> commit;

  3.在插入时不记录日志记录的快速方法

  INSERT的时候可通过APPEND选项不产生归档日志。

  alter table aa nologging

  alter table aa logging

  insert /+append/ into ...nologing

  select * from ...

  insert /*+ append, parallel */ into ods_list_t nologging

  select * from ods_list;

  但这样不行:整个表可以插入,但要某一个字段则不能加入nologging

  insert /*+ append, parallel */ into ods_list_t(a,b) nologging

  select a,b from ods_list;

  但可以这样:

  insert /*+ append, parallel */ into ods_list_t nologging(a,b)

  select a,b from ods_list;

  create table ods_list_t nologging as select * from ods_list;

  insert /*+ append, parallel */ into ods_list_t nologging

  select * from ods_list;

  insert /*+ Append parallel(tablename,number) */ into ods_list_t nologging

  select * from ods_list;

  tablename: 表名

  number: 并行度

  4、

  使用批量拷贝方法

  set arraysize 20

  set copycommit 5000

  copy from username/password@oracle_name append table_name1

  using select * from table_name2;

  --------------------------------------------------

  一、非归档模式下:

  没有优化前 (1281372 redo size)

  1、单一的使用nologging参数,对redo的产生没有什么影响。 (1214836 redo size)

  2、单一的使用append提示,redo的减少很显著 (43872 redo size)

  3、nologging+append,更显著 (1108 redo size)

  二、归档模式下:

  没有优化前:

  1、单独使用nologging参数,(1231904 redo size)

  2、单独使用append提示, (1245804 redo size)

  3、nologging + append, (3748 redo size)

  a、使用nologging参数并不代表在dml操作中,oracle不产生redo,只是对于指定表的更新数据不产生redo,但是oracle还是要记录这些操作,所以无论怎么优化,dml操作肯定要产生redo,但是使用这些参数对redo size的影响还是非常可观的。

  b、单独使用nologging参数,对redo size没有多少影响,只有和append配合时,才能产生效果。

  c、单独使用append提示,对redo的产生影响很大,这是我到现在都不明白的道理,按说append是绕过freelists,直接去寻找新块,能减少对freelists的争用,为什么会少这么多redo呢?

  d、归档模式和非归档模式下,参数影响不一样,尤其是单独使用append参数时,看来oracle对归档模式下出于安全考虑还是要多一些。

  oracle append有什么作用?

  oracle中append是做什么用的。

  insert /+append/ into table1 select * from table2

  在使用了append选项以后,insert数据会直接加到表的最后面,而不会在表的空闲块中插入数据。

  使用append会增加数据插入的速度。

  /+APPEND/的作用是在表的高水位上分配空间,不再使用表的extent中的空余空间

  append 属于direct insert,归档模式下append+table nologging会大量减少日志,非归档模式append会大量减少日志,append方式插入只会产生很少的undo

  不去寻找 freelist 中的free block , 直接在table HWM 上面加入数据。

  采用高速的存储设备,提高读写能力,如:EMC 和NetApp,

  假如tab1表中的没有数据的话

  DROP TABLE TAB1;

  CREATE TABLE TAB1 AS SELECT * FROM TAB2;

  然后在创建索引

  用Hint 提示减少操作时间

  INSERT /+Append/ INTO tab1

  SELECT * FROM tab2;

  采用不写日志及使用Hint提示减少数据操作的时间。

  建议方案是先修改表为不写日志:

  sql> alter table table_name NOLOGGING;

  插入数据:

  INSERT /+Append/ INTO tab1

  SELECT * FROM tab2;

  插入完数据后,再修改表写日志:

  sql> alter table table_name LOGGING;

  这里的区别就在于如果插入数据的同时又写日志,尤其是大数据量的insert操作,需要耗费较长的时间。

  用EXP/IMP 处理大量数据

  (1)给当前的两个表分别改名

  alter table tab1 rename to tab11;

  alter table tab2 rename to tab1;

  (2)导出改名前的tab2

  exp user/pwd@... file=... log=... tables=(tab1)

  (3)把名字改回来

  alter table tab1 rename to tab2;

  alter table tab11 rename to tab1;

  (4)导入数据

  imp user/pwd@... file=... log=... fromuser=user touser=user tables=(tab1)

(作者:王珏)
请关注天极网欢迎在新浪微博上关注我们
吐槽
评论
* 网友发言均非本站立场,本站不在评论栏推荐任何网店、经销商,谨防上当受骗!
热门推荐
必应输入法

微软必应拼音输入法是微软亚洲研究院推出的新一代拼音输入法。[详细]

必应输入法