RMAN-压缩选项(as compressed backupset)

本文实测了 Oracle 10g 数据库中使用 AS COMPRESSED BACKUPSET 进行压缩备份的方法及效果。比较了压缩与非压缩备份的时间、磁盘占用及 CPU 使用情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


   
Oracle10g允许你和BACKUP命令伴随使用AS COMPRESSED BACKUPSET字句,对备份集进行压缩。
这个压缩备份在恢复时无需解压缩,这一特性在以下条件下可能大为有益:
1.你的备份存储空间有限
2.通过网络备份而带宽有限
3.直接备份至磁带、CD,DVD介质而压缩不可用

你可以选择在备份命令里显示指定压缩选项:
BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG;
--仅对1,5文件压缩备份
BACKUP AS COMPRESSED BACKUPSET DATAFILE 1,5;

也可以配置RMAN指定压缩选项:
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO COMPRESSED BACKUPSET;
================================================================
下边来做个测试来计较下他们吧:

非压缩备份

RMAN> backup database; 

Starting backup at 28-JUL-12
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00001 name=/oracle/oradata/orcl/system01.dbf
input datafile fno=00003 name=/oracle/oradata/orcl/sysaux01.dbf
input datafile fno=00005 name=/oracle/oradata/orcl/jietbs01.dbf
input datafile fno=00002 name=/oracle/oradata/orcl/undotbs01.dbf
input datafile fno=00004 name=/oracle/oradata/orcl/users01.dbf
channel ORA_DISK_1: starting piece 1 at 28-JUL-12
channel ORA_DISK_1: finished piece 1 at 28-JUL-12
piece handle=/home/oracle/app/product/10.2.0/db_1/flash_recovery_area/ORCL/backupset/2012_07_28/o1_mf_nnndf_TAG20120728T011430_815m3q6m_.bkp tag=TAG20120728T011430 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
including current SPFILE in backupset
channel ORA_DISK_1: starting piece 1 at 28-JUL-12
channel ORA_DISK_1: finished piece 1 at 28-JUL-12
piece handle=/home/oracle/app/product/10.2.0/db_1/flash_recovery_area/ORCL/backupset/2012_07_28/o1_mf_ncsnf_TAG20120728T011430_815m5tgv_.bkp tag=TAG20120728T011430 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
Finished backup at 28-JUL-12

消耗时间: 
00:01:06+00:00:03=1分08秒=68s
--------------------------------------------------------------------------------------------
压缩备份

RMAN> backup as compressed backupset database;

Starting backup at 28-JUL-12
using channel ORA_DISK_1
channel ORA_DISK_1: starting compressed full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00001 name=/oracle/oradata/orcl/system01.dbf
input datafile fno=00003 name=/oracle/oradata/orcl/sysaux01.dbf
input datafile fno=00005 name=/oracle/oradata/orcl/jietbs01.dbf
input datafile fno=00002 name=/oracle/oradata/orcl/undotbs01.dbf
input datafile fno=00004 name=/oracle/oradata/orcl/users01.dbf
channel ORA_DISK_1: starting piece 1 at 28-JUL-12
channel ORA_DISK_1: finished piece 1 at 28-JUL-12
piece handle=/home/oracle/app/product/10.2.0/db_1/flash_recovery_area/ORCL/backupset/2012_07_28/o1_mf_nnndf_TAG20120728T012227_815mln9b_.bkp tag=TAG20120728T012227 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:01:15
channel ORA_DISK_1: starting compressed full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
including current control file in backupset
including current SPFILE in backupset
channel ORA_DISK_1: starting piece 1 at 28-JUL-12
channel ORA_DISK_1: finished piece 1 at 28-JUL-12
piece handle=/home/oracle/app/product/10.2.0/db_1/flash_recovery_area/ORCL/backupset/2012_07_28/o1_mf_ncsnf_TAG20120728T012227_815mo1kh_.bkp tag=TAG20120728T012227 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
Finished backup at 28-JUL-12

消耗时间:00:01:15+ 
00:00:03
 
=1分18秒=78s
--------------------------------------------------------------------------------------------
非压缩备份  CPU(18.1%)

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                 
 5483 oracle    18   0  414m  72m  40m D 18.1 10.5   0:54.36 oracle     


