第五章:数据库的备份和恢复
点击数:1256发布日期:2020-04-19 14:42:02 来源:oracle数据库秘籍
第五章:数据库的备份和恢复
5.1介绍备份和恢复
备不备份取决于数据的重要程度,如果数据不重要,都是一些日志,又可以再造,又怕开归档影响性能,实时性要求又不高,停一天也没事儿,那可以不备份,裸奔,省事不省心。一旦有东西坏了,重装一次软件,再建一个新库再造一份数据就行了,如测度库。
如果数据不太重要,丢一天的数据也可以接受,不想花太多的钱和精力在数据库上,数据量也不大,导出来的时间可以接受,那可以使用exp或expdp逻辑备份,每天自动执行一个导出,不开归档,省空间,省事儿。
数据库上线投产之后,基本上都很重要。有的对运维的要求很苛刻,如银行,要求7*24小时服务,一年也没有多长时间的停机时间,数据非常重要,一条也不能丢,所以银行不但要备份,还要容灾,两地三中心容灾。存储级复制,DataGuard,GoldenGate等容灾方式。有了备份心里才踏实,定期做一次备份有效性测试,测一测能不能正常恢复,或者我们的应急系统能不能正常切换。
有的数据库晚上下班之后压力小,提前通知用户晚上可以停几个小时,数据库也很重要,比如医院。医院要重启一下数据库,提前申请晚上的停机时间,一般还是允许的。医院也要使用RMAN备份,然后再DataGuard做个容灾。
如果备份工作能在半小时左右能够完成,甚至几分钟十几分钟就完成,那么可以设置成每天一个全备。也要参考每天生成的日志量。如果日志产生量很大,可能要几个小时就备一次归档日志,备完就删除,给新的归档日志留空间。
数据库备份可以根据制定的备份策略编写RMAN脚本,然后加到crontab定时任务里实现自动备份。也可以使用备份软件实现,如Veritas Netbackup,nbu等。NBU不仅可以备份数据库,还可以备份应用程序和其它东西,况且集中管理,管理多台机器,所以NBU卖的也不错。如果就很少的几套数据库,数据库又不大,应用变化量少,可以手工备份,那么可以只使用RMAN备份,不使用备份软件。
物理备份,将组成数据库的操作系统文件从一处拷贝到另一处的过程叫物理备份。使用RMAN(Recovery Manager恢复管理器)实现,数据库必须运行在归档模式下,该方法可以实现数据库的完全恢复,做到不丢数据,需要大量的外部存储设备,例如磁带库。冷备份和热备份都叫物理备份,它不涉及逻辑内容,只对数据库中的数据块进行备份。
冷备份,将数据库shutdown immediate,然后将数据文件,控制文件,日志文件,参数文件拷贝至另一个地方的备份方式叫冷备份。冷备份只能恢复到备份的时间点,无法做完全恢复。只在允许的停机时间比较长,做数据库迁移,数据库升级的时候用的较多,其它情况下很少用这种备份方式。
热备份,数据库在运行状态下,且已经打开了归档模式,使用RMAN工具进行的全备或增量备份叫热备份。也就是我们最常用的备份方式,本章节将重点讨论RMAN热备份。热备份不需要停止数据库,但会消耗系统资源,一般在系统清闲的时间进行,如凌晨1点开始。
逻辑备份,使用SQL语句,在数据库中抽取数据,并存为二进制文件的过程叫逻辑备份。抽取工具就是exp导出工具和expdp数据泵。逻辑备份只能恢复到开始备份的时间点,对备份之后发生改变的数据无能为力,逻辑备份常常用于做数据迁移和数据移动,GoldenGate同步也可以使用exp或expdp。
5.2 RMAN备份的特点
5.2.1 RMAN备份的优点:
支持多种恢复方法,进行完全恢复和不完全恢复。基于时间点的恢复,可以恢复到发生误操作前的时间点,将误删除的数据找回来。基于SCN号的恢复,精确恢复到某一个SCN号,在做数据同步时会用到。基于日志序列的恢复,如果归档日志文件丢失,我们只能恢复到gap的前一个日志,就可以使用这种恢复方法。基于退出的恢复,恢复语句的不同,恢复的终点也不一样,可以理解为截止到某一个点,就退出恢复。完全恢复,如果我们有一份全备、全备之后所有的归档日志和在线日志三样东西,我们就可以做数据库的完全恢复,做到一条数据也不丢。
压缩备份,减少备份集占用的空间。我测试的11g压缩备份只占不压缩备份空间的三分之一左右。压缩备份会消耗更多的CPU,我们在用的时候,开始的几次备份多关注一下CPU资源。压缩备份还会拉长备份时间,会将备份时间拉长三倍左右甚至更多。
支持不停库备份,不需要停止数据库,不影响生产正常运行,就能实现全备份。
支持并行,同时几个通道备份,也对于需要加快备份速度还是很有必要的。并行备份可以设置为并行度为4或者8,具体根据有多少颗CPU,一般不超过CPU数的一半,还要考虑存储的速度,如果存储跟不上,再并行也不快。
可以设置成自动任务,不需要人工干预,我们只要经常关注一下备份日志,查看备份是否成功了就可以了。自动任务让我们想什么时候备份都可以。
支持多种备份类型,RMAN热备可以备份,数据文件,控制文件,归档文件,参数文件。但不能备份在线的redo文件。要保护好在线redo,可以给redo所在的磁盘做一个RAID1镜像,也可以设置每组两个member,分别放到不同的磁盘上,坏一个member没有关系。备份类型还包括全库备份和增量备份,如果数据库很大,几十TB,可以使用增量备份,缩短备份时间。每周日全备,周一到周六增量备份。
支持跨平台的表空间迁移,可以使用rman convert命令实现跨平台的数据迁移。
RMAN功能强大,具有很强的脚本控制语言,可以根据我们的需求,编出合适的备份恢复脚本。
5.2.2 RMAN备份的缺点:
脚本编写比较复杂。功能越强大对应的脚本越多,像买一个高级的音响或电视机,功能强大的一辈子也用不上几回,RMAN也有这么强大的功能。做为专业人士,我们要知道有这些功能,一旦有这样的工作,我们得会用。
占用较大的存储空间。一份数据,为了备份容灾要存好几份它的副本,如果生产存储上做的是RAID10,这就2份;再备份,备份存储上也是做的RAID10,这就4份,再保留两份的备份集,这就6份。再做一个容灾,不管是同城的还是异地的,又会多至少一份,容灾的存储如果再是RAID10,那就8份了;再两地三中心... ... 总算下来,一共七八倍的冗余。安全倒是安全了,火灾地震都不怕,但确实浪费了不少存储资源。我们要在冗余、安全和性能上做一个很好的平衡。即够用,且安全,又节约,以此来指导我们的规划工作。
要开启归档模式。归档模式开了之后,务必想着定期删除归档日志,否则迟早会满。有的客户DBA责任心不强,也不买服务,存储够大,堆了两年的归档日志,终于满了,数据库卡住了,还着急找原因。
5.3 RMAN的配置
5.3.1 非归档切换到归档日志模式
设置归档日志的路径,我们将归档日志放在什么地方。
SQL> alter system set LOG_ARCHIVE_DEST_1='LOCATION=/arch1' scope=both;
System altered.
使用LOG_ARCHIVE_DEST参数也可以,但只能归到本地;使用LOG_ARCHIVE_DEST_1即可以归到本地也可以归到远程。其它参数如归档日志的格式log_archive_format,归档日志进程的最大值log_archive_max_processes使用默认值就可以。在10g之前我们还要修改log_archive_start参数,10g和10g之后,这个参数就淘汰了。
非归档改为归档模式,必须重启数据库,在mount状态下修改归档模式。步骤如下:
SQL> shutdown immediate; //关闭数据库
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL> startup mount; //将数据库启动到mount状态
ORACLE instance started.
... ...
Database mounted.
SQL>
SQL> alter database archivelog; //开启归档模式
Database altered.
SQL> alter database open; //打开数据库
Database altered.
SQL>
SQL> archive log list; //查看是否归档,归到什么地方
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /arch1
Oldest online log sequence 25
Next log sequence to archive 27
Current log sequence 27
5.3.2 RMAN的配置
登录到RMAN之后,使用show all命令,可以查看当前数据库的RMAN配置。在这里,也可以修改RMAN配置。如配置保留备份集的策略,是否压缩,控制文件自动备份,使用磁盘/磁带设备类型,是否开启备份优化功能等。以下是常用的配置方法。
show all查询当前的数据库RMAN配置
[oracle@yingshu ~]$ rman target /
connected to target database: YSDB (DBID=3736627791)
RMAN> show all;
using target database control file instead of recovery catalog
RMAN configuration parameters for database with db_unique_name YSDB are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
... ...
CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE ; # default
默认的配置可能不适合我的备份策略,我们在给数据库做备份之前,需要修改一下RMAN的配置。我们在制定备份策略的时候,也可能包含修改RMAN的配置。
设置控制文件自动备份
RMAN> configure controlfile autobackup on;
new RMAN configuration parameters are successfully stored
RMAN> configure controlfile autobackup format for device type disk to '/orabak/ysdb_ctl_%f';
new RMAN configuration parameters are successfully stored
当发生数据库备份时,或建表空间,删除log文件等物理结构发生改变时,Oracle会自动备份控制文件。10g时会立刻自动备份,11g会有几分钟的延迟,具体延迟时间受参数"_controlfile_autobackup_delay"控制。默认是300秒。
查询这个隐含参数的方法
SQL> col ksppinm format a54
SQL> col ksppstvl format a54
SQL> select ksppinm, ksppstvl
2 from x$ksppi pi, x$ksppcv cv
3 where cv.indx=pi.indx and pi.ksppinm like '\_%' escape '\' and pi.ksppinm like '%_controlfile_autobackup_delay%';
KSPPINM KSPPSTVL
------------------------------------------------------
_controlfile_autobackup_delay 300
设置备份集的冗余
备份经常进行,一天一次甚至每隔几小时备一次,有了最新的备份,前几天的备份就可以删除,省的它占用宝贵的存储资源。删除之前我们可以设置一个策略,先将它标记为废弃obsolete,比如我们保留最近的三份全备,或设置成保留七天之内的备份,七天以前的备份标记为obsolete。默认的冗余是1,保留一份备份。
将冗余策略改为保留2份。
RMAN> configure retention policy to redundancy 2;
new RMAN configuration parameters are successfully stored
将冗余策略改为保留7天。保留策略只能配置一种,新的配置保留7天会将上面配置的保留2份覆盖掉。两种策略只能有一种生效。
RMAN> configure retention policy to recovery window of 7 days;
old RMAN configuration parameters:
CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
new RMAN configuration parameters:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
new RMAN configuration parameters are successfully stored
删除过期备份
obsolete(废弃)标记在执行REPORT OBSOLETE或者是DELETE OBSOLETE用到。标记为obsolete的备份并没有被物理删除,它在物理上是存在的。是可以再用做恢复的。它取决于我们的保留策略,如果我们的保留策略是保留7天,那么7天前的备份将标记为obsolete。obsolete的意思是不需要了,有更新的了。和obsolete相关的命令是:
report obsolete; //报告废弃的备份
delete noprompt obsolete; //删除废弃的备份,物理删除
expired(过期),标记为过期的备份在物理上已经不存在了,只是在控制文件中还记录着这个备份文件的信息。可以使用crosscheck backup;命令查看是否有已经被物理删除的备份集。用delete expired backup;删除过期的记录。expired的意思是找不到了,不存在了。和expired相关的命令是:
crosscheck archivelog all; //校验是否有过期的归档日志备份
delete noprompt expired archivelog all; //删除过期归档日志备份,不提示
crosscheck backup; //校验是否有过期备份集
delete noprompt expired backup; //删除过期备份,不提示
实现自动删除,将上述的删除语句添加到RMAN的自动备份脚本里,备份和删除过期备份先后执行。或将物理删除的脚本直接加到crontab里,也可以实现自动删除。
配置并行度
在数据库备份时,并行分配几个通道。默认是1个。如果CPU是4颗16核,我们为了提高备份速度,可以将并行度设置成4。自动分配4个通道进行备份。
RMAN> configure device type disk parallelism 4 backup type to backupset;
new RMAN configuration parameters:
CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO BACKUPSET;
new RMAN configuration parameters are successfully stored
配置备份优化功能
默认是关闭。开启后,在特定的条件下,备份将跳过已经在备份集中存在的文件,以减少备份时间,节约空间。思路就是能不备份的文件就不备份了。什么情况下数据文件才可以不备份呢?同样的修改时间,同样的SCN号时就可以不备份。
当数据文件被offline-normal、数据文件read-only或者是closed normally后,备份过了,新备份发起时,这些数据文件都没有发生任何变化,它和备份集里的数据文件拥用同样的SCN号,且最后的修改时间相同,就可以不用备份了。
归档日志文件,当备份集里面已经有这个归档日志了,那就可以不重复备份了。官方文档上说的是要有同样的DBID,thread,sequence number,RESETLOGS SCN 和time修改时间。
RMAN> configure backup optimization on; //打开备份优化功能
new RMAN configuration parameters are successfully stored
RMAN> configure backup optimization off; //关闭备份优化功能
new RMAN configuration parameters are successfully stored
配置备份片的最大值
如果数据库很大,有几十个T,我们可以把一个备份片也让它长到几个T,要给备份片设一个最大值,达到这个最大值的时候,另外生成一个新的文件。
RMAN> configure channel device type disk maxpiecesize 10g;
new RMAN configuration parameters are successfully stored
... ...
released channel: ORA_DISK_4
配置RMAN的备份压缩比例
如果有兴趣,可以做一下不同压缩比例设置下,做全备份,备份集的大小和备份的时间分别有多大区别。常用的压缩模式是medium,或者是默认值basic。algorithm(算法)。
configure compression algorithm 'HIGH'; //高度压缩,速度最慢
configure compression algorithm 'MEDIUM'; //中度压缩,速度比low慢
configure compression algorithm 'LOW'; //最小的压缩比率,速度最快
configure compression algorithm 'BASIC'; //压缩比和medium差不多,但速度慢
配置归档日志删除策略
configure archivelog deletion policy to applied on all standby;
在有DataGuard的情况下,如果备库还没有应用归档日志,主库就不可以使用DELETE INPUT删除归档日志。
configure archivelog deletion policy to backed up 1 times to disk;
确认归档日志已经在磁盘上备份了一份了,那么就可以在备份脚本里添加DELETE INPUT语句进行删除了。否则不允许删除。
配置控制文件快照
configure snapshot controlfile name to '/oracle/app/oracle/product/10.2.0/db_1/dbs/snapcf_ysdb.f'; # default
默认的快照是放在ORACLE_HOME/dbs底下,我们一般不用修改它的位置。控制文件快照在备份控制文件时会用到,可以用RMAN将其还原(restore)成控制文件。如果控制文件丢失了,请记得这里还有一个快照呢。
5.4 数据库全备
针对数据库比较小,备份时间短的数据库,可以使用数据库全备的方法,实现每天全备。方法最简单,效率高,脚本虽然简单,但很实用,当然了,前题是归档模式。对应脚本如下。
RMAN> run {
backup full tag 'ysdb' database
include current controlfile format '/orabak/ysdbfull_%d_%T_%s'
plus archivelog format '/orabak/arch_%d_%T_%s' delete all input;
}
过程是第一步先分配通道,通道的数量是我们在RMAN中配置的数量,也可以手工的分配通道,通道的数量影响备份速度;第二步备份归档日志文件,备完之后删除归档;第三步备份数据文件,相当于拷贝;第四步切换日志,将在线日志归档,备份过程中产生的新归档日志这时开始备份,然后删除。第五步备份控制文件,备份spfile。
5.5 备份部分内容
备份表空间,只备份一个表空间。
RMAN> backup tablespace users format '/orabak/users_%t%s.%p';
只备份一个数据文件。
RMAN> backup datafile '+DGDATA/ysdb/datafile/users.259.885903335' format '/orabak/users%t%s.%p';
只备份当前的控制文件
RMAN> backup current controlfile format '/orabak/control%t%s.%p';
只备份归档日志文件,或备份之后删除归档日志,减少空间占用。
RMAN> backup archivelog all format '/orabak/arc_%t%s.%p';
RMAN> backup archivelog all format '/orabak/arc_%t%s.%p' delete input;
5.6 增量备份
自Oracle 10g以来,增量备份具有真正的意义了,只备份变化的数据块,减少每次备份的数据量,可以缩短备份时间。9i因为要扫描所有的数据块,才能知道哪些数据块发生了变化,时间上,性能上都没有什么优势,使用较少。
增量备份分两种方式,Differential差异增量和Cumulative累积增量。默认为Differential差异增量。它们备的内容有所区别。如果只使用0级和1级的备份方法。区别如下:
Differential差异增量:以上一次的备份结束为起点至目前的数据变化。
Cumulative累积增量:每一次都是以全备(0级备份)开始,至目前的变化。
0级备份脚本。相当于数据库全备,能做为增量备份的基础。
run {
backup incremental level 0 tag 'ysdb' format '/orabak/ysdb0%u_%s_%p' database;
backup format '/orabak/arch%u_%s_%p' archivelog all delete input;
}
11g共有5个级别的增量备份,分别是01234。最常用的是0级和1级。下面是差异增量的脚本。
backup incremental level 1 database;
backup incremental level 2 database;
backup incremental level 3 database;
backup incremental level 4 database;
累积增量的样例。
backup incremental level 1 cumulative database;
... ...
5.6 查看备份情况
备份完成之后,我们可以查看备份的情况。list命令是在控制文件或恢复目录中查询历史的备份情况。list backup summary是列出备份的概述。
RMAN> list backup summary;
List of Backups
===============
Key TY LV S Device Type Completion Time #Pieces #Copies Compressed Tag
------- -- -- - ----------- --------------- ------- ------- ---------- ---
1 B F X DISK 23-JUN-15 1 1 NO TAG20150623T151524
2 B A A DISK 08-JUL-15 1 1 NO YSDB
... ...
列出数据库前化身,如果数据库多次被使用resetlogs打开,这里会有多条记录。数据库被resetlogs之后,代表一个RMAN备份时代的结束。
RMAN> list incarnation ;
List of Database Incarnations
DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1 1 YSDB 3736627791 PARENT 1 08-JUN-15
2 2 YSDB 3736627791 CURRENT 379611 21-JUL-15
如果还想使用resetlogs之前的备份,跨越resetlogs。就需要使用incarnation来穿越。这样我们就可以使用(incarnation)化身号为1的备份,把数据库恢复至resetlogs之前更早的时间点。
reset database to incarnation 1;
显示备份的某个数据文件及其它相关的list命令。
list backup of datafile '+DGDATA/ysdb/datafile/system.260.881852381' ;
RMAN> list backup; 列出详细备份
RMAN> list expired backup; 列出过期备份
RMAN> list backup of database; 列出所有数据文件的备份集
RMAN> list backup of tablespace user01; 列出特定表空间的所有数据文件备份集
RMAN> list backup of controlfile; 列出控制文件备份集
RMAN> list backup of archivelog all; 列出归档日志备份集详细信息
RMAN> list archivelog all; 列出归档日志备份集简要信息
RMAN> list backup of spfile; 列出SPFILE备份集
RMAN> list copy of datafile 5; 列出数据文件映像副本
RMAN> list copy of controlfile; 列出控制文件映像副本
RMAN> list copy of archivelog all; 列出归档日志映像副本
RMAN> list incarnation of database; 列出对应物/列出数据库副本
5.7 数据库恢复
数据库恢复主要应用于以下几种情形。数据库无法启动,强制启动也无济于事,忽然存储掉电可能会出现这种情况;生产库所在的磁盘坏了;配置DataGuard的过程中;挽回误操作;数据库迁移过程;数据库丢失文件。数据库最坏的情况就是坏块和无法启动此类的事。还有的数据库实在启动不了了,又发现没有备份,最后逼到用dul做恢复,很惨。有了备份,又做过恢复的测试,心里就踏实了。万一出现故障,我们可以轻松的再造一个新库出来。
恢复的类型。1完全恢复;2基于时间点的恢复;3基于Cancel的恢复;4基于SCN号的恢复。后三种都是不完全恢复。第一种可以做到一条数据也不丢,恢复到最后一个提交。
5.7.1 restore database
restore database,相当于物理拷贝,将备份集中的数据文件cp回来。restore database是在数据库mount的状态下执行,根据控制文件记录的备份信息,将最后一次成功备份集里的数据文件恢复至对应的位置。只需要这一个简单的语句,整个数据库中的数据文件神奇的重现在原来的位置,丢失了的数据文件,又回来了。过程不需要人工干预,我们只要查看一下日志是否恢复成功就行了。
RMAN> restore database;
Starting restore at 09-JUL-15
... ...
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to +DGDATA/ysdb/datafile/system.260.881852381
... ...
channel ORA_DISK_2: restore complete, elapsed time: 00:00:38
Finished restore at 09-JUL-15
还可以在恢复日志中显示摘要:
restore database preview summary;
restore database完成之后,数据库现在是一个不一致的状态,还原的数据文件是备份时的状态,早于当前的时间,数据库还启动不起来,还需要对数据库做recover应用日志,做完全恢复或恢复到某一个特定的状态下。
5.7.2 各种recover database
recover database就是将归档日志或在线日志应用至当前的数据文件,做数据库的恢复,将数据库从时间A恢复至时间B。可以是完全恢复,也可以是不完全恢复,具体要根据实际情况来选择恢复的方法。
完全恢复。如果归档日志和在线日志都完好无损,restore完成之后,就可以做recover完全恢复数据库,一条数据也不丢,提交的数据没有任何损失。
RMAN> recover database;
基于时间的恢复。
RMAN> run
{
set until time "to_date('2015-07-21 15:40:00','yyyy-mm-dd hh24:mi:ss')";
recover database;
}
基于退出的恢复。
SQL> conn /as sysdba
Connected.
SQL> recover database until cancel;
ORA-00279: change 359163 generated at 07/21/2015 13:09:58 needed for thread 1
ORA-00289: suggestion : /arch1/1_39_881852367.dbf
ORA-00280: change 359163 for thread 1 is in sequence #39
Specify log: {
auto
基于SCN号的恢复。
RMAN> recover database until scn 12345111;
基于日志序列号的恢复,这里请注意,日志序号为24的归档日志是不被恢复的。
RMAN> recover database until sequence 24;
Starting recover at 24-JUL-15
using channel ORA_DISK_1
starting media recovery
或者RAC环境使用thread号
RMAN> recover database until sequence 24 thread 1;
以上的不完全恢复,不能以alter database open直接打开数据库,必须使用RESETLOGS 或者 NORESETLOGS选项打开数据库。在线日志完好的情况下,noresetlogs将recover恢复在线日志,不丢数据。而resetlogs将不恢复在线日志内容,致在线日志中的数据丢失,重新启用新的日志序列号。以前的数据库备份宣告截止。建议重新做一次全备。
SQL> alter database open noresetlogs;
Database altered.
SQL> alter database open resetlogs;
Database altered.
下一篇:第六章:数据库故障处理
上一篇:第四章:完美安装oracle RAC数据库
图文推荐
序言
2020-04-19 查看:2272
第十五章:Oracle 12c介绍
2020-04-19 查看:2210
第十四章:常用Oracle工具
2020-04-19 查看:1934
第十三章:Oracle Golde...
2020-04-19 查看:2200
第十二章:DataGuard
2020-04-19 查看:1796