oracle 12c集群使用rman备份恢复
1、数据库备份 物理备份 热备:在数据库开机状态下进行的备份。 冷备:数据库关闭的情况下,进行操作系统文件的拷贝(注意此时关闭数据库库必须是按照正常情况关闭的)。 逻辑备份 2、物理热备 recovery manager(RMAN) 是一个客户端应用程序,用于数据库的备份和恢复。rman的体系结构由rman客户端、目标数据库、恢复目录组成。 3、recovery catalog(恢复目录,rman资料库) 归档日志的名字记录在控制文件中 如果使用恢复目录,则归档日志的名字记录在recovery catalog恢复目录(中) recovery catalog恢复目录存放的元数据信息 1、数据文件和归档日志文件的备份集(backup sets)和备份碎片的信息。 2、数据文件副本的信息 3、归档日志文件及副本的信息 4、目标数据库的表空间和数据文件的信息 5、存储脚本 6、rman的配置信息 4、归档日志文件 1、每个节点都有自己的回滚表空间 2、每个节点都有自己的联机重做日志 3、每个节点都有归档日志文件 5、还原(restore)和恢复(recovery)区别 restore 是使用备份文件,将数据库还原到过去的某个状态,是对备份的数据文件等的简单还原。 recovery是应用online redo logs和归档日志将数据库做向前恢复。 6、热备的环境准备。 [root@rac1 ~]# olsnodes -s rac1 Active rac2 Active [root@rac1 ~]#
两节点的集群 设置闪回区的大小: su - oracle sqlplus / as sysdba alter system set db_recovery_file_dest_size=2g scope=both sid=’*’;
设置闪回区的路径 alter system set db_recovery_file_dest='+DATA' scope=both sid='*';
需要注意闪回区经常会满,导致数据库hang住。 在热备时,要求数据是归档状态,所以下面需要使数据库在归档状态。 1、关闭数据库
关闭数据库,会关闭集群中的所有实例。 关闭完成后,在集群中任意一个节点,把数据库启动到mount阶段 su - oracle sqlplus / as sysdba startup mount;
执行开归档命令 alter database archivelog;
执行打开数据库 alter database open ;
查看数据库的状态 srvctl status database -d tar
验证数据库是否是归档状态 select log_mode from v$database ; archive log list 两种方式都能验证是否已经开启归档。
归档路径和归档大小都在闪回区,就是我们前面指定的。 下面可以查看归档日志文件 set linesize 1000; column name format a90; select name,status from v$archived_log ; 测试环境准备好就可以备份数据库了 首先必须记住数据库的DBID select dbid from v$database ; 3086949231
创建测试表 create table cust8( cust_id number, last_name varchar2(30), first_name varchar2(30) ); 插入4条记录 insert into cust8(cust_id,last_name,first_name) values(7,’acer’,’scott’); insert into cust8(cust_id,first_name) values(5,’stark’,’jim’); insert into cust8(cust_id,first_name) values(3,’grey’,’bob’); insert into cust8(cust_id,first_name) values(11,’khan’,’brad’); commit ; select * from cust8;
刚才插入的数据可能还在联机日志里面,并没有到数据库归档中去,所以我们执行日志切换,生成归档 alter system switch logfile;
切换日志后查询归档,发现又多生成了一个归档日志。 现在可以利用rman登录目标数据库 su - oracle rman nocatalog target sys/root123
通常我们用超级用户来做数据库的备份和恢复 记住我们平时在开始就应该记录每个数据库的dbid,不要在数据库完蛋的时候才想起来没有dbid。 下面我们打开备份文件自动备份功能 configure controlfile autobackup on ;
show all
show snapshot controlfile name;
查看控制文件快照的名称 创建一个目录存放我们的备份文件 mkdir /taryartar/12c/db_base/BKDIR
然后我们就可以通过脚本全备数据库: run{ allocate channel t1 type disk Format '/taryartar/12c/db_base/BKDIR/fullBK%s_%p_%t.bak'; set controlfile autobackup format for device type disk to '/taryartar/12c/db_base/BKDIR/c_%F.control'; backup database ; release channel t1 ; } 执行数据库的全备份。
全备完成后,我们在插入四条数据,模拟数据库全备后数据库继续运行了一段时间 insert into cust8(cust_id,first_name) values(14,’after fullbak’); insert into cust8(cust_id,first_name) values(15,first_name) values(16,’after fullbak’); commit; select * from cust8;
日志切换,生成归档 alter system switch logfile; set linesize 1000; column name format a60; select name,completion_time from v$archived_log;
得到归档日志名字,记录下来最后一个名字: SQL> select name,completion_time from v$archived_log; NAME COMPLETIO ------------------------------------------------------------ --------- +DATA/TAR/ARCHIVELOG/2017_12_24/thread_1_seq_22.300.96359306 24-DEC-17 5 +DATA/TAR/ARCHIVELOG/2017_12_24/thread_2_seq_5.301.963604847 24-DEC-17 +DATA/TAR/ARCHIVELOG/2017_12_24/thread_2_seq_6.302.963606783 24-DEC-17 SQL> 在数据库运行了几天以后,我们又对归档日志文件做了备份 backup archivelog all delete all input format '/taryartar/12c/db_base/BKDIR/arch_%s_%p_%t';
这里我们并没有备份控制文件和初始化参数文件,但是在输出可以看出,数据库自动备份了控制文件和初始化参数文件 破坏数据库 先关闭数据库 srvctl stop database -d tar -o abort
查看数据库状态 srvctl status database -d tar
所有实例都没运行了。 asmcmd
rm -rf +DATA/tar/AUTOBACKUP/* rm -rf +DATA/tar/DATAFILE/* rm -rf +DATA/tar/ONLINELOG/* rm -rf +DATA/tar/TEMPFILE/* rm -rf spfiletar.ora rm -rf +DATA/tar/CONTROLFILE/* rm -rf * 删除数据库 su - grid asmcmd rm -r -f +DATA/tar/DATAFILE/* 删除数据文件 rm -r -f +DATA/tar/CONTROLFILE/*
数据库被破坏以后,尝试启动数据库看看 su - oracle sqlplus / as sysdba startup 数据库起不来了。 注意关掉,下面要进行恢复了。
恢复数据库 rman nocatalog target sys/root123 一定要设置dbid set dbid 3086949231 这个值是前面已经查询后记录下来的。 启动数据库到nomount阶段 startup nomount ;
启动到这一步是为了恢复spfile,如果你的spfile没有被破坏,可以不需要执行这一步,直接启动到mount阶段。 启动实例后,才能还原spfile: restore spfile to '+data/tar/PARAMETERFILE/spfiletar.ora' from '/taryartar/12c/db_base/BKDIR/c_c-3086949231-20171224-00.control';
从备份中还原spfile,所以我们要确定上面我们把spfile和控制文件备份在哪儿了,文件名是是啥。 注意新还原的spfile路径在你删除原有spfile文件的时候,PARAMETERFILE路径也会一块被删掉了,所以主要要验证你的PARAMETERFILE路径是否存在。 查看目标目录,发现文件应来了:
下面还原控制文件 shutdown abort; startup nomount ; set dbid 3005509599;
然后从备份中还原控制文件: restore controlfile from '/taryartar/12c/db_base/BKDIR/c_c-3086949231-20171224-00.control' ;
然后就可以重启实例到mount阶段了。 shutdown abort; startup mount ;
下面就可以还原数据库了: restore database ;
注意,此处为什么直接可以执行restore database而不用像上面恢复spfile和控制文件一样,需要指定从哪边的备份文件恢复呢? 因为此时已经是mount状态了,控制文件已经生效了,所以此时就按照控制文件中的存在的信息来进行恢复的,而控制文件是在我们全备的时候备份的,所以里面已经知道全备的文件具体路径了。
还记得吗?这个地方全备的4个文件都是在控制文件中有的。 执行完成以后,控制文件是全备的时候的控制文件信息,这个里面并不包括我们在全备以后做的归档日志文件的备份信息,因此,我们需要把备份集添加(注册)到catalog中: list backupset of archivelog all; catalog backuppiece '/taryartar/12c/db_base/BKDIR/arch_8_1_963606886' ;
list archivelog all; list backupset of archivelog all; 然后就可以执行数据库的恢复了 recover database ;
到最后应用归档时,到最后会报错,因为他应用到最后一个归档后还会朝后面应用,导致找不到归档了,这个错误可以忽略。 然后就可以打开数据库了: alter database open resetlogs ;
注意本实验都在一个节点上做的,注意本实验的归档文件在共享磁盘+DATA中,这样两个节点产生的归档都在一起,对单实例可以同时访问,这样我们在一个节点上做归档日志文件的备份时,可以同时备份两个节点的归档日志文件。 验证数据库是否起来:
验证我们测试表中的数据是否回来了:
发现全备之后插入的数据也回来了,恢复成功! 启动节点一的实例:
检查集群资源:
集群资源没问题。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |