1、Oracle 数据安全,01,02,04,03,备份与容灾的重要性,备份与容灾概况,逻辑备份,物理备份,05,容灾,一. 为什么要进行备份和容灾?,1.1. 数据库系统故障 案例1:如某客户的IT设备机房突然停电,造成存储磁盘损坏,数据文件也因此损坏,来电后数据库无法启动,如果没有备份,则数据库恢复工作将非常艰难. 案例2:某客户的oracle数据库系统采用aix小机做硬件平台,但由于此小机购买年份较早,早过了维保期,某天突然宕机,操作系统无法启动,由于没有专业的小机维护人员,小机始终无法启动,业务也因此无法运行,幸好有异机备份,在短时间内恢复了数据。 案例3:某客户要新装一套rac数据库,但
2、由于安装过程报错,需要删除软件并重新安装,但不小心连到了生产数据库,删除了生产库的数据库软件,类似误删除操作还有很多惨痛的案例,一.为什么要进行备份和容灾?,1.2. 应用程序故障 案例:某客户的软件系统在试运行期间,由于需要上新的功能模块,开发人员添加一个栏目时发现添加有问题,需要删掉此栏目,结果删除的时候把上级目录也删掉了,导致整个目录的其他栏目都删掉了,此问题是软件的一个bug,而此时undo回滚表空间的内容也已经冲掉了,如果没有备份,数据将很难找回来。 1.3. 人为失误 案例:某客户维护一张表时,认为数据不再需要了,就truncate table t_xxx,结果后来又证明那张表还有
3、需要的数据,但后悔已经来不及了,二. 备份和容灾概况,我们有哪些方式避免各种自然灾害、人为失误及应用程序故障? Oracle为我们提供了多种备份和容灾方式: 1.冷备份(操作系统copy数据文件) 2.Rman物理备份 3.逻辑备份(exp/expdp) 4.rac 5.数据卫士(Dataguard) 6.Goldengate 其他厂商提供的备份和容灾方式: IBM的FlashCopy EMC的SRDF等存储复制技术,2.1 区分物理备份和逻辑备份,物理备份就是转储ORACLE物理文件(如数据文件、控制文件、归档日志文件等),一旦数据库发生故障,可以利用这些文件进行还原; 逻辑备份就是对数据库
4、对象(如用户、表、存储过程等)利用EXPORT等工具进行导出工作,可以利用IMPORT等工具把逻辑备份文件导入到数据库。,特点: 物理备份备份的是数据文件、归档日志等底层文件,是真正适用于生产环境的备份,强烈推荐生产库采用物理备份 逻辑备份是按一定的格式导出业务数据,适合特定场合,两种备份都不能直接查看数据,需要用相应的工具导入或还原才能读取数据,2.2.1 什么是冷备份? 数据库没有打开的情况下,使用操作系统命令或rman进行备份,由于数据库没有打开,数据库的数据是干净一致的,不存在活动事务。 方式: 使用操作系统命令直接复制数据文件到另外一个目录即可,windows下直接复制粘贴,其他平台
5、 如linux下:cp,oracledb10g datafile$ pwd /u01/oradata/ORCL/datafile oracledb10g datafile$ cp *.dbf *.ctl *.log /backup/,特点:需要将数据库关闭才能做冷备,这样就影响了业务使用,因此在实际生产环境不具实际使用价值,2.2 区分冷备份和热备份,2.2.2 什么是热备份? 数据库在open状态,事务还在活动,此时备份就是热备份,oracle数据库支持热备份,最常用最实用的是用rman进行热备份,三. rman物理备份,Rman是oracle数据库的一个组件,功能强大,既能备份也能恢复,r
6、man可以备份 这些文件:数据文件 归档日志文件 参数文件 控制文件,三. rman物理备份,恢复原理:基础整库备份+归档日志(+日志重演) 恢复到想要恢复的时间点 因此必须开启归档模式,让数据库的在线重做日志保存到归档日志目录里,这样才能利用基点备份+归档日志重演数据库到指定时间 而如果使用非归档模式,则数据库不会保存在线重做日志,数据丢失后将不能利用基点备份重演日志,通常用rman做物理备份。 查看归档是否开启:,使用sys或system用户用sqlplus登录数据库: SYSorclarchive log list Database log mode Archive Mode Autom
7、atic archival Enabled Archive destination /u01/app/oracle/admin/orcl/archivelog,或者: SQL select log_mode from v$database;LOG_MODE - ARCHIVELOG,oracledb $ rman target / -使用rman登录数据库 connected to target database: TESTDB (DBID=2592324560) RMAN backup database format /backup/fullbak_%U; Starting backup a
8、t 2013/09/05 09:23:00 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: sid=145 devtype=DISK channel ORA_DISK_1: starting full datafile backupset channel ORA_DISK_1: specifying datafile(s) in backupset input datafile fno=00001 name=/u01/
9、app/oracle/oradata/testdb/system.dbf input datafile fno=00003 name=/u01/app/oracle/oradata/testdb/sysaux.dbf input datafile fno=00004 name=/u01/app/oracle/oradata/testdb/users.dbf channel ORA_DISK_1: starting piece 1 at 2013/09/05 09:23:01 channel ORA_DISK_1: finished piece 1 at 2013/09/05 09:24:07
10、piece handle=/backup/fullbak_05oj2uvl_1_1 tag=TAG20130905T092301 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:01:06 channel ORA_DISK_1: starting full datafile backupset channel ORA_DISK_1: specifying datafile(s) in backupset including current control file in backupset inclu
11、ding current SPFILE in backupset channel ORA_DISK_1: starting piece 1 at 2013/09/05 09:24:10 channel ORA_DISK_1: finished piece 1 at 2013/09/05 09:24:11 piece handle=/backup/fullbak_06oj2v1n_1_1 tag=TAG20130905T092301 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:00:04 Finis
12、hed backup at 2013/09/05 09:24:11,3.1 备份过程示例:,可以看出备份全库时包括两部分:一个数据文件的备份集,其中包括了所有的数据文件,一个控制文件+spfile的备份集,包括了控制文件和spfile,rootdb backup# ls -lh total 811M -rw-r- 1 oracle oinstall 795M Sep 5 09:23 fullbak_05oj2uvl_1_1 -rw-r- 1 oracle oinstall 15M Sep 5 09:24 fullbak_06oj2v1n_1_1,3.2 rman备份恢复场景示例: 现在已经做了
13、全备,即基点备份,如果我们需要恢复数据库,我们就可以使用这个全备的rman备份做基点,加上归档日志来恢复,如创建一个表并插入数据,如果此时突然发生磁盘磁盘损坏,导致数据文件损坏及数据库异常终止,可以按如下方法恢复:,SQL create table t (id number,name varchar2(30); Table created. SQL insert into t values (1,mcl); 1 row created. SQL insert into t values (2,admin); 1 row created. SQL insert into t values (3,
14、dba); 1 row created. SQL commit;,1.在mcl用户下新建一张表,并插入数据,SQL select * from t;ID NAME - -1 mcl2 admin3 dba SQL alter system switch logfile; System altered.,2.假设此时磁盘发生损坏,并强制关闭了数据库,-强制关闭数据库 SQL shutdown abort ORACLE instance shut down. -删除数据文件 oracledb testdb$ ls current.269.808996433 goldengate.dbf redo0
15、3.dbf TESTDB undotbs2.dbf current.269.808996433.bak redo01.dbf sysaux.dbf ts_bbed.dbf undotbs3.dbf current.bak redo02.dbf system.dbf ts_mcl.dbf users.dbf oracledb testdb$ rm -rf *-启动数据库 SQL startup ORACLE instance started.Total System Global Area 331350016 bytes Fixed Size 2083720 bytes Variable Siz
16、e 117441656 bytes Database Buffers 205520896 bytes Redo Buffers 6303744 bytes ORA-00205: error in identifying control file, check alert log for more info SQL select instance_name,status from v$Instance;INSTANCE_NAME STATUS - - testdb STARTED,3.恢复控制文件,RMAN restore controlfile from /backup/fullbak_06o
17、j2v1n_1_1;Starting restore at 2013/09/05 10:46:47 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: sid=156 devtype=DISKchannel ORA_DISK_1: restoring control file channel ORA_DISK_1: restore complete, elapsed time: 00:00:03 output filena
18、me=/u01/app/oracle/oradata/testdb/current.269.808996433 Finished restore at 2013/09/05 10:46:51-mount控制文件 SQL alter database mount;Database altered. SQL select instance_name,status from v$Instance;INSTANCE_NAME STATUS - - testdb MOUNTED,4.恢复数据文件 包括两步:restore、recover,RMAN restore database;Starting re
19、store at 2013/09/05 12:42:18 using channel ORA_DISK_1channel ORA_DISK_1: starting datafile backupset restore channel ORA_DISK_1: specifying datafile(s) to restore from backup set restoring datafile 00001 to /u01/app/oracle/oradata/testdb/system.dbf restoring datafile 00002 to /u01/app/oracle/oradata
20、/testdb/ts_mcl.dbf restoring datafile 00003 to /u01/app/oracle/oradata/testdb/sysaux.dbf restoring datafile 00004 to /u01/app/oracle/oradata/testdb/users.dbf restoring datafile 00005 to /u01/app/oracle/oradata/testdb/ts_bbed.dbf restoring datafile 00006 to /u01/app/oracle/oradata/testdb/goldengate.d
21、bf restoring datafile 00007 to /u01/app/oracle/oradata/testdb/undotbs2.dbf restoring datafile 00008 to /u01/app/oracle/oradata/testdb/undotbs3.dbf channel ORA_DISK_1: reading from backup piece /backup/fullbak_05oj2uvl_1_1 channel ORA_DISK_1: restored backup piece 1 piece handle=/backup/fullbak_05oj2
22、uvl_1_1 tag=TAG20130905T092301 channel ORA_DISK_1: restore complete, elapsed time: 00:00:55 Finished restore at 2013/09/05 12:43:13,Restore其实就是把备份还原出来,但此时还是备份时的数据状态,也就是建mcl.t表之前的状态,数据文件目录的文件现在都回来了,但注意此时数据并没有mcl.t表,oracledb backup$ ls -lh /u01/app/oracle/oradata/testdb/ total 1.2G -rw-r- 1 oracle oin
23、stall 15M Sep 5 12:45 current.269.808996433 -rw-r- 1 oracle oinstall 21M Sep 5 12:42 goldengate.dbf -rw-r- 1 oracle oinstall 301M Sep 5 12:42 sysaux.dbf -rw-r- 1 oracle oinstall 521M Sep 5 12:43 system.dbf -rw-r- 1 oracle oinstall 11M Sep 5 12:42 ts_bbed.dbf -rw-r- 1 oracle oinstall 1.1M Sep 5 12:42
24、 ts_mcl.dbf -rw-r- 1 oracle oinstall 51M Sep 5 12:42 undotbs2.dbf -rw-r- 1 oracle oinstall 51M Sep 5 12:42 undotbs3.dbf -rw-r- 1 oracle oinstall 213M Sep 5 12:42 users.dbf,RMAN recover database;Starting recover at 2013/09/05 12:53:46 using channel ORA_DISK_1starting media recoveryarchive log filenam
25、e=/u01/app/oracle/arch/1_17_823348175.dbf thread=1 sequence=17 archive log filename=/u01/app/oracle/arch/1_17_823348175.dbf thread=1 sequence=18 RMAN-00571: = RMAN-00569: = ERROR MESSAGE STACK FOLLOWS = RMAN-00571: = RMAN-03002: failure of recover command at 09/05/2013 12:53:53 RMAN-11003: failure d
26、uring parse/execution of SQL statement: alter database recover logfile /u01/app/oracle/arch/1_17_823348175.dbf ORA-00310: archived log contains sequence 17; sequence 18 required ORA-00334: archived log: /u01/app/oracle/arch/1_17_823348175.dbf,5.恢复数据文件 continue 包括两步:restore、recover,SQL archive log li
27、st Database log mode Archive Mode Automatic archival Enabled Archive destination /u01/app/oracle/arch Oldest online log sequence 15 Next log sequence to archive 17 Current log sequence 17,6.打开数据库,由于数据库的当前联机日志已经被删除,因此需要resetlogs方式重建redolog,并打开数据库,SQL alter database open resetlogs;Database altered.,7.
28、验证数据,SQL select * from mcl.t;ID NAME - -1 mcl2 admin3 dba,总结:备份不是目的,恢复才是目的。恢复时需要一个基点备份(restore出来),然后在此基础上重演归档日志和在线日志(recover过程),恢复到故障发生的那一刻,3.3 生产环境下备份作业(适合小数据量),1.准备一个空间足够的备份盘,并mount到/backup目录,2.创建相关备份目录,mkdir -p /backup/oracle/testdb/archbackup mkdir -p /backup/oracle/testdb/fullbackup mkdir -p /b
29、ackup/oracle/testdb/ctlbackup mkdir -p /backup/oracle/testdb/script mkdir -p /backup/oracle/testdb/log mkdir -p /backup/oracle/testdb/other chown -R oracle:oinstall /backup/ chmod -R 775 /backup/,3.上传备份脚本到/backup/oracle/testdb/script/,4.制定任务计划定时执行备份:,crontab -e 0 2 * * * /backup/oracle/testdb/script
30、/startrman.sh,3.4 生产环境下增量备份作业(适合大数据量),增量备份的级别: 增量备份可以有 n 多个级别,从0级、1级、2级这样顺序排列直到 n 级( n 为小于等于4的正整数)。 增量备份分类: 差异增量备份(备份同级和小于同级的变化数据) 累计增量备份(备份小于同级的变化数据),差异增量备份,周日:全库备份 周一:只备份level0之后有变化的数据块 周二:只备份周一以来所有变化的数据块 周三:只备份周二以来所有变化的数据块 ,累计增量备份,周日:全库备份 周一:备份周日level0之后有变化的数据块 周二:备份周日以来所有变化的数据块 周三:备份周日以来所有变化的数据块
31、 ,差异增量备份特点:只备份小于同级的数据变化,但恢复时需要读取更多的备份集,因此备份时间短,恢复时间长。 累计增量备份特点:只备份小于等于同级的数据变化,但恢复时可以读取更少的备份集,因此备份时间长,恢复时间短。,实际生产环境备份示例:,1.创建备份磁盘及目录,建立相关目录(参考上节),部署备份作业步骤:,2. 上传备份脚本到/backup/oracle/testdb/script目录,3. 开启备份的block change trace功能(非必须),SQL alter database enable block change tracking; SQL select * from v$b
32、lock_change_tracking;STATUS FILENAME BYTES - - - ENABLED +DATADG/urpdb/changetracking/ctf.303.823879167 12681216,crontab -e 0 2 * * * /backup/oracle/testdb/script/startrman.sh,4. 制定备份自动,注意:以上脚本需要根据实际数据库名做修改,四. 逻辑备份,逻辑备份包括exp/expdp: 其中exp是oracle比较古老的数据导出工具了,oracle10g及以后建议使用expdp导数据,因为后者速度更快,使用更加灵活,两者
33、之间最大的区别在于:exp可以把数据导出到客户端,也可以导出到服务器端,但expdp只能导出到服务器端,逻辑导出的特点: 优点:逻辑导出可以只导出部分对象,方式灵活,导出的dmp文件可以跨平台、跨操作系统、跨数据库版本导入到别的数据库中,因此这种平台无关、版本无关的特性适合数据迁移(1T以下)、数据备份。 缺点:导出那一刻数据就已经固定了,无法利用数据库日志进行重演而恢复到最新的状态,但有时候也不需要这种功能。另外导出速度快,导入速度慢,不适合大数据量的导入,但对于中小型数据库(1T以下)使用场景很多。,exp/expdp分为三种导出模式: 表模式:导出一个表或多个表,在导出时指定tables
34、=xxx.xxx 用户模式:导出一个schema下的所有对象 全库模式:full=y,SQL select userenv(language) from dual;USERENV(LANGUAGE) - AMERICAN_AMERICA.AL32UTF8,4.1 exp示例:,1.查询数据库的字符集,2.设置NLS_LANG环境变量,避免导出时字符集转换,oracledb backup$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8,3.exp导出数据,oracledb backup$ exp mcl/mcl tables=mcl.t file=/back
35、up/mcl_t.dmp Export: Release 10.2.0.4.0 - Production on Thu Sep 5 16:23:44 2013 Copyright (c) 1982, 2007, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing opti
36、ons Export done in AL32UTF8 character set and AL16UTF16 NCHAR character set About to export specified tables via Conventional Path . . . exporting table T 3 rows exported Export terminated successfully without warnings.,oracledb backup$ mkdir -p /backup/dir_dump/ SQL create directory dir_dump as /ba
37、ckup/dir_dump;Directory created.,4.2 expdp示例:,1.建目录及目录对象:,2.导出数据:,oracledb backup$ expdp mcl/mcl directory=dir_dump tables=mcl.t dumpfile=mcl_t_expdp.dmp logfile=expdp_mcl_t.log Export: Release 10.2.0.4.0 - 64bit Production on Thursday, 05 September, 2013 16:44:30 Copyright (c) 2003, 2007, Oracle. A
38、ll rights reserved.Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options Starting “MCL“.“SYS_EXPORT_TABLE_01“: mcl/* directory=dir_dump tables=mcl.t dumpfile=mcl_t_expdp.dmp logfile=exp
39、dp_mcl_t.log Estimate in progress using BLOCKS method. Processing object type TABLE_EXPORT/TABLE/TABLE_DATA Total estimation using BLOCKS method: 64 KB Processing object type TABLE_EXPORT/TABLE/TABLE Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS . . exported “MCL“.“T“ 5.242 K
40、B 3 rows Master table “MCL“.“SYS_EXPORT_TABLE_01“ successfully loaded/unloaded * Dump file set for MCL.SYS_EXPORT_TABLE_01 is:/backup/dir_dump/mcl_t_expdp.dmp Job “MCL“.“SYS_EXPORT_TABLE_01“ successfully completed at 16:44:52,4.3 一个实际生产环境逻辑备份示例:,生产库环境:10.2.0.5 rac数据库 操作系统平台:HUPX11.31 备份库环境:10.2.0.1
41、单机数据库 操作系统平台:AIX 5.3,逻辑备份需求: 主库有rman物理备份,但为了加固数据安全,防止因存储控制器损坏等问题造成数据全部丢失,利旧AIX 小机做逻辑备份,数据文件总大小为196G,expdp导出并压缩后的实际数据为 5G,业务用户约50个,每天夜里备份完所有的业务用户数据后,使用scp复制到备库,并在主库保留7天数据,备库上保留14天。,5. 其他灾备,5.1 rac,RAC是为了满足人们对系统的高可靠性、高速性以及VLDB(大规模数据库)的需求而开发设计的一项集群处理技术。另外,它还能提高系统的吞吐量,并有效支持更多的用户 ,RAC可以让多个节点的多个实例同时访问同一个数
42、据库。这样,系统就可以把一个大的任务分为几个子任务,给不同的节点去执行,从而横向扩展服务器内存、cpu压力。,Rac的优点: 多个数据库服务器担任实例,同时能对外提供服务,可以提供负载均衡和故障切换,任何一台数据库服务器发生故障,业务均不会受到影响,对服务器单点故障能起到很好的保护作用. Rac的缺点: 在共享存储上只有1份数据,如果存储发生故障,数据可能会丢失,RTO时间也比较长,从性能角度上讲,如果软件本身的性能比较差(如sql比较低效),扩容成rac也不能解决性能问题,另外如果硬件比较差,如存储读写慢、内网速度慢,rac本身就是性能瓶颈;部署要求:两台相同硬件架构(甚至型号)的数据库服务
43、器,每台数据库服务器至少两块网卡,一台共享存储,至少一台光纤交换机;,5.1 rac,5.2 dataguard,dataguard包含一个生产数据库(单机或者rac)和一个或更多备份数据库(也可以是单机或 rac)。在 Data Guard 配置中的数据库可以通过oracle Net 连接并可以分布在不同地理位置, 通过冗余数据来提供数据保护。 dataguard 通过日志同步机制保证冗余数据和主数据之间的同步,这种同步可以是实时、延时、同步、异步多种形式。数据库所处位置是没有限制的,只要它们能互相通信,特点如下: Data Guard 采用捕获主库归档日志或在线重做日志的方式,把所有主库的
44、数据改变传递到备库进行重演,以此保证低延迟、一致性的多份数据。 10g版本的dataguard的备库只能处于mount模式下做日志同步, 如果想打开数据库进行查询只能先停止恢复数据并 open readonly 模式打开数据库,因此备库的作用只能用作灾备而不能利用起来,11g 版本的dataguard 的备库可以在 open readonly 模式进行日志恢复,因此可以在备库上进行实时只读查询业务,但要注意的是,虽然可以在 Standby 机器 上执行只读查询,从而分散Primary数据库的性能压力,但是 Data Gurad 不 是性能解决方案。 dataguard 的两端主备库的操作系统要
45、采用相同平台、相同版本的操作系统,硬件配置最好一致。 Data Guard 能与传统的rac、cluster 技术一起使用,而且主库端和备库端可以分别采用单机+单机、rac+单机、单机+rac、rac+rac的方式组件 dataguard,以提供高级别的数据保护和数据可用性。,5.2 dataguard,优点:真正的数据库灾备技术,数据可以同时存放在两个或更多个存储上,主库新数据可以进行实时同步,按数据库的保护级别可以进行最大保护、最高可用、最高性能三种模式灵活进行保护。 缺点:备库只能做灾备使用,业务系统不能利用备库提供业务访问(虽然11g active dataguard 可以提供只读访问
46、,但只能应用中某些特定场景,如报表查询功能) ,因此对硬件有些浪费。,5.3 goldengate,Goldengate 软件是一种基于日志的结构化数据复制软件,它通过解析源数据库在线日志或归档日志获得数据的增量变化,再将这些变化应用到目标数据库,从而实现源数据库与目标数据库同步。 GoldenGate 可以在异构的IT基础结构(包括几乎所有常用操作系统平台和数据库平台)之间实现大量数据亚秒一级的实时复制,从而可以在应急系统、在线报表、实时数据仓库供应、交易跟踪、数据同步、集中/分发、容灾等多个场景下应用。 其中跨平台特性是goldengate的一大亮点,即支持oracle和不同操作系统平台下
47、的oracle可以进行数据同步,也支持在不同操作系统平台下和其他数据库(如mysql、sqlserver、db2等)进行数据同步。 同时,GoldenGate可以实现一对一、广播(一对多)、聚合(多对一)、双向、点对点、级联等多种灵活的拓扑结构,下图是oracle goldengate支持的架构。,优点: 主库和从库可以进行在不同平台、不同操作系统、不同数据库版本甚至不同数据库下灵活配置,可以同步一张表、一个用户下的所有或部分表、整库同步等多种同步模式,粒度更细更灵活,可以用作灾备、数据同步、ETL、升级、数据汇总等多种场景 缺点: 配置复杂,维护成本较高,5.3 goldengate,5.4 各种容灾技术对比,