如何调用 DBMS_DISKGROUP 对 ASM 文件进行随机读取

目录

一、概述

二、实现思路与注意点

三、Java Demo

1、直接调用

2、读写异步


一、概述

        对于 Oracle Rac 环境下,数据文件大多默认存放在 ASM 共享存储上,当我们需要读取 ASM 上存储的数据文件时可以使用 Oracle 提供的一些方法,比如 ASMCMD CP。但是,对于一些备份场景,我们需要能够随机读取 ASM 共享存储上的数据文件,此时再使用 ASMCDM CP 的读写性能较差,需要先把文件缓存到本地,再从本地获取文件的数据流。

        DBMS_DISKGROUP 是 Oracle 官方提供的内部包,该包提供了一系列的文件操作接口,可以通过调用他提供的存储过程直接获取 ASM 共享存储上的文件数据流,实现无缓存的数据备份。

        但是由于 DBMS_DISKGROUP 属于内部包,Oracle 并没有提供任何文档对其详细描述,网络上的资源也相较稀少。本篇博客的内容,是博主在实现过程中的一些经验总结,可以实现 Java 通过 JDBC 调用 DBMS_DISKGROUP 包,将 ASM 共享存储内的数据文件备份出去,像备份本地文件一样。        

        但是需要提前声明的是,每次随机读取 ASM 文件都需要调用 DBMS_DISKGROUP.READ 的存储过程,性能较差,在我测试的虚机环境下只能达到 10 MB/s(每次调用的buff只有30KB左右)。期间使用了读写异步、多线程读等方法提升性能,效果也不是很大。而且由于调用 DBMS_DISKGROUP 存储过程需要 SYSASM 角色,无法自定义数据类型和存储过程,也无法调用其他的包,所以暂没有想到好的办法提升性能。如果您有什么好的建议,可以留言评论。

        下面是从网上总结的 DBMS_DISKGROUP 包内的存储过程。

dbms_diskgroup.abortfile(:handle)
dbms_diskgroup.addcreds(:osuname,:clusid,:uname,:passwd);
dbms_diskgroup.asmcopy (:src_path, :dst_name, :spfile_number,:fileType, :blkSz, :spfile_number2,:spfile_type, :client_mode)
dbms_diskgroup.checkfile (v_AsmFileName,v_FileType,v_lbks,v_offstart,v_FileSize)
dbms_diskgroup.close (:handle);
dbms_diskgroup.commitfile (:handle);
dbms_diskgroup.copy ('', '', '', :src_path, :src_ftyp, :src_blksz,:src_fsiz, '','','', :dst_path, 1)
dbms_diskgroup.createclientcluster (:clname, :direct_access)
dbms_diskgroup.createdir(:NAME);
dbms_diskgroup.createfile(:NAME,:type,:lblksize,:fsz,:handle,:pblksz,:genfname);
dbms_diskgroup.dropdir(:DIRNAME)
dbms_diskgroup.dropfile(:NAME,:type);
dbms_diskgroup.getfileattr (:src_path, :fileType, :fileSz, :blkSz)
dbms_diskgroup.getfileattr(:NAME,:type,:fsz,:lblksize, 1,:hideerr);
dbms_diskgroup.getfilephyblksize (:fileName, :flag, :pblksize)
dbms_diskgroup.gethdlattr(:handle,:attr,:nval,:sval);
dbms_diskgroup.gpnpsetsp(:spfile_path)
dbms_diskgroup.mapau (:gnum, :disk, :au, :file, :extent, :xsn)
dbms_diskgroup.mapextent(:NAME,:xsn,:mapcount,:extsize,:disk1,:au1,:disk2,:au2,:disk3,:au3);
dbms_diskgroup.mkdir (:DIRNAME)
dbms_diskgroup.open(:NAME,:fmode,:type,:lblksize,:handle,:pblksz,:fsz);
dbms_diskgroup.openpwfile(:NAME,:lblksize,:fsz,:handle,:pblksz,:fmode,:genfname,:dbname);
dbms_diskgroup.patchfile (v_AsmFilename,v_filetype,v_lbks,v_offstart,0,v_numblks,v_FsFilename,v_filetype,1,1)
dbms_diskgroup.read(:handle,:offset,:length,:buffer,:reason,:mirr);
dbms_diskgroup.remap (:gnum, :fnum, :vxn)
dbms_diskgroup.renamefile(:NAME,:tname,:type,:genfname);
dbms_diskgroup.resizefile(:handle,:fsz);
dbms_diskgroup.write(:handle,:offset,:length,:buffer,:reason);

二、实现思路与注意点

        使用 DBMS_DISKGROUP 包和使用 C 读取文件一样,需要先定义文件句柄,之后使用句柄读写文件,最后别忘了关闭句柄。

        下面是一段 PL/SQL 脚本,展示了如何读取  ASM 文件并打印出来,期间还打印了一些文件属性,包括文件名、文件类型、文件块数和文件块大小等。

/* block(512 Byte) ->  unit( 60 blocks, 30KB ) ->  batch ( 70 * unit, 2100KB ) */
set serveroutput on;
declare

        v_filename varchar2(4000);
        v_filesize number;
        v_filetype number;
        v_lbks number;

        v_handle number;
        v_pblksize number;
        v_length number default 512;
        v_offset number default 1;

        file_handle number := 0;
        batch_size number := 209715200;
        block_size number := 8192;
        block_start number := 1;
        block_end number := 25600;
        unit_size_limit number := 24576;
        unit_block_size number;
        unit_count number;
        unit_buffer raw(32767);
        /* loop parameters */
        block_read_this number;
        size_read_this number;
        block_start_index number;
BEGIN
        /* 10 MB */
        dbms_output.enable(null);
        dbms_output.put_line('start read');

        v_filename := '+data/orcl/datafile/SYSTEM.257.1142181233';
        dbms_diskgroup.getfileattr(v_filename, v_filetype, v_filesize, v_lbks);
        dbms_diskgroup.open(v_filename, 'r', v_filetype, v_lbks, v_handle, v_pblksize, v_filesize);

        batch_size := v_filesize * v_lbks;
        batch_size := v_filesize * v_lbks;
        block_size := v_lbks;
        block_end := v_filesize;
        unit_block_size := unit_size_limit / block_size;
        uni

你可能感兴趣的:(项目demo,ASM文件,共享存储,Oracle,RAC,随机读写)