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

Oracle常用导元数据方法

1 说明

前两天领导发邮件要求导出O库一批表和索引的ddl语句做国产化测试,涉及6个系统,6千多张表,还好涉及的用户并不多,要不然很麻烦。
如此大费周折原因,是某国产库无法做元数据迁移。。。额,只能我手动导出,拿去给他们同步。

考虑的方案有两个:

  1. 使用get_ddl查询出语句。
  2. 使用数据泵导元数据。

两种方式各有优点,分场景使用。

2 get_ddl查询

在需要查询的表不多,且不用导索引时,get_ddl方式比较省力。

缺点就是步骤比较多,表、索引、注释等都需要单独做查询;段属性之类的信息无法屏蔽。最大的问题是比较慢,我导出1000张表及其相关索引花了差不多4个小时,时间主要花在查询索引ddl上。

2.1 创建表清单表

将需要生成ddl的表粘到下面表中:

create table lu9up.cs_tab_250210
(owner           varchar2(30) not null,table_name      varchar2(30) not null
);select * from lu9up.cs_tab_250210 for update;

2.2 部署脚本

进入到某个目录下,创建script_cs_250210.sql脚本,用于跑get_ddl:

cat > script_cs_250210.sql << EOF
declarescripts varchar2(4000);cursor tab isselect owner,table_name,dbms_metadata.get_ddl('TABLE', table_name, owner) || ';' table_scriptsfrom lu9up.cs_tab_250210--where owner = '' and table_name = ''order by owner;
beginfor i in tab loopdbms_output.put_line(chr(10) || '----' || i.owner || '.' ||i.table_name);dbms_output.put_line(i.table_scripts);for j in (select to_char(dbms_metadata.get_ddl(t.index_type,t.index_name,t.owner)) || ';' scriptsfrom (select owner, index_name, 'INDEX' index_typefrom dba_indexes bwhere owner = i.ownerand not exists(select 1from dba_constraints cwhere b.owner = i.ownerand b.index_name = c.constraint_name)and table_name = i.table_nameorder by 3, 2) t) loopdbms_output.put_line(j.scripts);end loop;end loop;
end;
/
EOF

创建script_cs_250210.sh脚本,调用script_cs_250210.sql脚本:

#!/bin/bash
export ORACLE_SID=xxxdb
sqlplus -s / as sysdbba <<EOF
set lines 500
set serveroutput on
spool cs_tab_250210.sql
@script_cs_250210.sql
spool off
EOF

2.3 导出元数据到sql文件

执行script_cs_250210.sh脚本:

nohup sh script_cs_250210.sh &

结果在cs_tab_250210.sql文件。

3 数据泵导出

如果涉及到的表、索引很多的情况下,使用数据泵比较快,几千张表十来分钟就可以导出完毕了,且可读性比较高。

3.1 创建表清单表

将需要生成ddl的表粘到下面表中:

create table lu9up.cs_tab_250210
(owner           varchar2(30) not null,table_name      varchar2(30) not null
);select * from lu9up.cs_tab_250210 for update;

3.2 创建导出目录

创建一个具有oracle权限的导出目录:

create directory csdir as '/home/oracle/lu9up';
grant read,write on directory csdir to lu9up;
grant datapump_exp_full_database to lu9up;
grant datapump_imp_full_database to lu9up;select * from dba_directories;

3.3 生成执行语句

由于得按schema导出,执行以下sql可生成不同schema的数据泵执行语句:

