myfriend2010的博客
===========================================================
Win下Oracle9208如何升级到Oracle10.2.0.1
===========================================================

从QQ群里找到的oracle升级方式!
1、 关闭原9208数据库,执行一个完全冷备。
2、 安装ORACLE10g,选择一个跟9208不同的Home,安装的时候选择不装数据库。
3、 以SYSDBA身份登陆到SQLPLUS,执行:
Sql>spool upgrade.info
Sql>@ oracle10G_HOMErdbmsadminutlu102i.sql
Sql>spool off
注意屏幕的输出
4、在Tablespace栏提示有些表空间需要额外的空间:
Autoextend Additional space required:165mb.
查询原原数据库的空间大小和剩余空间。
Sql>select tablespace_name,bytes from dba_data_files;
Sql>select tablespace_name,sum(bytes) from dba_free_space group by tablespace_name;
扩展提示需增加空间的表空间。
Sql>alter database tablespace system add datafile
‘dracleoradatatestsystem02.dbf’ size 200m;
Sql>alter database datafile
‘dracleoradatatestxdb01.dbf’ resize 50m’;
4、 拷贝9i的initsid.ora文件到10gHomedatabase目录下。
运行菜单下的Database Upgrade Assistant,根据提示一步一步操作。如不能成功,则手工升级,依次执行以下顺序。
5、 拷贝9i的密码文件pwdsid.ora到10gHomedatabase目录下。
6、 拷贝9iHomenetworkadmin下的tnsname.ora、listerna.ora、sqlnet.ora到10GHomenetworkadmin目录。
7、 根据upgrade.info的提示,修改10GHomedatabaseinitSid.ora参数文件。
8、 关闭9I数据库
9、 在命令行用cmd>oradim –delete –sid sid删除WINDOWS服务下的实例。
10、 在命令行用cmd.>oradim –new –sid sid pfile=’path’建立新的实例。
11、 停止原9i的listerner服务
12、 用sysdba的身份登陆到sqlplus,以upgrade的方式启动数据库。
Startup upgrade
启动时提示LRM-00116: ‘D:ORACLELOGSDB后跟’=’出现语法错误
ORA-01078:处理系统参数失败
根据提示,修改10GHomedatabaseinitsid.ora,将utl_file_dir=draclelogs
注释掉。重新执行sql>startup upgrade成功。
13、 创建sysaux表空间。
Sql>create tablespace sysaux
Datafile ‘dracleoradatatestsysaux01.dbf’ size 500m
Extent management local
Segment space management auto
Online;
15、@dracle10.2rdbmsadmincatupgrd.sql;(此过程在我电脑花费约1个半小时)。
16、sql>shutdown immediate;
17、sql>startup
18、sql>@dracle10.2rdbmsadminutlrp.sql
To recompile any invalid application object
执行完毕后执行查询所有重新编译错误
Sql> select * from utl_recomp_errors;

19、启动10G的listerner服务
测试,升级完毕。


myfriend2010 发表于:2007.11.13 13:45 ::分类: ( oracle ) ::阅读:(255次) :: 评论 (7)
===========================================================
电信数据仓库元数据管理方案
===========================================================

元数据管理

(一) 什么是元数据

元数据(meta-data)是关于数据的数据,是关于数据、操纵数据的进程,以及应用程序的结构、意义的描述信息,其主要目标是提供数据资源的全面指南。元数据按其用途可分为3类:技术元数据(technical meta-data)、业务元数据(business meta-data)和内联映射元数据(inter-mapping meta-data)。元数据对不同厂商提供的不同软件系统和产品之间的集成起着不可缺少的作用。

中国电信企业在经过近20年的信息化建设后,已经形成了众多的信息系统,这些信息系统构成了电信行业的信息供应链(information supply chain,ISC)的相关组件(如计费系统,经营分析与决策支持系统,客户关系管理系统,服务开通系统等),电信行业的信息供应链的组件拥有丰富的元数据结构,且它们和元数据紧密相关。因此,需要把元数据作为它们操作和服务的基础。

(二) 元数据集成体系架构提议

随着电信行业的竞争白热化,在不可能全新设计开发所有系统的前提下,电信运营商们必然要求在信息化建设中将遗留系统(legacy system)进行高效全面的集成,解决所谓的“信息孤岛”问题,以保证信息和数据的共享,提高经营和决策的科学性和正确性。这就意味着在信息供应链中交换和共享元数据成为电信行业信息化建设不可回避的问题。由于这些系统分别由不同的厂商在不同的时期建设,各自拥有不同的元数据模型(即元模型,metamodel)要很容易地在这些系统中共享元数据几乎是不可能的,这就需要集成设计者通过一个和底层技术无关的通用的元数据集成模型来解决这个问题。

要设计一个复杂的符合行业需要并且可实现的元数据集成体系架构,必须从2个方面考虑:元数据互连体系架构、元数据生命周期体系架构。

(一) 元数据互连体系架构从一个高层的角度描述了一个实际的数据仓库或ISC中软件产品和工具之间建立的物理元数据交换连接。常见的互连体系结构的泛化类型有:1.点对点模型,在需要交互的系统之间直接建立数据连接;2,中央辐射模型(如星形结构),建立一个中央模型存储库;3.分布式模型,多个中央辐射式的拓扑结构通过他们各自的中心存储库再以点对点方式或者中央辐射式结构连接起来。通过基础的拓扑图知识可以知道:在一个复杂的交互环境中使用点对点模型是代价最为昂贵的,同时也是最复杂的,因此在大型系统集成中是完全不可行的而中央辐射式结构在这种超大型系统中则存在处理能力不够的弱点,因此:电信行业的元数据互连架构只能采取分布式模型。

(二) 一个元数据的生命周期由创作、发布、拥有、消费、管理5种活动组成。对应了5种元数据生命周期角色:作者、发布者、所有者、消费者、管理者。这些角色定义了元数据体系架构的另一个观点,即元数据生命周期体系架构,该架构定义了元数据集成体系架构的整个元数据流和行为特性。所有业务系统是元数据体系的元数据的作者,同时每个业务系统都有它本身的元模型存储库,因此从某种意义上来说,元数据体系也是发布者和管理者,同时它又是其他业务系统元数据的消费者,而全局的中央元模型存储库则是全局元数据的发布者和管理者。

综合以上分析我们可以得出一个较为合理的电信行业元数据集成体系架构:

(三) 客户关怀系统中元数据管理方案实例

在此,以客户关怀系统为例,介绍集市开发过程中的元数据及管理方案。

客户关怀系统介绍:

目前,各大电信运营商对客户的争夺非常激烈,如何有效管理存量客户已经成为陕西电信关注的一个重点;随着市场格局的变化,需要从管理客户数量转变为管理客户质量与关系,即从大众营销转为定向营销;而这种转换需以识别客户的价值和流失趋势两方面的特征为基础;陕西电信客户关怀系统正是以此为建设宗旨,为目前陕西电信存量客户的管理提供强有力的业务支撑和数据支撑。

所示:红色的方框代表客户关怀系统涉及的功能模块;

本系统涉及的支撑系统功能数据模型设计需要遵循陕西电信IT支撑系统企业数据模型,以便以后能够顺利纳入陕西电信IT支撑系统体系。详细要求参见“数据规范”。

关于客户关怀系统元数据管理提出:

如上图:由于客户关怀数据集市的实施,需要从电信方数据仓库数据每月提取部分原始账单数据,并对此部分数据进行清洗、转换以及汇总,为了保证客户关怀系统中的相关指标和数据仓库中指标计算的一致性、合理性,以及客户关怀系统中数据访问(包括数据查询、增、删、改)的有效监控,就须要有一套完整的元数据来定义和维护,来有效的保证电信数据仓库数据中各个集市数据的面向主题、集成性、数据相对稳定等特征。

客户关怀系统中元数据的主要管理功能:

根据客户关怀系统的需求,以及项目组的开发经验,把数据集市系统中,元数据机制描述为以下五类系统管理功能:

(1)描述哪些数据在数据集市中;

(2)定义要进入数据集市中的数据和从数据集市中产生的数据;

(3)记录根据业务事件发生而随之进行的数据抽取工作时间安排;

(4)记录并检测系统数据一致性的要求和执行情况;

(5)衡量数据质量。

依据以上提出的元数据的管理功能,将项目组开发过程中的元数据管理划分为如下,并根据不用的种类来实施不同的元数据管理方法:

一、数据结构:

数据集的名称、关系、字段、约束等,包括数据库模型设计文档,表的设计文档,以及相关的管理,在客户关怀系统中,数据结构的元数据管理采用svn统一版本的管理方法。

二、数据部署:

数据集的物理位置,包括数据集市平台设计方案(服务器配置、分区、表、日志等的管理),web平台设计方案(web服务器的配置、数据源、连接池的配置等),各方案对应相关文档,采用svn的统一版本的管理方法。

三、数据流:

数据集之间的流程依赖关系(非参照依赖),包括数据集到另一个数据集的规则,客户关怀系统中的数据流划分为,电信原始数据、细节层数据、计算层数据、业务部分数据,每月从电信拿到原始细节层的数据,进行保存,并更新相关元数据文档。在细节层对电信数据进行计算,在计算层对细节曾数据进行汇总,还包括业务库和集市层数据的迁移,在整个数据的流向过程中需要进行元数据的管理。并维护相关文档。

四、质量度量:

对数据集上可以计算的度量进行相关元数据的管理,包括详细设计文档中对各个表中度量的定义、描述等。

五、度量逻辑关系:

记录数据集度量之间的逻辑运算关系。要求客户关怀系统中对所有表和度量之间的关系进行严格的文档记录,包括度量的计算、度量之间的相互依赖关系、以及历史信息进行元数据管理

六、ETL过程:

记录过程运行的顺序,并行、串行,由数据库开发人员,根据各个模块的ETL过程,制定相关元数据管理文档,并形成元数据文档提交svn,进行统一版本的管理。

七、数据集快照:

记录一个时间点上,数据在所有数据集上的分布情况。对数据库在这一时间的数据分布、I/O、表空间使用,内存使用等进行快照,并形成元数据文档提交svn,进行统一版本的管理。

八、星型模式元数据:

记录事实表、维度、属性、层次等。

九、数据访问日志:

记录哪些数据何时被何人访问。启用数据库的快照捕获以及预警,对访问数据库的人的相关信息进行记录,保存数据库访问时间,把对数据库表德操作、锁、内存使用、I/O使用等信息记录日志,并形成元数据文档提交svn,进行统一版本的管理。

十、质量稽核日志:

记录数据库何时、何度量被稽核,其结果;

十一、 数据装载日志:

记录哪些数据何时被何人装载,在客户关怀系统中,建立日志表,对每个ETl过程,记录抽取时间,操作人员,起始和截止时间,抽取涉及到的表,操作行数等相关信息。并形成元数据的文件提交svn,进行统一版本的管理。

(四) 元数据管理过程中部分问题的处理

1. Q如何做到数据汇总时对数据改动、数据作废记录时间戳、作者、错误原因,代码等信息。

A

一、 在数据关怀数据集市中建立日志表,在细节层、计算层的运算时对操作人员、操作时间、用时、访问的表、操作成功标志等进行记录,并对此表的数据进行管理,做到有效的监控。

二、 ETL过程中建立日志文件,记录系统中的数据流向,以及错误故障点、错误信息、ETL成功标志等信息,并提交相关人员进行处理,做到对整个ETL过程的实时监控,并有利于断点的恢复。

2. Q:如何保证电信数据仓库中各个数据集市的数据的相对一致性

A

对每个计算层和汇总层的相关指标取值进行详细的描述,并对ETL过程进行完整的测试,统一口径,形成元数据文档提交svn,进行统一版本的管理。


myfriend2010 发表于:2007.09.27 15:35 ::分类: ( oracle ) ::阅读:(332次) :: 评论 (0)
===========================================================
刚写的一个把表rename然后重建分区表的一个存储过程!
===========================================================

存储过程注视很详细了,不多说了

