Oracle中如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句?
今天小麦苗给大家分享的是Oracle中如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句?。
从Oracle9i开始Oracle提供了一个新的系统包DBMS_METADATA,可以用于提取对象创建的DDL语句。
1. 用户user1定义的存储过程,即使用sys用户执行,需要参考user1权限?
在导出数据的时候 数据库会先导出序列 再导出表数据 就会导致表中的id大于序列的值 导致新插入数据时 报唯一约束错误
sequence在平时的工作中是一个默默无闻的角色。可能创建好之后很少会去修改它,它就在默默地自增长。直到一些特殊的原因导致sequence出现问题,比如提供了一个脚本,需要使用insert语句修复一些问题, 修复的语句类似insert into test values(100,xxxxxx,xxxx); 正确的写法应该是insert into test values(test_seq.nextval,xxxxxx,xxxx); 但是测试的时候也没有发现问题,就这样部署到生产中就出现问题了。这个时候就是比较
原因是该用户缺少一些动态性能视图的访问权限,但是当我们尝试将提示的v$session授予用户(例如hr)时,提示了这个错,
为了便于建立性能良好的PL/SQL程序,Oracle提供了大量的系统包供使用。Oracle提供的这些包扩展并增强了数据库的一些功能,以及突
MySQL和Oracle虽然在架构上有很大的不同,但是如果从某些方面比较起来,它们有些方面也是相通的。 毕竟学习的主线是MySQL,所以会从MySQL的角度来对比Oracle的一些功能。大体总结了以下的内容,欢迎大家拍砖, 查看当前的数据库名 mysql> SELECT DATABASE(); +------------+ | DATABASE() | +------------+ | test | +------------+ 1 row in set (0.00 sec) +++ Or
Oracle 的数据泵功能从 10g 开始慢慢引入,从此导入导出变得更加快捷,方便。使用时只需要 help 就可以获得很多有用的参数。只要你可以登录到数据库服务器,导入导出变得更加的方便高效,可以使用命令行、参数文件或交互命令模式与 Oracle Data Pump 交互。
--初始化操作, 创建两个用户一个,testo,一个test. 在testo上创建表,test上创建物化视图。 SQL> create user testo identified by testo; User created. SQL> create user test identified by test; User created. SQL> grant connect,resource to testo,test; Grant succeeded. SQL> grant create materia
前几天的并行问题自己分析了下,也算有了一些进展,但是目前还没有找到让人信服的理由,有些读者也比较关心这个问题,所以第二篇中会把自己的分析过程写出来,第三篇中应该会对这个问题做一个了结。 之前发现剧烈的性能抖动似乎和数据库中存在的scheduler有一定的关系。自己就顺着这个思路进行了排查。 首先得到了离问题时间点比较接近的一个scheduler,然后抓取了对应的ddl语句。 OWNER JOB_NAME LAST_START_DATE ------- --
在做一套库的迁移准备,测试的时候有些异常,记录一下处理办法。 如果有处理不对的地方,请不吝赐教。
Oracle数据库意外宕机,归档开了,但是归档文件损坏,redo损坏,在强行拉起来之后UNDO报错,设置_corrupted_rollback_segments 跳过不一致的UNDO,重建UNDO表空间,接着报错:SMON encountered 100 out of maximum 100 non-fatal internal errors. 然后数据库自动宕机,报错处理如下: 1ORA-00600: internal error code, arguments: [13013], [5001], [458], [4197442], [6], [4197442], [3], [], [], [], [], []
思考: 对于DBA而言,常用物理方式的迁移,物理迁移的优势不必多说,使用这种方式不必担心对象前后不一致的情况,而这往往也解决了不懂业务的DBA最头疼的问题。
环境:数据迁移,版本 11.2.0.4 -> 12.2.0.1 思考: 对于DBA而言,常用物理方式的迁移,物理迁移的优势不必多说,使用这种方式不必担心对象前后不一致的情况,而这往往也解决了不懂业务的DBA最头疼的问题。 对于开发而言,常用逻辑方式的迁移,比如传统的exp/imp或者现在的expdp/impdp,优势是简单方便,不需要了解过多的数据库运维知识。 实际上,在某些数据库升级的场景下,针对业务数据量不大,停机时间充裕的迁移专项来说,也可以考虑采用数据泵逻辑迁移的方式。 那么数据泵的导出导入究竟需要注意哪些事项呢?本文宗旨是通过构建一个简单的例子来说明。
若要获取一个用户的角色、系统权限、对象权限以及列权限,则可以通过以上介绍的数据字典视图来获取也可以通过DBMS_METADATA.GET_GRANTED_DDL来获取。
今天有一个同学问我一个问题,因为白天比较忙也没有在意,在下班后坐地铁的时候抽空看了这个问题,感觉还是蛮有意思的。但是当时也没有任何答案,就准备自己回去好好实验一下再做答复,至少不能敷衍别人嘛。 他的问题大体思路如下,查看sys用户下object_type为TABLE的对象 SQL> select owner,count(*) from dba_objects where object_type='TABLE' and owner='SYS' group by owner; OWNER
对于数据整合式迁移,基本就是小霸王的二合一,四合一,八合一这样的节奏,把几个尽可能相关业务的数据库中的数据整合到一个库里。彼此还是独立的schema,倒也是相安无事。 在这种整合式迁移中,比较让人纠结的部分就是性能不是排第一位,而是迁移前的准备比较琐碎。 如果环境中有大量的db link,那就好像蜘蛛网一般,每个环境之间都有着千丝万缕的联系,如果准备不当,出了一点小的差错,那可能就是伤筋动骨的影响了。或者环境中存在这大量 的连接用户,有的环境关联业务多,连接用户可能几十上百个。这个时候准备脚本的时候就感觉
姊妹篇文章:【DB宝52】Oracle异构平台迁移利器之XTTS(使用rman方式)
问题: 想要获取数据库对象的定义(DDL)怎么办? 方法: 可以通过以下的方法获取数据库对象的定义(DDL)。 1. 使用DBMS_METADATA.GET_DDL程序包 SQL> set pages 0 SQL> set longchunksize 3000 SQL> set long 2000000000 SQL> select dbms_metadata.get_ddl('<对象类型>','<对象名>','<对象SCHEMA>') from dual; 例:
今天和大家分享下数据库的创建和删除的步骤,里面有很多细节需要大家考虑。创建数据库不只是一个create database语句。删除数据库 drop database也不是随时都能执行的。 --创建数据库的步骤。 1.用户,文件系统,挂载点和网络的配置,内核参数配置 这个需要提前准备好。 2.ORACLE_HOME的安装和PSU oracle_home的安装,这个也可以静默安装,不过有条件还是图形界面装,也省事。 最好打上最新的psu。省去不少潜在的问题。 3.初始化参数的考虑 有4个必备的参数。 db_
Oracle数据库对很多开发人员而言,基本就只是一个存储数据的仓库,只不过这个仓库功能非常强大,额外提供了很多好用的功能,需要的时候会用就好,不会纠结于某个细节。而对很多DBA而言,正好相反,喜欢沉溺于某些细节上,对某些小知识点对应的原理理解的非常透彻,但却往往很少会站在开发层面认识Oracle。 本文旨在构造一份相对较全面的测试数据,对开发常用的对象都模拟创建一份测试用例,DBA就可以直接拿去做一些基本测试。
Keyword: DDL 定义 Data Definition Language 可以通过以下的方法获取数据库对象的定义(DDL)。 1. 使用DBMS_METADATA.GET_DDL程序包 SQL> set pages 0 SQL> set longchunksize 3000 SQL> set long 2000000000 SQL> select dbms_metadata.get_ddl('<对象类型>','<对象名>','<对象SCHEMA>') fro
前阵子在漏洞扫描后,有些暂时不再使用的数据库链接Database Link需要删除。出于万一后续需要再用的情况考虑,于是乎先备份这些Database Link。首先让我想到的是直接生成DDL就行。事实上这DDL并不包含链接用户的密码。此路不通,所以就只能考虑用expdp工具来进行备份了。其次由于有些数据库用户的密码未知,因此这些用户创建的数据库链接在sys账号下无法删除。下文则是这些个问题的描述与解决。
在数据库优化中,索引的重要性是不言而喻的。但是,在性能调整过程中,一个索引是否能被查询用到,在索引创建之前是无法确定的,而创建索引是一个代价比较高的操作,尤其是当数据量较大的时候。这种情况下,创建虚拟索引是一个很好的选择。
XTTS(Cross Platform Transportable Tablespaces)属于跨平台迁移表空间,它是从Oracle 8i开始就引入的一种基于表空间传输的物理迁移方法,命名为TTS,经历各个版本的不断演进,从11gR2开始,在相对停机时间要求日益减少的情况,为了应对越来越大的数据量跨平台迁移,Oracle推出了新的解决方案—加强版TTS(以下简称XTTS),XTTS使用增量备份的方式实现跨平台的数据迁移,从真正意义上大大缩短停机时间。在U2L如火如荼的今天,通过XTTS快捷、高效、平稳、安全的将Oracle数据库“小型机+集中式存储”环境迁移至“X86架构平台+分布式存储”已然成为一大神技。
环境:Solaris 10 + Oracle 11.2.0.1 现象:alert告警日志定期出现ORA-600 [13011]错误
Oracle Database 23ai支持Lock-Free Reservation,中文通常译为“无锁列值保留”。
近期计划使用XTTS方式迁移某库,在进行自包含检查时发现,该库有部分数据(分区表、索引)存放于SYSTEM表空间中,需要先将这部分数据移动到要迁移的表空间中。
有时候想查看一个package的信息,但是对于package的名字不是很确定,比如只知道一个大概,知道一些关键字,这个时候通过图形工具是查找不到package的信息的,而且对于package的信息,我只关心package里面有哪些存储过程,哪些函数等,看看简单的参数情况就可以了,类似sqlplus的desc的形式。 shell脚本的实现如下, 以下的脚本是查看是否有对应的package信息。 PROC_OWNER=`sqlplus -silent $DB_CONN_STR@$SH_DB_SID <<END
继昨天一个SQL语句导致的ORA-00600错误之后,我给出了背景和初步的分析结果,今天来给出我的结论,当然说明原因不是我的本意,还有反思。 首先语句类似这样的形式: MERGE INTO (SELECT * FROM TEST_SERVER_LOG WHERE BUY_TIME>=TO_DATE(:1 ,'YYYY-MM-DD HH24:MI:SS') AND BUY_TIME<to_date(:2 ,'yyyy-mm-dd="" hh2
今天开发的同事找到我,让我帮他们补一部分数据,因为有一个表的数据已经快一个月没有增量数据了,这个需求听起来有些奇怪是不? 问题的背景是在统计库中存在一个表,供部分应用做统计分析,每天会根据时间生成一条记录,这条记录汇总的数据会作为统计分析所用。但是每天的这一条增量数据的源头来自于另外两个在线交易库。两个库中的数据会做一些关联,大体的实现思路就是下面的形式。 现在OLAP的库中的表里的部分增量数据没有按照时间增加,所以对前端应用的统计造成了一定的影响。 当然对于DBA而言,这部分逻辑还是未知的,可能跨业务部
客户的测试环境已经从10g升级到11g了。但是没过几天,数据hang住了,登都登不了了,而且通过sys,system,普通用户连接的错误都不一样 首先通过 一下命令来查看变量和进程是否都正常 ps -ef|grep smon echo $ORACLE_SID 没发现问题 --使用sys,显示连接到一个空实例 sqlplus / as sysdba SQL*Plus: Release 11.2.0.2.0 Production on Tue Aug 13 14:51:25 2013 Copyright
实验环境:Oracle 11.2.0.4 以获取jingyu用户下的T1表为例:
在工作中难免碰到需要提取用户权限或是不同数据库用户权限的同步问题。我们知道,Oracle数据库的任意一个用户,必须有相应的权限才可以登录以及操纵数据库对象。同时这些用户存在对象权限、系统权限以及所属用户组的情形,或这三种情况同时存在。本文首先通过脚本获取任意指定用户的所有权限,然后产生特定用户所有权限相关的DDL,最后演示了一个权限同步的例子。 有关用户角色的相关概念可参考: Oracle 用户、对象权限、系统权限 Oracle 角色、配置文件
##指定表:sh GetTabStript.sh “dbrwdadm” “dbrwdadm” “chnrwd” “DBRWDADM” “DCUSTMSG SCHNKPI” “CreateTable.sql”
Oracle Datapump API 是基于PL/SQL实现的,是命令行方式下的补充。使用Datapump API可以将其逻辑备份特性将其集成到应用程序当中, 基于界面来实现有利于简化其管理。本文主要描述的使用Datapump API描述各种不同情形的数据导出。
点击上方蓝色字关注我们~ online indexbuild (online create或者rebuild index)是Oracle的一个极其常用的online操作,我们知道当创建索引或者重建索引没有加online关键字的话,会请求表对象上的4号TM锁,而DML请求的是3号TM锁,3和4的TM锁并不兼容,所以在索引创建或者重建期间是无法进行DML操作的,等待事件为enq: TM – contention。 为了改进这一缺陷,在Oracle 8i推出了online indexbuild功能,并且在11.
编辑手记:注重细节,是DBA必要的基本素质要求。 书接上文(参考:空与非空 - 数据库中也有薛定谔的猫?),其实CBO的判断本身是没有问题的,问题在于,为什么一个空值会存在非空约束的字段中。 SQL> select dbms_metadata.get_ddl('TABLE', 'T_DEF') from dual; DBMS_METADATA.GET_DDL('TABLE','T_DEF') ------------------------------------------------------
近期公司有个项目,需要将一套AIX上的rac 11g,迁移到华为云上,数据量大概4T,停机时间2小时,目前最大问题是本地磁盘空间不足。起初,想到的是OGG或XTTS,XTTS没啥问题,最适合做这类迁移了。对于OGG来说,OGG初始化需要导出和导入,仍然需要临时的本地磁盘空间,当时把该方案直接pass掉了,后来回头想想,似乎可以使用network_link来解决这个问题。使用impdp+network_link导入完成后,再配置OGG实时同步,即可实现AIX到Linux的迁移。
有时候在工作中,可以使用exp/imp得到表的创建语句。 如果想得到关于table,index,constraint的语句,可以考虑使用dbms_metadata来实现。 我们可以使用如下的脚本来得到建表语句,对应的索引语句,和ref_constraint语句。 建表语句就不多说了,关于索引的部分,过滤了主键和唯一性索引的部分,这些语句会和建表语句中的constraint有一定的冲突,而foreign key的语句在建表语句中也不建议使用,这样会对其他表产生依赖,可以考虑单独生成这部分的语句,最后执行。 所
最近测试环境需要把一些现有的存储空间匀出一部分来给新增的环境使用。 unix组的人很快就空间按照指定的比例重新切分好了。环境交给我的时候,我先把数据库起来,没有任何问题,因为需要到处一个创建用户的语句,就简单执行了一个查询。 select dbms_metadata.get_ddl('USER',u.username) from dba_users u WHERE USERNAME in('TEST'); 但是让我意外的,报了如下的错误。 SQL> select dbms_metadata.get_ddl(
今天碰到一个问题,在drop primary key的时候,提示ORA-02273的错误。 SQL> ALTER TABLE AR1_ACCOUNT DROP PRIMARY KEY; ALTER TABLE AR1_ACCOUNT DROP PRIMARY KEY * ERROR at line 1: ORA-02273: this unique/primary key is referenced by some foreign keys 通过下面的字典表查找的关联的表 SQL> SELECT con.c
Oracle提供了utlrp.sql和utlprp.sql脚本来重新编译数据库中的所有无效对象,
由于本次迁移为历史库迁移,且数据库未开启归档模式,所以选择较为便捷第二种方式进行迁移。
对 DBA 而言,CREATE TABLE AS 可谓是家常便饭,顺手拈来。需不知该方式虽然简单,但疏忽也容易导致意想不到的问题。笔者前阵子就碰上 了这样的事情。由于是对原表进行克隆,且数据存储在不同的表空间,因此毫不犹豫地使用了CREATE TABLE AS,结果在运行package时,error...
事情是这样的,前几天在墨天轮社区问答区上有个问题 “Oracle 用户密码已经过期,但不知道原密码的情况下,如何解决”?看意思是想让已有的应用使用原来的老密码继续连接,问题前提是不知道原密码,那么该怎么解决呢?肯定是重置密码呀!怎么重置,使用明文密码肯定不行,这里有点小道道,继续往下看吧。
对于同义词的备份我们有多种方式来实现,如直接通过脚本生成同义词的创建脚本,或者使用dbms_metadata.get_ddl来提取同义词的定义脚本。然而在使用传统的exp或是datapump expdp实现schema级别数据迁移时,不能导出公共同义词。尽管如此,我们依旧可以使用导出导入的方式来实现。所不同的是,我们使用FULL=Y的方式来单独导出同义词,然后再将其导入的目标数据库。下文是对此进行的描述,末尾也给出了手动创建同义词的脚本。
领取专属 10元无门槛券
手把手带您无忧上云