一个高人写的oracle资料[转载]
我们从一个用户请求开始讲,ORACLE的完整的工作机制是怎样的,首先一个用户进程发出一个连接请求,如果使用的是主机命名或者是本地服务命中的主机名使用的是机器名(非IP地址),那么这个请求都会通过DNS服务器或HOST文件的服务名解析然后传送到ORACLE监听进程,监听进程接收到用户请求后会采取两种方式来处理这个用户请求,下面我们分专用服务器和共享服务器分别采用这两种方式时的情况来讲:[@more@]专用服务器模式下:一种方式是监听进程接收到用户进程请求后,产生一个新的专用服务器进程,并且将对用户进程的所有控制信息传给此服务器进程,
分布式查询优化一例
在分布式查询中,对于分布在两个节点上的两张表进行嵌套循环连接将会非常慢,这是由于Oracle将所有的远程数据传到本地来处理。所以对于这类查询最好换成排序合并连接或者hash连接。[@more@]下面例子中的表aaa、bbb分别位于两个库,aaa所在库通过数据库链db244访问bbb表:create table aaa as select * from dba_objects;create table bbb as select * from dba_objects;1、嵌套循环连接SQL> select count(*) from aaa a where exists (sel
在PL/SQL开发中正确使用数据类型来提高性能
1、确保比较运算中的数据类型相同 下面例子比较了采用不同数据类型的代价,也就是在if语句中将一个数字类型的数据类型和字符值进行比较。[@more@]程序1:create or replace procedure test_if(p_condition_num number) as lv_temp_num number := 0; lv_temp_cond_num number := p_condition_num;begin for lv_cont_num in 1..100000 loop if lv_temp_cond_num = '1' then lv_temp_num := lv
Oracle9i和10g并存时问题
在Windows2000上先安装10g,再安装9i软件后,无法启动9i的dbca界面[@more@]同时安装10g、9i后的系统pathD:oracleproduct9.2.0bin;C:Program FilesOraclejre1.1.8bin;C:Program FilesOraclejre1.3.1bin;D:oracleproduct10.1.0bin;D:oracleproduct10.1.0jre1.4.2binclient;D:oracleproduct10.1.0jre1.4.2bin;%SystemRoot%system32;%SystemRoot%;%SystemRoot%System32Wbem;C:KAV2003;C:PROGRA~1ULTRAEDT;C:Program FilesSecureCRT;C:Program FilesATI TechnologiesATI Control Panel;C:KAV69i的dbca能启动的path(需要将10g的jre去掉)D:orac
利用Oracle工具sysresv来显示、清除共享内存和信号量
Oracle从8i开始提供sysresv工具来对Oracle使用的共享内存和信号量进行管理。当服务器上存在多个实例时,该命令能显示每个实例对应的共享内存和信号量,当一个实例由于某种原因崩溃了,但是由该实例创建的共享内存和信号量却没有被系统回收清理掉,可以用这个工具来清除应该回收的共享内存和信号量。[@more@]usage : sysresv [-if] [-d <on/off>] [-l sid1 <sid2> ...] -i : Prompt before removing ipc resources for each sid &n
Linux环境下的一个rman备份的实例脚本
背景:目标数据库192.168.1.172 Redhat Linux AS 3.0 Oracle 9.2.0.6 恢复目录数据库 192.168.1.244 Windows2000 Oracle 9.2.0.1 rman/rman [@more@]1、配置catalog恢复目录 create tablespace ts_rman datafile='d:oratestrman.dbf' size=100M; create user rman identified by rman default tablespace ts_rman; grant connect ,resource , RECOVERY_CATALOG_OWNER to rman; 连接到目标数据库和
rman技术速查手册
1、配置catalog恢复目录 create tablespace ts_rman datafile='d:oratestrman.dbf' size=100M; create user rman identified by rman default tablespace ts_rman; grant connect ,resource , RECOVERY_CATALOG_OWNER to rman;[@more@] 连接到目标数据库和CATALOG数据库 rman target / catalog rman/rman@catalog_tnsname 创建CATALOG用户的表 rman>create catalog 登记目标数据库: rman>regis
在sqlplus下格式化输出查询结果集
在sqlplus下经常会遇到这种问题:查询结果中包含有许多列,在一行内不能完全显示sqlplus就自动换行,导致输出非常混乱,可读性很差,Tom写了个以列形式显示每行的程序,我稍稍改动了一下,增加了显示每行行号。[@more@]该程序中使用了调用者权限属性,即调用者调用该过程查看的表是调用者自己的表,而不是过程定义者所属的表注意:最好把输出缓存设置得大一些,免得报错 ORA-20000: ORU-10027: buffer overflow,limit of 2000 bytesset serveroutput on size 10000000CREATE OR REPLACE PROCEDURE print_table( p
oracle9i下配置企业管理器
1、运行企业管理器配置助理创建EM repository Windows平台: - 选择菜单 Programs > Oracle-OraHome92 > Configuration and Migration Tools > Enterprise Manager Configuration Assistant - 在命令行中输入: emca [@more@] Linux平台: [oracle@sms oracle]$ emca2、启动Oracle Management Server Windows平台: a. 双点[控制面板/Contro
在Oracle中通过优化器计划稳定性来优化应用程序
dba在实际工作中经常会遇到这种情况:应用程序开发者写得SQL效率极其低下,dba想通过给sql语句添加提示(hint)的方式来提高效率,但是又不允许直接对应用程序进行修改。[@more@]对此Oracle从8i开始就提供了优化器计划稳定性(Optimizer Plan Stability)来完成这一功能,可以对当前应用程序中的SQL创建最优的执行计划存储概要。下面就通过一个例子来描述这一功能的具体实现:(Oracle 9.2.0.6)SQL> create table aaa as select * from dba_objects where object_id is not null;Table createdSQL> alter table aaa modify object_id not
Oracle9i中v$sql、v$sqlarea、v$sqltext、v$sql_plan的联系与区别
对于同一个SQL语句,如果在不同环境下使用了不同的优化器目标的情况下,会有不同的执行计划,这样就要求分别有一个独立的游标(即子游标)来区别出每一种情况下的不同的运行行为。[@more@]Oracle用v$sqlarea中一行保存同样语句的SQL,并用字段version_count的值来指出子游标的个数,而在v$sql里面为每个子游标保留了一个单独的行。两个表可以通过字段address和hash_value相互对应。例如下面例子:SQL> select address,hash_value,sql_text,version_count 2 from v$sqlarea where sql_text like 'select value$ from sys.pr
基于角色的安全性和显示grant语句的区别
我们经常会遇到这种情况:a用户把自己的表demo权限授予一个角色,再把这个角色授予用户b,用户b可以在sql语句中访问a.demo,但是在创建视图、存储过程中用到a.demo却报错,必须要显示的用语句grant all on a.demo to b; 才能创建这些对象[@more@]原因是对于一个会话来说其状态可以打开或关闭,而授权却在所执行的grant后被永久存储到数据字典中。在DDL语句创建包、存储过程、存储函数、触发器和视图等数据库对象时,当前用户所拥有的角色都会被禁用。对于命名PL/SQL对象的情况,会报错:"ORA-01031:insufficient privileges",对
Oracle下配置透明网关访问MS SQL SERVER
配置环境:Oracle服务器:192.168.1.218 Oracle9.2.0.1 for Windows SID:lrdbMS SQL服务器:192.168.1.244 SQL SERVER 2000 要访问的库:lfkf[@more@]1、安装 TRANSPARENT GATEWAY 选件(FOR MSSQL) 安装完成了以后有这样一个目录 $ORACLE_HOMEora90tg4msql2、 配置 LISTENER.ORA, 在SID_LIST_LISTENER下添加: (SID_DESC = (GLOBAL_DBNAME = sql2000) # 可自己命名 (PROGRAM = tg4msql) &n
删除重复数据的一种高效的方法
表demo是重复拷贝自dba_objects,有88万左右,不重复的是27323,没有索引方法一:delete from demo a where a.rowid <> (select max(rowid) from demo b where &nbs
ORACLE临时表和SQLSERVER临时表异同
SQL SERVER临时表 临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。有本地和全局两种类型的临时表,二者在名称、可见性和可用性上均不相同。[@more@]本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 Microsoft® SQL Server™ 2000 实例断开连接时被删除。全局临时表的名称以数学符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。 例如,如果创建名为 employees 的表,则任何人只要在数据库中有使用该表的安
使用PL/SQL模拟SQLLOAD的功能
原文出自Thomas Kyte《expert one-on-on》下面这个存储过程实现了从文件加载数据到数据库表的过程注意:要设置初始化参数utl_file_dir,在下面例子中其值为/home/oracle/work/data[@more@]首先创建一个错误信息表:create table badlog( errm varchar2(4000), data varchar2(4000) ); &nb
从mysql中将数据导入到oracle数据库中
这两天在折腾从mysql倒数据到oracle中,下面是一些步骤环境:Mysql 4 => Oracle 9.2.0.41、从Mysql中导出csv格式的数据[@more@]mysqldump -u mysql -p -T./ --fields-terminated-by=, --fields-enclosed-by=" mms send_done_log 输入密码:password 2、从导出的send_done_log.sql文件中找到建表语句,将其修改成符合oracle语法的建表语句 注意:Mysql导出空是"N",所以Mysql中可以为空的字段在oracle中都要改成varchar2类型3、使用
使用sqlldr装载数据的简单例子
创建测试表:create table DEMO( DEPTNO NUMBER(2) not null, DNAME VARCHAR2(14), LOC VARCHAR2(13));[@more@]例子1:装载定界数据类型为csv(Comma-Separated Value)C:sqlldr userid=scott/tiger control=load.ctl data=data.csv direct=yload.ctl内容如下:LOAD DATA  
imp时发生ora-01659的错误处理
今天从一个8i的库中导出一个大表,dump大约200M左右,然后导入9i的库,结果报错:[@more@]import done in ZHS16GBK character set and UTF8 NCHAR character setexport server uses US7ASCII NCHAR character set (possible ncharset conversion). importing SMS's objects into LINKRICH_MMSIMP-00017: following statement failed with ORACLE error 1659: "CREATE TABLE "T_MPN_OUTDATE" ("MOBILE" VARCHAR2(11), "HAPPEN_TIME" VARCHAR2" "(8), "PROV" VARCHAR2(5)
关于当前模式current_schema的切换问题
我们有时会在用户A下调用用户B下的存储过程,去用户B下的表的数据,但是这要求用户A拥有B下相关表的权限,并且在处理表时指定好表的模式通常的做法是在写存储过程时写出表的模式,例如:SCOTT.DEPT,但是有时存储过程没有这样写,而又不想改程序,还有一个方法就是在调用存储过程前设置current_schema[@more@]例如,把scott.dept的select权限授予hr用户 sqlplus scott/tigerSQL>grant select on dept to hr;然后用hr用户登录sqlplus hr/hrSQL> select count(*) from scott.dept; COUNT(*)---------- &