这篇论坛文章主要介绍了Oracle数据库备份策略的相关概念及使用中的注意事项,详细内容请大家参考下文
-
一、了解备份的重要性
可以说,从计算机系统出世的那天起,就有了备份这个概念,计算机以其强大的速度处理能力,取代了很多人为的工作,但是,往往很多时候,它又是那么弱不禁风,主板上的芯片、主板电路、内存、电源等任何一项不能正常工作,都会导致计算机系统不能正常工作。当然,这些损坏可以修复,不会导致应用和数据的损坏。但是,如果计算机的硬盘损坏,将会导致数据丢失,此时必须用备份恢复数据。
其实,在我们的现实世界中,已经就存在很多备份策略,如RAID技术,双机热备,集群技术发展的不就是计算机系统的备份和高可用性吗?有很多时候,系统的备份的确就能解决数据库备份的问题,如磁盘介质的损坏,往往从镜相上面做简单的恢复,或简单的切换机器就可以了。
但是,上面所说的系统备份策略是从硬件的角度来考虑备份与恢复的问题,这是需要代价的。我们所能选择备份策略的依据是:丢是数据的代价与确保数据不丢失的代价之比。还有的时候,硬件的备份有时根本满足不了现实需要,假如你误删了一个表,但是你又想恢复的时候,数据库的备份就变的重要了。Oracle本身就提供了强大的备份与恢复策略,这里我们只讨论ORACLE备份策略,以下的备份都是指Oracle数据库备份,恢复将放到下一讲中。
所谓备份,就是把数据库复制到转储设备的过程。其中,转储设备是指用于放置数据库拷贝的磁带或磁盘。
能够进行什么样的恢复依赖于有什么样的备份。作为 DBA,有责任从以下三个方面维护数据库的可恢复性:
·使数据库的失效次数减到最少,从而使数据库保持最大的可用性;
·当数据库不可避免地失效后,要使恢复时间减到最少,从而使恢复的效率达到最高;
·当数据库失效后,要确保尽量少的数据丢失或根本不丢失,从而使数据具有最大的可恢复性。
灾难恢复的最重要的工作是设计充足频率的硬盘备份过程。备份过程应该满足系统要求的可恢复性。例如,如果数据库可有较长的关机时间,则可以每周进行一次冷备份,并归档重做日志,对于24*7的系统,或许我们考虑的只能是热备份。 如果每天都能备份当然会很理想,但要考虑其现实性。企业都在想办法降低维护成本,现实的方案才可能被采用。只要仔细计划,并想办法达到数据库可用性的底线,花少量的钱进行成功的备份与恢复也是可能的。
二、了解Oracle的运行方式
ORACLE数据库有两种运行方式:一是归档方式(ARCHIVELOG),归档方式的目的是当数据库发生故障时最大限度恢复数据库,可以保证不丢失任何已提交的数据;二是不归档方式(NOARCHIVELOG),只能恢复数据库到最近的回收点(冷备份或是逻辑备份)。我们根据数据库的高可用性和用户可承受丢失的工作量的多少,对于生产数据库,强烈要求采用为归档方式;那些正在开发和调试的数据库可以采用不归档方式。
如何改变数据库的运行方式,在创建数据库时,作为创建数据库的一部分,就决定了数据库初始的存档方式。一般情况下为NOARCHIVELOG方式。当数据库创建好以后,根据我们的需要把需要运行在归档方式的数据库改成ARCHIVELOG方式。
1、改变不归档方式为为归档方式
a.关闭数据库,备份已有的数据,改变数据库的运行方式是对数据库的重要改动,所以要对数据库做备份,对可能出现的问题作出保护。
b. 修改初试化参数,使能自动存档
修改(添加)初始化文件init[SID].ora参数:
log_archive_start=true #启动自动归档
log_archive_format=ARC%T%S.arc #归档文件格式
log_archive_dest=/arch12/arch #归档路径
在8i中,可以最多有五个归档路径,并可以归档到其它服务器,如备用数据库(standby database)服务器
c.启动Instance到Mount状态,即加载数据库但不打开数据库:
$》SVRMGRL
SVRMGRL 》connect internal
SVRMGRL 》startup mount
d.发出修改命令
SVRMGRL 》alter database archivelog;
SVRMGRL》alter database open;
2、改变归档状态为不归档状态
与以上步骤相同,但有些操作不一样,主要是在以上的b操作中,现在为删除或注释该参数,在d操作中,命令为
SVRMGRL 》alter database noarchivelog;
注意,从归档方式转换到非归档方式后一定要做一次数据库的全冷备份,防止意外事件的发生。
三、Oracle备份的分类
简单的按照备份进行的方式,可以分为逻辑备份、冷备份(脱机备份)、热备份(联机备份),其实冷备份与热备份又可以合称为物理备份
按照备份的工具,可以分为EXP/IMP备份、OS拷贝、RMAN、第三方工具,如VERITAS
以下我们将从多个角度来说明以上的各种备份方式
1、EXP/IMP逻辑备份
导入/导出是ORACLE幸存的最古老的两个命令行工具了,其实我从来不认为Exp/Imp是一种好的备份方式,正确的说法是Exp/Imp只能是一个好的转储工具,特别是在小型数据库的转储,表空间的迁移,表的抽取,检测逻辑和物理冲突等中有不小的功劳。当然,我们也可以把它作为小型数据库的物理备份后的一个逻辑辅助备份,也是不错的建议。
对于越来越大的数据库,特别是TB级数据库和越来越多数据仓库的出现,EXP/IMP越来越力不从心了,这个时候,数据库的备份都转向了RMAN和第三方工具。下面我们还是简要介绍一下EXP/IMP的使用。
i、使用方法
Exp parameter_name=value
Or Exp parameter_name=(value1,value2……)
只要输入参数help=y就可以看到所有帮助
如:
C:\》set nls_lang=simplified chinese_china.zhs16gbk
C:\》exp -help
Export: Release 8.1.6.0.0 - Production on 星期四 4月 10 19:09:21 2003
(c) Copyright 1999 Oracle Corporation. All rights reserved.
通过输入 EXP 命令和用户名/口令,您可以
在用户 / 口令之后的命令:
实例: EXP SCOTT/TIGER
或者,您也可以通过输入跟有各种参数的 EXP 命令来控制“导出”
的运行方式。要指定参数,您可以使用关键字:
格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,。..,valueN)
实例: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)
或 TABLES=(T1: P1,T1: P2),如果 T1 是分区表
USERID 必须是命令行中的第一个参数。
关键字 说明(默认) 关键字 说明(默认)
--------------------------------------------------------------------------
USERID 用户名/口令 FULL 导出整个文件 (N)
BUFFER 数据缓冲区的大小 OWNER 所有者用户名列表
FILE 输出文件 (EXPDAT.DMP) TABLES 表名列表
COMPRESS 导入一个范围 (Y) RECORDLENGTH IO 记录的长度
GRANTS 导出权限 (Y) INCTYPE 增量导出类型
INDEXES 导出索引 (Y) RECORD 跟踪增量导出 (Y)
ROWS 导出数据行 (Y) PARFILE 参数文件名
CONSTRAINTS 导出限制 (Y) CONSISTENT 交叉表一致性
LOG 屏幕输出的日志文件 STATISTICS 分析对象 (ESTIMATE)
DIRECT 直接路径 (N) TRIGGERS 导出触发器 (Y)
FEEDBACK 显示每 x 行 (0) 的进度
FILESIZE 各转储文件的最大尺寸
QUERY 选定导出表子集的子句
下列关键字仅用于可传输的表空间
TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N)
TABLESPACES 将传输的表空间列表
在没有警告的情况下成功终止导出。
C:\》
帮助已经很详细的说明了参数的意义和使用方法,并列举了几个简单的例子,注意的是,从8i开始,已经开始支持数据子集的方法,就是可以指定自己的Where条件,可以从表中导出一行或多行数据。
注意上面的set nls_lang=simplified chinese_china.zhs16gbk,通过设置环境变量,可以让exp的帮助以中文显示,如果set nls_lang=American_america.字符集,那么你的帮助就是英文的了。
增量和累计导出必须在全库方式下才有效,而且,大多数情况下,增量和累计导出并没有想象中的那么有效。ORACLE从9i开始,不再支持增量导出和累计导出。
ii、表空间传输
表空间传输是8i新增加的一种快速在数据库间移动数据的一种办法,是把一个数据库上的格式数据文件附加到另外一个数据库中,而不是把数据导出成Dmp文件,这在有些时候是非常管用的,因为传输表空间移动数据就象复制文件一样快。
关于传输表空间有一些规则,即:
·源数据库和目标数据库必须运行在相同的平台上。
·源数据库与目标数据库必须使用相同的字符集。
·源数据库与目标数据库一定要有相同大小的数据块(9i已经不用)
·目标数据库不能有与迁移表空间同名的表空间
·SYS的对象不能迁移
·必须传输自包含的对象集
·有一些对象,如物化视图,基于函数的索引等不能被传输
可以用以下的方法来检测一个表空间或一套表空间是否符合传输标准:
exec sys.dbms_tts.transport_set_check(‘tablespace_name’,true);
select * from sys.transport_set_violation;
如果没有行选择,表示该表空间只包含表数据,并且是自包含的。对于有些非自包含的表空间,如数据表空间和索引表空间,可以一起传输。
以下为简要使用步骤,如果想参考详细使用方法,也可以参考ORACLE联机帮助。
a.设置表空间为只读(假定表空间名字为APP_Data 和APP_Index)
alter tablespace app_data read only;
alter tablespace app_index read only;
b.发出EXP命令
SQL》host exp userid=”””sys/password as sysdba”””
transport_tablespace=y tablespace=(app_data, app_index)
以上需要注意的是
·为了在SQL中执行EXP,USERID必须用三个引号,在UNIX中也必须注意避免“/”的使用
·在816和以后,必须使用sysdba才能操作
·这个命令在SQL中必须放置在一行(这里是因为显示问题放在了两行)
c.拷贝数据文件到另一个地点,即目标数据库
可以是cp(unix)或copy(windows)或通过ftp传输文件(一定要在bin方式)
d.把本地的表空间设置为读写
e.在目标数据库附加该数据文件
imp file=expdat.dmp userid=”””sys/password as sysdba”””
transport_tablespace=y
“datafile=(c:\temp\app_data,c:\temp\app_index)”
f.设置目标数据库表空间为读写
alter tablespace app_data read write;
alter tablespace app_index read write;
iii、导出/导入与字符集
明白ORACLE的多国语言设置,ORACLE多国语言设置是为了支持世界范围的语言与字符集,一般对语言提示,货币形式,排序方式和CHAR,VARCHAR2,CLOB,LONG字段的数据的显示等有效。ORACLE的多国语言设置最主要的两个特性就是国家语言设置与字符集设置,国家语言设置决定了界面或提示使用的语言种类,字符集决定了数据库保存与字符集有关数据(如文本)时候的编码规则。正如刚才上面的一个小例子,环境变量NLS_LANG的不同,导致EXP帮助发生变化,这就是多国语言设置的作用(NLS_LANG包含国家语言设置与字符集设置,这里起作用的是国家语言设置,而不是字符集)。
ORACLE字符集设定,分为数据库字符集和客户端字符集环境设置。在数据库端,字符集在创建数据库的时候设定,并保存在数据库props$表中,对于8i以上产品,已经可以采用“Alter database character set 字符集”来修改数据库的字符集,但也仅仅是从子集到超集,不要通过update props$来修改字符集,如果是不支持的转换,可能会失去所有与字符集有关的数据,就是支持的转换,也可能导致数据库的不正常工作。字符集分为单字节字符集与多字节字符集,US7ASCII就是典型的单字节字符集,在这种字符集中length=lengthb,而ZHS16GBK就是常用的双字节字符集,在这里lengthb=2*length。
在客户端的字符集环境比较简单,主要就是环境变量或注册表项NLS_LANG,注意NLS_LANG的优先级别为:参数文件à注册表à环境变量àalter session。NLS_LANG的组成为“国家语言设置。字符集”,如nls_lang=simplified chinese_china.zhs16gbk。客户端的字符集最好与数据库端一样(国家语言设置可以不一样,如zhs16gbk的字符集,客户端可以是nls_lang =simplified chinese_china.zhs16gbk或Ameircan_America.zhs16gbk,都不影响数据库字符的正常显示),如果字符集不一样,而且字符集的转换也不兼容,那么客户端的数据显示与导出/导入的与字符集有关的数据将都是乱码。
使用一点点技巧,就可以使导出/导入在不同的字符集的数据库上转换数据。这里需要一个2进制文件编辑工具即可,如uedit32。用编辑方式打开导出的dmp文件,获取2、3字节的内容,如00 01,先把它转换为10进制数,为1,使用函数NLS_CHARSET_NAME即可获得该字符集:
SQL》 select nls_charset_name(1) from dual;
NLS_CHARSET_NAME(1)
-------------------
US7ASCII
可以知道该dmp文件的字符集为US7ASCII,如果需要把该dmp文件的字符集换成ZHS16GBK,则需要用NLS_CHARSET_ID获取该字符集的编号:
SQL》 select nls_charset_id(‘zhs16gbk’) from dual;
NLS_CHARSET_ID(‘ZHS16GBK’)
--------------------------
852
把852换成16进制数,为354,把2、3字节的00 01换成03 54,即完成了把该dmp文件字符集从us7ascii到zhs16gbk的转化,这样,再把该dmp文件导入到zhs16gbk字符集的数据库就可以了。(注意,十进制数与十六进制之间的转换,想明白其中的道理)
Iv、跨版本使用Exp/Imp
Exp/Imp很多时候,可以跨版本使用,如在版本7与版本8之间导出导入数据,但这样做必须选择正确的版本,规则为:
·总是使用IMP的版本匹配数据库的版本,如果要导入到816,则使用816的导入工具。
·总是使用EXP的版本匹配两个数据库中低的那个版本,如在815与816之间互导,则使用815的EXP工具。
2、OS备份
操作系统备份有两类,冷备份(Cold backup)与热备份(Hot backup),操作系统备份与以上的逻辑备份有本质的区别。逻辑备份提取数据库的数据内容,而不备份物理数据块。而操作系统备份则是拷贝整个的数据文件。
i、冷备份
在文件级备份开始前数据库必须彻底关闭。关闭操作必须用带有normal、immediate、transaction选项的shutdown来执行。
数据库使用的每个文件都被备份下来,这些文件包括:
☆所有数据文件
☆所有控制文件
☆所有联机REDO LOG 文件
☆INIT.ORA文件(可选)
作冷备份一般步骤是:
a.正常关闭要备份的实例(instance);
b.备份整个数据库到一个目录
c.启动数据库
如
SVRMGRL》connect internal
SVRMGRL 》shutdown immediate
SVRMGRL 》! cp
或
SVRMGRL 》!tar cvf /dev/rmt/0 /u01/oradata/prod
SVRMGRL 》startup
注意:如果利用脚本对数据库进行冷备份,必须对关闭数据库的命令进行逻辑检查,如果发生关闭数据库的命令不能正常执行而导致数据库没有正常关闭,那么,所有的冷备份将回是无效的。
ii、热备份
热备份是当数据库打开并对用户有效是的OS级的数据备份。热备份只能用于ARCHIVELOG方式的数据库。在数据文件备份之前,对应的表空间必须通过使用ALTER TABLESPACE …… BEGIN BACKUP以备份方式放置。然后组成表空间的数据文件可以使用类似冷备份的操作系统命令进行拷贝。在数据文件用操作系统命令拷贝后,应使用ALTER TABLESPACE …… END BACKUP命令使表空间脱离热备份方式。
热备份没有必要备份联机日志,但必须是归档状态,在实例恢复的时候,可能需要用到归档日志。当前联机日志一定要保护好或是处于镜相状态,当前联机日志的损坏,对于数据库的损坏是巨大的,只能以数据的丢失来进行数据库的恢复工作。
对于临时表空间,存放的是临时信息,在热备份是也可以考虑不用备份,如果临时文件发生故障,可以删除该数据文件与表空间,重建一个临时表空间。
热备份的优点是显而易见的
---- a.可在表空间或数据文件级备份,备份时间短。
---- b.备份时数据库仍可使用。
---- c.可达到秒级恢复(恢复到某一时间点上)。
---- d.可对几乎所有数据库实体作恢复。
---- e.恢复是快速的,在大多数情况下在数据库仍工作时恢复。
操作系统作热备份的一般步骤为:
①连接数据库
SVRMGRL》connect internal;
②将需要备份的表空间(如User)设置为备份方式
SVRMGRL》Alter tablespace User begin backup;
③拷贝数据文件
SVRMGRL》!cp /u01/oradata/prod/user01.ora /backup/prod/user01.ora
Or
$cp cp /u01/oradata/prod/user01.ora /backup/prod/user01.ora
④在数据文件拷贝完成后,将表空间拖体备份方式
SVRMGRL》Alter tablespace User end backup;
⑤对所有需要备份的表空间重复2,3,4
⑥使用如下的命令备份控制文件ALTER DATABSE …… BACKUP CONTROLFILE
如备份成二进制文件
alter database backup controlfile to ‘new fielname’;
备份成文本文件
alter database backup controlfile to trace;
因为热备份的时候,用户还在操作数据库,所以,最好是每个表空间处于备份状态的时间最短,这样就要求一个表空间一个表空间的备份,不要一起使表空间处于备份状态而同时拷贝数据文件。