2006 年 11 月 01日, 星期三
Oracle 9i concept 7 Memory Architecture
1.5.3本文参考资料
序号
书名
章节
出版单位
1
《Oracle9i Database Concepts》
Release 2 (9.2) Part Number A96524-01
14
SQL,PL/SQL, and Java
oracle
2
《Oracle9i Database Concepts》
Release 2 (9.2) Part Number A96524-01
7
Memory Architecture
oracle
3
《Oracle9i Database Concepts》
Release 2 (9.2) Part Number A96524-01
4
The Data Dictionary
oracle
4
《Oracle9i Database Performance Tuning Guide and Reference》
Release 2 (9.2) Part Number A96533-02
14
Memory Configuration and Use
oracle
bitmap索引超级异常无限扩大问题
今天遇到这么一个情况:
一朋友的现场发现表空间不够,就一直加表空间的size,一直加到6G,还是会提示不够,报告错误。
后来从系统视图得知,某表A,有约40M,在上面的3个字段上建了bitmap索引,该索引已扩展到5821M。
为了赶紧解决问题,把该索引直接drop了,系统开始正常,不到1秒就drop掉了。
========================================
原始表40M,bitmap索引5821M,明显异常。
然后从alert.log里检查错误,与此有关,只有唯一一个错误提示:
ORA-1654: unable to extend index MEES.A_IND_1 by 8192 in tablespace XXXSPACE
没有任何跟踪文件生成。
在第一次出现这个错误提示的紧接着,分配了N多undo segment(从 alert.log文件摘出)。
各位有遇到过这事的吗?知道什么原因吗?
附alert.log错误部分:
Thu Oct 26 00:58:01 2006
ORA-1654: unable to extend index MEES.A_IND_1 by 8192 in tablespace XXXSPACE
Thu Oct 26 01:51:59 2006
Created Undo Segment _SYSSMU11$
Undo Segment 11 Onlined
Thu Oct 26 01:52:12 2006
Created Undo Segment _SYSSMU12$
Undo Segment 12 Onlined
Thu Oct 26 01:52:23 2006
Created Undo Segment _SYSSMU13$
Undo Segment 13 Onlined
Thu Oct 26 01:53:00 2006
Created Undo Segment _SYSSMU14$
Undo Segment 14 Onlined
Thu Oct 26 01:53:37 2006
Created Undo Segment _SYSSMU15$
Undo Segment 15 Onlined
Thu Oct 26 01:53:51 2006
Created Undo Segment _SYSSMU16$
Undo Segment 16 Onlined
Thu Oct 26 01:54:19 2006
Created Undo Segment _SYSSMU17$
Undo Segment 17 Onlined
Thu Oct 26 01:55:04 2006
Created Undo Segment _SYSSMU18$
Undo Segment 18 Onlined
Thu Oct 26 01:55:16 2006
Created Undo Segment _SYSSMU19$
Undo Segment 19 Onlined
Thu Oct 26 01:55:22 2006
Created Undo Segment _SYSSMU20$
Undo Segment 20 Onlined
Thu Oct 26 01:56:26 2006
Created Undo Segment _SYSSMU21$
Undo Segment 21 Onlined
Thu Oct 26 01:58:14 2006
Created Undo Segment _SYSSMU22$
Undo Segment 22 Onlined
Thu Oct 26 01:58:33 2006
Created Undo Segment _SYSSMU23$
Undo Segment 23 Onlined
Thu Oct 26 01:58:52 2006
Created Undo Segment _SYSSMU24$
Undo Segment 24 Onlined
Thu Oct 26 01:59:18 2006
Created Undo Segment _SYSSMU25$
Undo Segment 25 Onlined
Thu Oct 26 01:59:31 2006
Created Undo Segment _SYSSMU26$
Undo Segment 26 Onlined
Thu Oct 26 01:59:36 2006
Created Undo Segment _SYSSMU27$
Undo Segment 27 Onlined
Thu Oct 26 02:00:09 2006
Created Undo Segment _SYSSMU28$
Undo Segment 28 Onlined
Thu Oct 26 02:00:09 2006
Created Undo Segment _SYSSMU29$
Undo Segment 29 Onlined
Thu Oct 26 02:11:12 2006
Created Undo Segment _SYSSMU30$
Thu Oct 26 02:11:12 2006
Undo Segment 30 Onlined
Thu Oct 26 02:11:13 2006
Created Undo Segment _SYSSMU31$
Undo Segment 31 Onlined
Thu Oct 26 02:16:47 2006
Created Undo Segment _SYSSMU32$
Undo Segment 32 Onlined
Thu Oct 26 03:57:34 2006
Thread 1 advanced to log sequence 621
cursor工作原理一点点说明
有网友说:
db instance: share modle.
open cursor时, 想问一下:
1.如果没设large pool, cursor用的是UGA, 如果UGA用完了接着用哪个空间?还是会报错?
2. 如果设定了large pool, cursor用的是large pool, large pool也用完了,接着oracle会怎么处理?
为了这个问题,我查了好几天的资料,以下描述,仅查询oracle 9i资料。
先从cursor的定义来看:
Cursors
A cursor is a handle or name for a private SQL area--an area in memory
in which a parsed statement and other information for processing the
statement are kept.
Although most Oracle users rely on the automatic cursor handling of the
Oracle utilities, the programmatic interfaces offer application
designers more control over cursors. In application development, a
cursor is a named resource available to a program and can be used
specifically to parse SQL statements embedded within the application.
Each user session can open multiple cursors up to the limit set by the
initialization parameter OPEN_CURSORS. However, applications should
close unneeded cursors to conserve system memory. If a cursor cannot be
opened due to a limit on the number of cursors, then the database
administrator can alter the OPEN_CURSORS initialization parameter.
Some statements (primarily DDL statements) require Oracle to implicitly
issue recursive SQL statements, which also require recursive cursors.
For example, a CREATE TABLE statement causes many updates to various
data dictionary tables to record the new table and columns. Recursive
calls are made for those recursive cursors; one cursor can run several
recursive calls. These recursive cursors also use shared SQL areas.
-----引自《Oracle9i Database Concepts Release 2 (9.2) Part Number A96524-01》的第14章SQL, PL/SQL, and Java。
总的来说,定义的cursor的意思大体是:
A cursor is a handle or name for a private SQL area.In application
development, a cursor is a named resource available to a program and
can be used specifically to parse SQL statements embedded within the
application.Each user session can open multiple cursors up to the limit
set by the initialization parameter OPEN_CURSORS. Some statements
(primarily DDL statements) require Oracle to implicitly issue recursive
SQL statements, which also require recursive cursors.
这么说来,cursor是一条SQL语句的句柄,或private SQL area的名字,或对应用程序来说是一个命名资源。
那么,说起cursor,就应该从一条SQL语句的执行过程说起和private SQL area是怎么分配,在那里分配的了?
cursor分显式和隐式,比如我们在pl/sql里自己定义的游标,然后用明确的open语句打开了,那么就是显式的;如果用for x in cur_data的方法打开游标,那么就是隐式的了。不管是那一种,他都是一个游标。
关于SQL语句的执行过程,可以参考:《Oracle9i Database Concepts Release 2 (9.2) Part
Number A96524-01》的第14章“SQL, PL/SQL, and Java”的“SQL Processing”这一节。
从这一节我们可以看到,SQL语句执行的第一步就是创建游标:
Stage 1: Create a Cursor
A program interface call creates a cursor. The cursor is created
independent of any SQL statement: it is created in expectation of any
SQL statement. In most applications, cursor creation is automatic.
However, in precompiler programs, cursor creation can either occur
implicitly or be explicitly declared.
然后,就是把SQL语句交给Oracle来解析,此时如果在shared pool的library
cache发现一个和该SQL语句一样的shared SQL area,那么,直接拷贝一份作为private SQL
area来执行,此叫做发生一次soft parse;如果没有找到,那么就要解析该SQL,也就是要得到该SQL的parse
tree和execution plan,分配内存,存储这些信息为一个shared SQL area,然后拷贝一份做为private SQL
area然后再执行,此为发生一次hard parse。
对于private SQL area,参考《Oracle9i Database Concepts Release 2 (9.2) Part
Number A96524-01》的第7章“Memory Architecture”,我们可以得到private SQL area的信息如下:
Private SQL Area
A private SQL area contains data such as bind information and runtime
memory structures. Each session that issues a SQL statement has a
private SQL area. Each user that submits the same SQL statement has his
or her own private SQL area that uses a single shared SQL area. Thus,
many private SQL areas can be associated with the same shared SQL area.
The private SQL area of a cursor is itself divided into two areas whose lifetimes are different:
* The persistent area, which contains, for example, bind information. It is freed only when the cursor is closed.
* The run-time area, which is freed when the execution is terminated.
Oracle creates the runtime area as the first step of an execute
request. For INSERT, UPDATE, and DELETE statements, Oracle frees the
runtime area after the statement has been run. For queries, Oracle
frees the runtime area only after all rows are fetched or the query is
canceled.
The location of a private SQL area depends on the type of connection
established for a session. If a session is connected through a
dedicated server, private SQL areas are located in the server process's
PGA. However, if a session is connected through a shared server, part
of the private SQL area is kept in the SGA.
Cursors and SQL Areas
The application developer of an Oracle precompiler program or OCI
program can explicitly open cursors, or handles to specific private SQL
areas, and use them as a named resource throughout the execution of the
program. Recursive cursors that Oracle issues implicitly for some SQL
statements also use shared SQL areas.
The management of private SQL areas is the responsibility of the user
process. The allocation and deallocation of private SQL areas depends
largely on which application tool you are using, although the number of
private SQL areas that a user process can allocate is always limited by
the initialization parameter OPEN_CURSORS. The default value of this
parameter is 50.
A private SQL area continues to exist until the corresponding cursor is
closed or the statement handle is freed. Although Oracle frees the
runtime area after the statement completes, the persistent area remains
waiting. Application developers close all open cursors that will not be
used again to free the persistent area and to minimize the amount of
memory required for users of the application.
上面的E文描述了,在private SQL area创建过程中,会有两个内存区域,第一个是The persistent
area,只有在cursor close才会释放,而另外一个The run-time
area,update,insert,delete语句一执行结束,或SELECT语句的所有行返回后,就会释放。
那么,private SQL area在那里分配的呢?shared SQL area 是在shared pool的library
cache里分配的,而private SQL area,如果是shared server模式,那么是在shared pool的library
cache里分配,如果是dedicated server,那么是在PGA里分配。那么这里的PGA说的是什么呢?
这里的PGA,说的是通过参数PGA_AGGREGATE_TARGET参数指定的PGA大小分配的区域。即这部分内容,已经不在SGA里分配了。
此时,如果是SQL语句里包含了sort,hash-join,bitmap create,bitmap merge,那么,还会在单独的分配SQL
work area来处理“sort,hash-join,bitmap create,bitmap merge”操作,这里的SQL work
area,如果WORKARE_SIZE_POLICY设置为auto,那么也是在GA_AGGREGATE_TARGET的范围里分配的,如果设置为
manual,那么是由*_AREA_SIZE(例如sort_area_size,hash_area_size,
create_bitmap_area_size)来分别定义大小的(如果分配的大小不够,此时temp表空间就排上用场了),分配的范围还是属于PGA
的。
到此,关于SQL语句的执行,主要是关于cursor的定义,我觉得应该是相对比较清楚了。
但是,想深一层,cursor的取值过程,比如1G的SGA,1G的PGA,取10G的大表全表数据,如果在pl/sql里打开游标处理,那么这些数据的处理过程是怎么处理的,还是没有描述出来,这里只表述了关于CURSOR这个SQL语句的分析处理过程。
这里,cursor有关的两个参数,open_cursor定义一个session最大能打开的cursor数,指的是打开后不关闭的情况,也就是可以创
建多少个private SQL
area,CURSOR_SHARING指的是符合那些标准的SQL语句可以认为是一类,是同一个SQL语句来被shared,即创建的shared
SQL
area可以被后续的那些SQL语句共享执行。SESSION_CACHED_CURSORS说的是一个session可以缓存多少个cursor,让后
续相同的SQL语句不再OPEN。
==================================
最后,针对楼主的问题:
db instance: share modle.
open cursor时, 想问一下:
1.如果没设large pool, cursor用的是UGA, 如果UGA用完了接着用哪个空间?还是会报错?
2. 如果设定了large pool, cursor用的是large pool, large pool也用完了,接着oracle会怎么处理?
cursor用完了,1是cursor个数用完了,受到open_cursors限制,应该会报错。2是cursor消耗内存消耗完了,这里cursor
对应的private SQL
area的PGA大小,应该是受到PGA_AGGREGATE_TARGET限制,如果超过了,那么就错了,而且,private SQL
area只是存储parsing tree和execute
plan等信息,size是很小的,默认的open_cursors=50,在加上process参数指定的会话数,应该是不会超过
PGA_AGGREGATE_TARGET,与此相关的shared SQL area,由于是在shared
pool,如果SQL语句太多,那么是受LRU list管理的,如果全部有用,而又不能淘汰,应该是会报告错误的。
至于large pool,如果配置了,应该也是和cursor没关系的。
按照《Oracle9i Database Concepts Release 2 (9.2) Part Number A96524-01》的第7章“Memory Architecture”定义:
Large Pool
The database administrator can configure an optional memory area called the large pool to provide large memory allocations for:
* Session memory for the shared server and the Oracle XA interface
(used where transactions interact with more than one database)
* I/O server processes
* Oracle backup and restore operations
* Parallel execution message buffers, if the initialization
parameter PARALLEL_AUTOMATIC_TUNING is set to true (otherwise, these
buffers are allocated to the shared pool)
large pool工作的4大块内容,只有session memory貌似和cursor有点关系,可是参考下面对session memory的定义:
Session Memory
Session memory is the memory allocated to hold a session's variables
(logon information) and other information related to the session. For a
shared server, the session memory is shared and not private.
session memory与cursor是没有关系的,那么,large pool,与cursor是没有关系的。
2006 年 10 月 17日, 星期二
plsql表比游标更快
在遇到使用游标嵌套循环时,由于我们需要在里层循环里open和close游标,这样重复很多次,导致性能会很低下。此时可以使用plsql来改善性能。使用plsql,每个游标只需要open close一次。减少的时间不是一点两点。
下面的例子仅是简单的示范用法和性能对比,经过分别多次执行,得到时间如下:
使用plsql表的执行时间约在 0 . 04 秒。
而不使用plsql表的执行时间约在 8 . 33 秒。
查看全文
2006 年 07 月 26日, 星期三
ORA-07445 [zllcini] or ORA-04045 in a Database with OLS Set to FALSE
转自metalink
Doc ID:
Note:233110.1
Type:
BULLETIN
Last Revision Date:
10-APR-2003
Status:
PUBLISHED
查看全文
Problems Description
--------------------
You may get OLS related errors in a database where the Oracle Label Security
option was not installed.
--> ORA-7445 core dump [zllcini...]
--> ORA-04045: errors during recompilation/revalidation of LBACSYS.LBAC_EVENTS
Oracle Label Security was added to V$OPTION in 9.2.0.1 so additionally you can
check in a 9.2.0.X database with a query on V$OPTION that OLS is not installed:
SQL> select * from v$option where parameter = 'Oracle Label Security';
PARAMETER VALUE
--------------------- -------------------------------------
Oracle Label Security FALSE
1) Core Dump in zllcini
--------------------
ORA-07445: exception encountered: core dump [zllcini()+186] [SIGSEGV]
[Address not mapped to object] [0xC] [] []
Current SQL statement for this session:
BEGIN
LBACSYS.lbac_events.logon(dbms_standard.login_user);
END;
----- PL/SQL Call Stack -----
object line object
handle number name
0x599ffb54 521 package body LBACSYS.LBAC_CACHE
0x59ce5d94 82 package body LBACSYS.LBAC_EVENTS
0x59a05a74 2 anonymous block
Typical Call Stack Trace :
zllcini spefcmpa spefmccallstd pextproc peftrusted psdexsp rpiswu2
psdextp pefccal pefcal pevm_FCAL pfrrun peicnt
2) ORA-4045 related to LBACSYS.LBAC_EVENTS
---------------------------------------
ORA-00604: error occurred at recursive SQL level 1
ORA-04045: errors during recompilation/revalidation of LBACSYS.LBAC_EVENTS
ORA-06508: PL/SQL: could not find program unit being called
ORA-06512: at line 2
ORA-06508: PL/SQL: could not find program unit being called
ORA-06512: at line 2
Solution Description
--------------------
1. Install Oracle Label Security with the Oracle Universal Installer
2. Run $ORACLE_HOME/rdbms/admin/catnools.sql script to disable OLS
3. Optionally de-install 'The Label Security' software
2006 年 07 月 19日, 星期三
数据仓库,杂记三:数据仓库环境
数据仓库中只有单一集成的数据资源,并且因为数据是可访问的,所以与传统数据环境相比,在数据仓库环境中DSS分析员的工作将要容易得多。
数据仓库是一个面向主题的、集成的、非易失的且随时间变化的数据集合,用来支持管理人员的决策。
数据仓库,杂记二:数据仓库设计环境
一、体系结构设计环境的层次在体系结构设计环境中有四个层次:操作层、原子或数据仓库层、部门层、个体层。
数据操作层----只保存原始数据并且服务于高性能事务处理领域,反映了当前信息值。
数据仓库层----存储不更新的原始数据,此外一些导出数据也在此存放,反映了历史变化信息,与操作层无重叠。
数据部门层----几乎只存放导出数据。也叫数据集市层,OLAP层或多维DBMS层,反映了一段周期的数据统计。
数据个体层----完成大多数启发式分析,主要认为集中在个人PC上运行完成。
查看全文
数据仓库,杂记一:数据仓库模型
一、蜘蛛网-自然演化体系结构:
起初只是抽取,随后是抽取之上的抽取,接着是在此基础上的再次抽取,如此等等。这种由失控的抽取过程产生的结构被称为“自然演化体系结构”当一个组织以放任自流的态度处理整个硬、软件体系结构时,就会发生这种情况。组织越庞大,越成熟,自然演化体系结构问题就变得越严重。
从总体上看,抽取程序形成了蜘蛛网,这正是自然演化(或“传统系统”)体系结构的另一个名称。
从历史来看,主要出现在银行,商场及其他一些营运公司。
2006 年 07 月 17日, 星期一
2006 年 07 月 10日, 星期一
用oracle来背单词
看英文文档的时候,总是遇到很多生词,那些是重点记住,那些属于无所谓的呢?我的想法是把文档里所有单词入库,只出现一次的,就不用背的,记得记不得就无所谓了,从而过滤一大P单词。
本文使用oracle的sqlldr,utl_file和shell脚本实现,简单,容易实现。
1,把文档单词入库:
1)手工拷贝整个电子文档(比如PDF文档),放入一个文本文件,如a.txt(直接拷贝完接,不用做其他处理)。
2)执行脚本(脚本内容见后文) 命令入库单词:%sh read_word.sh 文本文件名 表名 数据库连接字符串
比如%sh read_word.sh d32643.txt abc bigboar/bigboar@db121
查看全文
2006 年 06 月 15日, 星期四
Oracle 9204 与 fedora 缘尽core 4,与core 5无缘(oracle 9204在fc5上的安装)?
已发在:
http://www.itpub.net/570951.html
通
过检查Oracle安装帮助文档,我们可以发现,Oracle安装文档里写了的认证的linux操作系统只写了“SuSE Linux
Enterprise Server 7 (or SLES-7) with kernel 2.4.7, and glibc 2.2.2, GNU
gcc 2.95.3”。
但我们通过网上查资料和通过自己的测试,在linux内核为 2 . 4 . 1 到 2 . 4 . 2 1 时,Oracle 9i都是有方法可以安装成功的。
(BTW:对gcc的编译版本什么的,没有如文档要求的那么严格为2.95,或同志们说的2.96什么的,没关系,我在gcc 3.2什么的一样的安装!)
但如今,fc5的内核(我的是升级到2.6.16)2.6.15(初始安装好像是15),安装 9i,会在link时的18%处hang。通过手工
relink,把genclntsh脚本检查了,直到genclntst脚本的cp $object `basename
$object`行会出现$object为空报错,和/DIS***/报错,MD,还是在hang,再在网上搜索,看看别人是怎么做的,搜到如下信息:
引自:http://www.puschitz.com/InstallingOracle9i.shtml
“Red Hat 9:
Red Hat 9 includes the Native POSIX Thread Library (NPTL) which is an
improved implementation of POSIX threads for Linux. But using NPTL will
cause several problems for Oracle applications. Note that Oracle9i has
not been certified on Red Hat 9!
So to fix this problem, you can set the environment variable
LD_ASSUME_KERNEL to 2.4.1, which means that the old "Linuxthreads with
floating stacks" implementation will be used. Otherwise the Oracle
installer runInstaller will hang, the Database Configuration Assistant
dbca won't start etc.; see Oracle Installation Errors for more
information. To see where this environment variable can be set, see Set
Oracle Environments. For more information on LD_ASSUME_KERNEL, see Red
Hat Linux 9 Release Notes.
NOTE: Before you install Oracle9iR2, make sure that you first read the
information about the error message "Error in invoking target install
of make file /u01/app/oracle/product/9.2.0/network/lib/ins_oemagent.mk"
in the Oracle Installation Errors section!
”
NPTL?查查这是什么玩意儿,通过网上查:
http://fedora.gro.clinux.org/docs/R...kage-notes.html
“
7.1.3. LinuxThreads 与 NPTL
作为去除过时的 LinuxThreads 库的一个步骤,在 Fedora Core 5 test1 中编译和连接的代码现在自动使用 NPTL 头文件和库。
在过去的版本中,从 Red Hat Linux 9 开始,默认的线程模型是 LinuxThreads,因为接口是最通用的。NPTL
接口的优点在于,线程取消的处理更快 (使用 -fexception 参数时,即使在 C
代码中)。现在附加的接口也已可用,不需要特殊的编译器和连接器参数。也就是说,您不必再用 -I/usr/include/nptl 和
-L/usr/lib{,64}/nptl 选项了。注意 lib{,64} 应该理解为 lib64,如果这个平台将 DSO 文件放在
lib64/ 目录的话。
在 Fedora Core 5 test1 中仍然可以创建使用 LinuxThreads 的代码。为此,必须安装 linuxthreads-devel 软件包,并且
-I/usr/include/linuxthreads -L/usr/lib{,64}/linuxthreads
选项必须被传递给编译器。
过去,您可以使用运行时环境变量选择 glibc 的版本,以及 libpgthread DSH。现在,您需要同时指定这个环境变量:
LD_LIBRARY_PATH=/lib{,64}/obsolete/linuxthreads
需要这个附加的变量,是因为运行时库已经被移动到了那里。仍然有些程序无法工作,如果它们使用了 DT_RPATH (那样会覆盖 LD_LIBRARY_PATH 设置)。
这样做会导致运行依赖于 LinuxThreads 的程序非常麻烦。但是这是有意为之。
[重要] 重要
FC5 将不包含 LinuxThreads 支持,那时所有程序都必须被转换为使用 NPTL。
通常,到 NPTL 的转换没什么问题。
”
而从www.findrpm.net以及其他地方找到的li...需要glibc-devel = 2.3.6-3。
现在的问题是,如果把glibc-devel一系列相关的(gcc-4.1.0-3.i386,compat-gcc-32-3.2.3-
55.fc5.i386,gcc-java-4.1.0-3.i386等等)相关的包,降级到2.3.6-3版本了,可是我昨天在家里的测试机上,降级的
时候把系统就搞崩溃了。
现在的核心是,如何把linuxthreads-devel-2.3.6-3.i386.rpm给安装上!
linuxthreads-devel-2.3.6-3.i386.rpm是Fedora Core 4 Updates for i386的rpm包。
也就是,找到在fedora core 5上的linuxthreads-devel安装程序先。
查看全文2006 年 06 月 14日, 星期三
fedora core 5 办公环境安装配置,fc5不完全指南(十二)Oracle 10g 成功安装
参考:
http://www.oracle-base.com/articles/10g/OracleDB10gR2InstallationOnFedora5.php
原文安装方法太复杂了,而且原文是按满足Oracle安装文档的要求来做的。
我们以往失败的地方在于未修改$ORACLE_HOME/bin/gennttab文件。
我偷懒,直接:
root
1)确认(没有就安装)下列rpm包:
# From Fedora Core 5 DVD
cd /media/dvd/Fedora/RPMS
rpm -Uvh setarch-*
rpm -Uvh --force tcl-*
rpm -Uvh openmotif-2*
rpm -Uvh compat-db-*
rpm -Uvh compat-libstdc++-33*
rpm -Uvh compat-libf2c-32-*
rpm -Uvh compat-gcc-32-*
rpm -Uvh libaio-*
rpm -Uvh compat-gcc-32-c++-*
rpm -Uvh compat-libstdc++-296*
rpm -Uvh compat-libgcc-296*
rpm -Uvh rsh-*
# From download
rpm -Uvh openmotif21-2.1.30-14.i386.rpm
2)创建oracle用户
groupadd oinstall
groupadd dba
useradd -g oinstall -G dba -d /opt/oracle oracle
passwd oracle
3)设置oracle用户的.bash_profile文件,添加如下内容
# Oracle Settings
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR
ORACLE_BASE=/opt/oracle/dbhome; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/10.2.0; export ORACLE_HOME
ORACLE_SID=boar10g; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/jre:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH
切换到oracle用户(直接注销,用oracle用户登录)
4)安装oracle 10g
$./runInstaller -IgnoreSysPreReqs
开始安装,忽略10g的一大堆乱七八糟的检查
5)中途(这步一定要做了,也是安装失败的关键所在;不然会在link的时候让你无限等待,一直阻塞等死都没反应)
修改$ORACLE_HOME/bin/gennttab文件
(注意,如果修改了还hang,说明修改的内容有问题,没有拷贝正确,已经有人遇到这个问题了)
# Change this...
LIB=`$ECHO ${TtoLIB} | $SED 's/ /
/g' | $GREP "^${T}:" | $AWK -F: '{print $2}'`
INI=`$ECHO ${TtoINI} | $SED 's/ /
/g' | $GREP "^${T}:" | $AWK -F: '{print $2}'`
BAS=`$ECHO ${TtoBAS} | $SED 's/ /
/g' | $GREP "^${T}:" | $AWK -F: '{print $2}'`
# To this...
LIB=`$ECHO ${TtoLIB} | $SED 's/ /n/g' | $GREP "^${T}:" | $AWK -F: '{print $2}'`
INI=`$ECHO ${TtoINI} | $SED 's/ /n/g' | $GREP "^${T}:" | $AWK -F: '{print $2}'`
BAS=`$ECHO ${TtoBAS} | $SED 's/ /n/g' | $GREP "^${T}:" | $AWK -F: '{print $2}'`
其他的,安装过Oracle的人都知道怎么做了。
对了,我是先把database安装了,再装的client。
查看全文
2006 年 06 月 01日, 星期四
不创建索引,只用hash分区缩小数据扫描范围一用
在业务启动的时候,有一个用户名单的手机号要做比较,这个名单原来只有不到3K条,现在要增加到3百多万条,查询性能受到威胁。
表结构很简单,就一个手机号码(原来就设置为varchar2(21)),一个序列号number(17),还有两个长字段空着。
分析过后,该表在手机号上不适合建索引,因为本身一它相对是个长字段,二该表也以它为主;建立索引后一次读一个索引块,应不如一次读多个数据块,不该建索引。那此时应该缩小全表扫描的范围,办法就是分区了,由于操作的条件是等于或不等于,hash分区就是选择了。
记录一下今天的做法:
1,3百多万手机号(37M)导入,sqlldr普通导法导了约15分钟。先导到一个临时表A。(MD,远程主机老把我给踢出来,就写了个脚本,nohup sh t.sh &让他自己导着,过段时间登上去看结果就好了)
2,在同一个表空间(就一个物理硬盘,不存在分多个表空间的必要),创建与原表UL结构一样,具有20个hash分区的分区表B。同时,创建一个新序列,START WITH 100000000.
3,从临时表A,添加序列nextval,insert /*+ append */ nologging导入到表B。
4,从原来的表UL使用insert into导入数据到表B。
5,rename UL to UL_20060601bk;rename B to UL;
搞定。
经过测试,
2006 年 04 月 29日, 星期六
具有外键约束的用户数据迁移办法(exp/imp)
在我们只需要迁移一部分表数据,而不是整个用户,同时又希望得到整个用户的所有非用户数据的结构,此时如果遇到具有外键约束的用户数据,我们总是因为外键约束导致数据导入时出现错误,导致丢失部分数据,乃至无法导入数据,今想出如下办法,通过5个步骤即可解决此问题。
相信很多环境都需会有类似的需求。以前说的(http://bigboar.itpub.net/post/8411/58613)并没有解决外键约束数据的问题,次解决。
==================================================
需求:
1)迁移某oracle数据库用户下所有非用户数据的结构(即包括:table,index,procedure等等除了表数据以外的所有该用户的结构).
2)迁移该用户下的指定的一部分表的用户数据。
测试环境:
solaris9+oracle817 to redhat2.1+oracle817
查看全文
2006 年 04 月 27日, 星期四
utl_file包说明
file_handle := utl_file.fopen(。。。, 'w');
有r,w,a三种模式
其中 w模式会覆盖原来的文件,如果原来有文件,则覆盖,没有则创建新的文件。
a模式为追加,如果原来有文件,则覆盖,没有则创建新的文件。
oracle,informix,sybase临时表开发特性比较
Oracle:
提供两种临时表,一种是在执行commit的时候数据消失(自动删除),一种是在会话结束时数据自动消失,不管是那一种,临时表结构都会一直存在于数据库中,除非执行drop table命令来卸载。表结构创建后,所有会话可见这个临时表,但临时表里的数据,只有当前插入数据的会话可见插入的数据。即使临时表上创建了唯一索引,不同会话插入相同临时表的唯一数据互相也不会冲突的,互相之间是不可见的。临时表的表名和其他物理表的名字不能冲突!
Informix:
只提供一种临时表,即在会话开始的时候创建,插入数据,会话一退出,临时表即消失,数据自然也消失。下一个会话要自己再次创建这个临时表。而且,即使同时有两个会话,在一个数据库里创建相同表名的临时表,互相之间也是不会冲突的,即另一个会话完全不可见这个会话创建的临时表及临时表里的数据。
Sybase:
提供两种临时表,其中一种类似Informix,另外一种是在temp数据库里创建表,数据库重启数据才会消失(表是否消失忘记了)。。。
10046 trace
SQL>set timing on
SQL>alter session set events '10046 trace name context forever,level 12';
SQL>在此执行procedure或SQL
SQL>alter session set events '10046 trace name context off';
SQL>
SELECT s.sid,p.spid,s.username FROM v$session s,v$process p WHERE s.audsid=USERENV('sessionid') AND s.paddr = p.addr;
2006 年 04 月 24日, 星期一
读书:Oracle 10g Database Concepts: 第四章:事务管理
和ern约的翻译,10g和9i的 concept顺序变了,他没注意,直接就按顺序翻译的第四章,后来才发现是9i的第十六章.本来我和他约的是我翻译他审核,他翻译我校对,可惜工作不是很清楚,计划可能流产:(翻译:ern
传播:bigboar 查看全文
2006 年 04 月 22日, 星期六
读书:Oracle 9i Database Concepts:第三章:Tablespaces,Datafiles,and Control Files
发表在:
http://www.cnoug.org/viewthread.php?tid=90571
3 第三章:Tablespaces,Datafiles,and Control Files
本章描述了tablespace,tablespace是任何Oracle数据库主要的逻辑数据库结构,以及描述了对应于每个tablespace的物理datafile。
本章包括:
Introduction to Tablespaces, Datafiles, and Control Files
Tablespaces Overview
Datafiles Overview
Control Files Overview
2006 年 04 月 19日, 星期三
转:linux adserve2.1下安装完oracle8.1.7
开始安装因为粗心,收到了好多好多错误,与好多人的错误都不一样,后来发现是步骤不够认真,环境准备不好导致的。
在网上找到一篇写的很详细,我测试过,没什么大问题的文档。(一定要认真按照步骤慢慢来,别急)
原文地址:http://linux.computersci.net/forum/printthread.php?Board=UBB21&main=2217&type=post |
BTW:网上有一篇很多地方都有的帖让人把错误一路忽略,说最后成功,骗鬼!这样是不行的。
查看全文pro*c程序启动,error while loading shared libraries
在linux as3下,root用户安装了个程序,proc编译了个.pc文件到c程序里,执行c可执行程序的时候提示下面错误:
error while loading shared libraries: libclntsh.so.8.0: cannot open shared object file: No such file or directory
想啊想啊,难道这个库文件不存在?到 $ORACLE_HOME/lib目录下查看,这个文件是存在的啊。。。怀疑环境有问题,又搞到了其他机器上看。
最后发现,是不是应该设置LD_LIBRARY_PATH参数呢。以前安装Oracle,配置参数的时候这个参数我从来是不配置的。。。
在root下,
#. /home/oracle/.bash_profile #这步如果没有定义LD_LIBRARY_PATH,就没有必要了.
#LD_LIBRARY_PATH=/u01/app/oracle/product/8.1.7/lib:/lib:/usr/lib:/usr/local/lib;export LD_LIBRARY_PATH
就可以了。
真是冤枉啊.............
pro*c编译错误两例
使用如$proc iname=voracle.pc oname=voracle.c
的命令方式来编译.pc文件(使用Oracle缺省配置文件pcscfg.cfg)。
若收到类似下面两个错误的,则肯定是$ORACLE_HOME/precomp/admin/pcscfg.cfg文件配置错误了。
最后提供一个正确的配置方法。
BTW:
我发现这个错误的时候,曾大量在google上搜索过,metalink搜索过,发现的类似这种问题的有如下几种可能原因:
1)pcscfg.cfg路径配置错误。
2)swap交换区不够。(听着就悬呼)
3)BUG。
4)Oracle版本问题。
。。。。。。
其中PCC-S-02015, unable to open include file,好多贴,文档都说了是 pcscfg.cfg路径设置不对,但没找到“ PCC-S-02201, Encountered the symbol "__gnuc_va_list" when expecting one”错误说是路径有问题的。我几乎放弃了,尝试后居然成功了。
1)
Error at line 53, column 11 in file /usr/include/libio.h
53 # include <stdarg.h>
53 ..........1
53 PCC-S-02015, unable to open include file
2)
Error at line 0, column 0 in file voracle.pc
PCC-S-02201, Encountered the symbol "<eof>" when expecting one of the following
Error at line 0, column 0 in file voracle.pc
PCC-F-02102, Fatal error while doing C preprocessing
Error at line 307, column 8 in file /usr/include/stdio.h
307 _G_va_list __arg) __THROW;
307 .......1
307 PCC-S-02201, Encountered the symbol "__gnuc_va_list" when expecting one
of the following:
... auto, char, const, double, enum, float, int, long,
ulong_varchar, OCIBFileLocator OCIBlobLocator,
OCIClobLocator, OCIDateTime, OCIExtProcContext, OCIInterval,
OCIRowid, OCIDate, OCINumber, OCIRaw, OCIString, register,
short, signed, sql_context, sql_cursor, static, struct,
union, unsigned, utext, uvarchar, varchar, void, volatile,
a typedef name, exec oracle, exec oracle begin, exec,
exec sql, exec sql begin, exec sql type, exec sql var,
The symbol "enum," was substituted for "__gnuc_va_list" to continue.
我尝试的正确的配置(特别要注意的是路径是否正确,字母是否因为粗心输入错误等):
$ cat pcscfg.cfg
sys_include=(/usr/include,/usr/lib/gcc-lib/i386-glibc21-linux/egcs-2.91.66/include,/u01/app/oracle/product/8.1.7/precomp/public,/usr/include/sys)
include=(/u01/app/oracle/product/8.1.7/precomp/public)
include=/u01/app/oracle/product/8.1.7/precomp/hdrs
include=/u01/app/oracle/product/8.1.7/tpcc2x_2/src
include=/u01/app/oracle/product/8.1.7/precomp/precomp/include
include=/u01/app/oracle/product/8.1.7/precomp/oracore/include
include=/u01/app/oracle/product/8.1.7/precomp/oracore/public
include=/u01/app/oracle/product/8.1.7/precomp/rdbms/include
include=/u01/app/oracle/product/8.1.7/precomp/rdbms/public
include=/u01/app/oracle/product/8.1.7/precomp/rdbms/demo
include=/u01/app/oracle/product/8.1.7/precomp/nlsrtl/include
include=/u01/app/oracle/product/8.1.7/precomp/nlsrtl/public
include=/u01/app/oracle/product/8.1.7/precomp/network_src/include
include=/u01/app/oracle/product/8.1.7/precomp/network_src/public
include=/u01/app/oracle/product/8.1.7/precomp/network/include
include=/u01/app/oracle/product/8.1.7/precomp/network/public
include=/u01/app/oracle/product/8.1.7/precomp/plsql/public
ltype=short
更多信息可参考:
Pro*C/C++ Precompiler Programmer's Guide Release 9.2
Part Number A97269-01
2006 年 04 月 15日, 星期六
成就DBA职业生涯
转自:http://www.itpub.net/showthread.php?s=&threadid=519295&perpage=10&pagenumber=1
写的非常好,在此备份!
查看全文2006 年 04 月 14日, 星期五
读oracle trace文件头信息
数据库生成的trace文件,原始会有类似下面的信息:
#more ora_ora_17965.trc
/u01/app/oracle/admin/oracle9i/udump/ora_ora_17965.trc
Oracle9i Enterprise Edition Release 9.2.0.7.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.7.0 - Production
ORACLE_HOME = /u01/app/oracle/product/9.2.0
System name: SunOS
Node name: hostname_name
Release: 5.9
Version: Generic_117171-10
Machine: sun4u
Instance name: ora
Redo thread mounted by this instance: 1
Oracle process number: 34
Unix process pid: 17965, image: oracle@hostname_name (TNS V1-V3)
*** SESSION ID:(396.57066) 2006-04-14 11:54:03.663
*** 2006-04-14 11:54:03.663
ksedmp: internal or fatal error
ORA-00600: internal error code, arguments: [ttcgcshnd-1], [0], [], [], [], [], [], []
Current SQL statement for this session:
SELECT VALUE FROM NLS_INSTANCE_PARAMETERS WHERE PARAMETER ='NLS_DATE_FORMAT'
----- Call Stack Trace -----
通过这个文件,我们可以获取如下信息:
1)数据库版本:
Oracle9i Enterprise Edition Release 9.2.0.7.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.7.0 - Production
SQL>select * from v$version;
2)主机信息
ORACLE_HOME = /u01/app/oracle/product/9.2.0
System name: SunOS #主机操作系统
Node name: hostname_name #主机名
Release: 5.9 #操作系统版本
Version: Generic_117171-10 #内核版本
Machine: sun4u #主机环境
%env | grep ORACLE_HOME
%uname -ar
3)数据库信息(发生这个错误的进程,会话信息主要就靠从这里得到的信息跟踪了)
Instance name: ora #$ORACLE_SID名称,即例程名称.v$instance.instance_name
Redo thread mounted by this instance: 1 #v$instance.instance_number
Oracle process number: 34 #v$process.pid
Unix process pid: 17965, #v$process.spid,也是操作系统的进程号,trace文件名里包含了这个进程号
image: oracle@hostname_name (TNS V1-V3) #连接描述符
*** SESSION ID:(396.57066) 2006-04-14 11:54:03.663 #SESSION ID:(396.57066),即是v$session里的(sid和serial#)
*** 2006-04-14 11:54:03.663 #发生错误的时间(不是会话的登陆时间)
SQL>SELECT instance_number,instance_name,host_name FROM v$instance;
4)错误提示
ksedmp: internal or fatal error
ORA-00600: internal error code, arguments: [ttcgcshnd-1], [0], [], [], [], [], [], []
5)如果错误里有在执行的SQL语句,在该跟踪文件里查找如ORA-00600,就可找到在执行的SQL语句。
ORA-600一例,ttcgcshnd
alert_${ORACLE_SID}.log文件报告如下错误:
Errors in file /u01/app/oracle/admin/oracle9i/udump/ora_ora_17965.trc:
ORA-00600: internal error code, arguments: [ttcgcshnd-1], [0], [], [], [], [], [], []
Fri Apr 14 11:54:06 2006
Errors in file /u01/app/oracle/admin/oracle9i/udump/ora_ora_17965.trc:
ORA-00600: internal error code, arguments: [ttcgcshnd-1], [0], [], [], [], [], [], []
确认是JDBC版本问题,升级JDBC,问题解决。
#######################################################
通过metalink查到解释如下:
2006 年 04 月 11日, 星期二
读书:Oracle 9i Database Concepts:第二章:Data Blocks, Extents, and Segments
一直想认真的地毯式读厂家文档,总是找到好多借口耽误计划.今特在此发帖督促自己.期望可2-3天读一章,并把翻译记录在此.
希望:
1)翻译过程中,因个人水平有限,错误肯定是有的,一旦有兄弟发现错误或疑问,务必请跟贴帮我纠正,大家学习,共同进步。
2)翻译过程中,我自己对很多问题有疑问,也会一起帖出来,有知道的兄弟,请务必帮助我一把,把你知道的跟帖解释出来.
================================================
本章原文地址:
http://www.oracle.com.cn/onlined ... 4/c03block.htm#2528
第二章:Data Blocks, Extents, and Segments
本章描述了Oracle server的逻辑存储结构的特性和他们之间的关系,包括以下内容:
data blocks,extents,segments介绍
data blocks overview
extents overview
segments overview
2006 年 04 月 06日, 星期四
实际使用statspack做趋势分析
一直说statspack能做趋势分析,有几人认真的拿statspack做过趋势分析?以前就有认真学习学习statspack的想法,花时间读了spreport.sql,sprepins.sql,又把statspack安装的package读了一遍,受益好多好多,特别是对package的写法,report里变量的用法,函数为什么要这样写等等,学了好多好多,也知道不会的好多好多......
开始整理statspack是如何收集数据,收集的步骤,采集那些表数据,怎么控制采集门限,分那些级别采集等等,全在statspack package里写的清清楚楚,查资料......然后写了《Statspack Report模块解释》,实在是太多内容,没有力气写了,很杂乱的就贴在blog里了。
今天,要做性能分析,刚来新公司,数据环境不象以前那么熟悉,业务情况也不熟悉,得把statspack搬出来了,基于以前看statspack经常查看的几个指标,写了函数和脚本,把连续采集的数据整体趋势查询出来。不然一个一个的 statspack report来看,不晕也得死了。。。
查看全文2006 年 03 月 26日, 星期日
一次sqlplus里的变量赋值
最近写个脚本,需要在sqlplus里通过select语句查出一个值,然后传递给下一条语句使用。
阅$ORACLE_HOME/rdbms/admin/spreport.sql脚本,仿STATSPACK写,可没成功,后来得 彦MM 提示,发现 少了 new_value 关键字的定义:( ,导致失败。
现通过例子说明一下用法:
SQL> conn username/password
Connected.
SQL> col tname new_value tname --注意,要设置new_value,开始我就是失败在此!
SQL> select tname from tab where rownum =1;
TNAME
------------------------------
STAMP_DBA_DATA_TEMP_FILES
SQL> var tab_name varchar2(30);
SQL> begin
2 :tab_name := '&tname';
3 end;
4 /
old 2: :tab_name := '&tname';
new 2: :tab_name := 'STAMP_DBA_DATA_TEMP_FILES';
PL/SQL procedure successfully completed.
SQL> print :tab_name;
TAB_NAME
--------------------------------
STAMP_DBA_DATA_TEMP_FILES
SQL>
我现在还有一个问题搞不定:
var 不能定义date类型,有知道的兄弟告诉我一声,谢谢。
再遇TNS-12547
$oerr tns 12547
12547, 00000, "TNS:lost contact"
// *Cause: Partner has unexpectedly gone away, usually during process
// startup.
// *Action: Investigate partner application for abnormal termination. On an
// Interchange, this can happen if the machine is overloaded
环境:WIN2000 Oracle 9i 连接Solaris Oracle 9i报告TNS-12547错误.
开始觉得很怪,认真核对服务端主机信息,没有发现问题!
检查tnsnames.ora的配置,实在看不出什么毛病。
防火墙打开了?检查半天也没找到防火墙是打开的证据,难道是杀毒软件?退出杀毒软件,还是不行,Oracle 服务端做了IP限制?我肯定这是没有的。
在google上搜索一下,有说是WINDOWS服务没有启动?去启动,还是不行。
在metalink上搜索,找到很多种原因,都不是。。。。
最后,连接其他数据库测试一下:
本机数据库,连接没问题。
本局域网数据库,连接没有问题。
公网数据库,连接就不正常了,就报告12547错误了!!!
怀疑该该主机IP到公网的1521端口被封了,找网管一查,COW,端口被封,打开端口,一切OK...
技术部的1521端口被封,不知道和RP有没有点啥关系,呵呵
2006 年 03 月 17日, 星期五
SYS_CONNECT_BY_PATH函数错误
昨天,在一条有
start with
connect by
inline view一堆的SQL语句中,使用了SYS_CONNECT_BY_PATH函数来做字段连接,形如:
SYS_CONNECT_BY_PATH(xxxxx, '->')
以前正常,昨天一执行,取出200行就开始错误了,错误号忘记了,第一次见这个东西,还真的蒙,问了朋友,其中一个彦MM说了可能是字段里有特殊字符,就开始查,结果还真的在xxxxx里有两条记录包含的有'->'结尾,一更新掉这两条记录的'->'符号,马上正常。。。。。。
哎呀,现在混个DBA不容易啊,啥都得会,朋友更是重要啊,话说的好,朋友多了路好走,这话肯定不假。
SQL开发的变态应用,是得认真学习学习了!
TNS-12547, TNS-12560, TNS-00517错误
今天同事说listener启动不了,有问题,我一去
%lsnrctl start
报告如下错误:
TNS-12547: TNS:lost contact
TNS-12560: TNS:protocol adapter error
TNS-00517: Lost contact
Linux Error: 32: Broken pipe
12547, 00000, "TNS:lost contact"
// *Cause: Partner has unexpectedly gone away, usually during process
// startup.
// *Action: Investigate partner application for abnormal termination. On an
// Interchange, this can happen if the machine is overloaded.
12560, 00000, "TNS:protocol adapter error"
// *Cause: A generic protocol adapter error occurred.
// *Action: Check addresses used for proper protocol specification. Before
// reporting this error, look at the error stack and check for lower level
// transport errors.For further details, turn on tracing and reexecute the
// operation. Turn off tracing when the operation is complete.
00517, 00000, "Lost contact"
// *Cause: Partner has unexpectedly gone away.
// *Action: Investigate partner application for abnormal termination.
咳,一看到,还真有一点蒙,反复看了listener.ora,没什么问题啊,根据错误信息,有点晕,看了listener.log,没看出什么毛病,本月11号后就没有连接了。
上网搜索一下吧,说是listener.log超过2G了就会这样,回头一看,可不是有2G了吗,马上
%mv listener.log listener.log.bak
%lsnrctl start
一切OK,listener正常了。再看刚起来的listener.log,一下就好大,可能是那个哥们做了什么连接审计什么的了。。。。
BTW:listener.log文件在$ORACLE_HOME/network/log目录.
2006 年 03 月 10日, 星期五
记一次数据导出
需求:
导出某个用户下,除了指定表的数据不导出外,其他的内容,包括表,索引,视图,存储过程等等,都要求和普通导出一样导出。
我能想到的最好的实现方法,若有兄弟能想到更好的,请一定告诉我,谢谢!
1)按照普通导出方法,全用户导出,但是设置rows=n,不导出表里的数据,得到导出文件:A.dat。
2)得到需要数据的表的列表,指定导出这些表的表结构和数据,得到导出文件:B.dat。
3)导入:
导入时,先全用户导入A.dat,再使用ignore=y的方法,忽略创建表结构错误,导入B.dat。
2006 年 02 月 24日, 星期五
表整理之:move表或索引汇总
缘起一个表空间太大,删除数据后由于文件尾被用,无法resize,打算把所有表空间上的对象move到一个临时存储的表空间做整理。
写procedure用utl_file来自动生成整理脚本,麻烦......
move一个表到另外一个表空间时,索引不会跟着一起move,而且会失效。(LOB类型例外)
表move,我们分为:
*普通表move
*分区表move
*LONG,LOB大字段类型move
来进行测试和说明。
索引的move,我们通过rebuild来实现
查看全文2006 年 02 月 17日, 星期五
附录2:SQL优化测试方法(1)
1.2 附录2:SQL优化测试方法 53
1.2.1 使用Statspack 测试SQL 53
1.2.2 使用autotrace测试SQL 55
1.2.2.1 Set autotrace on 55
1.1.1.1.50 范例 56
1.2.2.2 Set autotrace traceonly explain 63
1.2.3 使用SQL_TRACE测试SQL 64
1.2.4 使用Set Event测试SQL 64
附录3:定制STATSPACK REPORT(1)
1.3 附录3:定制STATSPACK REPORT 65
1.3.1 Report完整的SQL语句 65
1.3.2 Report更多的SQL语句 65
1.3.3 Report指定模块的SQL语句 65
1.3.4 Report指定字段的排序 66
附录1:Statspack Report模块解释(5)
1.1.6 SQL ordered by Gets 37
1.1.6.1 原始算法说明 37
1.1.6.2 关键子字说明 42
1.1.1.1.43 Buffer Gets 42
1.1.1.1.44 Executions 42
1.1.1.1.45 Gets per Exec 43
1.1.1.1.46 %Total 43
1.1.1.1.47 CPU Time (s) 43
1.1.1.1.48 Elapsd Time (s) 43
1.1.1.1.49 Hash Value 43
1.1.7 SQL ordered by Reads 43
1.1.7.1 原始算法说明 44
1.1.7.2 关键字段说明 45
1.1.8 SQL ordered by Executions 46
1.1.8.1 原始算法说明 46
1.1.8.2 关键字说明 47
1.1.9 SQL ordered by Parse Calls 48
1.1.9.1 原始算法说明 48
1.1.9.2 关键字段说明 49
1.1.10 SQL ordered by Sharable Memory 49
1.1.10.1 原始算法说明 50
1.1.10.2 关键字段说明 51
1.1.11 ordered by Version Count 52
1.1.11.1 原始算法说明 52
1.1.11.2 关键字段说明 53
附录1:Statspack Report模块解释(3)
1.1.4 Instance Efficiency Percentages 24
1.1.4.1 原始算法说明 25
1.1.4.2 关键字说明 26
1.1.1.1.30 Buffer Nowait % 26
1.1.1.1.31 Redo NoWait % 26
1.1.1.1.32 Buffer Hit % 27
1.1.1.1.33 Buffer Cache Hit % 27
1.1.1.1.34 In-memory Sort % 28
1.1.1.1.35 Library Hit % 29
1.1.1.1.36 Data Dictionary Hit % 31
1.1.1.1.37 Data Dictionary Miss % 31
1.1.1.1.38 Soft Parse % 32
1.1.1.1.39 Execute to Parse % 33
1.1.1.1.40 Latch Hit % 34
1.1.1.1.41 Parse CPU to Parse Elapsd % 34
1.1.1.1.42 % Non-Parse CPU 34
附录1:Statspack Report模块解释(2)
1.1.3 Load Profile 11
1.1.3.1 原始算法说明 11
1.1.3.2 关键字说明 14
1.1.1.1.10 Redo size 14
1.1.1.1.11 Logical reads 14
1.1.1.1.12 block changes 14
1.1.1.1.13 Physical reads 15
1.1.1.1.14 Physical writes 16
1.1.1.1.15 User calls 16
1.1.1.1.16 Parses 17
1.1.1.1.17 Hard parses 18
1.1.1.1.18 Sorts 20
1.1.1.1.19 Average Rows Per Sort 20
1.1.1.1.20 Logons 21
1.1.1.1.21 Executes 21
1.1.1.1.22 Transactions 21
1.1.1.1.23 Commits Per Second 21
1.1.1.1.24 Commit % 21
1.1.1.1.25 % Blocks changed per Read 22
1.1.1.1.26 Recursive Call % 22
1.1.1.1.27 Rollback per transaction % 22
1.1.1.1.28 Rows per Sort 23
1.1.3.3 参数说明 24
1.1.1.1.29 SORT_AREA_SIZE 24
附录1:Statspack Report模块解释(1)
1.1 附录1:STATSPACK REPORT模块解释 5
1.1.1 Head Information 5
1.1.1.1 原始算法 5
1.1.1.2 关键字说明 6
1.1.1.3 参数说明 7
1.1.1.1.1 SESSION_CACHED_CURSORS 7
1.1.1.1.2 OPEN_CURSORS 7
1.1.2 Cache Sizes (end) 7
1.1.2.1 原始算法 8
1.1.2.2 关键字说明 8
1.1.2.3 参数说明 8
1.1.1.1.3 DB_CACHE_SIZE 8
1.1.1.1.4 DB_KEEP_CACHE_SIZE 9
1.1.1.1.5 DB_RECYCLE_CACHE_SIZE 9
1.1.1.1.6 DB_nK_CACHE_SIZE 9
1.1.1.1.7 DB_BLOCK_SIZE 9
1.1.1.1.8 SHARED_POOL_SIZE 10
1.1.1.1.9 LOG_BUFFER 10
2006 年 02 月 15日, 星期三
Oracle数据库优化的方案和实践
一、前言 2
二、ORACLE数据库优化概述 2
1、内存等参数配置的优化 3
2、减少物理读写的优化 4
3、批量重复操作的SQL语句及大表操作的优化 4
二、ORACLE数据库优化方案 5
1、内存等Oracle系统参数配置 5
2、使用索引 6
3、表分区 8
4、Procedure优化 9
5、其他改造 10
6、维护作业计划 10
三、ORACLE数据库优化前后比较 10
1、批量重复的SQL语句执行性能 10
2、一些单次、不常用的操作的语句执行性能 11
四、参考 11
1、常用的优化工具 11
2、参考文献 12
Oracle 9i 整体性能优化概述草稿之四:调整磁盘I/O
5 调整磁盘I/O 52
5.1 数据文件I/O调整 52
5.1.1 测量数据文件IO 52
5.1.2 改进数据文件I/O 53
5.2 DBW0 56
5.2.1 测量DBW0性能 56
5.2.2 改进DBW0性能 57
5.3 单个段数据块I/O调整 58
5.3.1 测量段性能和调整 59
5.4 排序操作和临时段优化 62
5.4.1 排序 62
5.5 UNDO 64
5.5.1 测量UNDO I/O性能 65
5.5.2 优化undo segment 66
Oracle 9i 整体性能优化概述草稿之三:SQL优化
4 SQL优化 25
4.1 测量SQL性能 25
4.1.1 Explain Plan 25
4.1.2 Top Sql 26
4.1.3 TKPROF 26
4.1.4 AUTOTRACE 29
4.1.5 STATSPACK 31
4.2 优化器模式 31
4.2.1 Analyze-表和索引分析 32
4.2.2 设置优化程序模式 34
4.3 优化应用程序 36
4.3.1 stored outline 36
4.3.2 物化视图 39
4.3.3 索引 40
4.3.4 分区partition 44
4.3.5 cluster 51
4.4 常见优化的SQL书写方法 52
Oracle 9i 整体性能优化概述草稿之二:SGA优化
3 SGA优化 9
3.1 SHARED POOL 9
3.1.1 测量shared pool 性能 11
3.1.2 调整shared pool性能 12
3.2 DATABASE BUFFER CACHE 15
3.2.1 测量database buffer cache性能 16
3.2.2 改进buffer cache性能 17
3.3 LARGE POOL 21
3.4 JAVA POOL 21
3.5 REDO LOG BUFFER 22
3.5.1 Oracle重做机制 22
3.5.2 调整Redo Log Buffer 22
3.6 其他SGA对象 24
Oracle 9i 整体性能优化概述草稿之一:调整争用
2.1 优化维护 4
2.2 诊断LATCH竞争 4
2.2.1 概念 4
2.2.2 是否存在latch争用 5
2.2.3 检查Latch是否主要竞争 5
2.2.4 DBA关注的latch内容 5
2.3 诊断FREE LIST竞争 6
2.3.1 概念 6
2.3.2 是否存在free list争用 6
2.3.3 确定free list 争用的段 7
2.3.4 优化free list争用 7
2.4 诊断LOCK竞争 8
2.4.1 概念 8
2.4.2 可能引起lock contention的原因 8
2.4.3 锁解决办法 9
2.4.4 死锁 9
Oracle 9i 初始配置:数据库服务器数据库参数配置说明
编写时间 2005年8月16日
ORACLE 9I 初始配置 1
1 概述 2
1.1 参数修改注意事项 2
1.2 各省数据库服务器内存及CPU统计 2
1.3 参数修改方法 2
2 操作系统参数配置 3
3 数据库参数配置 3
3.1 SGA配置 3
3.1.1 Shared pool 3
3.1.2 Data buffer 4
3.1.3 Sga other memory 5
3.2 磁盘I/O配置 5
2006 年 02 月 10日, 星期五
初步总结"pl/sql表"
物理表,临时表,pl/sql表,嵌套表,VARRAY,他们之间是存在区别的。
pl/sql表的定义:
是一维的(说明pl/sql表只能有1列,于一维数组很相似)、无边界的(表行数没有限制,动态增长,定义时并没有为其分配任何行)、由同类(pl/sql表只有1列,自然同类)元素组成的稀疏(行被赋值后,该行才会存在于表中,行不必按顺序定义,可以给表中的任何行赋值,如1行和100行赋值,他们中间可不给行赋值;VARRAY就不行,VARRAY声明后即分配内存等待被使用)集合,并通过整数来索引(单索引模式,BINARY_INTEGER来索引,充当主键,正负2的31次方减1的范围,可以为负数是因为这个行好仅仅是一个数字而已,本身并不代表顺序)。
pl/sql表驻留在oracle server的私有pl/sql区域中。
由于pl/sql表只是pl/sql中定义的一种结构,并不是真实可访问的表(所以不存在commit,rollback,select,insert,update,delete操作),RDBMS或SQL内核并不识别他,所以对他的操作受到限制,比如pl/sql中的DML就不能操作他,因为DML要提交给RDBMS来处理。
只能通过循环一次一行的浏览pl/sql表的内容。
1,声明pl/sql表
[语法:TYPE <table_type_name> IS TABLE OF <datatype> [NOT NULL] INDEX BY BINARY_INTEGER;]
明天有空再来继续。。。。
初步总结oracle pl/sql 的record
引子:
今天在QQ群里,一网友问到
TYPE ename_table_type IS TABLE OF employees.last_name%TYPE INDEX BY BINARY_INTEGER;
的语法问题,我以前没看过这部分内容,不敢随便乱说,特查资料,弄清这是怎么回事,先总结RECORD说明如下,以备以后查阅。
至于record的目的,意义,原理,好坏分析,在此就不详谈,以实用为主进行记录,更多信息请查后面给出的参考资料。
对record的印象:类似C++里的struct,只是有很多定义方法,出现不同的record类型。当record嵌套的有record类型定义的时候,就出现嵌套record了。
1,创建L/SQL支持的record类型和声明record(不同类型之间的record不能以record为单位互相进行判断、赋值等操作)
1)基于表的。
[语法:<record_name> <table_name>%ROWTYPE;]
示例:
declare
r_c_perf_bsc c_perf_bsc%ROWTYPE;
begin
2)基于游标的。
[语法:<record_name> <cursor_name>%ROWTYPE;]
示例:
DECLARE
cursor cur_c_perf_bsc is select related_bsc bsc_id,sum(cell_num) cell_num from ne_bts group by related_bsc;
r_c_perf_bsc cur_c_perf_bsc%ROWTYPE;
BEGIN
open cur_c_perf_bsc ;
loop
fetch cur_c_perf_bsc into r_c_perf_bsc;
exit when cur_c_perf_bsc%NOTFOUND;
...
3)用户自定义的。
[语法:
TYPE <type_name> IS RECORD
(
<field_name1> <datetype1>,
...
<field_nameN> <datetypeN>
);
]
declare
TYPE c_perf_bsc IS RECORD
(
ne_id char(16),
bsc_name c_unicom.ne_bsc.bsc_name%TYPE,
cell_num c_unicom.ne_bts.cell_num%TYPE,
);
r_c_perf_bsc c_perf_bsc;
begin
2,列举一个复杂的record声明示例说明
SUBTYPE long_line_type IS VARCHAR2;
cursor cur_c_perf_bsc is select related_bsc bsc_id,sum(cell_num) cell_num from ne_bts group by related_bsc;
TYPE bsc_base_tab IS TABLE OF c_perf_bsc.equip_name INDEX BY BINARY_INTEGER;
TYPE c_perf_bsc IS RECORD
(
a int NOT NULL,
b long_line_type,
c c_unicom.ne_bsc.area%TYPE,
d cur_c_perf_bsc.bsc_id%TYPE := '0000000000000000',
e bsc_base_tab
);
3,对record的操作
变量引用的时候使用“.”符号
如:
r_c_perf_bsc c_perf_bsc;
则可用
r_c_perf_bsc.a := 1;
来操作。
对于以类型为单位来进行的集体操作,受很多限制,比如必须在同类型之间才可以,而且相同的类型定义的声明才可以。
比如,不同的游标类型之间不能进行集体操作。
示例:
如上面的fetch cur_c_perf_bsc into r_c_perf_bsc;语句的集体赋值操作。
或如:
r1_c_perf_bsc c_perf_bsc;
r2_c_perf_bsc c_perf_bsc;
则可以执行
r1_c_perf_bsc := NULL;
1_c_perf_bsc := r2_c_perf_bsc;
的集体赋值操作。
关于record的问题,有个思路,在应用的时候,多测试就好了;以上是总结,重在思路,所写示例并未真实测试,可能存在错误。
参考资料:
《Oracle PL/SQL 程序设计》
Steven Feuerstein & Bill Pribyl著,林其,王宇译
中国电力出版社出版
2006 年 02 月 09日, 星期四
系统维护参考手册(Oracle 9i)
目录
1 引言 4
1.1 目的 4
1.2 系统介绍 4
1.3 适用范围 4
1.4 术语 4
1.5 参考资料 4
1.6 注意事项(重要) 4
2 准备工作 5
3 常见系统配置、维护 5
3.1 ORACLE当前库及其监听的启动、关闭 5
3.1.1 Oracle的启动 5
3.1.2 监听器的启动 6
3.1.3 检查监听器服务 6
3.1.4 Oracle的关闭 6
3.1.5 监听器的关闭 6
3.1.6 自动启动和关闭Oracle 7
3.2 ORACLE帐户管理 8
3.2.1 查询用户信息 8
3.2.2 增加用户 8
3.2.3 修改用户密码 9
3.2.4 删除用户 9
3.3 服务命名配置 9
3.4 修改内存结构 10
3.5 ORACLE最大链接数两种修改办法 10
3.6 导入导出数据 11
3.7 ORACLE联机在线日志文件管理 11
3.7.1 查询联机在线日志文件信息 11
3.7.2 修改数据库联机在线日志文件 12
3.8 ORACLE归档日志管理 12
3.8.1 检查归档配置 12
3.8.2 设置归档模式和取消归档模式 13
3.9 ORACLE存储信息 14
3.9.1 查询存储信息 14
3.9.2 创建表空间 15
3.10 修改某用户缺省和临时表空间 15
3.11 ORACLE数据库的汉字显示问题 16
3.12 ORACLE卸载方法 17
3.12.1 UNIX 17
3.12.2 WIN 17
4 常见开发操作 18
4.1 常见表字段名操作 18
4.1.1 查看表字段 18
4.1.2 增加表字段 18
4.1.3 删除表字段 18
4.1.4 修改表字段类型 19
4.1.5 修改表字段名 19
4.2 表操作 19
4.2.1 查询表信息 19
4.2.2 创建表 19
4.2.3 删除表数据(重要) 19
4.2.4 删除表 21
4.2.5 重命名表 21
4.2.6 备份表 21
4.3 索引操作 21
4.3.1 查询索引信息 21
4.3.2 创建索引 22
4.3.3 删除索引 22
4.3.4 重建索引 22
4.4 SQL语句及存储过程优化 23
4.4.1 SQL语句是否使用索引 23
4.4.2 SQL语句是否使用了最恰当的索引 24
4.4.3 怎么提示SQL语句使用固定的索引 24
4.4.4 怎么提示SQL语句固定使用全表扫描 24
4.4.5 存储过程是否可以执行更少的、有效的SQL语句 24
4.5 操作阻塞,锁情况 24
5 FAQ 25
5.1 操作表数据提示数据文件错误 25
5.2 从数据库服务器进程运行中,优化最消耗CPU的SQL语句 25
5.3 导数据到新数据库指定用户的缺省表空间 26
5.4 正确安装数据库软件,但无法创建库 26
5.5 打开数据库报告关闭错误,关闭数据库报告打开错误 27
5.6 用户不能在数据库中创建对象 27
5.7 导入导出错误 27
5.8 不同版本的数据库数据导入导出 28
5.9 数据库挂起问题 28
5.10 多个数据库操作方法:不同实例间转换. 28
5.11 查询错误号信息 29
5.12 查看ORACLE系统的版本 29
5.13 查看ORACLE系统安装了哪些选项 29
5.14 查看ORACLE软件是几位数据库 29
5.15 数据库起不来,报告ORA-01157和ORA-01110错误 29
5.16 ORACLE目录文件维护 30
文件修改控制 31