select '--'||owner|| chr(10) ||'cat > cs_'||owner||'_exp_250210.par << EOF' || chr(10) ||'directory=CSDIR' || chr(10) || 'schemas='||owner||'' || chr(10) ||'include=table:"in (select table_name from lu9up.cs_tab_250210 where owner = '''||owner||''')"' ||chr(10) || 'parallel=8' || chr(10) || 'cluster=n' || chr(10) ||'content=metadata_only' || chr(10) ||'dumpfile=cs_'||owner||'_exp_250210.dmp' || chr(10) ||'logfile=cs_'||owner||'_exp_250210.log' || chr(10) || 'EOF' || chr(10) ||chr(10) ||'expdp lu9up/oracle parfile=cs_'||owner||'_exp_250210.par' ||chr(10) ||chr(10)||chr(10)|| 'cat > cs_'||owner||'_imp_250210.par << EOF' || chr(10) ||'directory=CSDIR' || chr(10)|| 'dumpfile=cs_'||owner||'_exp_250210.dmp' ||chr(10) || 'parallel=8' || chr(10) ||'exclude=grant,statistics' || chr(10) ||'transform=segment_attributes:n'|| chr(10) ||'sqlfile='||owner||'.sql' || chr(10) ||'logfile=cs_'||owner||'_imp_250210.log' || chr(10) ||'EOF' || chr(10) ||chr(10) ||'impdp lu9up/oracle  parfile=cs_'||owner||'_imp_250210.par'from (select owner, count(*) ctfrom lu9up.cs_tab_250210group by ownerorder by ct desc);

image.png

image.png

有多个用户的时候就非常方便,可以直接拿去执行,不用再修改脚本。

其实也可以直接用dblink+impdp不落地导sqlfile,省去了expdp的步骤。

3.4 脚本部署

把cs_xxx_exp_250210.par和cs_xxx_imp_250210.par两个文件部署到数据库服务器,确认有oracle用户权限。

image.png

3.5 执行导出

脚本分两个,一个是使用expdp导出元数据到dmp文件,然后再用impdp将dmp文件转化为sqlfile。

expdp:

expdp lu9up/oracle  parfile=cs_xxx_exp_250210.par

impdp:

impdp lu9up/oracle  parfile=cs_xxx_imp_250210.par

结果生成到导出目录csdir中xxx.sql文件。

4 总结

总的来说,使用数据泵导出元数据比较符合规范,内容比较完整,阅读性高,且可以使用参数控制输出的内容。
get_ddl在少量表和索引的情况下,相对比较方便快捷。

相关文章:

Oracle常用导元数据方法

1 说明 前两天领导发邮件要求导出O库一批表和索引的ddl语句做国产化测试&#xff0c;涉及6个系统&#xff0c;6千多张表&#xff0c;还好涉及的用户并不多&#xff0c;要不然很麻烦。 如此大费周折原因&#xff0c;是某国产库无法做元数据迁移。。。额&#xff0c;只能我手动导…...

linux安装jdk 许可证确认 user did not accept the oracle-license-v1-1 license

一定要接受许可证&#xff0c;不然会出现 一、添加 ppa第三方软件源 sudo add-apt-repository ppa:ts.sch.gr/ppa二、更新系统软件包列表 sudo apt-get update三、接受许可证 echo debconf shared/accepted-oracle-license-v1-1 select true | sudo debconf-set-selection…...

Spring基于文心一言API使用的大模型

有时做项目我们可能会遇到要在项目中对接AI大模型 本篇文章是对使用文心一言大模型的使用总结 前置任务 在百度智能云开放平台中注册成为开发者 百度智能云开放平台 进入百度智能云官网进行登录&#xff0c;点击立即体验 点击千帆大模型平台 向下滑动&#xff0c;进入到模型…...

【Elasticsearch】derivative聚合

1.定义与用途 derivative聚合是一种管道聚合&#xff08;pipeline aggregation&#xff09;&#xff0c;用于计算指定度量&#xff08;metric&#xff09;的变化率。它通过计算当前值与前一个值之间的差异来实现这一点。这种聚合特别适用于分析时间序列数据&#xff0c;例如监…...

4.7.KMP算法(新版)

一.回顾&#xff1a;KMP算法基于朴素模式匹配算法优化而得来的 朴素模式匹配算法核心思想&#xff1a;把主串中所有长度与模式串长度相等的子串与模式串进行对比&#xff0c;直到找到第一个完全匹配的子串为止&#xff0c;如果当前尝试匹配的子串在某一个位置匹配失败&#xf…...

iOS AES/CBC/CTR加解密以及AES-CMAC

感觉iOS自带的CryptoKit不好用&#xff0c;有个第三方库CryptoSwift还不错&#xff0c;好巧不巧&#xff0c;清理过Xcode缓存后死活下载不下来&#xff0c;当然也可以自己编译个Framework&#xff0c;但是偏偏不想用第三方库了&#xff0c;于是研究了一下&#xff0c;自带的Com…...

错误报告:WebSocket 设备连接断开处理问题

错误报告&#xff1a;WebSocket 设备连接断开处理问题 项目背景 设备通过自启动的客户端连接到服务器&#xff0c;服务器将设备的 mac_address 和设备信息存入 Redis。前端通过 Redis 接口查看设备信息并展示。 问题描述 设备连接到服务器后&#xff0c;前端无法立即看到设…...

点云配准网络

【论文笔记】点云配准网络 PCRNet: Point Cloud Registration Network using PointNet Encoding 2019_pcr-net-CSDN博客 【点云配准】【深度学习】Windows11下PCRNet代码Pytorch实现与源码讲解-CSDN博客 【点云配准】【深度学习】Windows11下GCNet代码Pytorch实现与源码讲解_…...

黑马Redis详细笔记(实战篇---短信登录)

目录 一.短信登录 1.1 导入项目 1.2 Session 实现短信登录 1.3 集群的 Session 共享问题 1.4 基于 Redis 实现共享 Session 登录 一.短信登录 1.1 导入项目 数据库准备 -- 创建用户表 CREATE TABLE user (id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID,phone …...

51单片机俄罗斯方块整行消除函数

/************************************************************************************************************** * 名称&#xff1a;flash * 功能&#xff1a;行清除动画 * 参数&#xff1a;NULL * 返回&#xff1a;NULL * 备注&#xff1a; * 采用非阻塞延时&#xff0…...

Vue 3 30天精进之旅:Day 21 - 项目实践:打造功能完备的Todo应用

前言 经过前20天的学习&#xff0c;我们已经掌握了Vue 3的核心概念、组合式API、路由、状态管理等关键技术。今天将通过一个完整的项目实践——Todo应用&#xff0c;将所学知识融会贯通。我们将为Todo应用添加编辑、删除、过滤等进阶功能&#xff0c;并优化代码结构。 一、项目…...

32单片机学习记录1之GPIO

32单片机学习记录1之GPIO 前置 GPIO口在单片机中扮演着什么角色&#xff1f; 在单片机中&#xff0c;GPIO口&#xff08;General Purpose Input/Output&#xff09; 是一种通用输入/输出接口&#xff0c;扮演着连接单片机与外部设备的桥梁角色。具体来说&#xff0c;它在单片…...

AI 编程助手 Cline

Cline 是一款集成于 Visual Studio Code&#xff08;VS Code&#xff09;的 AI 编程助手&#xff0c;旨在提升开发者的编程效率和代码质量。 主要功能&#xff1a; 代码生成与补全&#xff1a;Cline 能根据开发者的输入&#xff0c;自动生成代码片段或完整的函数&#xff0c;减…...

YOLOv11-ultralytics-8.3.67部分代码阅读笔记-patches.py

patches.py ultralytics\utils\patches.py 目录 patches.py 1.所需的库和模块 2.def imread(filename: str, flags: int cv2.IMREAD_COLOR): 3.def imwrite(filename: str, img: np.ndarray, paramsNone): 4.def imshow(winname: str, mat: np.ndarray): 5.PyTorch…...

R语言LCMM多维度潜在类别模型流行病学研究:LCA、MM方法分析纵向数据

全文代码数据&#xff1a;https://tecdat.cn/?p39710 在数据分析领域&#xff0c;当我们面对一组数据时&#xff0c;通常会有已知的分组情况&#xff0c;比如不同的治疗组、性别组或种族组等&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 然而&#xff0c;…...

2025 年前端开发现状分析:卷疯了还是卷麻了?

一、前端现状&#xff1a;框架狂飙&#xff0c;开发者崩溃 如果你是个前端开发者&#xff0c;那么你大概率经历过这些场景&#xff1a; 早上打开 CSDN&#xff08;或者掘金&#xff0c;随便&#xff09;&#xff0c;发现又有新框架发布了&#xff0c;名字可能是 VueXNext.js 之…...

RDK新一代模型转换可视化工具!!!

作者&#xff1a;SkyXZ CSDN&#xff1a;SkyXZ&#xff5e;-CSDN博客 博客园&#xff1a;SkyXZ - 博客园 之前在使用的RDK X3的时候&#xff0c;吴诺老师wunuo发布了新一代量化转换工具链使用教程&#xff0c;这个工具真的非常的方便&#xff0c;能非常快速的完成X3上模型的量化…...

JVM春招快速学习指南

1.说在前面 在Java相关岗位的春/秋招面试过程中&#xff0c;JVM的学习是必不可少的。本文主要是通过《深入理解Java虚拟机》第三版来介绍JVM的学习路线和方法&#xff0c;并对没有过JVM基础的给出阅读和学习建议&#xff0c;尽可能更加快速高效的进行JVM的学习与秋招面试的备战…...

C#中的序列化和反序列化

序列化是指将对象转换为可存储或传输的格式&#xff0c;例如将对象转换为JSON字符串或字节流。反序列化则是将存储或传输的数据转换回对象的过程。这两个过程在数据持久化、数据交换以及与外部系统的通信中非常常见 把对象转换成josn字符串格式 这个过程就是序列化 josn字符…...

xcode常见设置

1、如何使用cmake构建archs为$(ARCHS_STANDARD)的xcode项目 在cmake中使用如下指令 set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD)") cmake - nomadli的博客 | nomadli Blog...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...