Oracle中比对2张表之间数据是否一致的几种方法

toad_compare_data7

大约是2个星期前做一个夜班的时候,开发人员需要比对shareplex 数据同步复制软件在 源端和目标端的2张表上的数据是否一致,实际上后来想了下shareplex 本身应当具有这种数据校验功能, 但是还是希望从数据库的角度得出几种可用的同表结构下的数据比对方法。

 

注意以下几种数据比对方式适用的前提条件:

 

1. 所要比对的表的结构是一致的 2. 比对过程中源端和 目标端 表上的数据都是静态的,没有任何DML修改

 

方式1:

假设你所要进行数据比对的数据库其中有一个版本为11g且该表上有相应的主键索引(primary key index)或者唯一非空索引(unique key &not null)的话,那么恭喜你! 你可以借助11g 新引入的专门做数据对比的PL/SQL Package dbms_comparison来实现数据校验的目的,如以下演示:

 

 

Source 源端版本为11gR2 : conn maclean/maclean SQL> select * from v$version; BANNER ——————————————————————————– Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – 64bit Production PL/SQL Release 11.2.0.3.0 – Production . . . → Read More: Oracle中比对2张表之间数据是否一致的几种方法

如何禁止特定用户使用sqlplus或PL/SQL Developer等工具登陆?

logon_plsqldeveloper

最早想要实现禁止某些特定用户使用SQLPLUS或PL/SQL Developer等工具登陆是在2010年的3月,当时发现用户的一套数据库中有大量的用户使用老版本的PL/SQL Developer登陆,具体的版本号记不清楚了,大约是PL/SQL Developer 5的版本,是否正版授权不得而知, 反正就是一个办公室里有大量的阿姨、大叔都靠这个图形化工具访问数据库,做一些必要的数据操作,主要是一些SQL查询语句,有时候他们还会用工具栏查一些对象(search object),正是因为他们使用了老版本的PL/SQL Developer,造成在使用一些widget的时候会引起Oracle出现一些非致命的ORA-00600错误,虽然这些600错误不会导致严重的问题,但是只要是出现在告警日志Alert.log中的600还是需要我们去分析。

当时我的想法是直接从Oracle的角度禁止普通用户以PL/SQL Developer工具登陆,虽然当时没有真的这样做。 题外话,要真的这么做了,估计那一办公室的阿姨、叔叔都要找我的麻烦,他们可不会用SQLPLUS来登数据库;让他们升级PL/SQL Developer到高版本的想法也基本可以打住,让阿姨、叔叔们升级可要比登天还难。

Google了一番,没有找到太多有用的信息。

闲来无事,我在著名的Oracle-l Freelist邮件列表中发了一封邮件,集思广益:

 

Hello every, Anyone can advise how to ban plsql developer connect to oracle? The plsql developer search widget may cause some ora-600 warning in alert log . So I want to ban any connection using plsql developer.

 

Oracle-l . . . → Read More: 如何禁止特定用户使用sqlplus或PL/SQL Developer等工具登陆?

Oracle中的Package/Procedure/Function存放在哪里?

procedureinfo$

有同学问Oracle 的package、Procedure、Function 这些PL/SQL程序单元分别存放在哪里?

针对这个问题我们可以通过对create package、Procedure、Function 做trace分析来了解其细节,如:

 

SQL> select * from v$version; BANNER —————————————————————- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 – 64bi PL/SQL Release 10.2.0.1.0 – Production CORE 10.2.0.1.0 Production TNS for Linux: Version 10.2.0.1.0 – Production NLSRTL Version 10.2.0.1.0 – Production SQL> select * from global_name; GLOBAL_NAME ———————————————– www.oracledatabase12g.com & www.askmaclean.com SQL> oradebug . . . → Read More: Oracle中的Package/Procedure/Function存放在哪里?

PL/SQL Virtual Machine Memory Usage

PL/SQL Program Units即PL/SQL程序单元,常被叫做”library units”或lib-units.

参考以下模块类型:

package spec package body top-level function or procedure type spec type body trigger anonymous blocks.

PL/SQL 虚拟机的内存使用主要体现在4个方面:

PGA PL/SQL stack call,用于保存本地变量和其他一些状态结构 NCOMP生成的动态链接库文件 CGA 二级内存(secondary memory),分配的堆和大的可收缩本地变量如大的strings、Lob或collections UGA 程度单元的实例(library-unit instantiations),如package global variables, DL0/ DL1 dependency vectors, display frame等 SGA 共享池中的MCODE子堆

KGL – Kernel Generic Library Manager 该layer管理会话间需要共享的资源,如PL/SQL MCODE,Diana,Source,SQL cursor,SQL Plan)

KGI – . . . → Read More: PL/SQL Virtual Machine Memory Usage

ORA-22813 When Using Bulk Collect in PL/SQL

Applies to:

PL/SQL – Version: 9.2.0.1 and later [Release: 9.2 and later ] Information in this document applies to any platform. Checked for relevance on 25-Nov-2010

Symptoms

While running PL/SQL code that uses a BULK COLLECT you receive the error

ORA-22813 – operand value exceeds system limits

Cause

An ORA-22813 when using BULK COLLECT is . . . → Read More: ORA-22813 When Using Bulk Collect in PL/SQL