64位系统下shmmax设置问题
系统配置:64位redhat linuxe as3 ,oracle9204,机器有8G内存以前在32位系统下,shmmax的含义是单个共享内存段的最大尺寸,比如你设置shmmax=1G,sga分配了1.2G,当启动db时就分配2块共享内存给oracle。可是最近在64位上测试,发现当设置shmmax <= 956301311时,sga的分配规律和32位上一样。但是如果设置shmmax > 956301311,则如果sga设置的值大于shmmax的值且大于2.3G时,启动数据报错:SQL> startupORA-27123: unable to attach to shared memory segment下面是个在64位上的测试结果:[@more@]shmmax值 SGA值 分配共享内存是
KEEP POOL和CACHE属性的区别
我们知道可以设置表的属性CACHE将表数据放入数据缓存中,也可以设置表将其放入KEEP缓冲池,这两者的区别如下:[@more@]BUFFER POOL包括DEFAULT、KEEP、RECYCLE三个POOL,其大小分别对应三个参数:DB_CACHE_SIZE, DB_KEEP_CACHE_SIZE, DB_RECYCLE_CACHE_SZIE,这三个POOL相互独立,没有包含的关系。语法如下:create/alter table ...... storage(buffer_pool keep); 当表被读入的时候,放入keep pool,keep pool 中的数据会尽量长时间的保留,保留的时间长短依据keep pool的负载而定。create/alter table ...... cache; 当全表扫描时,放入
导入导出中支持表名模式匹配
这个特性是从9i开始支持的,格式如下:TABLES=(MYSCHEMA.ORDER%, MYSCHEMA.EMP%)可以将以模式MYSCHEMA下以ORDER、EMP开头的表导出或者导入,下面是个简单的验证过程[@more@][oracle@localhost oracle]$ sqlplus test/testSQL*Plus: Release 9.2.0.4.0 - Production on 星期三 4月 26 09:38:26 2006Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.Connected to:Oracle9i Enterprise Edition Release 9.2.0.4.0 - ProductionWith the Partitioning, OLAP and Oracle Data Mining optionsJServer Release 9.2.0.4.0 -
在64位的RHAS3上安装ORACLE9204
操作系统版本如下:[root@test gpodb]# cat /etc/redhat-release Red Hat Enterprise Linux AS release 3 (Taroon Update 5)[root@test gpodb]# uname -aLinux test 2.4.21-32.EL #1 SMP Fri Apr 15 21:02:58 EDT 2005 x86_64 x86_64 x86_64 GNU/Linux安装结论:安装前不用打任何补丁包,直接安装9204的安装文件即可[@more@]
在高级复制环境中执行DDL处理步骤
在高级复制环境中的对于需要复制的对象作任何DDL操作,都应该使用高级复制程序包来实现,下面是在一个复制表上添加两个列的DDL操作的处理流程。[@more@]首先说明一下测试环境:oracle9204,单主体站点,只读物化视图在非复制环境中简单的添加列的语句:ALTER TABLE DEMO ADD (D2 NUMBER,D3 NUMBER);一、在主体站点上执行的步骤1、挂起复制组DBMS_REPCAT.SUSPEND_MASTER_ACTIVITY(GNAME =>'REP_GROUP');2、通过高级复制包中的过程来执行DDLDBMS_REPCAT.ALTER_MASTER_REPOBJECT (SNAME =>'SCOTT',ONAME =>'DEMO',TYPE =>'TABLE'
关于Oracle9i中timestamp数据类型的一个bug
今天在网友blog上看到一片文章描述通过数据库链使用CTAS建表时,如果在源表中含有timestamp类型的列,则新创建的表的timestamp列的精度被置为最小即timestamp(0)Bug 2417643,该bug在10g中已经被修正过来,下面是我在9204中的测试验证 [@more@]1、在数据库A中创建源表SQL> create table demo (d1 timestamp(6));Table createdSQL> desc demoName Type Nullable Default Comments ---- ------------ -------- ------- -------- D1 TIMESTAMP(6) Y SQL> insert into demo(d1) values (timestamp'2005-04-17 14:12:03.234');1 row i
定制作业以半小时为单位执行
即要以30分钟为单位取整执行,有以下两种方法:-- 简单起见,只写取下一次时间的算法方法一:SQL> select trunc(sysdate,'HH24')+(trunc(sysdate+1/48,'HH24')-trunc(sysdate,'HH24'))/2+1/48 from dual;TRUNC(SYSDATE,'HH24')+(TRUNC(S------------------------------2006-4-12 15:30:00 方法二:QL> select trunc(sysdate,'HH24')+CASE WHEN TO_CHAR(SYSDATE,'MI')>=30 THEN 1/24 ELSE 1/48 END from dual;TRUNC(SYSDATE,'HH24')+CASEWHEN------------------------------2006-4-12 15:30:00 [@more@]
使用自定义聚集函数来实现分组合并字符串
oracle自定义聚集函数接口简介 a. static function ODCIAggregateInitialize(sctx IN OUTstring_agg_type ) return number 自定义聚集函数初始化设置,从这儿开始一个聚集函数 b. member function ODCIAggregateIterate(self IN OUT string_agg_type ,value IN varchar2) return number 自定义聚集函数,最主要的步骤,这个函数定义我们的聚集函数具体做什么操作,后面的例子,是取最大值,最小值,平均值,还是做连接操作.self 为当前聚集函数的指针,用来与前面的计算结果进行关联 c. member functio
oracle10g中的bigfile tablespace
bigfile tablespace是Oracle10g的新特性。Bigfile tablespaces包含1个最大4G个blocks 的datafile。因此,使用8KBdata blocks 的bigfile tablespace 最大可以达到32TB。Bigfile tablespaces 常用于非常大的DB。 如果很大的DB有成千的 read/write datafiles, 那么checkpoints之类的操作将非常费时。如果用一个很大的datafile,减少datafiles的数量,将会提高效率。创建时使用BIGFILE关键字如下:CREATE BIGFILE TABLESPACE BIG_DEMODATAFILE '/ORADATA/PROD/BIG_DEMO.DBF' SIZE 25G;Smallfile tablespace是原Oracle tablespace datafile 选项
语法novalidate对添加主键约束不起作用
最近在看tom的《Effective Oracle by design》,其中第6章6.3.8节有个例子是给表添加主键,但是不想对已经存在的数据进行校验:alter table dept add constraint dept_pk primary key(deptno) rely enable novalidate;我经过测试,发现即使加上novalidate语法也还是要检验的,测试如下:[@more@]SQL> create table aaa as select * from all_users;Table createdSQL> insert into aaa select * from aaa;29 rows insertedSQL> alter table aaa add constraint pk_aaa primary key(username) rely enable novalidate;alter table
批量绑定与本地动态SQL execute immediate的结合
批量处理不仅可以和静态sql组合,也可以和动态sql结合使用,但是在8i和9i中,其具体处理方式有些差异 [@more@]1> 在8i环境下create table aaa (a1 number);create type vcarray as table of number; create or replace procedure p_demo isp_value vcarray := vcarray(); beginfor i in 1..10000loop p_value.extend;p_value(i) := i;end loop;execute immediate'beginforall j in 1..10000insert into aaa values (:x(j));end;'using p_value;commit;end p_demo;注意:1、使用数组类型要先初始化p_value vcarray := vcarray()2、不要在
关于exists、in系列的补充说明
1、在Oracle8i中,当使用exists时,如果两表连接字段使用函数或||之类的特殊处理,其执行计划不能走hash semi的半连接,这时需要将其改成in的格式来处理,9i中就不存在这种情况 [@more@]Oracle 8i 中:select count(*)from t_cp_dz_user twhere t.strdatetime > '0602'and exists(select /*+ hash_sj(t q)*/* from t_200602_yd_3 qwhere q.mpn=substr(t.strusernumber,3) )执行计划:SELECT STATEMENT, GOAL = CHOOSE SORT AGGREGATE FILTER TABLE ACCESS FULL Object owner=SMSTABLE ACCESS FULL Object owner=SMS select count(*)fro
使用vnc访问linux
这两天公司网络重新配置了,我的pc的ip也换了,结果平时用来统计数据的linux服务器不能用xmanager连上,能ping通,ssh也能访问,估计是交换机设置有问题。但又急着用图形界面,于是换用vnc来访问。配置很简单,网上到处都有资料,这里就不重复了。感觉使用vnc,客户端可以使用浏览器就能访问,这是最方便的一点,缺点是图形比较差,这点就不如xmanager了[@more@]
关于按周统计数据
方法1:使用to_char函数select sum(sal) ,to_char(HIREDATE,'yyyy')||':'||to_char(HIREDATE,'IW') week_snfrom scott.empgroup by to_char(HIREDATE,'yyyy')||':'||to_char(HIREDATE,'IW');格式'IW'返回当前日期是当年的第几周方法2:使用next_day()函数select sum(sal) ,NEXT_DAY(trunc(HIREDATE),'星期一')-7 weekstart,NEXT_DAY(trunc(HIREDATE),'星期一') weekend from scott.empgroup by NEXT_DAY(trunc(HIREDATE),'星期一');上面这个例子是在中文字符集下使用,如果在英文字符集下则使用:select sum(sal) ,NEXT_DAY(trunc(HIREDAT
学前班照片
今天在5460上的小学班上弄到了学前班时期的照片,这张照片不知为什么我没有(可能丢了吧),高中时见别人拿出来过。看着上面的时间:1984.7 ,都21年了。看着小时候的自己,发现,现在真是老了。。。。[@more@]
限制用户登录后idle时间
今天一朋友想设置如果客户登录数据库后长时间不操作,就强制其退出。记得这是在profile中配置idle_time,设置成要求的时间,再更换数据库用户的profile,重新登录。可是测试居然无效,超时后用户没有退出,查了手册,原来还要设置初始化参数resource_limit=true才行。[@more@]
使用exists、not eixsts不能用到semi-join、anti-join的一些情况讨论
在Oralce中我们经常会使用exists、not exists来进行一些表连接操作,在普通情况下Oracle的执行计划如果使用到semi-join、anti-join方式来进行表连接的话,速度一遍很快,否则很慢。通过使用提示hash_sj hash_aj也可使执行计划走semi-join、anti-join。但是在有些情况下,即使增加了提示,或者对表进行了分析后,执行计划也不走semi-join、anti-join方式,下面就是对这些情况的讨论。附注:本文中的例子均是在Oracle9.2.0.6 for linux中测试的。[@more@]1、在where条件中多个exists、not exists是or的关系SQL> create table a1 as selec
oracle9i(10g)中使用full outer join遇到bug
今天在oracle9206中使用full outer join遇到bug,执行没有响应,例子如下:[@more@]SQL> select * from p1;MPN CNT----------- ----------1 52 6SQL> select * from p2;MPN CNT----------- ----------2 83 9简单点的没有问题:SQL> select a.mpn,a.cnt,b.mpn,b.cnt2 from (select mpn,sum(cnt) cnt from p1 group by mpn) a3 full outer join4 (select mpn,sum(cnt) cnt from p2 group by mpn) b5 on a.mpn=b.mpn;MPN CNT MPN CNT----------- ---------- ----------- ----------2 6 2 81 53 9如果出现统计多字段查询就无相应了:
Oracle9i中的PGA
1、PGA的结构 Oracle的内存结构,除了SGA(System Global Area)之外,Oracle进程还使用下面三个全局区:The Process Global Area (PGA)The User Global Area (UGA)The Call Global Area (CGA)[@more@]很多人都搞不清楚PGA和UGA两者之间的区别,实际上两者之间的区别跟一个进程和一个会话之间的区别是类似的.尽管说进程和会话之间一般都是一对一的关系,但实际上比这个更复杂.一个很明显的情况是MTS配置,会话往往会比进程多得多.在这种配置下,每一个进程会有一个PGA,每一个会话会有一个UGA.PGA所包含的信息跟会话是无任何关联的,而UGA包
理解Oracle9i中的监听动态注册
在Oracle9i中,使用命令lsnrctl status可以看到如下例子:Service "lrdb" has 2 instance(s).Instance "lrdb", status UNKNOWN, has 1 handler(s) for this service...Instance "lrdb", status READY, has 1 handler(s) for this service...[@more@]这是Oracle9i监听器行为的不同之处的第一个线索,因为Instance "lrdb"出现了两次。出现额外条目是因为,数据库在启动时通过一个被称为动态注册的进程在监听器中注册信息。相应地,如果数据库通过listener.ora文件中的信息在监听器中注册数据库着称为