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'
 7 echo '------------------------------------' >> /tmp/rman_PRD04_full.log
 8 echo "Start FULL Backup at  `date +%Y-%m-%d:%H:%M:%S`  " >> /tmp/rman_PRD04_full.log
 9 echo '------------------------------------' >> /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/dbs/spfileorcl.ora';#复制的pfile在同目录下 SQL> create pfile from spfile; #复制当前的spfile文件为pfile文件,同目录。 SQL> create pfile="/app/oracle/product/11.2.0/dbhome_1/dbs/bakpfile.ora" from spfile="/app/oracle/product/11.2.0/dbhome_1/dbs/spfileorcl.ora"; SQL> create pfile="/app/oracle/product/11.2.0/dbhome_1/dbs/bakpfile.ora" from spfile;

  spfile丢失过后可以直接复制,也可以使用如下命令恢复spfile文件。

  SQL> create spfile from pfile='/app/oracle/product/11.2.0/dbhome_1/dbs/bakpfile.ora';

 

获取数据库名,在spfile文件中

在文件中查看 db_name= 行内容并记录下来。

[oracle@localhost dbs]$ cat spfileorcl.ora| 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'
*.compatible='11.2.0.4.0'
*.control_files='/app/oracle/oradata/orcl/control01.ctl','/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  1 11:58 control01.ctl.bak
-rw-r----- 1 oracle oinstall 331M Sep  1 11:57 example01.dbf
drwxr-x--- 3 oracle oinstall 4.0K Aug 20 06:25 ORCL
-rw-r----- 1 oracle oinstall 501M Sep  1 11:54 redo01.log
-rw-r----- 1 oracle oinstall 501M Sep  1 11:57 redo02.log
-rw-r----- 1 oracle oinstall 501M Sep  1 11:54 redo03.log-rw-r----- 1 oracle oinstall 541M Sep  1 11:57 sysaux01.dbf
-rw-r----- 1 oracle oinstall 751M Sep  1 11:57 system01.dbf
-rw-r----- 1 oracle oinstall  21M Sep  1 11:54 temp01.dbf
-rw-r----- 1 oracle oinstall 101M Sep  1 11:57 undotbs01.dbf
-rw-r----- 1 oracle oinstall 5.1M Sep  1 11: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这一行,再执行。 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: file 1 needs media recovery ORA-01110: data file 1: '/app/oracle/oradata/orcl/system01.dbf'

 

2.4 恢复丢失的数据文件

如果没有备份至故障期间的归档重做日志,那么只能恢复到备份的时候,不能进行完全恢复。

思路:

        强制关闭数据库,在rman中启动数据库到nomount状态,恢复控制文件(可选),启动数据库到mount阶段,恢复相关数据文件,recover一下数据,最后打开数据库。

步骤:

        1.强制关闭数据库

        2.启动数据库到nomount状态

        3.恢复控制文件(可选)

        4.切换数据库到mount模式,restore数据文件

        5.recover数据文件

        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.使用备份数据恢复丢失文件

        3.recover刚才恢复的文件

        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

 

posted @ 2020-09-02 16:18  飞翔的小胖猪  阅读(1974)  评论(0编辑  收藏  举报