压缩备份  CPU(84.0%)

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                             
 5483 oracle    18   0  430m  88m  48m R 84.0 27.8   0:47.09 oracle

--------------------------------------------------------------------------------------------
非压缩备份的大小(107724800+1097728=108822528)
-rw-r----- 1 oracle oinstall 107724800 Jul 28 01:34 o1_mf_nnndf_TAG20120728T013252_815n64k8_.bkp
-rw-r----- 1 oracle oinstall   1097728 Jul 28 01:34 o1_mf_ncsnf_TAG20120728T013252_815n8llv_.bkp

压缩备份的大小(599318528+7143424=606461952)
-rw-r----- 1 oracle oinstall 599318528 Jul 28 01:28 o1_mf_nnndf_TAG20120728T012730_815mw2yz_.bkp
-rw-r----- 1 oracle oinstall   7143424 Jul 28 01:28 o1_mf_ncsnf_TAG20120728T012730_815my5v5_.bkp
=============================================================================================
下边我们来比较下他们之前的差别:
压缩时间(非压缩:压缩)   
68s:78s    大约 4:5 (1:1.14)
压缩占磁盘的空间(非压缩:压缩)  103.78125:578.367188   大约 1:5
压缩CPU使用(非压缩:压缩)  18.1%:84.0%    大约 (1:4.67)

压缩占空间少,相对来说比较消耗CPU和时间,呵呵。

