当前位置: 首页 > news >正文

如何调用 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;
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;

相关文章:

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

目录 一、概述 二、实现思路与注意点 三、Java Demo 1、直接调用 2、读写异步 一、概述 对于 Oracle Rac 环境下,数据文件大多默认存放在 ASM 共享存储上,当我们需要读取 ASM 上存储的数据文件时可以使用 Oracle 提供的一些方法,比如 ASMCMD CP。但是,对于一些备份场景…...

UART学习

uart.c #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h" // UART4_TX : PG11 AF6 // UART4_RX : PB2 AF8 void __uart_init() {// GPIOB2 设置为复用功能GPIOB->MODER & (~(0x3 << 4));GPIOB->MODER | (0x2 << 4);G…...

洗地机哪个牌子最好用?洗地机品牌排行榜

近年来&#xff0c;洗地机相当热门&#xff0c;洗地机结合了扫地拖地吸地为一体的多功能清洁工具&#xff0c;让我们告别了传统方式打扫卫生&#xff0c;让我们清洁不再费劲&#xff0c;可是市面上的洗地机五花八门&#xff0c;怎么挑选到一个洗地机也是一个问题&#xff0c;下…...

国际阿里云:Windows实例中数据恢复教程!!!

在处理磁盘相关问题时&#xff0c;您可能会碰到操作系统中数据盘分区丢失的情况。本文介绍了Windows系统下常见的数据盘分区丢失的问题以及对应的处理方法&#xff0c;同时提供了使用云盘的常见误区以及最佳实践&#xff0c;避免可能的数据丢失风险。 前提条件 已注册阿里云账…...

浅谈二叉树

✏️✏️✏️今天给大家分享一下二叉树的基本概念以及性质、二叉树的自定义实现&#xff0c;二叉树的遍历等。 清风的CSDN博客 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&…...

(二) 用QWebSocket 实现服务端和客户端(详细代码直接使用)

目录 前言 一、服务器的代码&#xff1a; 1、服务器的思路 2、具体服务器的代码示例 二、客户端的代码&#xff1a; 1、客户端的思路&#xff08;和服务器类似&#xff09; 2、具体客户端的代码示例 前言 要是想了解QWebSocket的详细知识&#xff0c;还得移步到上一篇文…...

关于我在配置zookeeper出现,启动成功,进程存在,但是查看状态却没有出现Mode:xxxxx的问题和我的解决方案

在我输入:zkServer.sh status 之后出现报错码. 报错码&#xff1a; ZooKeeper JMX enabled by default Using config: /opt/software/zookeeper/bin/../conf/zoo.cfgClient port found: 2181. Client address: localhost. Error contacting service. It is probably not runni…...

react及相关面试问题汇总

目录 1、什么是React&#xff1f;它的特点是什么&#xff1f; 2、解释一下虚拟DOM(Virtual DOM)的概念以及它的工作原理。 3、什么是组件(Component)&#xff1f;如何定义一个React组件&#xff1f; 4、什么是JSX&#xff1f;它与HTML的区别是什么&#xff1f;如何在React中…...

QT4到QT5移植出现的一些问题

转自&#xff1a;QT4到QT5移植出现的一些问题_西门子3gl qt5 许可证-CSDN博客 在上述作者基础上修改&#xff1a; 一、问题1&#xff1a;头文件的问题 1、QtGui/QApplication: No such file or directory 1.1错因 原因是Qt5源文件位置的改动 1.2解决 pro文件里&#xff0…...

【可解释AI】Alibi explain: 解释机器学习模型的算法

Alibi explain: 解释机器学习模型的算法 可解释人工智能简介Alibi特点算法Library设计展望参考资料 今天介绍Alibi Explain&#xff0c;一个开源Python库&#xff0c;用于解释机器学习模型的预测(https://github.com/SeldonIO/alibi)。该库具有最先进的分类和回归模型可解释性算…...

No191.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…...

ROS基础—vscode创建工作空间

1、创建ROS工作空间 首先打开ubuntu的终端&#xff0c;接着依次输入如下的命令行&#xff1b; mkdir -p xxx_ws/src(必须得有 src) cd xxx_ws catkin_make当然我一般是新建一个叫做demo的工作空间&#xff0c;如 mkdir -p demo04_ws/src 2、启动vscode cd xxx_ws code . …...

机器学习复习(待更新)

01绪论 &#xff08;1&#xff09;机器学习基本分类&#xff1a; 监督学习&#xff08;有标签&#xff09;半监督学习&#xff08;部分标签&#xff0c;找数据结构&#xff09;无监督学习&#xff08;无标签&#xff0c;找数据结构&#xff09;强化学习&#xff08;不断交互&…...

taro(踩坑) npm run dev:weapp 微信小程序开发者工具预览报错

控制台报错信息&#xff1a; VM72:9 app.js错误: Error: module vendors-node_modules_taro_weapp_prebundle_chunk-JUEIR267_js.js is not defined, require args is ./vendors-node_modules_taro_weapp_prebundle_chunk-JUEIR267_js.js 环境&#xff1a; node 版本&#x…...

3. 深度学习——损失函数

机器学习面试题汇总与解析——损失函数 本章讲解知识点 什么是损失函数?为什么要使用损失函数?详细讲解损失函数本专栏适合于Python已经入门的学生或人士,有一定的编程基础。 本专栏适合于算法工程师、机器学习、图像处理求职的学生或人士。 本专栏针对面试题答案进行了优化…...

交叉编译 openssl

要在 x86 平台上编译适用于 aarch64 架构的 OpenSSL 动态库&#xff0c;你需要使用交叉编译工具链。可以按照以下步骤进行&#xff1a; 安装 aarch64 交叉编译工具链&#xff1a; $ sudo apt-get install gcc-aarch64-linux-gnu g-aarch64-linux-gnu 这将安装 aarch64 交叉编…...

C++文件的读取和写入

1、C对txt文件的读&#xff0c;ios::in #include<iostream> #include<fstream> using namespace std;int main() {ifstream ifs;ifs.open("test.txt",ios::in);if(!ifs.is_open()){cout<<"打开文件失败&#xff01;"<<endl;}char…...

住宅IP、家庭宽带IP以及原生IP,它们有什么区别?谷歌开发者账号应选择哪种IP?

IP地址&#xff08;Internet Protocol Address&#xff09;是互联网协议地址的简称&#xff0c;是互联网通信的基础&#xff0c;互联网上每一个网络设备的唯一标识符每个在线的设备都需要一个IP地址&#xff0c;这样才能在网络中找到它们并进行数据交换。 IP地址有很多种类型&…...

Linux内核分析(十三)--内存管理之I/O交换与性能调优

目录 一、引言 二、page cache ------>2.1、file-backed ------>2.2、匿名页(Anonymous page) ------>2.3、读写方式 ------>2.4、常驻内存 三、页面回收 ------>3.1、LRU算法 ------>3.2、嵌入式系统的zRAM 四、内存性能调优 ------>4.1、存储…...

前端使用webscoket

前端 <template><div class"wrap"><button click"socketEmit">连接Socket</button><button click"socketSendmsg">发送数据</button></div> </template><script> export default {data(…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...