CREATE OR REPLACE PROCEDURE Altertabletopartition_Zxt(Tablename IN VARCHAR2,
Midtablename IN VARCHAR2 DEFAULT '',
Partitioncolomn IN VARCHAR2,
Partitionstartstr IN VARCHAR2 DEFAULT '',
Partitionendstr IN VARCHAR2 DEFAULT '',
Partitioncolomntype IN CHAR DEFAULT '1',
Partitiontype IN CHAR DEFAULT '1',
Parttablespace IN VARCHAR2 DEFAULT NULL,
Varstart IN VARCHAR2 DEFAULT '0',
Varinceraseby IN NUMBER DEFAULT 1,
Varend IN VARCHAR2 DEFAULT '',
Dropmidtabornot IN CHAR DEFAULT '1'--,
--State OUT CHAR
) IS
Mymidtablename VARCHAR2(30); --中间表的名称
Partitiondml VARCHAR2(32767); --分区的DML、最大长度
Mypartitiontype VARCHAR2(10); --分区类型
Partitiontypesql VARCHAR2(20); --分区DDL;
Myvarstart VARCHAR2(30); --起始字段
Myvarend VARCHAR2(30); --终止字段
i INTEGER; --循环
Uu INTEGER; --用以分200字节打印分区DDL;
g INTEGER; --对于日期类型的分区字段,在首次循环,不增加递增模式,Varinceraseby*0=0;
--在下次循环中再按照递增模式增加 Varinceraseby*1=Varinceraseby
BEGIN
i := 0;
g := 0;
/*
--Z.X.T
--20070129
Q:由于数据仓库开发过程中可能可能存在建表的时候没有考虑到分区,在以后的应用中会增加查询的负担和相应时间
A:本过程把一个非分区表转换成分区表,只考虑在原表上的一层分区,不考虑subpartition
分区逻辑:本程序采用先rename 表,然后再按照中间表创建原始表,同时加上分区的属性
对于LIST类型,只提供按照一个类型的分区,也就是说只能PARTITION ** VALUES ('CT')而不能PARTITION ** VALUES ('CT','RI'..)
过程是用于下列情况,1:表数据在修改时间没有变化,对于时时变化的表,建议用oracle的在线重定义来实现!
2:分区字段Varinceraseby有递增模式,如:2004、2005、2006
3:新增对于字段内部有递增方式的,如GLFW01AA、GLFW02AA、在第5位和第6位上有递增模式,
需传partitionstartstr=>'GLFW';partitionendstr=>'AA'
4:分区会删掉所有索引等
5:如果表上有物化试图日志,则应先drop掉,否则汇报错!
Tablename :原tableName
Midtablename :过程中间的表名,如果没有传Midtablename则用Tablename构造Midtablename
Partitioncolomn :原表上分区的字段名称
partitionstartpoint :分区字段的分区起始位置,如列为GLFW01、GLFW02等则可以作为list的分区方式分区
partitionstartpoint为01、02在列中的起始位置
Partitioncolomntype :要分区的字段类型,1--varchar2、2--number、3--char、4--date
parttablespace :分区表空间,为空则为当前用户的表空间
Partitiontype :分区类型1--Range、2--List、3--Hash
Varstart :分区字段(Partitioncolomn)的起始,对于hash则不需要传入,只要传入Varinceraseby(用来表示要分几个区)就行
Varinceraseby :分区字段的增长方式,如:起始为2004年,以1增长则第二个分区就是2004+1=2005,对于hash方式则表示hash分区的个数
Varend :分区字段(Partitioncolomn)的终止,对于hash则不需要
Dropmidtabornot :需不需要drop中间表1--需要、2不需要
--State :返回成功分区标志1--成功、2--不成功
--example
1:
execute altertabletopartition_zxt('f_fix_fixreport','f_fix_fixreport1','REPORTCODE','GLFW','','1','2','shuihu','1','1','17','2');
2:
execute Altertabletopartition_Zxt('f_reg_levyauthinfo','','AUTHDATE','','','4','1','shuihu','20040101',1,'20070101','2');
Tablename IN VARCHAR(30) NOT NULL,
Midtablename IN VARCHAR(30) DEFAULT '',
Partitioncolomn IN VARCHAR2(30) NOT NULL,
partitionstartstr IN varchar2(30) default '',
partitionendstr IN varchar2(30) default '',
Partitioncolomntype IN CHAR(1) DEFAULT '1',
Partitiontype IN CHAR(1) DEFAULT '1',
Parttablespace IN VARCHAR(30) DEFAULT '0',
Varstart IN VARCHAR2(11) DEFAULT '',
Varinceraseby IN NUMBER DEFAULT 1,
Varend IN VARCHAR2(11) DEFAULT '0',
Dropmidtabornot IN CHAR(1) DEFAULT '1',
State OUT CHAR(1)
*/
Dbms_Output.Put_Line('tablename=' || Tablename);
Dbms_Output.Put_Line('Midtablename=' || Midtablename);
Dbms_Output.Put_Line('Partitioncolomn=' || Partitioncolomn);
Dbms_Output.Put_Line('partitionstartstr=' || Partitionstartstr); --partitionendstr
Dbms_Output.Put_Line('partitionendstr=' || Partitionendstr);
Dbms_Output.Put_Line('Partitioncolomntype=' || Partitioncolomntype);
Dbms_Output.Put_Line('Parttablespace=' || Parttablespace);
Dbms_Output.Put_Line('Partitiontype=' || Partitiontype);
Dbms_Output.Put_Line('Varinceraseby=' || Varinceraseby);
Dbms_Output.Put_Line('Varstart=' || Varstart);
Dbms_Output.Put_Line('Varend=' || Varend);
Dbms_Output.Put_Line('Dropmidtabornot=' || Dropmidtabornot);
--对数据数据的校验
--Tablename 、Partitioncolomn不能为空
IF (Tablename IS NULL OR Partitioncolomn IS NULL) THEN
Dbms_Output.Put_Line('表名、分区字段名不能为空!');
GOTO Aa;
END IF;
--Tablename的长度--字段定义不能超过30位
IF (Lengthb(Tablename) > 30 OR Lengthb(Midtablename) > 30 OR Lengthb(Partitioncolomn) > 30 OR Lengthb(Parttablespace) > 30) THEN
Dbms_Output.Put_Line('字段名成太长!');
GOTO Aa;
END IF;
--初始化各数值
IF (Partitiontype = '3') THEN
--对于hash 分区,不能只指定1个分区(Varinceraseby=1)
IF (Varinceraseby = 1) THEN
Dbms_Output.Put_Line('对于hash 分区,不能只指定1个分区!');
GOTO Aa;
ELSE
Myvarstart := 0;
Myvarend := Varinceraseby;
END IF;
ELSE
Myvarstart := Varstart;
Myvarend := Varend;
IF (Myvarstart = Myvarend) THEN
Dbms_Output.Put_Line('指定一个分区没有意义!');
GOTO Aa;
END IF;
END IF;
----初始化各数值end;
--Partitioncolomntype必须为1、2、3、4
IF (Partitioncolomntype > '4' OR Partitioncolomntype < '1') THEN
GOTO Aa;
END IF;
--Partitiontype 必须为1--Range、2--List、3--Hash
IF (Partitiontype > '3' OR Partitiontype < '1') THEN
GOTO Aa;
ELSE
--初始化各字段
IF (Partitiontype = '3') THEN
Mypartitiontype := ' hash ';
Partitiontypesql := '';
ELSIF (Partitiontype = '2') THEN
Mypartitiontype := ' List ';
Partitiontypesql := ' VALUES ';
ELSIF (Partitiontype = '1') THEN
Mypartitiontype := ' Range ';
Partitiontypesql := ' VALUES LESS THAN ';
END IF;
----初始化各字段end;
END IF;
--对数据数据的校验 end;
--得到中间表Midtablename
--如果没有传Midtablename则用Tablename构造Midtablename
IF (Midtablename IS NOT NULL) THEN
Mymidtablename := Midtablename;
ELSE
Mymidtablename := Tablename;
--如果没有传Midtablename并且Midtablename<25则再其后加'_$zxt',如果Midtablename>25,则截取前25位加'_$zxt
IF (Lengthb(Midtablename) <= 25 AND Midtablename IS NOT NULL) THEN
Mymidtablename := Midtablename || '_$zxt';
ELSE
Mymidtablename := Substrb(Tablename, 0, 25) || '_$zxt';
END IF;
END IF;
Dbms_Output.Put_Line('myMidtablename=' || Mymidtablename);
--得到Midtablename end;
--将原标rename为中间表
Dbms_Output.Put_Line('renameDML=' || '
Alter Table ' || Tablename || ' rename To "' || Mymidtablename || '"');
IF (Length(Tablename) = Lengthb(Tablename)) THEN
EXECUTE IMMEDIATE '
Alter Table ' || Tablename || ' rename To ' || Mymidtablename;
ELSE
EXECUTE IMMEDIATE '
Alter Table ' || Tablename || ' rename To "' || Mymidtablename || '"';
END IF;
--将原标rename为中间表 end;
--构造分区语句
Partitiondml := 'PARTITION By' || Mypartitiontype || '(' || Partitioncolomn || ')
( ';
Dbms_Output.Put_Line('Myvarend=' || Myvarend);
IF (Partitioncolomntype = '4') --分区字段为日期或者月份类型字段
THEN
--为to_date('yyyymmdd')做准备
IF (Length(Varstart) = 6) THEN
Myvarstart := Substr(Myvarstart, 0, 6) || '01';
Myvarend := Substr(Myvarend, 0, 6) || '01';
ELSE
Myvarstart := Substr(Myvarstart, 0, 8);
Myvarend := Substr(Myvarend, 0, 8);
END IF;
--为to_date('yyyymmdd')做准备 end;
WHILE (Add_Months(To_Date(Myvarstart, 'yyyymmdd'), Varinceraseby) <= To_Date(Myvarend, 'yyyymmdd'))
LOOP
Myvarstart := To_Char(Add_Months(To_Date(Myvarstart, 'yyyymmdd'), Varinceraseby * g), 'yyyymmdd');
IF (Length(Varstart) = 6) --月份,对于list类型的月份,将PARTITION ** VALUES ('20040701') 变成VALUES ('200407')
THEN
Myvarstart := Substr(Myvarstart, 0, 6);
END IF;
Dbms_Output.Put_Line('Myvarstart=' || i || '=' || Myvarstart);
--While ing
Partitiondml := Partitiondml || ' PARTITION ' || Partitioncolomn || i || Partitiontypesql;
IF (Partitiontype != '3') --不是hash分区
THEN
Partitiondml := Partitiondml || '( ''' || Myvarstart || ''' )';
END IF;
IF (Parttablespace IS NOT NULL) THEN
Partitiondml := Partitiondml || ' TABLESPACE ' || Parttablespace || ' ,';
ELSE
Partitiondml := Partitiondml || ',';
END IF;
i := i + 1;
IF (Length(Varstart) = 6) THEN
Myvarstart := Myvarstart || '01';
--Myvarend := Myvarend || '01';
END IF;
g := 1;
END LOOP;
ELSE
--不是日期型字段,年度、number等
WHILE (Myvarstart + Varinceraseby <= Myvarend)
LOOP
Myvarstart := Myvarstart + Varinceraseby * g;
Dbms_Output.Put_Line('Myvarstart=' || Myvarstart);
IF (Myvarstart < 10) THEN
Myvarstart := '0' || Myvarstart;
END IF;
Dbms_Output.Put_Line('Myvarstart=' || i || '=' || Myvarstart);
--While ing
Partitiondml := Partitiondml || ' PARTITION ' || Partitioncolomn || i || Partitiontypesql;
IF (Partitiontype != '3') --不是hash分区
THEN
Partitiondml := Partitiondml || '( ''' || Partitionstartstr || Myvarstart || Partitionendstr || ''' )';
END IF;
IF (Parttablespace IS NOT NULL) THEN
Partitiondml := Partitiondml || ' TABLESPACE ' || Parttablespace || ' ,';
ELSE
Partitiondml := Partitiondml || ',';
END IF;
i := i + 1;
g := 1;
END LOOP;
END IF;
--对Partitiondml的后续操作
IF (Partitiontype = '1') --1--Range--增加Maxvalue分区
THEN
Partitiondml := Partitiondml || ' PARTITION ' || Partitioncolomn || i || Partitiontypesql || '(Maxvalue)';
IF (Parttablespace IS NOT NULL) THEN
Partitiondml := Partitiondml || ' TABLESPACE ' || Parttablespace || ' )';
ELSE
Partitiondml := Partitiondml || ' ) ';
END IF;
ELSE
Partitiondml := Substr(Partitiondml, 0, Length(Partitiondml) - 1); ---去掉最后的一个逗号
Partitiondml := Partitiondml || ' ) ';
END IF;
----对Partitiondml的后续操作 end;
----构造分区语句 end;
--构造DDL;
IF (Length(Tablename) = Lengthb(Tablename)) THEN
Partitiondml := 'Create Table ' || Tablename || ' ' || Partitiondml || ' as Select * From ' || Mymidtablename;
ELSE
Partitiondml := 'Create Table ' || Tablename || ' ' || Partitiondml || ' as Select * From "' || Mymidtablename || '"';
END IF;
Dbms_Output.Put_Line('Partitiondml length=' || Length(Partitiondml));
Uu := Length(Partitiondml) / 200;
FOR i IN 1 .. Uu
LOOP
Dbms_Output.Put_Line(Substr(Partitiondml, (i - 1) * 200, 200));
END LOOP;
--构造DDL end;
--Execute
EXECUTE IMMEDIATE Partitiondml;
--删除中间表
IF (Dropmidtabornot = '1') THEN
IF (Length(Tablename) = Lengthb(Tablename)) THEN
EXECUTE IMMEDIATE '
drop Table ' || Mymidtablename||' cascade constraints';
ELSE
EXECUTE IMMEDIATE '
drop Table "' || Mymidtablename || '" cascade constraints';
END IF;
END IF;
----删除中间表end;
--State := '2';
GOTO aa;
--出错处理
<<aa>>
--State := '1';
Dbms_Output.Put_Line('State end ');
END Altertabletopartition_Zxt;


myfriend2010 发表于:2007.07.09 14:51 ::分类: ( oracle ) ::阅读:(261次) :: 评论 (0)
===========================================================
sql监控的sh
===========================================================

export ORACLE_BASE=/oracle
export AIXTHREAD_SCOPE=S
export TMP=/tmp
export TEMP=/tmp
export TMPDIR=/tmp
umask 022
export CRS_HOME=$ORACLE_BASE/crs
export ORA_CRS_HOME=$ORACLE_BASE/crs
export ORACLE_HOME=$ORACLE_BASE/db10g
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$CRS_HOME/lib:$ORACLE_HOME/lib32:$CRS_HOME/lib32
export PATH=$ORACLE_HOME/bin:/oracle/OPatch:$CRS_HOME/bin:$PATH
export ORACLE_SID=zgdb1
export NLS_LANG=american_america.ZHS16GBK

PATH=/usr/bin:/etc:/usr/sbin:/usr/ucb:$HOME/bin:/usr/bin/X11:$ORACLE_HOME/bin:/sbin:.

export PATH

if [ -s "$MAIL" ] # This is at Shell startup. In normal
then echo "$MAILMSG" # operation, the Shell checks
fi # periodically.
prex=`date "+%Y%m%d"`
sqlplus "/ as sysdba">>/oracle/zxc/zgdb1_sql_$prex.out<<!
set pagesize 50000 linesize 300
set echo off

column executions heading "Execs" format 99999999
column rows_processed heading "Rows Procd" format 99999999
column loads heading "Loads" format 999999.99
column buffer_gets heading "Buffer Gets"
column disk_reads heading "Disk Reads"
column elapsed_time heading "Elasped Time"
column cpu_time heading "CPU Time"
column sql_text heading "SQL Text" format a60 wrap
column avg_cost heading "Avg Cost" format 99999999
column gets_per_exec heading "Gets Per Exec" format 99999999
column reads_per_exec heading "Read Per Exec" format 99999999
column rows_per_exec heading "Rows Per Exec" format 99999999

break on report
compute sum of rows_processed on report
compute sum of executions on report
compute avg of avg_cost on report
compute avg of gets_per_exec on report
compute avg of reads_per_exec on report
compute avg of row_per_exec on report
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

PROMPT
PROMPT Top 10 most expensive SQL (Elapsed Time)...
PROMPT
select rownum as rank, a.*
from (
select elapsed_Time,
executions,
buffer_gets,
disk_reads,
cpu_time
hash_value,
sql_text
from v$sqlarea
where elapsed_time > 20000
order by elapsed_time desc) a
where rownum < 11
/

PROMPT
PROMPT Top 10 most expensive SQL (CPU Time)...
PROMPT

select rownum as rank, a.*
from (
select elapsed_Time,
executions,
buffer_gets,
disk_reads,
cpu_time
hash_value,
sql_text
from v$sqlarea
where cpu_time > 20000
order by cpu_time desc) a
where rownum < 11
/

PROMPT
PROMPT Top 10 most expensive SQL (Buffer Gets by Executions)...
PROMPT

select rownum as rank, a.*
from (
select buffer_gets,
executions,
buffer_gets/ decode(executions,0,1, executions) gets_per_exec,
hash_value,
sql_text
from v$sqlarea
where buffer_gets > 50000
order by buffer_gets desc) a
where rownum < 11
/


PROMPT Top 10 most expensive SQL (Physical Reads by Executions)...
PROMPT

select rownum as rank, a.*
from (
select disk_reads,
executions,
disk_reads / decode(executions,0,1, executions) reads_per_exec,
hash_value,
sql_text
from v$sqlarea
where disk_reads > 10000
order by disk_reads desc) a
where rownum < 11
/

PROMPT Top 10 most expensive SQL (Rows Processed by Executions)...
PROMPT

select rownum as rank, a.*
from (
select rows_processed,
executions,
rows_processed / decode(executions,0,1, executions) rows_per_exec,
hash_value,
sql_text
from v$sqlarea
where rows_processed > 10000
order by rows_processed desc) a
where rownum < 11
/

PROMPT
PROMPT Top 10 most expensive SQL (Buffer Gets vs Rows Processed)...
PROMPT

select rownum as rank, a.*
from (
select buffer_gets, lpad(rows_processed ||
decode(users_opening + users_executing, 0, ' ','*'),20) "rows_processed",
executions, loads,
(decode(rows_processed,0,1,1)) *
buffer_gets/ decode(rows_processed,0,1,
rows_processed) avg_cost,
sql_text
from v$sqlarea
where decode(rows_processed,0,1,1) * buffer_gets/ decode(rows_processed,0,1,rows_processed) > 10000
order by 5 desc) a
where rownum < 11
/


select rownum as rank, a.*
from (
select upper(substr(sql_text, 1, 65)) sqltext, count(*)
from v$sqlarea
group by upper(substr(sql_text, 1, 65))
having count(*) > 1
order by count(*) desc) a
where rownum < 11
/
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
!


myfriend2010 发表于:2007.07.05 17:59 ::分类: ( oracle ) ::阅读:(411次) :: 评论 (12)
===========================================================
ORACLE诊断事件的总结-转
===========================================================

Oracle为RDBMS提供了多种的诊断工具,诊断事件(Event)是其中一种常用、好用的方法,它使DBA可以方便的转储数据库各种结构及跟踪特定事件的发生.

  一、Event的通常格式及分类
  
  1、 通常格式如下:
  EVENT="<事件名称><动作><跟踪项目><范围限定>"
  
  2、 Event分类
  诊断事件大体上可以分为四类:
  a. 转储类事件:它们主要用于转储Oracle的一些结构,例如转储一下控制文件、数据文件头等内容。
  b. 捕捉类事件:它们用于捕捉一些Error事件的发生,例如捕捉一下ORA-04031发生时一些Rdbms信息,以判断是Bug还是其它原因引起的这方面的问题。
  c. 改变执行途径类事件:它们用于改主一些Oracle内部代码的执行途径,例如设置10269将会使Smon进程不去合并那些Free的空间。
  d. 跟踪类事件:这们用于获取一些跟踪信息以用于Sql调优等方面,最典型的便是10046了,将会对Sql进行跟踪。
  3、 说明:
  a. 如果immediate放在第一个说明是无条件事件,即命令发出即转储到跟踪文件。
  b. trace name位于第二、三项,除它们外的其它限定词是供Oracle内部开发组用的。
  c. level通常位于1-10之间(10046有时用到12),10意味着转储事件所有的信息。例如当转储控制文件时,level1表示转储控制文件头,而level 10表明转储控制文件全部内容。
  d. 转储所生成的trace文件在user_dump_dest初始化参数指定的位置。

  二、说一说设置的问题了
  
  可以在init.ora中设置所需的事件,这将对所有会话期打开的会话进行跟踪,也可以用alter session set event 等方法设置事件跟踪,这将打开正在进行会话的事件跟踪。
  
  1、 在init.ora中设置跟踪事件的方法
  a. 语法
  EVENT=”event 语法|,level n|:event 语法|,level n|…”
  b. 举例
  event=”10231 trace name context forever,level 10’
  c. 可以这样设置多个事件:
  EVENT="
  10231 trace name context forever, level 10:
  10232 trace name context forever, level 10"
  
  2、 通过Alter session/system set events这种方法
  举个例子大家就明白了
  Example:
  Alter session set events ‘immediate trace name controlf level 10’;
  Alter session set events ‘immediate trace name blockdump level 112511416’; (*)
  在oracle8x及之上的版本也有这样的语句:
  Alter system dump datafile 13 block 15;实现的功能与(*)是类似的。
  
  3、 使用DBMS_SYSTEM.SET_EV的方法
  a. 过和定义如下
  DBMS_SYSTEM.SET_EV(
  SI Binary_integer,
  SE Binary_integer,
  EV Binary_integer,
  LE Binary_integer,
  NM Binary_integer);
  
  SI: 即v$session中的sid
  SE:即v$session中的serial#
  EV:要设置的事件
  LE:要设置事件的级别
  NM:名称
  b. 举个例子,以10046为例
  SQL> EXECUTE SYS.DBMS_SYSTEM.SET_EV(sid,serial#,10046,12,'');
  
  4、 使用Oradebug来设置诊断事件的方法
  同样举个例子大家就明白了:
  a. 找到spid
  SQL>select username, sid, serial#, paddr from v$session where username='qiuyb';
  
  USERNAME SID SERIAL# PADDR
  --------------------------------------------------------
  HRB3 265 910 C000000084435AD8
  
  SQL>SELECT ADDR,PID,SPID FROM V$PROCESS WHERE ADDR= C000000084435AD8';
  ADDR PID SPID
  ------------------------------------------
  C000000084435AD8 91 4835
  
  b. 设置事件,以10046为例
  sqlplus /nolog
  SQL>connect / as sysdba;
  SQL>oradebug setospid 4835
  SQL>oradebug unlimit   --不限制转储文件的大小
  SQL> oradebug event 10046 trace name context forever,level 12 --设置事件进行sql跟踪
  
  SQL> oradebug event 10046 trace name context off --关闭跟踪
  
  注意不要用oradug去跟踪oracle的smon,pmon等几个进程,操作不当可能会杀掉这几个后台进和引起宕库。
  
  三、你可能的问题
  
  1、 我如何知道在系统中设置了哪些event?
  回答:
  a. 如果你的事件是在init.ora中设置的可以用
  SQL>show parameter event;
  来查看
  b. Michael R.Ault给的SQL
  serveroutput on size 1000000
  declare
  event_level number;
  begin
  for i in 10000..10999 loop
  sys.dbms_system.read_ev(i,event_level);
  if (event_level > 0) then
  dbms_output.put_line('Event '||to_char(i)||' set at level '||
  to_char(event_level));
  end if;
  end loop;
  end;
  /
  
  2、 在oracle9i中使用spfile的那种如何设置诊断事件呢?
  回答:
  简单,Alter system命令就可以完成
  alter system set event='10046 trace name context forever, level 12' scope=spfile;
  重启一下就生效了。
  
  3、 坏了,我的9i设置完诊断事件,起不来了,报ORA-02194错怎么办?
  回答:
  那你一定是在使用Alter system时把某一项写错了,比如把context写成了conetxt了,可以做如下的解决:
  a.由spfile生成pfile
  SQL>create pfile from spfile;
  File created.
  
  b.编辑pfile以修正错误
  Change... *.event='10046 trace name conetxt forever, level 12'
  -to- *.event='10046 trace name context forever, level 12'
  c.用pfile启动
  SQL>startup pfile=/.....
  d.重新生成 SPFILE.
  SQL>create spfile from pfile;
  File created.


常用的Event Reference
Event 10013 - Monitor Transaction Recovery
This event can be used to trace transaction recovery during startup

For example

ALTER SESSION SET EVENTS
'10013 trace name context forever, level 1';

Event 10015 - Dump Undo Segment Headers
This event can be used to dump undo segment headers before and after transaction recovery

For example

ALTER SESSION SET EVENTS
'10015 trace name context forever, level 1';

Event 10032 - Dump Sort Statistics
This event can be used to dump sort statistics. Level 10 is the most detailed

For example

ALTER SESSION SET EVENTS
'10032 trace name context forever, level 10';

Event 10033 - Dump Sort Intermediate Run Statistics
This event can be used to dump sort intermediate run statistics. Level 10 is the most detailed

For example

ALTER SESSION SET EVENTS
'10033 trace name context forever, level 10';

Event 10045 - Trace Free List Management Operations
This event can be used to trace free list management operations

For example

ALTER SESSION SET EVENTS
'10045 trace name context forever, level 1';

Event 10046 - Enable SQL Statement Trace
This event can be used to dump SQL statements executed by a session with execution plans and statistics. Bind variable and wait statistics can optionally be included. Level 12 is the most detailed.

For example

ALTER SESSION SET EVENTS
'10046 trace name context forever, level 12';

Levels are

Level Action
1 Print SQL statements, execution plans and execution statistics
4 As level 1 plus bind variables
8 As level 1 plus wait statistics
12 As level 1 plus bind variables and wait statistics


Event 10053 - Dump Optimizer Decisions
This event can be used to dump the decisions made by the optimizer when parsing a statement. Level 1 is the most detailed

For example

ALTER SESSION SET EVENTS
'10053 trace name context forever, level 1';

Levels are

Level Action
1 Print statistics and computations
2 Print computations only


Event 10060 - Dump Predicates
This event can be used to force the optimizer to dump predicates to a table It is available in Oracle 7.1.3 and above, and was still working in Oracle 9.2.

This event requires the following table to be created in the schema of the user parsing the statement

CREATE TABLE kkoipt_table
(
c1 INTEGER,
c2 VARCHAR2(80)
);

To enable this event use

ALTER SESSION SET EVENTS
'10060 trace name context forever, level 1';

This example uses the following object

CREATE TABLE t1 (c01 NUMBER, c02 NUMBER);

With event 10060 set to level 1, when the following statement is executed for the first time

SELECT c01 FROM t1 WHERE c02 = 0;

It is parsed and the results written to kkoipt_table

The results can be selected using the statement

SELECT c1,c2 FROM kkoipt_table ORDER BY c1;

C1 C2
1 Table:
2 T1
3 frofand
4 "T1"."C02"=0


The following table summarises the various operations that can be reported by this event

Operation Description
fptconst Folding constants
fptrnum Remove ROWNUM predicates
fptwhr Remove all WHERE predicates except remaining ROWNUM predicates
frofkks (rowid lookup) ROWID lookup
frofkks[i] (and-equal lookup) start key
frofkke[i] (and-equal lookup) end key
froiand index-only predicate
frofkksm[i] (sort-merge) sort-merge key
frosand (sort-merge) sort-merge predicates
frojand (sort-merge) join predicates
frofkks[i] (index start key) index start key
frofkke[i] (index stop key) index end key
frofand (hash part) table predicate (hash)
froiand (index only filter) index only predicate
frofand table predicate
froutand outer join predicates


Event 10065 - Restrict Library Cache Dump Output for State Object Dumps
The amount of library cache dump output for state object dumps can be limited using event 10065

ALTER SESSION SET EVENTS '10065 trace name context forever, level level';

where level is one of the following

Level Description
1 Address of library object only
2 As level 1 plus library object lock details
3 As level 2 plus library object handle and library object


Level 3 is the default

Event 10079 - Dump SQL*Net Statistics
This event can be used to SQL*Net statistics. Level 2 is the most detailed

For example

ALTER SESSION SET EVENTS
'10079 trace name context forever, level 2';

Event 10081 - Trace High Water Mark Changes
This event can be used to trace high water mark changes

For example

ALTER SESSION SET EVENTS
'10081 trace name context forever, level 1';

Event 10104 - Dump Hash Join Statistics
This event can be used to hash join statistics. Level 10 is the most detailed

For example

ALTER SESSION SET EVENTS
'10104 trace name context forever, level 10';

Event 10128 - Dump Partition Pruning Information
This event can be used to partition pruning information

For example

ALTER SESSION SET EVENTS
'10128 trace name context forever, level level';

Levels are

Level Action
0x0001 Dump pruning descriptor for each partitioned object
0x0002 Dump partition iterators
0x0004 Dump optimizer decisions about partition-wise joins
0x0008 Dump ROWID range scan pruning information


There are further levels (up to 4096?)

In Oracle 9.0.1 and above, a table must be created before level 2 of this event can be set.

The table definition is as follows

CREATE TABLE kkpap_pruning
(
partition_count NUMBER,
iterator VARCHAR2(32),
partition_level VARCHAR2(32),
order_pt VARCHAR2(12),
call_time VARCHAR2(12),
part# NUMBER,
subp# NUMBER,
abs# NUMBER
);

Event 10200 - Dump Consistent Reads
This event can be used to dump consistent reads

ALTER SESSION SET EVENTS
'10200 trace name context forever, level 1';

Event 10201 - Dump Consistent Read Undo Application
This event can be used to dump consistent read undo application

ALTER SESSION SET EVENTS
'10201 trace name context forever, level 1';

Event 10220 - Dump Changes to Undo Header
This event can be used to dump changes to the undo header (transaction table)

ALTER SESSION SET EVENTS
'10220 trace name context forever, level 1';

Event 10221 - Dump Undo Changes
This event can be used to dump undo changes applied. Level 7 is the most detailed

ALTER SESSION SET EVENTS
'10221 trace name context forever, level 7';

Event 10224 - Dump Index Block Splits / Deletes
This event can be used to dump index block splits and deletes detailed

ALTER SESSION SET EVENTS
'10224 trace name context forever, level 1';

Event 10225 - Dump Changes to Dictionary Managed Extents
This event can be used to dump changes to dictionary-managed extents made in the row cache

ALTER SESSION SET EVENTS
'10225 trace name context forever, level 1';

Event 10241 - Dump Remote SQL Execution
This event can be used to dump remotely executed SQL statements

ALTER SESSION SET EVENTS
'10241 trace name context forever, level 1';

Event 10246 - Trace PMON Process
This event can be used to trace the actions of the PMON background process

This event can only be enabled in the init.ora file using

event = "10246 trace name context forever, level 1"

The ALTER SYSTEM command does not appear to work for this event

There only appears to be one level for this event (levels 5 and 10 appear to generate the same output as level 1)

Event 10248 - Trace Dispatcher Processes
This event can be used to trace dispatcher processes

This event can be enabled in the init.ora file using

event = "10248 trace name context forever, level 10"

In Oracle 9.2 (Windows 2000) the trace is written to a file in the udump directory with a name in the format

ServiceName_dDispatcherNumber_ThreadNumber.trc

e.g.

JD92001_d000_1234.trc

Valid levels are 1 to 10 (Metalink Note)

Event 10249 - Trace Shared Server (MTS) Processes
This event can be used to trace shared server (MTS) processes

This event can be enabled in the init.ora file using

event = "10249 trace name context forever, level 10"

In Oracle 9.2 (Windows 2000) the trace is written to a file in the udump directory with a name in the format

ServiceName_sSharedServerNumber_ThreadNumber.trc

e.g.

JD92001_s000_5678.trc

Valid levels are 1 to 10 (Metalink Note)

Event 10270 - Debug Shared Cursors
This event can be used to enable debugging code in shared cursor management modules

event = "10270 trace name context forever, level 10"

Event 10299 - Debug Prefetching
This event can be used to enable debugging code for table and index block prefetching. It also enables dumping of trace by the CKPT process.

event = "10299 trace name context forever, level 1"

Event 10357 - Debug Direct Path
This event can be used to enable debugging code for direct path

ALTER SESSION SET EVENTS
'10357 trace name context forever, level 1';

Event 10390 - Dump Parallel Execution Slave Statistics
This event can be used to dump parallel slave statistics

ALTER SESSION SET EVENTS
'10390 trace name context forever, level level';

Levels are (from messages)

Level Action
0x0001 Slave-side execution messages
0x0002 Coordinator-side execution messages
0x0004 Slave context state changes
0x0008 Slave ROWID range bind variables and xty
0x0010 Slave fetched rows as enqueued to TQ
0x0020 Coordinator wait reply handling
0x0040 Coordinator wait message buffering
0x0080 Slave dump timing
0x0100 Coordinator dump timing
0x0200 Slave dump allocation file number
0x0400 Terse format for debug dumps
0x0800 Trace CRI random sampling
0x1000 Trace signals
0x2000 Trace parallel execution granule operations
0x4000 Force compilation by slave 0


Event 10391 - Dump Parallel Execution Granule Allocation
This event can be used to dump parallel granule allocation / assignment statistics

ALTER SESSION SET EVENTS
'10391 trace name context forever, level level';

Levels are (from messages)

Level Action
0x0001 Dump summary of each object scanned in parallel
0x0002 Full dump of each object except extent map
0x0004 Full dump of each object including extent map
0x0010 Dump summary of each granule generators
0x0020 Full dump of granule generators except granule instances
0x0040 Full dump of granule generators including granule instances
0x0080 Dump system information
0x0100 Dump reference object for the query
0x0200 Gives timing in kxfralo
0x0400 Trace affinity module
0x0800 Trace granule allocation during query execution
0x1000 Trace object flush
0x2000 Unknown


Event 10393 - Dump Parallel Execution Statistics
This event can be used to dump kxfp statistics after each parallel query

ALTER SESSION SET EVENTS
'10393 trace name context forever, level 1';

Note that in Oracle 9.2 for parallel execution trace is written to files with names of the format

ServiceName_pServerNumber_ThreadNumber.trc

This is an example of the output for this event. The output has been modified for readability

kxfpdst
dumping statistics
---------------------------
Query Sessions 1
Total Messages Sent 0
Data Messages Sent 948
Stream Messages Sent 917
Dialog Messages Sent 26
Null Messages Sent 0
Fast Shared Memory Streams 669
Fast Distributed Stream 0
Stream Mode Credit Ping 0
Unknown Credit Pings 0
Single Credit Pings 252
Double Credit Pings 0
Triple Credit Pings 0
Multiple Credit Pings 0
Total Messages Dequeued 0
Data Messages Dequeued 31
Null Messages Dequeued 0
Immediate Dequeues 1
Posted Dequeues 31
Timed-out Dequeues 0
Implicit Dequeues 255
Total Dequeue Waits 85
Total Dequeue Timeouts 44
Dequeues for Credit (geb) 77
Dequeues for Credit (free) 0
Dequeues for Credit (enq) 39

Event 10500 - Trace SMON Process
This event can be used to trace the actions of the SMON background process

This event can be enabled in the init.ora file using

event = "10500 trace name context forever, level 1"

Event 10608 - Trace Bitmap Index Creation
This event traces bitmap index creation.

ALTER SESSION SET EVENTS
'10608 trace name context forever, level 10';

Event 10704 - Trace Enqueues
This event dumps information about which enqueues are being obtained

When enabled it prints out arguments to calls to ksqcmi and ksqlrl and the return values

ALTER SESSION SET EVENTS
'10704 trace name context forever, level 1';

Event 10706 - Trace Global Enqueue Manipulation
This event allows RAC global enqueue manipulation to be trace

ALTER SESSION SET EVENTS
'10706 trace name context forever, level 1';

The amount of output can be limited using the unsupported parameter '_ksi_trace'.

This parameter specifies the lock types that should be included e.g. TM, TX etc. They are specified as a string e.g. 'TMTX'

The parameter '_ksi_trace' can only be set in the initialisation file.

Event 10708 - Trace RAC Buffer Cache
This event allows RAC buffer cache activity to be traced

ALTER SESSION SET EVENTS
'10708 trace name context forever, level 10';

This diagnostic applies only to RAC clusters (not single-instance)

Event 10710 - Trace Bitmap Index Access
This event traces bitmap index access. It displays the start ROWID and end ROWID of each bitmap

ALTER SESSION SET EVENTS
'10710 trace name context forever, level 1';

Event 10711 - Trace Bitmap Index Merge Operation
This event traces the bitmap index merge operation.

ALTER SESSION SET EVENTS
'10711 trace name context forever, level 1';

Event 10712 - Trace Bitmap Index OR Operation
This event traces the bitmap index OR operation.

ALTER SESSION SET EVENTS
'10712 trace name context forever, level 1';

Event 10713 - Trace Bitmap Index AND Operation
This event traces the bitmap index AND operation.

ALTER SESSION SET EVENTS
'10713 trace name context forever, level 1';

Event 10714 - Trace Bitmap Index MINUS Operation
This event traces the bitmap index MINUS operation.

ALTER SESSION SET EVENTS
'10714 trace name context forever, level 1';

Event 10715 - Trace Bitmap Index Conversion to ROWIDs Operation
This event traces the bitmap index conversion to ROWIDs operation

ALTER SESSION SET EVENTS
'10715 trace name context forever, level 1';

Event 10716 - Trace Bitmap Index Compress/Decompress
This event traces the bitmap index compress/decompress

ALTER SESSION SET EVENTS
'10716 trace name context forever, level 1';

Event 10717 - Trace Bitmap Index Compaction
This event traces the bitmap index compaction.

ALTER SESSION SET EVENTS
'10717 trace name context forever, level 1';

Event 10719 - Trace Bitmap Index DML
This event traces the bitmap index DML.

ALTER SESSION SET EVENTS
'10719 trace name context forever, level 1';

Event 10730 - Trace Fine Grained Access Predicates
This event traces find grained access (RLS) predicates

ALTER SESSION SET EVENTS
'10730 trace name context forever, level 1';

Event 10731 - Trace CURSOR Statements
This event traces CURSOR statements

ALTER SESSION SET EVENTS
'10731 trace name context forever, level level';

Levels are

Level Action
1 Print parent query and subquery
2 Print subquery only


Event 10928 - Trace PL/SQL Execution
This event traces PL/SQL execution

ALTER SESSION SET EVENTS
'10928 trace name context forever, level 1';

Event 10938 - Dump PL/SQL Execution Statistics
This event dumps PL/SQL execution statistics.

ALTER SESSION SET EVENTS
'10938 trace name context forever, level 1';

This event currently generates the following output

--NOTICE ---------------------------------------
--PL/SQL TRACE INFORMATION IS NOW IN THE DATABASE
-- To create the trace tables, use the script --
-- rdbms/admin/tracetab.sql under ORACLE_HOME --


myfriend2010 发表于:2007.07.01 09:32 ::分类: ( oracle ) ::阅读:(251次) :: 评论 (0)
===========================================================
Oracle10g:数据的导入导出--数据泵的使用--转
===========================================================

Oracle10g:数据的导入导出--数据泵的使用

Oracle 数据库 10g 中的新的实用程序使其性能和多功能性达到了新的水平。

Oracle 数据库 10g 中增加的叫做 Oracle Data Pump (数据泵)的新的导入和导出特性,彻底改变了数据库用户已经习惯的过去几代 Oracle 数据库的客户 / 服务器工作方式。现在服务器可以运行导出和导入任务。你可以通过并行方式快速装入或卸载大量数据,而且你可以在运行过程中调整并行的程度。导出和导入任务现在可以重新启动,所以发生故障不一定意味着要从头开始。 API 是公诸于众的,并且易于使用;用 PL/SQL 建立一个导入和导出任务非常简单。一旦启动,这些任务就在后台运行,但你可以通过客户端实用程序从任何地方检查任务的状态和进行修改。

体系结构

在 Oracle 数据库 10g 之前(从 Oracle7 到 Oracle9I ),导入和导出实用程序都作为客户端程序运行,并且完成大量工作。导出的数据由数据库实例读出,通过连接传输到导出客户程序,然后写到磁盘上。所有数据在整个导出进程下通过单线程操作。今天的数据量比这个体系结构最初采用的时候要大得多,使得单一导出进程成了一个瓶颈,因为导出任务的性能受限于导出实用程序所能支持的吞吐量。

在 Oracle 数据库 10g 和全新的数据泵( Data Pump )体系结构下,如今所有的工作都由数据库实例来完成。数据库实例可以用两种方法来并行处理这些工作:通过建立多个数据泵工作进程来读 / 写正在被导出 / 导入的数据,以及建立并行 I/O 服务器进程以更快地选取( SELECT )或插入( INSERT )这些数据。这样,单进程瓶颈再也就不存在了。

数据泵任务用新的 DBMS_DATAPUMP PL/SQL API 来建立、监测和调整。新的导入和导出实用程序(分别为 impdp 和 expdp )对于这个 API 来说只是命令行接口。你可以使用数据泵导出实用程序初始化一个任务,例如一个导出任务。然后你就可以关闭你的客户端,回家过夜和享用晚餐,而你的任务会一直运行。到了深夜,你可以重新连接到那个任务,检查其状态,甚至可以提高并行程度,以便在深夜系统没有用户在用的情况下多完成一些工作。第二天早上,你可以降低并行度甚至挂起该任务,为白天在线的用户释放资源。

重新启动任务的功能是数据泵体系结构的一个重要特性。你可以随时停止和重启动一个数据泵任务,比如为在线用户释放资源。你还可以从文件系统的空间问题中轻松地恢复。如果一个 12 小时的导出任务在进行了 11 小时后因磁盘空间不够而失败,那么你再也不用从头开始重新启动该任务,重复前面 11 小时的工作。而是你可以连接到这个失败的任务,增加一个或多个新的转储( dump )文件,从失败的地方重新启动,这样只需一个小时你就可以完成任务了。这在你处理很大数据量时非常有用。

对文件系统的访问

由服务器处理所有的文件 I/O 对于远程执行导出和导入任务的数据库管理员来说非常有利。如今,用户可以很轻松地在类似 UNIX 的系统 ( 如 Linux) 上 telnet 或 ssh 到一个服务器,在命令行方式下初始化一个运行在服务器上的导出或导入任务。然而,在其他操作系统上就不那么容易, Windows 是最明显的例子。在推出数据泵之前,要从一个 Windows 系统下的 Oracle 数据库中导出大量数据,你很可能必须坐在服务器控制台前发出命令。通过 TCP/IP 连接导出数据只对小数据量是可行的。数据泵改变了这一切,因为即使你通过在你的客户端上运行该导出和导入实用程序来初始化一个导出或导入任务,该任务其实也运行在服务器上,所有的 I/O 也都发生在该服务器上。

出于安全性考虑,数据泵要求你通过 Oracle 的目录对象来指定其中存放着你要建立或读取的转储文件的目标目录。例如:

CREATE DIRECTORY export_dumps

AS 'c:a';

GRANT read, write

ON DIRECTORY export_dumps

TO gennick;

我以 SYSTEM 身份登录到我的实验室数据库上,并执行以上语句来建立一个目录对象,这个目录对象指向了我磁盘上的一个临时目录,以用来存放导出的转储文件。 GRANT 语句为用户 gennick- 就是我 - 分配了访问该目录的权限。我给自己分配读 / 写权限,因为我将导出和导入数据。你可以为一个用户分配读权限,限制他只能导入数据。

启动一个导出任务

你可以使用新的 expdp 实用程序来启动一个导出任务。因为参数与老的 exp 实用程序不同,所以你得熟悉这些新的参数。你可以在命令行中指定参数,但在本文中我使用了参数文件。我想导出我的整个模式( schema ),使用了以下参数:

DUMPFILE=gnis%U.dmp

DIRECTORY=export_dumps

LOGFILE=gnis_export.log

JOB_NAME=gnis_export

DUMPFILE 指定我将向其中写入被导出数据的文件。 %U 语法给出了一个增量计数器,得到文件名 gnis01.dmp 、 gnis02.dmp 等。 DIRECTORY 指定了我的目标目录。

我的 LOGFILE 参数指定了日志文件的名字,这个文件是为每个导出任务默认创建的。 JOB_NAME 给任务指定了一个名字。我选择了一个易于记忆(和输入)的名字,因为我可能需要在后面才连接这个任务。要注意在指定任务名称时不要与你登录模式( schema )中的模式对象名称冲突。数据泵在你的登录模式中建立一个被称为任务主表的数据表,该表的名字与任务的名字相匹配。这个数据表跟踪该任务的状态,并最终被写入转储文件中,作为该文件所含内容的一个记录。

清单 1 显示了一个导出任务已被启动。该任务所做的第一件事是估计所需的磁盘空间大小。当估计值显示出来后,我按 ctrl-C 进入一个交互式的导出提示窗口,然后使用 EXIT_CLIENT 命令回到我操作系统的命令窗口。该导出任务仍然运行在服务器上。

注意,如果我要做并行导出并且将我的 I/O 分布在两个磁盘上,那么我可以对 DUMPFILE 参数值做出修改,并如下添加 PARALLEL 参数和值,如下所示:

DUMPFILE=export_dumps01:gnis%U.dmp,

export_dumps02:gnis%U.dmp

PARALLEL=2

注意,在这个并行导出任务中,目录名作为文件名的一部分来被指定。

检查状态

你可以随时连接到一个运行中的任务来检查其状态。要连接到一个导出任务,必须执行一条 expdp 命令,使用 ATTACH 参数来指定任务名称。 清单 2 显示了到 GNIS_EXPORT 任务的连接。当你连接到一个任务, expdp 显示该任务的相关信息和当前状态,并为你提供一个 EXPORT> 提示符。

当你连接到了一个任务后,你可以随时执行 STATUS 命令查看当前状态,如 清单 3 所示。你还可以执行 CONTINUE_CLIENT 命令返回到显示任务进度的日志输出状态,该命令可以被缩写成如 清单 4 所示的 CONTINUE 。

你可以通过查询 DBA_DATAPUMP_JOBS 视图快速查看所有数据泵任务的状态。你不能获得 STATUS 命令所给出的详细信息,但你可以快速查看到哪些任务在执行、哪些处于空闲状态等。另一个需要了解的视图是 DBA_DATAPUMP_SESSIONS ,它列出了所有活跃的数据泵工作进程。

从故障中恢复

重启动任务的能力使你可以从某些类型的故障中恢复过来。例如, 清单 5 显示了一个用完了转储文件空间的导出任务的日志文件的结尾部分。然而,什么也没有丢失。该任务只是进入了一个空闲状态,当你连接到该任务并查看状态输出时就可以看到这一点。这个状态不显示任务空闲的原因。要确定这是因为转储文件的空间不够了,则你需要查看日志文件。

连接到因转储文件空间不够用了而停止的任务后,你可以在两个操作中选择其一:你可以使用 KILL_JOB 命令来中止该任务,或者增加一个和多个转储文件来继续该任务的运行。如果空间不够的问题是因为磁盘空间不足,则当然你要确保你增加的文件是在另一个有可用空间的磁盘上。你也许需要创建一个新的 Oracle 目录对象来指向这一新位置。

清单 6 使用 ADD_FILES 命令为我的空闲任务增加两个文件。这两个文件位于不同的目录中,它们都不同于为该任务的第一个转储文件所指定的目录。我使用 START_JOB 命令来重新启动该任务,然后使用 CONTINUE 查看屏幕上滚动的其余日志输出。

导入任务不会受到卸载( dump )文件空间不足的影响。但是,它们可能会受到数据表空间不足或无法扩展表空间的影响。导入的恢复过程和导出任务的基本上相同。首先,通过向表空间增加一个数据文件、扩展一个数据文件或其他方法来提供可用空间。然后连接到该任务,执行 START_JOB 命令。导入任务将从它中断的地方继续执行。

导入选定的数据

本文中的例子到目前为止显示的是对用户 GENNICK 拥有的所有对象进行模式( schema )数据库级别的导出。为了展示数据泵的一些新的功能,我要导入那些数据,而且为了使问题更有意思,我列出了以下要求:

仅导入 GNIS 数据表
将该数据表导入到 MICHIGAN 模式中
仅导入那些与密歇根州相关的数据行
不导入原始的存储参数
一开始,我可以在我的导入参数文件中写出以下四行:

DUMPFILE=gnis%U.dmp

DIRECTORY=export_dumps

LOGFILE=gnis_import.log

JOB_NAME=gnis_import

这四行没有什么新意。他们指定了转储文件、目录、日志文件和该任务的名称。根据我们的四个要求,我可以使用 INCLUDE 参数将导入操作限制在我们感兴趣的一个数据表上:

INCLUDE=TABLE:"= 'GNIS'"

INCLUDE 是个很有意思的参数。当你需要导入一个转储文件的部分内容时,你可以有两个方法:

你可以使用一个或多个 INCLUDE 参数列出你要导入的那些对象。
你可以使用 EXCLUDE 参数列出那些你不需要的内容,然后导入其余的内容。
因为我只需要一个对象,明确包含该对象比起明确不包括其它对象要容易得多。我的 INCLUDE 参数值的第一部分是关键字 TABLE ,表明我要导入的对象是一个数据表(其它的可能是一个函数或一个过程)。 接下来是一个冒号,然后是一个 WHERE 子句的谓词。我明确希望数据表名为 GNIS ,所以这个谓词是 "= 'GNIS'" 。如果必要,则你可以写出多个详细的谓词。通过 INCLUDE 和 EXCLUDE 参数,你可以确切地指出以什么样的粒度导入或导出。我建议你仔细地阅读关于这两个参数的文档。它们的功能之强大和多功能性是我在本文中所无法描述的。

我可以很轻松地完成该模式的改变,将来自 GNIS 模式的数据表重新映射到 MICHIGAN 模式:

REMAP_SCHEMA=gennick: michigan

我只需要关于密歇根州的数据行。为此,我可以使用 QUERY 参数来指定一个 WHERE 子句:

QUERY="WHERE gnis_state_abbr='MI'"

QUERY 在老的实用程序中也有,但只能用于导出操作。数据泵使 QUERY 也能用于导入操作,因为数据泵利用了 Oracle 较新的外部数据表功能。只要可能,数据泵会选择直接路径来导出或导入数据,包括从数据库数据文件中读取数据然后直接写到一个导出转储文件中,或读取转储文件然后直接写入数据库数据文件中。但是,当你指定了 QUERY 参数时,数据泵将使用一个外部数据表。对于一个导入任务,数据泵将使用 ORACLE_DATAPUMP 存取驱动程序建立一个外部数据表,并执行一条 INSERT...SELECT...FROM 语句。

我的最后一个要求是避免导入与已被导出的数据表相关的存储参数。我希望 MICHIGAN 模式中的新 GNIS 表沿用该模式的默认表空间的默认存储参数。原因是 MICHIGAN 的默认表空间不足以容纳该数据表的本来大小,但是是以仅仅容纳与密歇根有关的数据行。通过 TRANSFORM 参数,我可以告诉导入任务不要包含与原始表相关的任何数据段属性:

TRANSFORM=SEGMENT_ATTRIBUTES:N

这看起来是件小事,但以前有很多次我都希望老的导入实用程序的 TRANSFORM 参数有这样的功能。我在试图将少量生产数据导入到测试系统中时经常失败,因为即使存储生产数据的各个区段当中许多是空的,其数据量也比我测试系统所能支持的大得多。对于只导入一张数据表的情况,预先建立数据表是解决这个问题的一个办法。然而,随着数据表的增多,预先建表会很麻烦。而 TRANSFORM 这样的简单开关可以轻松地将转储文件中所有数据段的属性全体忽略掉。

将我上面描述的所有选项放到一个参数文件中后,我可以调用导入实用程序,如下所示:

impdp michigan/password

parfile=gnis_import.par

当作为一个没被授权的用户进行导入时,你需要连接到目标模式。如果你拥有 IMP_FULL_DATABASE 角色,那么你可以用自己的身份登录,然后导入到任何目标模式。

性能和多功能性

Oracle 数据泵比起以前的导出和导入实用程序在性能上有很大的提高。这种性能提高大部分来自于读写转储文件的并行操作。你可以指定并行程度来达到你所要求的速度与资源消耗的折中。

下一步

下载本文所使用的示例数据

数据泵还很好地利用了 Oracle 数据库其他最新开发的创新特性。 Flashback (回闪)用于确保导出数据的一致性,而 FLASHBACK_SCN 和 FLASHBACK_TIME 参数使你能够完全控制这一功能。直接路径( direct-path ) API 用于在任何可能的时候提高性能,当直接路径 API 不能使用时,用外部数据表和新的 ORACLE_DATAPUMP 外部数据表存取驱动程序来传输数据。

数据泵除了提供全新的性能外还为你提供灵活性。这表现在 INCLUDE 和 EXCLUDE 参数、 QUERY 参数、 TRANSFORM 参数和其他参数的实现中,这些参数使你能够精细地控制被加载和卸载的数据和对象。

人们一直在不断地对 " 大数据 ?quot; 的含意进行重新定义,这种数据库容量之大在十年前还只能是梦想。在这样的世界里,数据泵对于你的数据库管理员所用的工具库是个不错的补充,使你能够以前所未有的速度对数据库进行数据导入和导出。


myfriend2010 发表于:2007.06.27 17:15 ::分类: ( oracle ) ::阅读:(588次) :: 评论 (7)
===========================================================
关于ORACLE数据库的并行执行
===========================================================

ORACLE数据库的并行执行

session_max_open_files:
  说明: 指定可在任一给定会话中打开的 BFILE 的最大数量。一旦达到这个数量, 此后将无法在该会话中打开更多文件。该参数还取决于操作系统参数 MAX_OPEN_FILES。
  值范围: 1 - 至少为 (50, OS 级上的 MAX_OPEN_FILES)。
  默认值: 10
parallel_execution_message_size:
  说明: 指定并行执行 (并行查询, PDML, 并行恢复和复制) 消息的大小。如果值大于 2048 或 4096, 就需要更大的共享池。如果 PARALLEL_AUTOMATIC_TUNING = TRUE, 将在大存储池之外指定消息缓冲区。
  值范围: 2148 - 无穷大。
  默认值: 如果 PARALLEL_AUTOMATIC_TUNING 为 FALSE, 通常值为 2148; 如果 PARALLEL_AUTOMATIC_TUNING 为 TRUE , 则值为 4096 (根据操作系统而定)。
Paralle_min_percent:
  说明: 指定并行执行要求的线程的最小百分比。设置该参数, 可以确保并行执行在没有可用的恰当查询从属进程时, 会显示一个错误消息, 并且该查询会因此而不予执行。
  值范围: 0 -100
  默认值: 0, 表示不使用该参数。
Parallel_automatic_tuning:
  说明: 如果设置为 TRUE, Oracle 将为控制并行执行的参数确定默认值。除了设置该参数外, 你还必须为系统中的表设置并行性。
  值范围: TRUE | FALSE
  默认值: FALSE
parallel_threads_per_cpu:
  说明: 说明一个 CPU 在并行执行过程中可处理的进程或线程的数量, 并优化并行自适应算法和负载均衡算法。如果计算机在执行一个典型查询时有超负荷的迹象, 应减小该数值。
  值范围: 任何非零值。
  默认值: 根据操作系统而定 (通常为 2)
parallel_broadcast_enabled:
  说明 : 通过使用一个散列联接或合并联接, 可以在将多个大结果集联接到一个小结果集 (以字节而不是行为单位来衡量大小) 时改善性能。如果该值设置为 TRUE, 优化程序可以将小结果集内的每个行都传播到大型集内的每个集群数据库处理行中。
  值范围: TRUE | FALSE
  默认值 : FALSE
parallel_adaptive_multi_user:
  说明: 启用或禁用一个自适应算法, 旨在提高使用并行执行方式的多用户环境的性能。通过按系统负荷自动降低请求的并行度, 在启动查询时实现此功能。当 PARALLEL_AUTOMATIC_TUNING = TRUE 时, 其效果最佳。
  值范围: TRUE | FALSE
  默认值: 如果 PARALLEL_AUTOMATIC_TUNING = TRUE, 则该值为 TRUE; 否则为 FALSE
parallel_max_servers:
  说明: 指定一个例程的并行执行服务器或并行恢复进程的最大数量。如果需要, 例程启动时分配的查询服务器的数量将增加到该数量。
  值范围: 0 -256
  默认值: 由 CPU_COUNT, PARALLEL_AUTOMATIC_TUNING 和 PARALLEL_ADAPTIVE_MULTI_USER 确定
parallel_min_servers
  说明: 指定为并行执行启动例程后, Oracle 创建的查询服务器进程的最小数量。
  值范围: 0 - PARALLEL_MAX_SERVERS。
  默认值: 0
log_archive_dest_state_3:
  说明: 指定相应的归档日志目标参数 (仅 LOG_ARCHIVE_DEST_3) 的可用性状态。如果启用, 日志目标将被归档。如果延迟, 该目标将被排除在归档操作之外直至重新启用。
  值范围: ENABLE | DEFER
  默认值: ENABLE
log_archive_dest_state_4:
  说明: 指定相应的归档日志目标参数 (仅 LOG_ARCHIVE_DEST_4) 的可用性状态。如果启用, 日志目标将被归档。如果延迟, 该目标将被排除在归档操作之外直至重新启用。
  值范围: ENABLE | DEFER
  默认值: ENABLE
log_archive_dest_state_5:
  说明: 指定相应的归档日志目标参数 (仅 LOG_ARCHIVE_DEST_5) 的可用性状态。如果启用, 日志目标将被归档。如果延迟, 该目标将被排除在归档操作之外直至重新启用。
  值范围: ENABLE | DEFER
  默认值: ENABLE
log_archive_dest_state_6:
  说明: 标识特定日志归档目标的最近的用户定义状态。
  值范围: ENABLE--如果目标属性有效, 则启用归档日志目标; DEFER--即使目标属性有效, 也要延迟处理归档日志目标; 或者是 ALTERNATE--延迟处理归档日志目标, 直到另一个目标的失败导致自动启用了此目标 (前提是备用目标的属性必须有效)。
log_archive_dest_state_7:
  说明: 标识特定日志归档目标的最近的用户定义状态。
  值范围: ENABLE--如果目标属性有效, 则启用归档日志目标; DEFER--即使目标属性有效, 也要延迟处理归档日志目标; 或者是 ALTERNATE--延迟处理归档日志目标, 直到另一个目标的失败导致自动启用了此目标 (前提是备用目标的属性必须有效)。
log_archive_dest_state_8:
  说明: 标识特定日志归档目标的最近的用户定义状态。
  值范围: ENABLE--如果目标属性有效, 则启用归档日志目标; DEFER--即使目标属性有效, 也要延迟处理归档日志目标; 或者是 ALTERNATE--延迟处理归档日志目标, 直到另一个目标的失败导致自动启用了此目标 (前提是备用目标的属性必须有效)。

--并行查询设置
alter table emp parallel (degree 4);
select degree from user_tables where table_name = 'EMP';
select count(*) from emp;
alter table emp noparallel;

SELECT /*+ PARALLEL(emp,4) */ COUNT(*)
FROM emp;

--深度了解
一、并行执行可以提高以下操作的执行速度:
大表扫描
创建大的索引
基于分区的索引扫描
大量的插入,修改,删除操作
拷贝操作

二、并行执行的条件
SMP,CLUSTERS,MPP系统
足够的I/O带宽
足够的内存来支持消耗内存的进程(排序,哈西算法,I/O缓冲)

三、何时使用并行执行
在DSS系统中,并行执行能够发挥最好的效果,OLTP系统也能从并行执行中受益,在批处理的情况下效果更为明显。
银行电信行业的月终年终结算
基于许多大表的即时查询
数据库的备份恢复

四、与并行执行有关的参数:
1、PARALLEL_AUTOMATIC_TUNING-自动并行执行调整,缺省值为FALSE
当该参数置为TRUE时,ORACLE 服务器自动调整控制并行执行,它将自动调节影响以下参数:PARALLEL_ADAPTIVE_MULTI_USER,-PROCESSES,SESSIONS,PARALLEL_MAX_SERVERS
,LARGE_POOL_SIZE,PARALLEL_EXECUTION_MESSAGE_SIZE。

2、PARALLEL_THREADS_PER_CPU

3、PARALLEL_MAX_SERVERS

4、SHARED_POOL_SIZE

5、TRANSACTIONS

6、PARALLEL_ADAPTIVE_MULTI_USER

7、PROCESSES

8、SESSIONS

9、TRANSACTIONS

10、LARGE_POOL_SIZE


五、并行执行调整事例:
1、 小型数据系统
系统硬件配置:
CPUS = 4
Main Memory = 750MB
Disk = 40GB
Users = 16

DBA 做如下设置:
PARALLEL_AUTOMATIC_TUNING = TRUE
SHARED_POOL_SIZE = 12MB
TRANSACTIONS =系统缺省值

Oracle自动调整以下参数的值
PARALLEL_MAX_SERVERS = 64
PARALLEL_ADAPTIVE_MULTI_USER = TRUE
PARALLEL_THREADS_PER_CPU = 2
PROCESSES = 76
SESSIONS = 88
TRANSACTIONS = 96
LARGE_POOL_SIZE = 29MB

Parameter Settings for DOP and the Adaptive Multi-User Feature
The DBA parallelizes every table having more than 10,000 rows using a command
similar to the following:
ALTER TABLE employee PARALLEL;
In this example, because PARALLEL_THREADS_PER_CPU is 2 and the number of
CPUs is 4, the DOP is 8. Because PARALLEL_ADAPTIVE_MULTI_USER is set to
TRUE, Oracle may reduce this DOP in response to the system load that exists at the
time of the query's initiation.

2、 中型数据系统
系统硬件配置:
CPUS = 8
Main Memory = 2GB
Disk = 80GB
Users = 40
The DBA makes the following settings:
n PARALLEL_AUTOMATIC_TUNING = TRUE
n PARALLEL_ADAPTIVE_MULTI_USER = FALSE
n PARALLEL_THREADS_PER_CPU = 4
n SHARED_POOL_SIZE = 20MB
The DBA also sets other parameters unrelated to parallelism. As a result, Oracle
responds by automatically adjusting the following parameter settings:
n PROCESSES = 307
n SESSIONS = 342
n TRANSACTIONS = 376
n PARALLEL_MAX_SERVERS = 256
n LARGE_POOL_SIZE = 78MB
Parameter Settings for DOP and the Adaptive Multi-User Feature
The DBA parallelizes some tables in the data warehouse while creating other views
for special users:
ALTER TABLE sales PARALLEL;
CREATE VIEW invoice_parallel AS SELECT /*+ PARALLEL(P) */ * FROM invoices P;
The DBA allows the system to use the PARALLEL_THREADS_PER_CPU setting of
4 with 8 CPUs. The DOP for the tables is 32. This means a simple query uses 32
processes while more complex queries use 64.

3、 大型数据中心
系统硬件配置:
24 Nodes, 1 CPU per node
Uses MPP Architecture (Massively Parallel Processing)
Main Memory = 750MB per node
Disk = 200GB
Users = 256
The DBA uses manual parallel tuning by setting the following:
n PARALLEL_AUTOMATIC_TUNING = FALSE
n PARALLEL_THREADS_PER_CPU = 1
n PARALLEL_MAX_SERVERS = 10
n SHARED_POOL_SIZE = 75MB
n PARALLEL_SERVER_INSTANCES = 24
n PARALLEL_SERVER = TRUE
n PROCESSES = 40
n SESSIONS = 50
n TRANSACTIONS = 60
The DBA also sets other parameters unrelated to parallel execution. Because
PARALLEL_AUTOMATIC_TUNING is set to FALSE, Oracle allocates parallel
execution buffers from the SHARED_POOL.
Parameter Settings for DOP and the Adaptive Multi-User Feature
The DBA parallelizes tables in the data warehouse by explicitly setting the DOP
using syntax similar to the following:
ALTER TABLE department1 PARALLEL 10;
ALTER TABLE department2 PARALLEL 5;
CREATE VIEW current_sales AS SELECT /*+ PARALLEL(P, 20) */ * FROM sales P;
In this example, Oracle does not make calculations for parallel execution because
the DBA has manually set all parallel execution parameters.

4、 超大规模数据中心
系统硬件配置:
CPUS = 64
Main Memory 32GB
Disk = 3TB
Users = 1,000
The DBA makes the following settings:
n PARALLEL_AUTOMATIC_TUNING = TRUE
n PARALLEL_MAX_SERVERS = 600
n PARALLEL_MIN_SERVER = 600
n LARGE_POOL_SIZE = 1,300MB
n SHARED_POOL_SIZE = 500MB
n PROCESSES = 800
n SESSIONS = 900
n TRANSACTIONS = 1,024
Parameter Settings for DOP and the Adaptive Multi-User Feature
The DBA has carefully evaluated which users and tables require parallelism and
has set the values according to their requirements. The DBA has taken all steps
mentioned in the earlier examples, but in addition, the DBA also uses the following
command during peak user hours to enable the adaptive DOP algorithms:
ALTER SYSTEM SET PARALLEL_ADAPTIVE_MULTI_USER = TRUE;
During off hours when batch processing is about to begin, the DBA disables
adaptive processing by issuing the command:
ALTER SYSTEM SET PARALLEL_ADAPTIVE_MULTI_USER = FALSE;


myfriend2010 发表于:2007.06.26 15:27 ::分类: ( oracle ) ::阅读:(645次) :: 评论 (0)
===========================================================
关于10g以下dbms_output.put_line超长的问题
===========================================================

关于10g以下dbms_output.put_line超长的问题

对于10gdbms_output.put_line的长度是没有限制
如果报错:buffer overflow,执行如下语句即可:
set serveroutput ON SIZE UNLIMITED FORMAT WORD_WRAPPED
由于10g以下dbms_output.put_line的长度有限制
所以今天特意写了一个按照回车符来截取字符串,也就是按行截取,然后打印出来的过程,希望对某些人有用!


create or replace procedure print_proc(str in varchar2) is
/*
--打印字符串,调试的时候用
--由于字符串过长,超过了dbms_output.put_line的长度,故采用本程序分行打印出来
--@auther:Z.X.T
--@date:2007-6-26
*/
begin
dbms_output.put_line('lengthb(str) =' || lengthb(str));
if (lengthb(str) < 255) then
dbms_output.put_line(str);
else
for i in 1 .. length(str) - length(replace(str, chr(10))) + 1
loop
dbms_output.put_line(substr(str, instr(chr(10) || str, chr(10), 1, i), instr(str ||
chr(10), chr(10), 1, i) -
instr(chr(10) || str, chr(10), 1, i)));
end loop;
end if;
exception
when others then
dbms_output.put_line(sqlerrm);
dbms_output.put_line(dbms_utility.format_call_stack);
end print_proc;


myfriend2010 发表于:2007.06.26 11:30 ::分类: ( oracle ) ::阅读:(407次) :: 评论 (0)
===========================================================
ORACLE**手册长篇连载--第五部分
===========================================================
5 备份及恢复

所有参见内容都在附件05_backup/下。

5.1 export与import方式

参见dmp/backup.sh。

见《工具》对exp和imp的描述

数据库中的对象是比较多的,但除了表以外占用的空间不大,所以当表中记录数量达到一定规模后,以用户的方式一下子把数据exp出来就显得不够灵活。考虑以下的策略,先exp出除表数据以外的所有对象,再分别exp出每张表的数据。

exp dbuser所有的数据对象

exp dbuser/oracle file=dbuser.dmp log=user.log owner=user buffer=2048000 rows=n

exp单张表的数据

sqlplus -s dbuser/oracle </dev/null

set colsep |;

set echo off;

set feedback off;

set heading off;

set pagesize 0;

set linesize 1000;

set termout off;

set trimout on;

set trimspool on;

spool tables.txt;

select table_name from user_tables;

spool off;

exit;

EOF

for table in $(cat tables.txt)

do

exp dbuser/oracle file=${table}_$(date '+%Y%m%d').dmp tables=$table direct=y

done

5.2 冷备份

shutdown数据库,将所有和本实例有关的文件,包括datafile,controlfile,redolog,archived redolog,initora.ora等全部备份。恢复时只要将这些文件放回从前的目录,startup数据库即可。

5.3 联机全备份+日志备份

5.3.1 设置

如果数据库实例原来没有使用归档日志功能,则必须进行配置修改

initoradb.ora:

log_archive_start = true #实例启动时同时启动归档进程。

log_archive_dest_1= "location=/appl/oracle/oradata/orafe/arch/arch" #归档日志目录。

打开归档日志功能:

shutdown数据库

sqlplus "/ as sysdba"

SQL>startup mount

SQL>alter database archivelog;

SQL>alter database open;

可用archive log list查看状态,去除归档日志功能的命令为alter database noarchivelog。

5.3.2 步骤

参见online/full.sh、daily.sh,以osdba组的用户执行

联机全备份:

数据库处于open状态,依次对各个表空间备份

sqlplus "/ as sysdba"

SQL>alter tablespace system begin backup;

复制此tablespace各个datafile

SQL>alter tablespace system end backup;

注意:据推测,begin backup是对tablespace冻结写入,end backup是解除冻结,因此复制datafile的过程不宜过长

备份controlfile

SQL>alter database backup controlfile to '…….';

日志备份:

sqlplus "/ as sysdba"

SQL>alter system archive log stop;

移去日志目录下的所有archived redolog

SQL>alter system archive log start;

5.3.3 恢复

数据库处于shutdown状态

最差情况:磁盘全部损坏,仅保存上次联机全备份和每天日志备份

解决硬件故障,配置系统软件及环境

oracle用户,将全备份和日志备份转移至相应目录,根据initoradb.ora中controlfile的配置,将备份控制文件复制到响应目录下

sqlplus "/ as sysdba"

SQL>startup mount

SQL>recover database until cancel using backup controlfile;

逐个确认待恢复的archived redolog,待最后一个完成后,键入cancel,使恢复结束

SQL>alter database open resetlogs;

注意:由于日志已经重置,所以应尽快做一次联机全备份

丢失某数据文件

只要将此文件从上次联机全备份中复制至其目录,并将自上次联机全备份以来所有日志备份移至归档目录

sqlplus "/ as sysdba"

SQL>startup mount

SQL>alter database recover datafile 'path/file';或者简单些recover database;

SQL>alter database open;

如果此文件损坏或丢失,又无备份,则只能将此文件脱机,将数据exp出来,重建表空间,再imp进去

sqlplus "/ as sysdba"

SQL>connect internal

SQL>startup mount

SQL>alter database datafile 'path/file' offline;

SQL>alter database open;

5.4 注意要点

无论有多少把握,恢复前先做冷备份,此为第一原则

不这样做,便是无路可退,一旦失误,后果不必多说。

rollback段损坏

这是非常严重的问题,可在initora.ora中写入_corrupted_rollback_segments=(rxx),启动时避开损坏的rollback段,这只是权宜之计。如数据库处于archivelog,应从上一次全备份起利用备份的日志进行恢复;如数据库处于noarchivelog,应尽快将全部数据export出来,重建数据库,再import进去。所有操作之前,应做冷备份。

数据库异常中止处理

通过手工shutdown abort操作中止数据库,不会产生大的问题,通常直接startup无需使用介质恢复命令

如果由于机器崩溃引起的中止,则情况严重得多,有可能要使用到上面提到的恢复方法,不过这种现象并不多见。一般需要显式使用介质恢复命令,如下:

sqlplus "/ as sysdba"

SQL>startup mount;

SQL>recover database;

SQL>alter database open;

myfriend2010 发表于:2007.06.18 10:51 ::分类: ( oracle ) ::阅读:(201次) :: 评论 (0)
===========================================================
ORACLE**手册长篇连载--第三部分
===========================================================
3 初始化文件配置

所有参见内容都在附件01_install_02_create_03_init/下。

描述initoradb.ora中各选项。

3.1 Oracle 8 & 8i

具体参见8i/initoradb.ora。

db_block_size

数据库基本数据块尺寸,字节为单位。

当涉及到大量数据交换时,例如export/import操作时,此参数对数据库性能有非常大的影响,设定一个较大的值,有利于提高数据吞吐量,但由于db block是文件和内存之间交换的基本单位,过大的值反而会交换不需要的记录,增加额外的I/O。

一般取8k就已能获得较满意效果。

db_block_buffers

数据缓冲区,db_block_size为单位,不超过1/4内存

计算查询缓冲命中率:

SELECT name, value FROM v$sysstat WHERE name IN ('db block gets', 'consistent gets', 'physical reads');

Hit Ratio = 1 - ( physical reads / (db block gets + consistent gets) )

SELECT name, phyrds, phywrts FROM v$datafile df, v$filestat fs WHERE df.file# = fs.file#

db block gets:在内存buffer中的命中次数

consistent gets:一致性命中次数,指在内存buffer中未命中,但从回滚段或数据文件中获得命中

physical reads:在数据文件中的读次数

注意:一般HitRatio达到90%以上就可以认为已达到优化,这个数值应在系统运行稳定后进行统计。

shared_pool_size

数据字典和SQL操作缓冲区,字节为单位,不超过1/4内存

select (sum(pins - reloads)) / sum(pins) "Lib Cache" from v$librarycache;

select (sum(gets - getmisses - usage - fixed)) / sum(gets) "Row Cache" from v$rowcache;

select * from v$sgastat where name = 'free memory'

注意:Cache命中率达到95%以上就可以认为已达到优化,这个数值应在系统运行稳定后进行统计

log_checkpoint_interval

日志提交点数据量间隔

以操作系统block(通常512-byte)为单位,当日志累计至此参数,会使sga中dirty buffer被同步至数据文件,日志切换时也会引起此操作,如设为0,则相当于无限大,此参数失去作用,日志提交仅依靠日志文件的切换。

应选择适当大小的日志文件,同时使log_checkpoint_interval略大于日志文件或设为0。原则上应该避免过于频繁的checkpoint操作,控制在30分钟以上为好。

推荐此参数设为0。

log_buffer

在线日志缓冲,字节为单位,512K或128K*CPU数量,取较大值

processes和sessions

dedicated server模式下每一个连接都有一个Oracle服务进程(process)为之服务,这个连接本身也就是一个会话(session)。

shared server模式下所有连接共享一个Oracle服务进程池,这样process和session就不再是一一对应,sessions要大于processes。

sort_area_size和sort_area_retained_size

排序缓冲区,字节为单位。

当排序记录被全部取走后,缓冲区缩减到sort_area_retained_size,为减少缓冲区缩放的开销,可使sort_area_size和sort_area_retained_size取相同值。

hash_area_size

hash join缓冲区,字节为单位,缺省为2*sort_area_size。

db_file_multiblock_read_count

每次读取的db block数,对大规模查询性能有提高,特别是表扫描效率。在线系统应避免这种类型的查询。

db_writer_processes

同步数据进程数,与checkpoint的频率和数据量有关。

db_block_lru_latches

LRU锁集,一般设为CPU数目。RedHat Linux 6.x下的Oracle 8.1.6设此参数会导致系统挂起,疑对smp支持有问题

log_archive_start

系统启动时是否同时启动归档进程(archive)。

log_archive_dest_1

归档日志目录,最后的标号表明归档线程编号,一般只用1。

log_archive_format

归档日志名称,%t指归档线程编号, %s指归档日志序列号

rollback_segments

如果创建回滚段(rollback segment)时不使用public选项,那就是使用私有的回滚段,这样就必须在系统启动时激活。

推荐使用public rollback segment的做法,这个选项可以废弃。

background_dump_dest

Oracle系统进程记录log和trc目录。

alert_{实例名}.log以文本方式记录系统启动、关闭、出错、存储变化、日志切换等log信息。

系统进程以各自名称和进程号记录错误信息,文件以trc为后缀,文本格式。

core_dump_dest

Oracle服务进程的core dump目录。

user_dump_dest

Oracle服务进程以各自名称和进程号记录错误信息,文件以trc为后缀,文本格式。

3.2 Oracle 9i

参见9i/initoradb.ora。

pga_aggregate_target

以K、M、G为单位

sort, group-by, hash-join, bitmap merge, bitmap create等对内存有一定需求的SQL操作,都由此选项统一动态分配内存区域大小,因此Oracle 8i中如sort_area_size,sort_area_retained_size,hash_area_size,bitmap_merge_area_size等选项可以废弃。

db_cache_size

数据缓冲区,以K、M、G为单位,自动对齐到粒度单位。

取代Oracle 8i的db_block_buffers选项。

undo_management

回滚空间管理模式,缺省为manual,使用回滚段(rollback segment),如设为auto,则使用Oracle 9i的回滚表空间。此选项决定了以下关于undo的其它选项。

undo_retention

已提交数据在回滚表空间中保留时间,以秒为单位,缺省900。

当某些较长时间的查询需要通过回滚数据重建老数据块的时候,此选项可使新事务尽可能使用空闲的回滚表空间,这样就减少了查询过程因snapshot too old而失败的几率。

然而当空闲回滚表空间不足以应付新事务时,系统仍然会重用此选项保留的空间,因此不能保证长查询一定能成功执行完毕。

undo_tablespace

指定系统启动时的回滚表空间。

myfriend2010 发表于:2007.06.18 10:45 ::分类: ( oracle ) ::阅读:(280次) :: 评论 (9)
===========================================================
ORACLE**手册长篇连载--第二部分
===========================================================
2 创建

所有参见内容都在附件01_install_02_create_03_init/下。

以oracle用户进行操作,设定数据库实例名为oradb(长度建议不要超过8个字符)。

2.1 Oracle 8 & 8i

2.1.1 工具创建

Oracle 8

运行$ORACLE_HOME/bin/orainst(安装数据库时必须选中oracle installer),选择create database object,安装界面中选Oracle Enterprise Server(RDBMS)

mount point暂为$ORACLE_BASE,字符集为ZHS16CGB231280或ZHS16GBK,调整system,tools,users,rbs,temp,redolog等尺寸。

创建过程中会提示输入osdba,osoper的UNIX组,这是向instance表明此组的成员享有角色sysdba或sysoper的权限,从而用connect / as sysdba替换掉connect internal

Oracle 8i

进入X WINDOW,运行dbassist

2.1.2 手工创建

任何工具都有其局限性,熟练的数据库管理员可采用手工方法创建数据库,以增加对系统的灵活控制。

对于手工建库Oracle 8与Oracle 8i的区别主要是建立的数据字典和存储过程有些不同,Oracle8i的dbassistant可以生成建库脚本供以后使用。

取得/8i/initoradb.ora,编辑如db_name,control_file,dump_dest等参数,以符合实际情况。如不需要生成remote_login_passwordfile,可在initoradb.ora中设remote_login_passwordfile=none;如需要,在initoradb.ora中设remote_login_passwordfile=exclusive,运行orapwd file= password=
必须创建新生成文件所要用到的目录,如在配置文件中指定的bdump,cdump,udump等目录,以及数据文件存储目录。

将initoradb.ora转移到$ORACLE_BASE/admin/oradb/pfile/,并连接到$ORACLE_HOME/dbs/initoradb.ora。

ln -s $ORACLE_BASE/admin/oradb/pfile/initoradb.ora $ORACLE_HOME/dbs/initoradb.ora

取得8i/createdb.sh,编辑如pfile,数据文件目录等参数,以符合实际情况,并转移到$ORACLE_BASE/admin/oradb/create/下,执行。

相关系统表:

v$database

v$datafile(file#,ts#,name)

v$tablespace(ts#,name)

v$parameter(SQL>show parameter)

v$sga(SQL>show sga)

2.1.3 MTS(multi-threaded server)

Oracle8使用两种配置模式:dedicated server(专用模式)和shared server(即multi-threaded server共享模式),缺省使用专用模式。在连接数不很大且保持长期连接的情况下,专用模式为每个连接设立一个专用oracle服务进程,以保持较高的性能和稳定性。而当连接数上升到非常高的数目且不保持长期连接时,数据库管理开销增大,并且占用大量系统资源,给操作系统形成带来极大的压力。在这种情况下,共享模式更为有利,它通过缓冲池和预先设定数目的server提供服务,每个连接不再有专用的oracle服务进程,每次SQL操作由分配器(dispatcher)确定oracle服务进程。

multi-thread仅表示分配器展开的多个服务流程,并非操作系统意义上的多线程

配置:

¢ initoradb.ora

加入

mts_dispatchers = "(address=(protocol=TCP))(dispatchers=10)" #初始分配器数量

mts_max_dispatchers = 15 #最大分配器数量

mts_servers = 50 #初始服务进程数量

mts_max_servers = 80 #最大服务进程数量

mts_service = oradb3 #MTS方式下对外提供的数据库服务,非service_name

表明instance能够提供MTS服务,不意味着取消dedicated方式

¢ listener.ora

应删除所有SID_LIST,SID_LIST的存在决定LISTENER以dedicated还是shared方式启动oracle连接。如SID_LIST存在,LISTENER不再接受instance的登记,以dedicated方式启动oracle连接; 如SID_LIST不存在,LISTENER启动时不为任何instance服务,由instance来登记MTS service,以shared方式启动oracle连接

¢ client

MTS在client端配置颇为怪诞,在tnsnames.ora中的host一定要写数据库server的名字,而且必须作全名解析,似乎server端接收到client端请求后会将主机字符串返回,应此client端必须能够解析,否则会报出诸如"database service not exist"的错误

tnsnames.ora

dbserver.soar.com =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS=(PROTOCOL=TCP)(HOST= dbserver)(PORT = 1521))

)

(CONNECT_DATA =(SERVICE_NAME = oradb))

)

/etc/hosts

10.0.0.1 dbserver.soar.com dbserver

启动:先起LISTENER,后起instance

以下步骤均在数据库open状态下,由system用户完成

2.1.4 调整临时表空间

alter tablespace temp temporary; #Oracle8的orainst没有将temp的缺省值permanent改为temporary,这样用户在temp上暂存的数据均为永久对象,很快将temp空间耗完。Oracle8i已修正。

SQL>alter tablespace temp default storage (initial 128k next 128k maxextents 5000 pctincrease 0);

SQL查询操作如group by,order by,distinct,join等需要在临时段上展开数据,须充分考虑临时段的大小。

如果实例启动参数指定hash_join_enabled=true(缺省为true),当oracle选择以hash join方式进行表与表的联接,oracle根据查询操作的实际情况计算出hash_multiblock_io_count,此参数从属于session,平时显示为0,即hash join一次I/O读写需要的连续数据空间。这样当此参数大于临时段的next扩展块时,hash join操作会中断。如果预知联接表的规模比较巨大,可使用alter tablespace temp default storage(next …)将next值设为较大值,待全部操作完成后,再恢复正常。

2.1.5 调整回滚表空间

先将建库工具缺省设定的若干个回滚段删除

SQL>alter rollback segment r01 offline;

SQL>drop rollback segment r01;

根据实际需要创建回滚段(如r01-r10),供联机处理和批处理使用

SQL>create rollback segment r01 storage(initial 128k next 128k maxextents 5000 optimal 5M) tablespace rbs;

SQL>alter rollback segment r01 online;

注意修改$ORACLE_HOME/dbs/initoradb.ora中的激活回滚段段名

另创建一个尺寸无限制的回滚段(r99),供特殊用途

SQL>create rollback segment r99 storage(initial 128k next 128k maxextents 5000) tablespace rbs;

如果在创建回滚段时使用create public rollback segment,则不需要在$ORACLE_HOME/dbs/initoradb.ora中用rollback_segment=(…)选项激活,推荐使用public方式

相关系统表:

SQL>select segment_name, initial_extent, next_extent, max_extents, extents,bytes from dba_segments where segment_type='ROLLBACK'; #回滚段占用空间状况

SQL>select segment_name, status from dba_rollback_segs; #回滚段状态

2.1.6 调整日志

建立日志组

SQL>alter database add logfile group x('log1a','log1b') size 10M;

增加日志组成员

SQL>alter database add logfile member 'log1c' to group x;

删除日志

数据库实例至少需要2个日志组,只有状态为inactive的日志组才能被删除,而当前日志组状态为current,上一个切换的日志组状态为active,这就意味着至少存在3个日志组才能删除其中的一个,如果要更新全部日志组,只能删除一个,再创建一个,直至全部被更新。

SQL>alter database drop logfile group x;

如果要删除的日志组是当前日志组,必须先将其切换至状态为inactive,再删除。

SQL>alter system switch logfile;

删除日志组成员

SQL>alter database drop logfile member 'log1c';

相关系统表

v$log #日志组状态、占用空间、顺序号等

v$logfile #日志组文件

2.1.7 调整用户表空间

创建表空间

假定表数据在ts_data,索引在ts_index

SQL>create tablespace ts_data default storage(initial 10M next 10M maxextents 5000 pctincrease 0) datafile 'path/data_01.dbf' size 500M;

SQL>create tablespace ts_index default storage(initial 5M next 5M maxextents 5000 pctincrease 0) datafile 'path/index_01.dbf' size 500M;

参考命令:删除表空间

SQL>drop tablespace data including contents; #删除表空间及其包含的所有数据对象

相关系统表:

user(dba)_tablespaces

增加表空间尺寸

假定表空间ts_data由path/data_01.dbf和path/data_02.dbf(500M)组成

增加一个数据文件:

SQL>alter tablespace ts_data add datafile 'path/data_03.dbf' size 500M;

扩大原有文件大小:

SQL>alter database datafile 'path/data_01.dbf' resize 1000M;

移动表空间数据文件

假如要求为:将path1下data_01.dbf移至path2下,并把文件名改为data01.dbf

实例处于关闭状态

sqlplus "/ as sysdba"

SQL>startup mount

回到shell环境下

$ mv path1/data_01.dbf path2/data01.dbf

$ mv path1/data_02.dbf path2/data02.dbf

再到sqlplus环境中

SQL>alter database rename file 'path1/data_01.dbf' to 'path2/data01.dbf';



SQL>alter tablespace tbsdata rename datafile 'path/data_01.dbf' to 'path2/data01.dbf';

SQL>alter database open;

查看剩余空间

SQL>select tablespace_name,sum(bytes),max(bytes) from dba_free_space group by tablespace_name;

注意:空闲数据块总和sum(bytes)够用并不意味每个空闲块都满足分配需要,所以当表空间不够分配扩展块的时候,还要查看最大空闲数据块max(bytes)的大小。

合并空闲块

如果表空间上的数据对象经常发生类似drop-create的变动,加之未采用统一的扩展块尺寸,使那些采用较大扩展块的数据对象不能利用较小的空间碎片,造成空间浪费。可通过将较小的空闲块合并成较大的空闲块的方法,减少空间浪费。

SQL>alter tablespace tbsdata coalesce;

2.1.8 创建用户

SQL>create user dbuser identified by oracle default tablespace data temporary tablespace temp quota unlimited on data quota 0 on system quota 0 on tools quota 0 on users;

SQL>grant connect to dbuser;

SQL>grant create procedure to dbuser; #这些权限足够用于开发及生产环境

SQL>grant select on dba_pending_transactions to dbuser; #二阶段提交过程中类似Tuxedo的软件需要检索挂起交易的状态,所以必须得到对此视图的select权限,以sys用户身份赋予

修改用户可使用alter user dbuser ...

参考命令:

drop user dbuser cascade; #删除用户及其所有的数据对象

revoke connect from dbuser; #取消用户角色权限

相关系统表:

user(dba)_users

user(dba)_role_privs 角色权限

user(dba)_sys_privs 系统权限

user(dba)_tab_privs 对其他用户表操作的权限

user_ts_quotas 表空间限额

2.1.9 创建数据对象

相关系统表:

user_catalog(cat)

user_objects(obj)

表和索引建立在表空间上,如果不指定表空间,使用本用户的缺省表空间(default tablespace);如果不指定本对象的存储参数,使用建于其上的表空间的缺省存储参数(default storage)。

表(table)

建表脚本通常是以下形式:

create table emp (no number(12), name char(20), …,constraint emp_x00 primary key(no)) storage(initial 100M next 100M pctincrease 0 maxextents 5000) pctused 70 pctfree 10 tablespace tbs_data enable primary key using index tablespace tbs_index;

然而从简化数据对象配置、减少表空间碎片的角度考虑,不推荐为每张表单独指定storage选项,存储参数使用建于其上的表空间的缺省存储参数。不同表对扩展块大小的要求,可以通过分析归类,建立相应具有不同缺省存储参数的表空间的方法解决。这样数据库设计就能变得简洁明了。

命令简化为:

create table emp (no number(12), name char(20), …, constraint emp_x00 primary key(no))pctused 70 pctfree 10 tablespace tbs_data enable primary key using index tablespace tbs_index;

primary key关键字建立同名的primary key constraint和unique index,表的每个域都有自身的constraint。

相关系统表:

user_tables(tabs),dba_tables #表属性

user_tab_columns(cols),dba_tab_columns #表各列属性

索引(index)

create index emp_x01 on emp(name) storage(initial 10M next 10M pctincrease 0 maxextents 5000) pctfree 10 tablespace tbs_index;

可参照表对storage的处理方式。

create index emp_x01 on emp(name) pctfree 10 tablespace tbs_index;

相关系统表:

user_indexes(ind),dba_indexes #索引属性

user_ind_columns,dba_ind_columns #索引各列属性,以index_position为顺序

序列(sequence)

create sequence emp_seq increment by 1 start with 1 nomaxvalue nocycle;

相关系统表:

user(dba)_sequences(seq) 序列属性

视图(view)

create emp_depart_view as select emp.name,emp_duty.name from emp,emp_duty where emp.duty=emp_duty.duty;

相关系统表:

user(dba)_views 视图属性

Oracle将view,sequence,用户参数等定义均存放于系统表空间,而用户创建的表空间仅存放table,index实体,因此可以大胆删除用户表空间,再用备份重新恢复,不必担心view,sequence等会被一并删去。

2.1.10 创建只读用户

假定数据库用户dbbrsr需要对dbuser的表emp拥有select权力

connect dbuser

grant select on emp to dbbrsr

connect dbbrsr

create synonym emp for dbuser.emp;

这样,dbbrsr就能象使用自己的表一样对dbuser的表执行select操作

2.1.11 启动及关闭数据库实例

oracle用户,dbstart和dbshut启动及关闭/var/opt/oracle/oratab或/etc/oratab中设定的数据库实例,dbstart采用normal方式,dbshut采用immediate方式。

或者使用手工方式

sqlplus "/ as sysdba"

启动

normal

SQL>startup

mount

SQL>startup mount; #启动实例进程,载入数据库文件,允许DBA权限的某些操作,但禁止对数据库文件的一般性操作

SQL>完成某些操作

SQL>alter database open;

nomount

SQL>startup nomount; #启动实例进程,但不允许访问数据库,常用于创建数据库、介质恢复或创建controlfile

SQL>完成某些操作

SQL>alter database open;

关闭

normal

SQL>shutdown或SQL>shutdown tra