Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103635867
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-03 21:45:32

作者:开发者在线 来源:开发者在线

作为原磁盘设备的替换方式,Oracle 10g中引入了自动存储管理(ASM)来保存与Oracle相关的文件。同原磁盘一样,ASM分区(称为磁盘组)也没有文件系统,不能在操作系统级别上进行直接的文件浏览。

因为不能使用普通的命令来复制和删除文件(UNIX中的cp和rm,Windows中的copy和del命令),从而给维护带来了挑战。在10gR2发布中,我们可以使用RMAN命令备份和恢复ASM文件,。不过,Oracle 10g包中的DBMS_FILE_TRANSFER是处理ASM的另一种方式。

DBMS_FILE_TRANSFER可以在同一台Oracle服务器上或两台Oracle 服务器之间复制文件。它使用目录对象来指定源目录和目的目录,因为目录对象支持ASM路径名称,所以DBMS_FILE_TRANSFER也支持ASM路径名。这使得从常规文件系统的ASM存储区移入和移出文件变得十分简单。

DBMS_FILE_TRANSFER可以在常规文件系统存储区中拷贝任何类型的文件,但是它只能将Oracle文件移入或移出ASM磁盘组。数据文件、日志文件(包括档案日志)和控制文件都可以被复制,但是不能将init.ora文件的拷贝放在磁盘组中。

假定你使用一个ASM磁盘组来存储档案日志,并且需要从中提取一些信息传递给数据保护可信服务器。演示了在我的服务器的ASM磁盘组上如何使用CREATE DIRECTORY命令定义档案目录以及如何在文件系统中定义一个临时目录。演示了如何使用DBMS_FILE_TRANSFER的COPY_FILE过程复制日志文件。

游标遍历选自动态执行视图V$ARCHIVED_LOG中的日志文件名。通过SUBSTR提取出文件名部分和序列号,然后生成一个新的文件名。最后,调用DBMS_FILE_TRANSFER来执行复制操作。同时,我们还可以使用包中的GET_FILE和PUT_FILE过程从其它服务器获得日志文件或传递到其它服务器中。

Bob Watkins (OCP, MCITP, MCDBA, MCT)作为技术培训师,咨询专家和数据库管理员是一位有25年从业经验的计算机专家。他是位于达拉斯/福特沃斯地区数据库咨询与培训公司B.Watkins的高级咨询师和管理伙伴。

Listing A

SQL> col name format a50
SQL> SELECT sequence#, name
  2  FROM v$archived_log
  3  ORDER BY sequence#;

 SEQUENCE# NAME                                                                 
---------- --------------------------------------------------                   
        12 +DG1/orcl/arch/arc00012_0578762891.001                               
        13 +DG1/orcl/arch/arc00013_0578762891.001                               
        14 +DG1/orcl/arch/arc00014_0578762891.001                               

SQL> CREATE DIRECTORY archdir AS '+DG1/orcl/arch';

Directory created.

SQL> CREATE DIRECTORY tempdir AS 'C:Temp';

Directory created.

SQL> 
Listing B

set serverout on

DECLARE

   v_archivedir         VARCHAR2(30)    := 'ARCHDIR';
   v_tempdir            VARCHAR2(30)    := 'TEMPDIR';

   v_asm_logname        VARCHAR2(100);
   v_win_logname        VARCHAR2(100);

   v_first_log_seq      NUMBER          := 12;
   v_last_log_seq       NUMBER          := 14;
   v_log_seq            VARCHAR2(5);

   CURSOR c_logs IS
      SELECT name
      FROM v$archived_log
      WHERE sequence# BETWEEN v_first_log_seq AND v_last_log_seq
      ORDER BY sequence#;

BEGIN
     FOR i IN c_logs LOOP
        v_asm_logname := SUBSTR(i.name, 16);
        v_log_seq     := SUBSTR(v_asm_logname,4,5);
        v_win_logname := 'orcl_arc'||v_log_seq||'.log';

        DBMS_FILE_TRANSFER.COPY_FILE(v_archivedir,
                                     v_asm_logname,
                                     v_tempdir,
                                     v_win_logname);

        DBMS_OUTPUT.PUT_LINE(v_asm_logname||' copied to '||
             v_win_logname||'.');

     END LOOP;
END;
/

SQL> @copyasm_b
arc00012_0578762891.001 copied to orcl_arc00012.log.                            
arc00013_0578762891.001 copied to orcl_arc00013.log.                            
arc00014_0578762891.001 copied to orcl_arc00014.log.                            

PL/SQL procedure successfully completed.

SQL>
阅读(447) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~