rman备份恢复操作⼿册-从零到⽆
--时间:2020年9⽉2⽇
--作者:飞翔的⼩胖猪
1 备份
1.1 备份说明
rman可进⾏热备和冷备,⼀般情况下都是进⾏热备即不数据库备份。执⾏的热备需要数据库处于归档模式下。
1.2 设置归档模式
归档模式开启过后,当⼀个在线重做⽇志写满了过后,会切换到下⼀个在线重做⽇志中进⾏⽇志写⼊。之前的在线重做⽇志会形成归档⽇志存放于归档⽇志⽬录中。如果归档⽇
志⽬录空间使⽤率100%,那么整个数据库会⽆法写⼊新数据⽽导致数据库GG,所以在开启设置数据库为归档模式后需要定时的检查归档⽇志⽬录剩余空间⼤⼩,及时清理过期
的数据或扩容⽬录空间。
设置归档⽇志路径
SQL> alter system  set log_archive_dest_1='location=/u01/arch'  #设置为本地⽬录作为归档⽇志⽬录,红⾊字体根据⾃⼰定义的⽬录填写
SQL> alter system set log_archive_dest_1='location=+DATA/RACDB/ARCH' scope=spfile sid='*';  #使⽤ASM的环境下使⽤此命令
SQL> show parameter log_archive_dest_1;    #查看确认设置的归档⽇志路径
开启归档
归档模式的切换必须处于mount状态下,其他状态下不⾏哟。
SQL> shutdown immediate;    #先正常关闭在⽤数据库,如果你的数据库正在运⾏
SQL> startup mount;                #启动数据库到mount阶段
SQL> alter database archivelog;    #设置数据库为归档模式
SQL> alter database open;              #启动数据库到open状态
SQL> archive log list;          #查看数据库当前是否处于归档模式下
SQL> alter system switch logfile;    #尝试切换⼀下在线重做⽇志⽂件,此时可以到之前设置的归档⽇志⽬录中查看是否有新⽂件,如果有新⽂件则表⽰归档正常。
关闭归档模式
关闭归档模式和开启的操作⼀样,只能在mount状态下执⾏。
SQL> shutdown immediate;    #先正常关闭在⽤数据库,如果你的数据库正在运⾏
SQL> startup mount;                #启动数据库到mount阶段
SQL> alter database noarchivelog;    #设置数据库为归档模式
SQL> alter database open;              #启动数据库到open状态
SQL> archive log list;          #查看数据库当前是否处于归档模式下
1.3 备份脚本
脚本中的ORACLE_SID、ORACLE_BASE、ORACLE_HOME、PATH这⼏个环境变量请根据⾃⼰的实际情况填写。
1 #!/bin/bash
2 export ORACLE_SID=orcl
3 export ORACLE_BASE=/app/oracle
4 export ORACLE_HOME=/app/oracle/product/11.2.0/dbhome_1
5 export PATH=$DB_HOME/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oracle/bin
6 export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
7echo'------------------------------------' >> /tmp/rman_PRD04_full.log
8echo"Start FULL Backup at  `date +%Y-%m-%d:%H:%M:%S`  " >> /tmp/rman_PRD04_full.log
9echo'------------------------------------' >> /tmp/rman_PRD04_full.log
10
11 rman target / log /tmp/rman_PRD04_full.log append <<EOF
12 run{
13 allocate channel c1 type disk;
14 allocate channel c2 type disk;
15 allocate channel c3 type disk;
16 backup database format '/app/archive_backup/full_%d_%T_%s_%p.bak';
17 SQL 'alter system archive log current';
18 SQL 'alter system archive log current';
19 backup archivelog all  format '/app/archive_backup/arch_%d_%T_%s_%p.bak';
20 backup current controlfile format '/app/archive_backup/ct1_%d_%T_%s_%p.ctl.bak';
21 backup spfile format '/app/archive_backup/%d_%T_%s_%p.spfile.bak';
22 }
23 EOF
释义:
13-15⾏:打开了三个通道介质都为disk,rman备份建议最多使⽤4个通道。
16⾏:定义备份过后的数据⽂件路径及命名格式。
17-18⾏:切换数据库在线重做⽇志⽂件。
19⾏:定义备份的归档⽇志⽂件路径及命名格式。(顺序必须在备份数据⽂件之后),备份的是数据库数据⽂件备份期间产⽣的归档⽇志。
20⾏:定义备份的控制⽂件路径及命令格式。
21⾏:定义备份的spfile⽂件路径及命令格式。
1.4 RMAN基础操作
$rman target /                #以数据库的sysdba⽤户进⼊到rman中,当设置了ORACLE_SID同时对应实例的数据库处于nomount以上的状态时,该命令会⾃动连接到该实例中。不然需要使⽤set dbid 'xxxxxx';设置连接到哪⼀个实例中RMAN> show all;              #查看所有配置
释义:
①configure retention policy to redundancy 1:
是⽤来决定那些备份不再需要了,它⼀共有三种可选项,分别是
复制代码代码如下:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
CONFIGURE RETENTION POLICY TO REDUNDANCY 5;
CONFIGURE RETENTION POLICY TO NONE;
第⼀种recover window是保持所有⾜够的备份,可以将数据库系统恢复到最近七天内的任意时刻。任何超过最近七天的数据库备份将被标记为obsolete。
第⼆种redundancy是为了保持可以恢复的最新的5份数据库备份,任何超过最新5份的备份都将被标记为redundancy。它的默认值是1份。
第三种不需要保持策略,clear将恢复回默认的保持策略。
⼀般最安全的⽅法是采⽤第⼆种保持策略。
②CONFIGURE BACKUP OPTIMIZATION OFF
默认值为关闭,如果打开,rman将对备份的数据⽂件及归档等⽂件进⾏⼀种优化的算法。
③Configure default device type to disk:
是指定所有I/O操作的设备类型是硬盘或者磁带,默认值是硬盘
磁带的设置是CONFIGURE DEFAULT DEVICE TYPE TO SBT;
④CONFIGURE CONTROLFILE AUTOBACKUP OFF
强制数据库在备份⽂件或者执⾏改变数据库结构的命令之后将控制⽂件⾃动备份,默认值为关闭。这样可以避免控制⽂件和catalog丢失后,控制⽂件仍然可以恢复。
⑤CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'
是配置控制⽂件的备份路径和备份格式
⑥CONFIGURE DEVICE TYPE DISK PARALLELISM 1;
是配置数据库设备类型的并⾏度,并⾏的数⽬决定了开启通道的个数。
⑦CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1;
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1
是否启动复合备份,向指定的i/o设备中指定的位置⽣成指定的份数。缺省为1.这个配置仅⽤于数据⽂件和归档⽂件,并且,只有在⾃动分配通道时才会⽣效!
⑧CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'C:ORACLE…SNCFTEST.ORA'
是配置控制⽂件的快照⽂件的存放路径和⽂件名,这个快照⽂件是在备份期间产⽣的,⽤于控制⽂件的读⼀致性。
⑨CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT 'C:...%d_DB_%u_%s_%p';
是配置备份⽂件的备份路径和备份格式
⑩CONFIGURE EXCLUDE FOR TABLESPACE <tablespace> [CLEAR];
此命令⽤于将指定的表空间不备份到备份集中,此命令对只读表空间是⾮常有⽤的。
校验备份数据
校验的⽬的是检测当前以存在rman备份数据是否有效等功能。
检验操作不会对以备份数据造成影响。可以放⼼⼤胆的使⽤。
RMAN> crosscheck backup;                        #校验所有备份数据信息
RMAN> crosscheck backup of database;            #校验数据库备份数据信息
RMAN> crosscheck backup of tablespacesystem;    #校验数据库表空间备份数据信息
RMAN> crosscheck backup of controlfile;          #校验控制⽂件备份信息
RMAN> crosscheck backup of spfile;              #检验数据库配置⽂件备份信息
RMAN> crosscheck archivelog all;                #检验归档⽇志⽂件数据信息
RMAN> crosscheck backup of archivelog all;      #检验归档⽇志⽂件备份信息
查看备份数据
查看rman中备份⽂件信息,为保证数据的准确性,在执⾏查看前请先使⽤crosscheck命令对备份数据进⾏⼀次检验。
查看命令是⽆害的随意⽤,不会修改任何东西。
RMAN> list backup;                          #查看所有备份数据
RMAN> list backup of database;              #查看数据库备份数据
RMAN> list backup of tablespacetable_name;  #查看表空间备份数据
RMAN> list backup of controlfile;            #查看控制⽂件备份数据
RMAN> list backup of spfile;                #查看数据库配置⽂件备份数据
RMAN> list backupset id;                    #这⾥ID指的是备份集的ID号⽐如2、3.
RMAN> list archivelog all; #查看所有的归档⽇志⽂件
RMAN> list archivelog all COMPLETED BEFORE 'SYSDATE-7'; #查看7天前的数据归档⽇志⽂件
RMAN> list ARCHIVELOG FROM TIME 'SYSDATE-7'; #查看7天内的归档⽇志⽂件
删除归档及备份⽂件
为了避免备份⽂件过多导致存储压⼒可以制定计划定时清理备份数据,在rman中删除数据时请先使⽤crosscheck命令对备份数据进⾏⼀次检验。
删除命令威⼒还是很⼤的,⼀定要按照⽣产规范执⾏数据保留策略。在进⾏清理操作时请多次确认。在执⾏删除操作时请⼩⼼!⼩⼼!⼩⼼!不要误操作了。
删除归档⽇志
RMAN> delete expired archivelog all;                        #删除过期的归档⽇志
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';  #删除7天前的归档⽇志
RMAN> DELETE ARCHIVELOG FROM TIME 'SYSDATE-7';              #删除七天内的归档
RMAN> report obsolete;                                      #报告陈旧备份
RMAN> delete obsolete;                                      #删除陈旧备份
RMAN> delete expired backup;                                #删除过期的数据,和rman的保留策略设置有关
RMAN> delete expired copy ;                                  #删除EXPIRED副本
RMAN> delete backupset 9;                                    #删除备份集编号9的
RMAN> delete backuppiece ¨F:\backup\DEMO_9.bak¨;            #删除特定备份⽚
RMAN> delete backup;                                        #删除所有备份
RMAN> RMAN> delete copy;                                    #删除映象副本
RMAN> delete datafilecopy ¨F:\backup\DEMO_9.bak¨            #删除特定映象副本
2 RMAN恢复数据
2.1 恢复说明
数据库启动需要经过: close 阶段  ---->    nomount阶段  ----->  mount阶段    ----> open阶段
close阶段:
状态:数据库程序未运⾏。
恢复内容:可以进⾏物理⽂件的移动拷贝。创建启动前必要的⽂件夹、物理拷贝spfile⽂件到正确⽬录。
nomount阶段:
状态:oracle程序数据库中必要的⽂件夹存及特定⽂件存在,该阶段不会去检测控制⽂件和数据库数据⽂件是否存在。但是如spfile⽂件丢失是⽆法启动到nomount状态。
恢复内容:可以进⾏控制⽂件的恢复,如从备份位置恢复控制⽂件或使⽤命令重建控制⽂件等操作。
mount阶段:
状态:阶段需要有控制⽂件。能够正常读取读取控制⽂件中的数据库信息如数据⽂件路径,当前scn号等信息。
恢复内容:该阶段组要可以对具体的数据⽂件进⾏恢复及redo ⽇志⽂件丢失重建等操作
open:
状态:数据库的最终状态。控制⽂件中的所有⽂件及scn号⼀致的情况下可以启动成功,如果scn号不⼀致可能需要进⾏实例恢复。
2.2 恢复控制⽂件(有备份)
思路:
强制关闭数据库,⼿动启动数据库到mount阶段,恢复丢失的控制⽂件,然后在mount阶段恢复同步⼀下数据库最后打开数据库。
步骤:
1.强制关闭数据库
2.启动数据库到nomount状态
3.使⽤rman连接数据库
4.使⽤备份⽂件恢复control⽂件
5.在rman管理器中启动数据库到mount阶段
6.执⾏恢复数据库
7.打开数据库
#强制关闭数据库
SQL> shutdown abort;
#启动到nomount阶段
SQL> startup nomount;
#新开⼀个终端,进⼊到rman管理器中
$ rman target /
RMAN> set dbid='xxxxxxxxxxx';        #dbid可以在数据库正常时,通过select dbid from v$database;命令查看
RMAN> restore controlfile from '实际备份的⽂件路径';
RMAN> alter database mount;
RMAN> recover database;  #如果报数据⽂件相关的错误,需进⾏数据⽂件恢复,则执⾏如下三条命令。
如果有datafile⽂件错误。
RMAN> list failure;
RMAN> advise failure;  #运⾏⾃动修复功能,会⽣成⼀个⽂本,使⽤cat查看按照⽂本操作
RMAN> repair failure;  #运⾏⾃动修复,成功的话会⾃动打开库
RMAN> alter database open;    #执⾏启动数据库到open状态,如果该命令成功则不⽤执⾏下⼀条命令
RMAN> alter database open resetlogs;
2.3 重建控制⽂件(没有备份)
在异常断电可能导致控制⽂件丢失或GG了,⼜没有备份那么只有尝试重建控制⽂件。
控制⽂件丢失数据库是⽆法启动到mount状态的。在rac环境中需要设置cluster_database为False,show parameter cluster_database
思路:
备份现有数据库配置⽂件,通过配置⽂件到数据库名和具体的数据存放路径,在nomount阶段下获取字符集,使⽤获取到的数据填充命令重建数据库控制⽂件。步骤:
1.强制关闭数据库
2.启动数据库到nomount状态
3.备份spfile⽂件
4.获取数据⽂件列表、数据库实例名、字符集等信息
5.完善控制⽂件重建命令
6.打开数据库
备份spfile⽂件
备份spfile⽂件,如果spfile不⼩⼼被你玩崩了那么你可以使⽤ startup pfile='pfile路径'指定之前备份的。
使⽤服务器参数⽂件spfile创建⽂本参数⽂件pfile:
SQL> show parameter spfile;        #查看spfile⽂件存放路径
(以下的spfile备份命令选择⼀种即可)
SQL> create pfile from spfile='/app/oracle/product/11.2.0/dbhome_1/a';#复制的pfile在同⽬录下
SQL> create pfile from spfile;  #复制当前的spfile⽂件为pfile⽂件,同⽬录。
SQL> create pfile="/app/oracle/product/11.2.0/dbhome_1/a" from spfile="/app/oracle/product/11.2.0/dbhome_1/a";
SQL> create pfile="/app/oracle/product/11.2.0/dbhome_1/a" from spfile;
spfile丢失过后可以直接复制,也可以使⽤如下命令恢复spfile⽂件。
SQL> create spfile from pfile='/app/oracle/product/11.2.0/dbhome_1/a';
获取数据库名,在spfile⽂件中
在⽂件中查看 db_name= ⾏内容并记录下来。
[oracle@localhost dbs]$ a| more
b_cache_size=637534208
orcl.__java_pool_size=16777216
orcl.__large_pool_size=33554432
orcl.__oracle_base='/app/oracle'#ORACLE_BASE set from environment
orcl.__pga_aggregate_target=637534208
orcl.__sga_target=922746880
orcl.__shared_io_pool_size=0
orcl.__shared_pool_size=218103808
orcl.__streams_pool_size=0
*.audit_file_dest='/app/oracle/admin/orcl/adump'
*.audit_trail='db'
*patible='11.2.0.4.0'
*.control_files='/app/oracle/oradata/l','/app/oracle/fast_recC
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl'
*.db_recovery_file_dest='/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=4385144832
*.diagnostic_dest='/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.log_archive_dest_1='location=/app/archive_data'
*.memory_target=1547698176
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
获取字符集,很重要(在nomount状态)
SQL> select userenv('language') from dual;
获取数据⽂件列表
⼀般在$ORACLE_BASE/oradata/实例名/下ASM除外。记录下所有的⽂件依次填写在命令中。
$ ll $ORACLE_BASE/oradata/orcl/
-rw-r----- 1 oracle oinstall 9.3M Sep  111:l.bak
-rw-r----- 1 oracle oinstall 331M Sep  111:57 example01.dbf
drwxr-x--- 3 oracle oinstall 4.0K Aug 2006:25 ORCL
-rw-r----- 1 oracle oinstall 501M Sep  111:54 redo01.log
-rw-r----- 1 oracle oinstall 501M Sep  111:57 redo02.log
-rw-r----- 1 oracle oinstall 501M Sep  111:54 redo03.log-rw-r----- 1 oracle oinstall 541M Sep  111:57 sysaux01.dbf
-rw-r----- 1 oracle oinstall 751M Sep  111:57 system01.dbf
-rw-r----- 1 oracle oinstall  21M Sep  111:54 temp01.dbf
-rw-r----- 1 oracle oinstall 101M Sep  111:57 undotbs01.dbf
-rw-r----- 1 oracle oinstall 5.1M Sep  111:57 users01.dbf
⽣成控制⽂件
在nomount中执⾏命令,按照之前查看到的⽂件填写。控制⽂件⽣成过后会⾃动启动到mount状态。
#红⾊字体部分请按照⾃⼰实际环境填写。
SQL> CREATE CONTROLFILE REUSE DATABASE 'orcl' NORESETLOGS ARCHIVELOG
MAXLOGFILES 5
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 226
LOGFILE
GROUP 1'/app/oracle/oradata/orcl/redo01.log' SIZE 500M,
GROUP 2'/app/oracle/oradata/orcl/redo02.log' SIZE 500M,
GROUP 3'/app/oracle/oradata/orcl/redo03.log' SIZE 500M
DATAFILE
'/app/oracle/oradata/orcl/system01.dbf',
'/app/oracle/oradata/orcl/sysaux01.dbf',
'/app/oracle/oradata/orcl/undotbs01.dbf',
'/app/oracle/oradata/orcl/users01.dbf',
'/app/oracle/oradata/orcl/example01.dbf',
'/app/oracle/oradata/orcl/temp01.dbf'
CHARACTER SET US7ASCII
;
注:提⽰ORA-01110: data file : '/app/oracle/oradata/orcl/temp01.dbf\' 则删除temp01.dbf这⼀⾏,再执⾏。
oracle数据库自动备份方法SQL> CREATE CONTROLFILE REUSE DATABASE 'orcl' NORESETLOGS ARCHIVELOG
MAXLOGFILES 5
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 226
LOGFILE
GROUP 1'/app/oracle/oradata/orcl/redo01.log' SIZE 500M,
GROUP 2'/app/oracle/oradata/orcl/redo02.log' SIZE 500M,
GROUP 3'/app/oracle/oradata/orcl/redo03.log' SIZE 500M
DATAFILE
'/app/oracle/oradata/orcl/system01.dbf',
'/app/oracle/oradata/orcl/sysaux01.dbf',
'/app/oracle/oradata/orcl/undotbs01.dbf',
'/app/oracle/oradata/orcl/users01.dbf',
'/app/oracle/oradata/orcl/example01.dbf'
CHARACTER SET US7ASCII
;
打开数据库
在成功执⾏了控制⽂件重建操作后,数据库会⾃动启动到mount状态。此时可以尝试open数据库。如果⽆法直接open尝试recover⼀下再open。
SQL> alter database open;
如果此处失败,则先进⾏实例恢复。recover database; 然后再执⾏alter database open;
ERROR at line 1:
ORA-01113: file1 needs media recovery
ORA-01110: data file1: '/app/oracle/oradata/orcl/system01.dbf'
2.4 恢复丢失的数据⽂件
如果没有备份⾄故障期间的归档重做⽇志,那么只能恢复到备份的时候,不能进⾏完全恢复。
思路:
强制关闭数据库,在rman中启动数据库到nomount状态,恢复控制⽂件(可选),启动数据库到mount阶段,恢复相关数据⽂件,recover⼀下数据,最后打开数据库。步骤:
1.强制关闭数据库
2.启动数据库到nomount状态
3.恢复控制⽂件(可选)
4.切换数据库到mount模式,restore数据⽂件
6.打开数据库
SQL> shutdown abort;  #强制关闭数据库⽤oracle账户
SQL> startup nomount; #启动数据库到nomount状态,如果有控制⽂件、pfile或者当前控制⽂件、spfile不正确,则需要先进⾏配置⽂件恢复。$ rman target /
RMAN> restore controlfile from '实际备份的⽂件路径';
RMAN> alter database mount;
RMAN> list failure;    #查看系统中缺失的⽂件信息,必须先执⾏该命令后才能使⽤如下的advise命令
RMAN> advise failure;  #运⾏⾃动修复功能,会⽣成⼀个⽂本,使⽤cat查看按照⽂本操作
RMAN> repair failure;  #运⾏⾃动修复,成功的话会⾃动打开库
2.5 恢复丢失的某个数据⽂件
思路:
离线丢失的数据⽂件,在rman中恢复丢失的数据⽂件,recover⼀下恢复的数据⽂件,最后上线数据⽂件。
步骤:
1.离线丢失数据⽂件
2.使⽤备份数据恢复丢失⽂件
4.上线数据⽂件
关闭数据库
启动到mount状态,也可以尝试启动到open状态(⼀般启动open的过程中会提⽰⽂件offline)
offline指定的数据库⽂件
SQL> alter database datafile '/app/oracle/oradata/orcl/example01.dbf' offline;
SQL> alter database open;
从rman中恢复数据⽂件
RMAN> restore datafile '/app/oracle/oradata/orcl/example01.dbf';
获取实际的数据⽂件路径
SQL> set linesize 200;
SQL> col file_name for a40;
SQL> select file_name,file_id,tablespace_name,status,online_status from dba_data_files
查看到offline的⽂件实际路径,为了保证scn号⼀致还需要获取到⽂件路径在rman中执⾏恢复。
RMAN> recover datafile '/app/oracle/oradata/orcl/example01.dbf';
online数据⽂件,重启数据库
SQL> alter database datafile '/app/oracle/oradata/orcl/example01.dbf' online;
SQL> shutdown immediate
SQL> startup

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。