网站程序问题,怎样做模具钢网站,和老妇做爰视频网站,盐城网站建设价位目录
一、概述
二、实现思路与注意点
三、Java Demo
1、直接调用
2、读写异步 一、概述 对于 Oracle Rac 环境下,数据文件大多默认存放在 ASM 共享存储上,当我们需要读取 ASM 上存储的数据文件时可以使用 Oracle 提供的一些方法,比如 ASMCMD CP。但是,对于一些备份场景…目录
一、概述
二、实现思路与注意点
三、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;
declarev_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;unit_count := (batch_size / unit_size_limit) + 1;