grid@rac11g01 ~]$ #!/bin/bash [grid@rac11g01 ~]$ source ~/.bash_profile [grid@rac11g01 ~]$ backup_log=/home/oracle/ORCL_full_`date +"%Y%m%d"`.log allocate channel ch4 type disk; backup AS COMPRESSED BACKUPSET incremental level=0 database format '/db_backup/%d_FULL_%T_%s_%p.bak'; backup AS COMPRESSED BACKUPSET archivelog all format '/db_backup/%d_ARC_%T_%s_%p.bak' delete input; backup current controlfile format '/db_backup/%d_CTL_%T_%s_%p.bak'; release channel ch1; release channel ch2; release channel ch3; release channel ch4; } exit; EOF[grid@rac11g01 ~]$ [grid@rac11g01 ~]$ rman target / nocatalog msglog $backup_log append << EOF > run { > allocate channel ch1 type disk; > allocate channel ch2 type disk; > allocate channel ch3 type disk; > allocate channel ch4 type disk; > > backup AS COMPRESSED BACKUPSET incremental level=0 database format '/db_backup/%d_FULL_%T_%s_%p.bak'; > backup AS COMPRESSED BACKUPSET archivelog all format '/db_backup/%d_ARC_%T_%s_%p.bak' delete input; > backup current controlfile format '/db_backup/%d_CTL_%T_%s_%p.bak'; > > release channel ch1; > release channel ch2; > release channel ch3; > release channel ch4; > } > exit; > EOF RMAN-00557: could not open MSGLOG "/home/oracle/ORCL_full_20250604.log" Recovery Manager: Release 11.2.0.4.0 - Production on Wed Jun 4 20:30:57 2025 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-00554: initialization of internal recovery manager package failed RMAN-12001: could not open channel default RMAN-10008: could not create channel context RMAN-10002: ORACLE error: ORA-15021: parameter "remote_dependencies_mode" is not valid in asm instance RMAN-10006: error running SQL statement: alter session set remote_dependencies_mode = signature [grid@rac11g01 ~]$
06-05
<think>我们正在解决用户遇到的RMAN备份错误:-RMAN-00557:couldnotopenMSGLOG-ORA-15021:parameterremote_dependencies_modenotvalidinasminstance用户的环境是RAC集群,且错误发生在使用RMAN进行备份时。根据错误信息,问题与MSGLOG文件的打开和ASM实例的无效参数有关。分析:1.RMAN-00557:通常是因为RMAN无法打开指定的日志文件。可能原因包括:-路径不存在-权限不足-磁盘空间不足2.ORA-15021:这个错误指出参数`remote_dependencies_mode`在ASM实例中无效。这是因为ASM实例不应该设置这个参数,该参数仅适用于数据库实例。然而,注意到错误信息中提到了`remote_dependencies_mode`,但实际上这个参数在ASM实例中是不被支持的。因此,问题可能是由于在ASM实例中设置了这个参数,或者RMAN在连接到ASM实例时尝试使用该参数。在RAC环境中,RMAN连接通常包括连接到数据库实例和ASM实例。当使用`rmantarget/`时,如果当前登录用户是grid(即ASM管理员),则可能会连接到ASM实例而不是数据库实例。但是,备份操作应该针对数据库实例,而不是ASM实例。因此,我们需要确保RMAN连接的目标是数据库实例。用户之前提供的备份脚本片段:```bash#!/bin/bashsource~/.bash_profilebackup_log=/home/oracle/ORCL_full_`date+"%Y%m%d"`.logrmantarget/nocatalogmsglog$backup_logappend<< EOF...```在脚本中,使用`rmantarget/`连接,并且使用`msglog`指定了日志文件路径。如果这个脚本是由grid用户执行,那么就会连接到ASM实例,从而引发问题。解决方案:步骤1:检查脚本的执行用户确保备份脚本是由oracle用户(数据库安装用户)执行,而不是grid用户(ASM管理员)。步骤2:检查环境变量在脚本中,`source~/.bash_profile`可能会设置ORACLE_SID等环境变量。如果当前环境设置不正确,也可能导致连接到ASM实例。建议在脚本中显式设置正确的ORACLE_SID,比如数据库实例的SID(在RAC中,每个节点有自己的实例名,如ORCL1、ORCL2)。但是,在RAC中,我们通常使用服务名连接,所以也可以使用`rmantargetsys/password@service_name`的方式,这样更明确。步骤3:检查日志文件路径的权限确保oracle用户有权限在`/home/oracle/`目录下创建日志文件,并且有写权限。步骤4:关于参数`remote_dependencies_mode`在ASM实例中,这个参数是不需要的,所以不应该在ASM实例的初始化参数中设置。如果这个参数出现在ASM实例的spfile中,需要将其移除。如何检查ASM实例的参数?以grid用户登录,执行:```sqlsqlplus/assysasmSQL>showparameterremote_dependencies_mode;```如果显示有值,那么需要修改:```sqlSQL>altersystemresetremote_dependencies_modescope=spfilesid='*';```然后重启ASM实例(注意:重启ASM实例会影响到数据库,需要在维护窗口进行)。但是,请注意:在ASM实例中,正常情况下不应该设置这个参数。所以,如果发现设置了,可能是误操作。另外,在数据库实例中,这个参数是有效的,所以不要删除数据库实例中的该参数。具体解决步骤:1.确认当前执行用户确保使用oracle用户执行备份脚本。2.修改脚本,显式指定目标为了避免连接到错误的实例,可以显式指定目标为数据库实例。例如,使用一个数据库用户(如sys)并指定服务名(在tnsnames.ora中配置的服务名,如RACDB):```bashrmantargetsys/yourpassword@RACDBnocatalogmsglog$backup_logappend<< EOF```或者,如果使用操作系统认证,且当前是oracle用户,那么连接字符串可以写成`target/`,但前提是当前ORACLE_SID设置为数据库实例SID(而不是ASM实例的SID)。3.检查日志目录权限确保oracle用户对日志文件所在目录有写权限。4.检查ASM实例参数(如果上述步骤后问题依旧)以grid用户登录,检查ASM实例的spfile中是否包含`remote_dependencies_mode`参数,如果有则删除。示例操作(删除ASM实例中的参数):```sqlsqlplus/assysasmSQL>createpfile='+DATA/pfileASM.ora'fromspfile;--备份当前spfileSQL>altersystemresetremote_dependencies_modescope=spfilesid='*';SQL>shutdownimmediate;SQL>startup;```注意:重启ASM实例会导致依赖该ASM存储的数据库实例也关闭,所以需谨慎操作,并在维护窗口进行。5.重新运行备份脚本在完成以上步骤后,重新运行备份脚本,观察错误是否解决。总结:该问题主要是由于RMAN连接到了ASM实例而不是数据库实例,并且在ASM实例中有一个无效参数。通过确保使用正确的用户(oracle)执行脚本,并检查ASM实例的参数设置,应该可以解决。根据用户提供的引用[^1](小麦苗的常用代码),我们还可以参考其他备份恢复相关的命令,但当前问题需要先解决连接和参数问题。生成的相关问题:1.如何正确配置RAC环境中的RMAN备份脚本?2.ASM实例管理中的常见错误有哪些?3.如何安全地修改ASM实例的参数?4.RMAN备份日志文件无法创建的常见原因及解决方法?5.RAC环境中数据库实例与ASM实例的连接区别?请注意,以上步骤需要根据实际情况调整,尤其是修改ASM参数和重启ASM实例的操作,务必在维护窗口进行,并做好备份。</think> ### RAC集群环境下解决RMAN备份错误(RMAN-00557 & ORA-15021) #### **错误根本原因分析** 1. **RMAN-00557**: 无法打开日志文件 - 日志路径`/home/oracle/`通常属于`oracle`用户,但ASM实例需以`grid`用户操作[^1] - 权限冲突:RMAN尝试以`oracle`用户身份写入grid用户的环境日志 2. **ORA-15021**: ASM实例参数无效 - `remote_dependencies_mode`是数据库实例参数,ASM实例不允许设置该参数[^1] - 错误通常在连接到ASM实例时发生 --- #### **解决方案(分步骤实施)** ##### **步骤1:修复日志路径权限** ```bash # 以root用户创建共享日志目录 mkdir -p /u01/rman_logs chown -R grid:oinstall /u01/rman_logs chmod 775 /u01/rman_logs ``` ```bash #!/bin/bash # 修改备份脚本日志路径 backup_log=/u01/rman_logs/ORCL_full_$(date +"%Y%m%d").log ``` ##### **步骤2:调整RMAN连接方式** ```sql -- 显式连接到ASM实例(需grid用户执行) rman target "'/ as sysbackup@+ASM1'" << EOF alter system set remote_dependencies_mode = none; -- ASM无需此参数 EOF ``` ##### **步骤3:验证参数有效性** ```sql -- 以grid用户检查ASM参数 sqlplus / as sysasm SQL> SHOW PARAMETER remote_dependencies_mode; ``` **预期结果**: 参数值应为`none`或报错`ORA-15021`表示参数不适用[^1] ##### **步骤4:分离数据库备份与ASM操作** ```bash #!/bin/bash # 数据库备份(oracle用户执行) backup_log=/u01/rman_logs/db_$(date +"%Y%m%d").log rman target / nocatalog msglog $backup_log << EOF ... EOF # ASM元数据备份(grid用户执行) su - grid rman target "'/ as sysbackup@+ASM1'" << EOF BACKUP AS BACKUPSET CURRENT CONTROLFILE FORMAT '+DG_BACKUP'; EOF ``` --- #### **关键注意事项** 1. **用户隔离原则** - 数据库操作使用`oracle`用户 - ASM操作使用`grid`用户 - 跨用户操作需通过`su - user`切换 2. **参数管理规范** ```sql -- 禁用ASM中的无效参数 ALTER SYSTEM SET remote_dependencies_mode='' SCOPE=SPFILE; ``` 3. **环境检查清单** - ✓ 日志目录属主:`grid:oinstall` - ✓ `$ORACLE_BASE`环境变量隔离 - ✓ `asm_diskstring`参数正确性 - ✓ 密码文件位置:`$GRID_HOME/dbs/orapw+ASM` --- #### **最佳实践** 1. **自动化脚本模板** ```bash #!/bin/bash # 数据库备份 oracle_env() { export ORACLE_SID=DB1 export ORAENV_ASK=NO . oraenv } oracle_env rman target / @rman_db_backup.sql # ASM备份 grid_env() { export ORACLE_SID=+ASM1 export ORAENV_ASK=NO . oraenv } su - grid -c "grid_env; rman target / @rman_asm_backup.sql" ``` 2. **日志监控方法** ```bash tail -f /u01/rman_logs/*.log | grep -E 'RMAN-|ORA-' ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值