Oracle Vault
Oracle时间类型数据为0的bug
在Oracle中,date类型的数据的取值范围是从-4712/12/31到9999/12/31之间,并且年份不能为0。也就是说'0000/00/00'是一个非法数据,不为oracle所接受。但是,现场告知发现部分date类型数据的值为0000/0/0。这确实有些奇怪。研究了一下,发现oracle在对年份为0的校验上并不十分严谨,在多种情况下会导致date数据结果为'0000/0/0',并能有效存储。
Oracle数据恢复/挖掘工具——FySafe
DBA最痛苦的事莫过于磁盘损坏、数据丢失。这不仅对DBA个人,对一个企业来说也是一项无法估计的损失。因此,要将这种风险降到最低,就要求数据库系统需要有完整的数据备份、灾难恢复方案,确保数据的万无一失!
但是,尽管有备份和灾难恢复方案,也无法保证风险降为0(况且还存在许多系统没有做备份方案),在一些极端情况下,还是会可能出现磁盘损坏、系统或数据文件损坏导致数据库无法恢复的情况。 针对这种情况,本站推出了一个完全自主开发的Oracle数据恢复工具——FySafe。该工具可以将幸存数据文件(可能文件本身也不完整)中的数据读出,尽可能的帮助用户找回丢失的数据。就像火灾后,尽量从废墟中找出所有有价值的物品,使损失降为最低。
临时表游标未释放导致回滚段空间不足案例
回滚段是Oracle数据库中的重要资源。它起着提高系统性能、事务控制、并发控制、保持数据完整性等多种作用。因而,再OLTP系统中,回滚段是一个会被频繁使用的资源。回滚段空间不足(ORA-01650)错误也经常困扰DBA。但是,当系统发生ORA-01650错误时,并一定代表真的是回滚段的存储空间不够用了。 还可能由于回滚段资源被不恰当的使用、没有及时释放有关。因此,一旦发生ORA-01650错误,我们不要急于增加回滚段空间,而要仔细分析错误发生的根本原因,从而找到最有效的办法。
这个案例就是由于临时表占用回滚段空间没有被及时释放所导致的系统报ORA-01650错误。经过分析,通过修改应用代码解决了该问题。
Oracle 11g 新特性
Oracle声称新版本将增加483种新特性。相信这些新特性将会解决许多困扰DBA和开发人员困扰已久的问题。本文将介绍部分11g的新特性。
zombie
前两天注意到生产系统上存在一个zombie进程。查了一下日志,这个zombie存在很久了,无论是否主机重启过。于是让hp的人查一下,原来时hp-ux 11i的一个bug。不影响系统。
这次发现的zombie进程虽然不影响系统,但是一旦发现系统存在zombie进程。因为这种进程很可能造成系统内存泄漏等问题。
想起了最近常听的一首哥,北爱尔兰乐队“小红莓”的zombie。这是一首反战歌曲,有朋克的味道,很好听。
听说某超女要翻唱,真不知道会唱成什么样。决定一定不听翻唱的,免得影响影响它在心中的形象。就想当年的“lemon tree”,台湾的翻唱者还靠它出名了,但实际上比原唱不知道差了多少倍。
这是这首歌的歌词:
Zombie(行屍走肉)
Another head hangs lowly又一顆被緩緩吊起來的頭顱
Child is slowly taken孩子也慢慢被帶走
And the violence caused such silence暴動造成的沉寂
Who are we mistaken是我們錯誤的決定
But you see it's not me, it's not my family難道你不明白這不是我、也不是我的家人造成的
In your head, in your head, they are fighting頂著你的大腦的、是他們不斷的攻擊
With their tanks, and their bombs用他們的坦克與炸彈
And their bombs, and their guns用他們的炸彈與槍
In your head, in your head they are crying不斷在你的腦中哭泣
In your head, in your head, Zombie, Zombie頂著你的大腦的,頂著你的大腦的,是行屍走肉
In your head, what's in your head, Zombie你的腦子裝了什麼,裝了什麼,行屍走肉
Another mother's breaking heart is taking over又一個傷心母親的心被帶走
When the violence causes silence當暴動造成的是沉默
We must be mistaken我們一定做了錯誤的決定
It's the same old theme since 1916同樣的故事已經在一九一六年發生
In your head, in your head they're still fighting頂著你的大腦的,是他們依舊不斷的攻擊
With their tanks, and their bombs用他們的坦克與炸彈
And their bombs, and their guns用他們的炸彈與槍
In your head, in your head they are dying不斷的在你腦中哭泣
In your head, in your head, Zombie, Zombie頂著你的大腦的,頂著你的大腦的,是行屍走肉
In your head, what's in your head, Zombie你的腦子裝了什麼,裝了什麼,行屍走肉
终于破解了Oracle的压缩格式
昨天晚上终于将Oracle的压缩格式破解了。虽然可能还存在漏洞,但是我的dul工具已经可以将我测试用的几十张压缩表正确读出来了。
发文庆贺一番,好好过个国庆!
Oracle内存全面分析
在Oracle的资源配置中,内存应该是最重要也最复杂的一项资源。为了能使Oracle各项功能模块达到最佳状态, 需要针对不同模块进行内存配置,以求达到资源与性能之间的的平衡。此外,与内存相关的问题,如ORA-4031在系统中也不会少见。这类问题并不是仅仅靠增加内存可以解决的。
DBA如果想要配置好Oracle内存参数,让你的系统在最少消耗资源情况下运行良好,或者要快速、妥善的解决生产系统中出现的内存问题,就需要了解Oracle的内存组成和内存机制,在配置资源时做到知其然,也知其所以然;在解决问题的时候胸有成竹。
本文对Oracle的内存机制做了比较全面的一次分析。
全文链接:http://www.hellodba.com/Doc/Oracle_Memory(1).htm
什么时候使用绑定变量性能反而更差
一般来说,绑定变量可以使查询计划稳定,避免对同一语句在使用不同变量值时,产生大量重复的查询计划,大量消耗shared pool,并出现大量硬解析,使系统性能下降。 因此,一般情况下,提倡使用绑定变量。但是,在某些情况下,可能使用绑定变量反而导致系统性能下降,这里就讨论一下什么情况下会出现这样的现象。
全文链接:http://www.hellodba.com/Doc/Oralce_no_bind_variable.htm
查询计划中集的势(Cardinality)的计算
当使用CBO模式的优化器时,oracle在生成查询计划时,会计算各个访问路径的代价,选择代价最小的访问路径作为查询计划。这个选择过程我们可以通过做一个10053的trace来观察。 在做代价估算时,有一个很重要的参数作为代价计算的因数,这就扫描字段的集的势(cardinality)。那么这个值是如何计算的呢?下面通过试验推算出了计算公式和部分计算方法。 |
一个显示windows中线程性能情况的小工具
Windows下没有top工具。任务管理器只能监控到进程。但是oracle的process在os上是以线程的形式存在的。在定位windows下的oracle性能问题时就没有unix下方便。于是写了一个小工具,可以显示windows线程的占用情况。
对程序进行了更新,可以看到进程对应文件路径,可以杀、挂起进程、线程(此功能慎用,造成什么后果本人不负责哦^_^)
下载地址:http://www.hellodba.com/Download/TopShow.html
游标表达式中NCHAR,NVARCHAR2数据类型的bug
游标表达式中NCHAR,NVARCHAR2数据类型的bug
by fuyuncat
昨天开发人员的程序有问题,过去帮忙定位,最后发现是在代码中使用了游标表达式,但游标不返回结果。跟踪了半天,最后发现问题出在数据类型上。他的代码中,游标子查询与外面的查询有join条件。从逻辑上理解,游标应该返回数据,但实际上却没有。最后发现将join字段的数据类型从nvarchar2改为varchar2就正常了。
下面是针对这个问题的一段测试代码:
create table test1 (a1 char(10), b1 varchar2(20), c1 nvarchar2(20), d1 nchar(10));
create table test2 (a2 char(10), b2 varchar2(20), c2 nvarchar2(20), d2 nchar(10));
insert into test1 values ('111','111','111','111');
insert into test1 values ('222','222','222','222');
insert into test1 values ('333','333','333','333');
insert into test2 values ('111','111','111','111');
insert into test2 values ('111','111','111','111');
insert into test2 values ('111','111','111','111');
insert into test2 values ('222','222','222','222');
insert into test2 values ('222','222','222','222');
insert into test2 values ('222','222','222','222');
insert into test2 values ('333','333','333','333');
insert into test2 values ('333','333','333','333');
insert into test2 values ('333','333','333','333');
select test1.*, cursor(select * from test2 where test1.a1 = test2.a2) c1
from test1;
select test1.*, cursor(select * from test2 where test1.b1 = test2.b2) c1
from test1;
这两个查询是能够正常返回结果的。
但这两个查询就有问题了,游标中没有结果:
select test1.*, cursor(select * from test2 where test1.c1 = test2.c2) c1
from test1;
select test1.*, cursor(select * from test2 where test1.d1 = test2.d2) c1
from test1;
上面语句的区别在那呢?就是数据类型不一样。分析一下这两种数据类型:nchar,nvarchar2与char,varchar2最大的区别在于,nchar,nvarchar2的存储结构与数据库的字符集有关,根据字符集的不同,当UTF8时,他们采用变长存储当AL16UTF16时,采用定长存储。而char和varchar始终采用定长存储。
nchar和nvarchar2最大的优势在于可以存储多字节的字符。比如一些特殊字符。
以上这个问题,可以通过将nvarcha2,nchar转换为定长的字符集方式来解决:
select CURSOR (select * from test2 where convert(test1.c1,'WE8MSWIN1252','AL16UTF16') = test2.c2 ) from test1;
这个查询就能获取到正确结果了。
一般情况下,建议都采用char和varchar2。对于多语种系统,或者有特殊字符存储要求的系统。可以考虑部分采用nchar,nvarchar2。比如,像username, id这种字段,只允许采用char或varchar2;但是对于description,comment这样的字段,就可以采用nchar或nvarchar2。
关于上面的这个问题,在metalink上查了一下,确实是一个bug(Bug 3927273),而且目前还没有补丁。
TX锁(Transaction Lock)分析
数据库是一个并发服务系统。在一个数据库系统中,可能同时存在成百上千个并发进程在访问公有的数据对象。在这种情况下,锁的重要性就相当突出了,它能帮助并发控制, 保证数据的一致性和完整性。但是如果控制不当,锁也能导致阻塞、死锁等问题的出现。因而DBA在处理这类问题时,一定需要先了解锁的机制、清楚在什么样的情况下会产生什么样的锁。本文分析了事务锁(TX lock)的机制以及产生TX锁的各种情况... ...
全文链接:http://www.hellodba.com/Doc/Oracle_tx_lock.htm
LOB类型字段的表空间转移
今天将系统上的一些表转移到一个新的表空间(move tablespace)上时发现,一些LOB类型的字段没有被转移,还在原先的表空间上。查了半天,其实LOB字段也是能被移动的:
ALTER TABLE t_table MOVE LOB(lob_column) STORE AS (TABLESPACE new_tablespace);
顺便提一下,表的存储位置被转移后,所有索引都会失效(unusable),需要rebuild,并重新分析表。
一个简单的问题。你能回答出来吗?
很多人都希望成为一个大师级的高手,于是参考各种资料,研究各种高深问题。其实,我觉得,扎实的基础才是成就一个高手必备的条件。
下面一个简单的问题:
drop一张表后,再按照原先的表定义重新创建它,会发生什么情况呢?
这是我的答案:
1、数据丢失;
2、索引丢失;
3、约束丢失
4、trigger丢失;
5、与它关联的视图实效;
6、所有引用它的包、函数、过程、trigger失效;
7、所有引用它的对象失效;
8、如果有外键指向它,drop失败;
9、如果有mview引用它,drop失败;
10、如果有对它作stream replication,drop失败;
11、如果有会话在使用这张表,drop失败;
12、所有引用它的PLSQL被重新硬分析;
13、表的分析数据丢失,所有相关查询计划都可能发生变化;
14、该表在buffer中的数据被释放;
15、重建后,表的物理位置很可能变化;
16、表的object id被重新分配;
17、所有被赋予访问权限的用户、角色都失去对它的访问权限。
你会怎么回答这个问题呢?
一个简单的查询所有Oracle错误代码的语句
begin
dbms_output.enable(1000000);
for i in 0..10000 loop
dbms_output.put_line(SQLERRM(0-i));
end loop;
dbms_output.disable();
dbms_output.enable(1000000);
for i in 10001..20000 loop
dbms_output.put_line(SQLERRM(0-i));
end loop;
end;/
Dual 表的性能优化
Dual表示一个特殊的系统,它只有一个字段、一条记录。在我们的代码中,经常会利用它产生一些特殊值,比如系统时间:
select sysdate from dual;正常情况下,以上语句会对dual表做一次全表扫描,产生3 consistent gets。这是一个很小的数值。但是如果放在一个大循环内,就会产生非常大的consistent gets(实际上,我们的系统就出现过这样的问题)。
如何来优化它呢... ...
全文链接:http://www.hellodba.com/Doc/Oracle_tuning_dual.htm
关于事务对数据块的操作过程的分析和试验(7)
在数据库中,对于数据块的处理往往是多事务并发处理的。他们之间不可避免会存在并发冲突,并且,某些事务可能由于某些原因失败了,需要回滚。那么,数据库是如何在这种并发环境中既能保持数据的完整性和一致性,又保证数据被高效访问和修改呢?一个事务究竟会对数据块产生什么样的微观操作呢?
全文链接:http://www.hellodba.com/Doc/Oracle_transaction_on_block(1).htm
关于事务对数据块的操作过程的分析和试验(6)
在数据库中,对于数据块的处理往往是多事务并发处理的。他们之间不可避免会存在并发冲突,并且,某些事务可能由于某些原因失败了,需要回滚。那么,数据库是如何在这种并发环境中既能保持数据的完整性和一致性,又保证数据被高效访问和修改呢?一个事务究竟会对数据块产生什么样的微观操作呢?
全文链接:http://www.hellodba.com/Doc/Oracle_transaction_on_block(1).htm
关于事务对数据块的操作过程的分析和试验(5)
在数据库中,对于数据块的处理往往是多事务并发处理的。他们之间不可避免会存在并发冲突,并且,某些事务可能由于某些原因失败了,需要回滚。那么,数据库是如何在这种并发环境中既能保持数据的完整性和一致性,又保证数据被高效访问和修改呢?一个事务究竟会对数据块产生什么样的微观操作呢?
全文链接:http://www.hellodba.com/Doc/Oracle_transaction_on_block(1).htm
关于事务对数据块的操作过程的分析和试验(4)
在数据库中,对于数据块的处理往往是多事务并发处理的。他们之间不可避免会存在并发冲突,并且,某些事务可能由于某些原因失败了,需要回滚。那么,数据库是如何在这种并发环境中既能保持数据的完整性和一致性,又保证数据被高效访问和修改呢?一个事务究竟会对数据块产生什么样的微观操作呢?
全文链接:http://www.hellodba.com/Doc/Oracle_transaction_on_block(1).htm
关于事务对数据块的操作过程的分析和试验(3)
在数据库中,对于数据块的处理往往是多事务并发处理的。他们之间不可避免会存在并发冲突,并且,某些事务可能由于某些原因失败了,需要回滚。那么,数据库是如何在这种并发环境中既能保持数据的完整性和一致性,又保证数据被高效访问和修改呢?一个事务究竟会对数据块产生什么样的微观操作呢?
全文链接:http://www.hellodba.com/Doc/Oracle_transaction_on_block(1).htm
关于事务对数据块的操作过程的分析和试验(2)
在数据库中,对于数据块的处理往往是多事务并发处理的。他们之间不可避免会存在并发冲突,并且,某些事务可能由于某些原因失败了,需要回滚。那么,数据库是如何在这种并发环境中既能保持数据的完整性和一致性,又保证数据被高效访问和修改呢?一个事务究竟会对数据块产生什么样的微观操作呢?
全文链接:http://www.hellodba.com/Doc/Oracle_transaction_on_block(1).htm
关于事务对数据块的操作过程的分析和试验(1)
在数据库中,对于数据块的处理往往是多事务并发处理的。他们之间不可避免会存在并发冲突,并且,某些事务可能由于某些原因失败了,需要回滚。那么,数据库是如何在这种并发环境中既能保持数据的完整性和一致性,又保证数据被高效访问和修改呢?一个事务究竟会对数据块产生什么样的微观操作呢?
全文链接:http://www.hellodba.com/Doc/Oracle_transaction_on_block(1).htm
ORA-01555错误浅析(7)
ORA-01555(快照过旧)问题让很多人感到十分头痛。最近我们的生产系统上也报出了ORA-01555错误。就结合这次案例将ORA-1555问题作个案例分析,并浅析产生原因和各种解决办法。
全文链接:http://www.hellodba.com/Doc/ORA-01555_analysis(1).htm
ORA-01555错误浅析(6)
ORA-01555(快照过旧)问题让很多人感到十分头痛。最近我们的生产系统上也报出了ORA-01555错误。就结合这次案例将ORA-1555问题作个案例分析,并浅析产生原因和各种解决办法。
全文链接:http://www.hellodba.com/Doc/ORA-01555_analysis(1).htm
ORA-01555错误浅析(5)
ORA-01555(快照过旧)问题让很多人感到十分头痛。最近我们的生产系统上也报出了ORA-01555错误。就结合这次案例将ORA-1555问题作个案例分析,并浅析产生原因和各种解决办法。
全文链接:http://www.hellodba.com/Doc/ORA-01555_analysis(1).htm
ORA-01555错误浅析(4)
ORA-01555(快照过旧)问题让很多人感到十分头痛。最近我们的生产系统上也报出了ORA-01555错误。就结合这次案例将ORA-1555问题作个案例分析,并浅析产生原因和各种解决办法。
全文链接:http://www.hellodba.com/Doc/ORA-01555_analysis(1).htm
ORA-01555错误浅析(3)
ORA-01555(快照过旧)问题让很多人感到十分头痛。最近我们的生产系统上也报出了ORA-01555错误。就结合这次案例将ORA-1555问题作个案例分析,并浅析产生原因和各种解决办法。
全文链接:http://www.hellodba.com/Doc/ORA-01555_analysis(1).htm
ORA-01555错误浅析(2)
ORA-01555(快照过旧)问题让很多人感到十分头痛。最近我们的生产系统上也报出了ORA-01555错误。就结合这次案例将ORA-1555问题作个案例分析,并浅析产生原因和各种解决办法。
全文链接:http://www.hellodba.com/Doc/ORA-01555_analysis(1).htm
ORA-01555错误浅析
ORA-01555(快照过旧)问题让很多人感到十分头痛。最近我们的生产系统上也报出了ORA-01555错误。就结合这次案例将ORA-1555问题作个案例分析,并浅析产生原因和各种解决办法。
全文链接:http://www.hellodba.com/Doc/ORA-01555_analysis(1).htm
各种语句的不同写法
| 最近处理的问题涉及SQL Tuning的东西比较多。不少语句不是加几个索引这么简单,而是语句是在太复杂了,有些作者都不知道是谁,逻辑非常难理解。碰到这种情况着实令人头疼。但是根据经验,很多语句的书写方式是可以用其他方式代替,通过尝试修改语句的写法,往往取得不错的效果。 当然,改变语句的写法只是语句优化的一种手段之一,在这个基础上,在结合其他的优化手段(采用PLSQL块提花单个语句、采用游标、提示等)才能取得最好的优化效果。以下的替换中,大多数情况下,右边的写法会优于左边的写法,并且根据等价原理进行互换,可以在复杂语句中组合成多种写法: 全文链接:http://www.hellodba.com/Doc/Oracle_acess_plsql_multi_way.htm |
对Group By 语句的一次优化过程
10gR2中设置大小写不敏感
10gR2中,nls_com新增加了一个值LINGUISTIC ,设置这个值,可以使在nl_sort中设置大小写不敏感。相应的,nl_sort也增加了一个值:BINARY_CI,(CI即Case Insensitive),也就是大小写不敏感。
但是,实际上设置过这两个值以后,并非真正大小写不敏感了,而是相当于Oracle会自动给语句加上upper函数。看以下例子:
SQL> set autot on
SQL> select * from t2 where f1 = 'a';
F1 AAA
---------- ----------
a 2
Execution Plan
----------------------------------------------------------
Plan hash value: 2238318762
--------------------------------------------------------------------------------
-------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Tim
e |
--------------------------------------------------------------------------------
-------
| 0 | SELECT STATEMENT | | 1 | 5 | 2 (0)| 00:
00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T2 | 1 | 5 | 2 (0)| 00:
00:01 |
|* 2 | INDEX RANGE SCAN | T2_IDX1 | 1 | | 1 (0)| 00:
00:01 |
--------------------------------------------------------------------------------
-------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("F1"='a')
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
0 bytes sent via SQL*Net to client
0 bytes received via SQL*Net from client
0 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> alter session set NLS_SORT=BINARY_CI;
Session altered.
SQL> alter session set NLS_COMP=LINGUISTIC;
Session altered.
SQL> select * from t2 where f1 = 'a';
F1 AAA
---------- ----------
A 1
a 2
Execution Plan
----------------------------------------------------------
Plan hash value: 1513984157
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 5 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T2 | 1 | 5 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(NLSSORT("F1",'nls_sort=''BINARY_CI''')=HEXTORAW('6100') )
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
0 bytes sent via SQL*Net to client
0 bytes received via SQL*Net from client
0 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
2 rows processed
创建监控表的DML的触发器
在生产环境中,总是可能出现这样的情况:某张或者某些表的数据被莫名其妙的修改了,但是很难定位出是哪个用户、哪个过程修改的。这是一个很让DBA头痛的事情(往往DBA对于整个代码逻辑并不是非常了解)。要定位出“问题”语句,有几种方法可以选择:log miner;细节粒度审计;触发器。Log miner要求要有归档日志(这个并非所有系统都可以做),而且需要有相当的磁盘空间,好处就是可以离线做;细节粒度升级能够根据条件记录下表的DML操作(9i及之前只能记录SELECT语句),比较复杂的FGA需要较高权限的用户来实现;触发器比较灵活,能够按照比较复杂的条件来记录需要的信息。下面介绍触发器如何实现... ...
全文链接:http://www.hellodba.com/Doc/Oracle_monitor_dml_trigger.htm
关于Oracle临时表数据cache的研究(2)
Global Temporary Table是Oracle 8i中出现的特性,可以用于存储事务或会话中的临时数据。它的出现大大方便了开发人员。但是在使用上面,由于它本身的特性,一直存在一些问题。
简单说一下临时表,它的数据只对调用它的会话可见,一个会话是无法访问其他会话中的临时表的数据。可以在创建时指定它是事务级的还是会话级的。它被创建在用户的默认临时表空间上,在创建时不会分配段,而是在会话中第一次insert的时候从零时表空间分配数据段。DML时,不会产生redo log,但是会产生undo log。并且无法生成临时表或者临时表上索引的统计信息(势必会影响CBO下的查询计划)。
下面研究一下临时表的数据是如何存储,又是如何获得的,如何cache在内存中的... ...
全文链接:http://www.hellodba.com/Doc/Oracle_tmp_table_cache.htm
关于Oracle临时表数据cache的研究(1)
Global Temporary Table是Oracle 8i中出现的特性,可以用于存储事务或会话中的临时数据。它的出现大大方便了开发人员。但是在使用上面,由于它本身的特性,一直存在一些问题。
简单说一下临时表,它的数据只对调用它的会话可见,一个会话是无法访问其他会话中的临时表的数据。可以在创建时指定它是事务级的还是会话级的。它被创建在用户的默认临时表空间上,在创建时不会分配段,而是在会话中第一次insert的时候从零时表空间分配数据段。DML时,不会产生redo log,但是会产生undo log。并且无法生成临时表或者临时表上索引的统计信息(势必会影响CBO下的查询计划)。
下面研究一下临时表的数据是如何存储,又是如何获得的,如何cache在内存中的... ...
全文链接:http://www.hellodba.com/Doc/Oracle_tmp_table_cache.htm
普通物理表、临时表和TABLE(函数)的执行效率对比
普通物理表、临时表和TABLE的用途各不相同,普通表一般存放需要长期保存的数据,临时表存放某个事务或会话过程中的临时数据,array是oracle中的数组,也可以用于存放临时数据,或在OODB中使用。但是,优化器在做查询计划时,尤其在CBO中,没临时表和TABLE的统计数据,因此总会得出一些混乱的查询计划,往往需要我们用hint去调整。并且,由于实现机制各不相同,他们的查询效率也不一样。下面通过一个简单的测试来对比他们之间的查询效率,以便于在可选的情况下选择最优的实现方式... ...
全文链接:http://www.hellodba.com/Doc/Oracle_compare_tmp_plsql_table.htm
郁闷!被plsql developer的bug耍了半天
今天帮开发人员定位一个问题,用plsql developer登到测试实例A上,打开对应的包,查了半天,没问题。
后来开发人员说是另外一个环境B。为了方便对比,把从A上打开的包的窗口保留了,直接用当前使用的plsql developer连上B,找到对应的包,打开一看,和A上面一样的。和开发人员邮件来来回回几回。最后唯一不同的是我用dba帐号连的,他用开发人员帐号连的。
于是另起一个plsql developer,用开发人员帐号一连,果然不一样了?!那就奇怪了,虽然我用的是DBA帐号,但是查看的都是开发帐号下面的同一个对象呀。怎么会登陆帐号不同,看到的内容不一样呢?!莫非是Oracle什么bug。
于是查呀查。。。折腾了半个小时。。。
最后发现原因是:
我第一次连A,打开了包,没有关窗口,由连上了B。这时候选择同一对象名打开,plsql developer检查到有一个一模一样的对象窗口已经打开了,就直接重用了这个窗口,而不管这两个对象是来自不同的实例!
!@#$%^&*
通过创建用户自定义函数索引优化语句
用DBMS_MONITOR进行跟踪SQL
使用Oracle 10g的新包DBMS_MONITOR跟踪SQL
by fuyuncat
Oracle 10g中提供了一个新的包进行SQL Trace: DBMS_MONITOR。它提供了多种级别的trace.
· 模块级别:
SQL> exec dbms_monitor.serv_mod_act_trace_enable(service_name => 'EDGAR', module_name => 'product_module', action_name => ‘INSERT_DATA’);
其中,module_name和action_name可以通过在程序中调用模块DBMS_APPLICATION_INFO来定义。也可以通过dbms_monitor.all_modules和dbms_monitor.all_actions来设置对所有模块和动作进行跟踪。
· 用户级别:
SQL> exec dbms_monitor.client_id_trace_enable(client_id => 'DEMO');
Client_id就是数据库中的用户名。· 会话级别:
SQL> exec dbms_monitor.session_trace_enable(138);
138就是会话ID.激活跟踪后,就可以用新工具trcsess来生成trace文件,先跳转到udump目录。
C:> cd <ORACLE_HOME>admin<SID>udump
可以生成不同级别的的trace文件(前提是该级别的trace已经激活)
· 模块级别:
C:oracleproduct10.2.0adminedgarudump> trcsess output="abc.trc" service="EDGAR" module="product_module" action="INSERT_DATA"
· 用户级别:
C:oracleproduct10.2.0adminedgarudump>trcsess output="abc.trc" clientid="DEMO"
· 会话级别:
C:oracleproduct10.2.0adminedgarudump>trcsess output="abc.trc" session=138.12432
其中session必须是SID.SERIAL#的格式(可以从v$session中查到)
打开产生的trace文件,会发现内面的内容实际上相当于10046和10053事件产生的trace文件内容的组合。
同样,用TRCSESS产生的trace文件,可以使用tkprof进行分析:
C:oracleproduct10.2.0adminedgarudump> tkprof abc.trc abc.txt
Oracle 10g中的正则表达式
Select username from t_userinfo
where (phonenumber like ‘135%8888’
or phonenumber like ‘136%8888’
or phonenumber like ‘137%8888’
or phonenumber like ‘138%8888’)
and length(phonenumber) = 13;
那时就会很羡慕java程序员可以使用一个正则表达式轻松搞定。10g中,再也不需要这么复杂了, oracle也提供了几个正则表达式函数... ...
全文链接:http://www.hellodba.com/Doc/oracle10g_regular_expression.htm
Oracle 10g中的代码混淆
Oracle 9i之前,提供了一个命令’warp’来加密代码。但它是命令行方式的,是针对脚本的。10g中,Oracle包DBMS_DDL提供了一个新的函数CREATE_WRAPPED来实现对代码的混淆... ...
全文链接:http://www.hellodba.com/Doc/oracle10g_code_wrapped.htm
Oracle 10g新特性——选择性编译
Oracle10g中提供了一个十分方便开发人员的新特性——选择性编译。即可以通过条件,只编译PL/SQL中的部分代码。如果你对C++很熟悉,那你会对这个特性感觉非常亲切,因为它和C++中的条件宏十分相似。在9i的时候,开发人员将自己的调试信息加入到程序中,往往release之后都没有删掉,这些信息轻则影响可读性,严重的话会影响系统性能。有了这个特性后,这个问题就可以解决了... ...
全文链接:http://www.hellodba.com/Doc/oracle10g_chooseful_compile.htm
利用Ultra Search创建自己的桌面文档搜索系统
我自己机器上有很多很有价值的文档(有自己写的,也有下载的),但是总是有时候想找一篇文档,当时不记得放在哪了。
机器上正好装了Ultra Search,我就在我的文档目录上创建一个搜索系统,以后找起文档来方便多了。很酷吧!(当然google desktop也是一个不错的工具,但是,它有一定局限性,比如不能针对某个目录搜索,没有高级搜索。关键是顺便还可以配置一下Ultra Search,增加经验值J)... ...
全文链接:http://www.hellodba.com/Doc/Oracle_Ultra_Search_desktop_Search.htm
共享自己写的一个Oracle压力测试工具(更新中)
自己写的一个Oracle压力测试工具。支持windows, unix和linux。但是必须要有java环境(java 1.4.1.03以上)。
没有界面。但是压强不小,我的必备工具。
当然肯定还有问题,发现了bug或者有什么好建议就发送到我的邮箱吧:fuyuncat@gmail.com
下载地址:http://www.hellodba.com/Download/SQLStress.html
更新日期:2005.12.23
最新版本:v1.12
更新内容:制作成exe文件、在unix下可能会产生严重错误,暂时不支持
使用sqlplus时要注意的几个问题
使用sqlplus时要注意的几个问题
by fuyuncat
1.1 ‘&’:
The first thing we should be care when using SQL*Plus or PL/SQL Developer is the start character of substitution variable reference, which default is ‘&’. Its effective scope is whole PL/SQL block, including your defined variable in the PL/SQL block or the comments of PL/SQL block. If the string following ‘&’ is a valid naming-string of PL/SQL, it will be treated as a input variable. For example:
SQL> declare
2 v_aaa varchar2(10):= 'aaa&b.bb'; --this is the comment, but include aaa&ccc also.
3 begin
4 dbms_output.put_line(v_aaa);
5 end;
6 /
Enter value for b:
Enter value for ccc:
old 2: v_aaa varchar2(10):= 'aaa&b.bb'; --this is the comment, but include aaa
&ccc also.
new 2: v_aaa varchar2(10):= 'aaabb'; --this is the comment, but include aaa al
so.
aaabb
PL/SQL procedure successfully completed.
We have many methods to avoid it. Such as using ’set’ command, convert ‘&’ to ASCII code. We recommend just split it isolated, or quote it by ‘”’:
SQL> declare
2 v_aaa varchar2(10):= 'aaa'||'&'||'b.bb';--this is the comment, but include aaa"&"ccc also.
3 begin
4 dbms_output.put_line(v_aaa);
5 end;
6 /
aaa&b.bb
PL/SQL procedure successfully completed.
1.2 ‘/’:
Another thing we should remember when using PL/SQL Developer or SQL*Plus is we should add a ‘/’ at the end of each PL/SQL scripts. Because the character means ask oracle to execute the PL/SQL block. If missing it, SQL*Plus will never execute the script and it will not be ended:
SQL> declare
2 v_aaa varchar2(10):= 'aaa';
3 begin
4 dbms_output.put_line(v_aaa);
5 end;
6
7
8
… …
1.3 Set command:
The ‘set’ command is using to set the environment of SQL*Plus and PL/SQL Developer. It can help us to format the select result. But be careful when using it. Because it will impact the following scripts. For example, when you set scan off in the first script, then you want accept input variable. But the ‘&’ will not effect at that time when executing the second script.
To recover all variables to be default value, we suggest to exit current session and recreate another one.
1.4 Spool
Spool is a very useful command. It can let you get the result report of a set of commands, including SQL commands and SQL*Plus commands. You can use ‘set’ or other commands to customize your report. However, if you use SQL*Plus to get the report, you will not get the result you want if you does not execute the commands in a scripts file. For example, if you execute these commands in SQL*Plus dierectly:
08:58:36 SQL> set echo off
08:58:44 SQL> spool c:test.txt
08:58:51 SQL> select sysdate from dual;
SYSDATE
---------
06-DEC-05
08:59:00 SQL> spool off
You wanna get this result:
SYSDATE
---------
06-DEC-05
But if you open the file ‘c:test.txt’, you will find the content of it is:
08:58:51 SQL> select sysdate from dual;
SYSDATE
---------
06-DEC-05
08:59:00 SQL> spool off
You must write those commands in a script file, e.g. ‘c:test.sql’, and execute it
09:06:07 SQL> @c:test.sql
SYSDATE
---------
06-DEC-05
And you can find its result is what you want.
For PL/SQL developer, it is another fact: you can get the same result whenever execute these commands in command window directly or execute the script file including them.
1.5 Comments in script
When we add comments in a script file, we should very careful. Comments will lead to unexpected result in some special conditions.
1.5.1 An English letter follows closely in comment symbol '/*'
In SQL*Plus, it will lead the SQL statement before the comment to be executed twice. For example, the script file “test.sql” includes follow SQL statements:
select 'aaa' from dual;
/*abc*/
select 'bbb' from dual;
We just want the statement ‘select 'aaa' from dual;’ to be executed once. However, we will get another result:
SQL> @c:test.sql
'AA
---
aaa
'AA
---
aaa
'BB
---
bbb
As you can see, the statement were executed twice.
This bug would not impact PL/SQL developer.
And this is the correct script (there is a blank char between ‘/*’ and ‘abc’):
select 'aaa' from dual;
/* abc */
select 'bbb' from dual;
The right result:
SQL> @c:test.sql
'AA
---
aaa
'BB
---
bbb
1.5.2 Commends follow a SQL statement
If a comment follows a SQL statement (the comments including ‘--’ mode and ‘/**/’ mode), this statement will be treated as comments, and will not be executed. For example, here a ‘test.sql’ script:
select 'aaa' from dual; --aaa
select 'bbb' from dual;
You will get this result when execute it:
SQL> @c:test.sql
'BB
---
bbb
Noted, the first SQL statement was not executed, because it was followed by a comments with ‘--’.
And, if the comment was placed in another line follow closely the SQL statement, it will also raise this bug:
select 'aaa' from dual;
--aaa
select 'bbb' from dual;
Execute the script:
SQL> @c:test.sql
'BB
---
bbb
This bug impact both SQL*Plus and PL/SQL developer.
And this is the correct script:
-- aaa
select 'aaa' from dual;
select 'bbb' from dual;
The right result:
SQL> @c:test.sql
'AA
---
aaa
'BB
---
bbb
1.5.3 Commends following a SQL statement, followed by another SQL statement closely
If a commend follows a SQL statement, and it was followed by another SQL statement closely. It will lead to a execution error. For example, this is the script:
select 'aaa' from dual; --aaa
select 'bbb' from dual;
Execute the script:
SQL> @c:test.sql
select 'aaa' from dual; --aaa
*
ERROR at line 1:
ORA-00911: invalid character
This bug will ignore the comments between them. For example, this is the script:
select 'aaa' from dual;--aaa
/* abc */
select 'bbb' from dual;
It will still raise the error:
SQL> @c:test.sql
select 'aaa' from dual;--aaa
*
ERROR at line 1:
ORA-00911: invalid character
This bug impact both SQL*Plus and PL/SQL developer.
And this is the correct script:
-- aaa
select 'aaa' from dual;
select 'bbb' from dual;
The right result:
SQL> @c:test.sql
'AA
---
aaa
'BB
---
bbb
Oracle中的Hash Join祥解
hash join(HJ)是一种用于equi-join(而anti-join就是使用NOT IN时的join)的技术。在Oracle中,它是从7.3开始引入的,以代替sort-merge和nested-loop join方式,提高效率。在CBO(hash join只有在CBO才可能被使用到)模式下,优化器计算代价时,资源足够时,首先会考虑hash join... ...
全文链接:http://www.hellodba.com/Doc/Oracle_Hash_Join.htm
安装配置ultra search
利用Oracle 10g SQL优化器(STA)优化语句(3)
SQL优化器(SQL Tuning Advisor STA)是Oracle10g中推出的帮助DBA优化工具,它的特点是简单、智能,DBA值需要调用函数就可以给出一个性能很差的语句的优化结果。下面介绍一下它的使用... ...
全文链接:http://www.hellodba.com/Doc/how_to_oracle10_sta(1).htm
利用Oracle 10g SQL优化器(STA)优化语句(2)
SQL优化器(SQL Tuning Advisor STA)是Oracle10g中推出的帮助DBA优化工具,它的特点是简单、智能,DBA值需要调用函数就可以给出一个性能很差的语句的优化结果。下面介绍一下它的使用... ...
全文链接:http://www.hellodba.com/Doc/how_to_oracle10_sta(1).htm
利用Oracle 10g SQL优化器(STA)优化语句(1)
SQL优化器(SQL Tuning Advisor STA)是Oracle10g中推出的帮助DBA优化工具,它的特点是简单、智能,DBA值需要调用函数就可以给出一个性能很差的语句的优化结果。下面介绍一下它的使用... ...
全文链接:http://www.hellodba.com/Doc/how_to_oracle10_sta(1).htm
Oracle10g数据库自动诊断监视工具(ADDM)使用指南(第四、五章)
在Oracle9i及之前,DBA们已经拥有了很多很好用的性能分析工具,比如,tkprof、sql_trace、statspack、set event 10046&10053等等。这些工具能够帮助DBA很快的定位性能问题。但这些工具都只给出一些统计数据,然后再由DBA们根据自己的经验进行优化...
全文链接:
http://www.hellodba.com/Doc/oracle10g_addm(1).htm
Oracle10g数据库自动诊断监视工具(ADDM)使用指南(第三章)
在Oracle9i及之前,DBA们已经拥有了很多很好用的性能分析工具,比如,tkprof、sql_trace、statspack、set event 10046&10053等等。这些工具能够帮助DBA很快的定位性能问题。但这些工具都只给出一些统计数据,然后再由DBA们根据自己的经验进行优化...
全文链接:
http://www.hellodba.com/Doc/oracle10g_addm(1).htm
Oracle10g数据库自动诊断监视工具(ADDM)使用指南(第二章)
在Oracle9i及之前,DBA们已经拥有了很多很好用的性能分析工具,比如,tkprof、sql_trace、statspack、set event 10046&10053等等。这些工具能够帮助DBA很快的定位性能问题。但这些工具都只给出一些统计数据,然后再由DBA们根据自己的经验进行优化...
全文链接:
http://www.hellodba.com/Doc/oracle10g_addm(1).htm
Oracle10g数据库自动诊断监视工具(ADDM)使用指南(第一章)
在Oracle9i及之前,DBA们已经拥有了很多很好用的性能分析工具,比如,tkprof、sql_trace、statspack、set event 10046&10053等等。这些工具能够帮助DBA很快的定位性能问题。但这些工具都只给出一些统计数据,然后再由DBA们根据自己的经验进行优化...
全文链接:
http://www.hellodba.com/Doc/oracle10g_addm(1).htm
RAC的load balance和failover的配置过程
本文介绍了在RAC模式中,如何配置客户端以及服务端,以实现负载均衡(Load Balance)和failover。
全文链接:http://www.hellodba.com/Doc/oracle_load_balance_and_fail_over.htm
SGA_MAX_SIZE、_ksm_granule_size和db_cache_size之间的关系
SGA_MAX_SIZE、_ksm_granule_size和db_cache_size之间的关系
_ksm_granule_size为最低粒度大小。如果SGA_MAX_SIZE小于128M,则_ksm_granule_size为4M;如果SGA_MAX_SIZE大于等于128M,则_ksm_granule_size为8M
_ksm_granule_size决定了其他一些参数的大小。
假如SGA_MAX_SIZE为64M,则_ksm_granule_size为4M,那么如果设定db_cache_size为9M,则实际db_cache_size会被设置为12M,因为最低粒度为4M;
假如SGA_MAX_SIZE为128M,则_ksm_granule_size为8M,那么如果设定db_cache_size为9M,则实际db_cache_size会被设置为16M,因为最低粒度为8M;
数据段压缩(Data Segment Compression)浅析
数据段压缩,又称为“块级压缩”,是Oracle 9.2 中出现的新特性。他对于数据仓库和那些只需要读的大表来说很有用。数据段压缩可以使存储空间减少,又可以提高查询速度(需要读入的数据块更少)。本文分析了数据段压缩的使用方法已经它的内部存储方式... ...
全文链接:http://www.hellodba.com/Doc/data_compress.htm
Oracle 10G OEM 无法正常启动的解决办法(重建OEM)
Oracle 10G OEM 无法正常启动的解决办法(重建OEM)
by fuyuncat
现在的操作系统不支持中文,原先存的中文信息都丢了:(
SQL> connect / as sysdba
SQL> drop role MGMT_USER;
SQL> drop user mgmt_view cascade;
SQL> drop public synonym mgmt_target_blackouts;
SQL> drop public synonym setemviewusercontext;
SQL> drop user sysman cascade;
delte directory ORACLE_HOMEoc4jj2eeOC4J_DBConsole_HOSTNAME_SID
C:> emca -x <SID>
C:> emca
Oracle XML DB之浅入浅出
XML DB是Oracle 9.2中出现的新特性,这里介绍了如何在Oracle中存储、控制、使用XML...
全文链接:http://www.hellodba.com/Doc/oracle_xml_db.htm
将SQL查询内容赋给Unix变量
将SQL查询内容赋给Unix变量
fuyuncat
方法一:
#!/bin/sh
VALUE=`sqlplus -silent user/password@instance <<END
set pagesize 0 feedback off verify off heading off echo off
select max(c1) from t1;
exit;
END`
if [ -z "$VALUE" ]; then
echo "No rows returned from database"
exit 0
else
echo $VALUE
fi
方法二:
#!/bin/ksh
sqlplus -s >junk1 /nolog <<EOF
connect user/password@instance
column num_rows new_value num_rows format 9999
select count(*) num_rows
from table_name;
exit num_rows
EOF
echo "Number of rows are: $?"
方法三:
sqlplus -s /nolog |& # Open a pipe to SQL*Plus
print -p -- 'connect user/password@instance'
print -p -- 'set feed off pause off pages 0 head off veri off line 500'
print -p -- 'set term off time off'
print -p -- "set sqlprompt ''"
print -p -- "select sysdate from dual;"
read -p SYSDATE
print -p -- "select user from dual;"
read -p USER
print -p -- "select global_name from global_name;"
read -p GLOBAL_NAME
print -p -- exit
echo SYSDATE: $SYSDATE
echo USER: $USER
echo GLOBAL_NAME: $GLOBAL_NAME
ORACLE各个版本的新特性一览表
ORACLE各个版本的新特性一览表
by fuyuncat
Oracle 10g Release 2 (10.2.0)
- SQL Access Advisor
- Segment Advisor
- Database Managed Undo Retention Time Period
- Database Managed Multiblock Read Count
- Size-Based Tablespace Freespace Alerts
- Enterprise Manager Direct SGA Attach
- Dropping Empty Datafiles
- V$SQLSTATS Performance View
Oracle 10g Release 1 (10.1.0)
- Simplified Oracle10g installation
- Enhanced Enterprise Manager
- Introducing DataPump - The load/unload utility
- Automatic Database Diagnostic Monitor
- Automatic Shared Memory Management
- Automatic Optimizer Statistics Gathering
- Automatic Undo Tuning
- Automatic Workload Repository
- Automatic Storage Management
- Automatic Maintenance Tasks
- SQL Tuning Advisor
- SQL Access Advisor
- Undo Advisor
- Redo Logfile Size Advisor
- Bigfile Tablespaces
- New Flashback Features
- The SYSAUX Tablespace
- Direct Upgrade to 10g
- UNIX Style Regular Expressions in SQL
- HTML DB
- New (bunch of) Wait Events
- New Initialization Parameters
- Rename Tablespace
- Flush buffer cache
- Temporary Tablespace Groups
- Default Permanent Tablespace
- Segment Shrink
- Skip Unusable Indexes
- Drop Database
- Server Alerts
- Transport tablespace across platforms
Oracle 9i Release 2 (9.2.0)
- Oracle Streams (for data movement - can potentially replace Oracle Advance Replication and Standby Databases).
- XML DB (Oracle is now a standards compliant XML database)
- Data segment compression (compress keys in tables - only when loading data)
- Cluster file system for Windows and Linux (raw devices are no longer required).
- Create logical standby databases with Data Guard
- Java 1.3 used inside the database
Oracle 9i Release 1 (9.0.1)
- Traditional rollback segments (RBS) are still available, but can be replaced with automated System Managed Undo (SMU). Using SMU, Oracle will create it's own "Rollback Segments" and size them automatically without any DBA involvement.
- Flashback query (dbms_flashback.enable) - one can query data as it looked at some point in the past. This feature will allow users to correct wrongly committed transactions without contacting the DBA to do a database restore.
- Use Oracle Ultra Search for searching databases, file systems, etc. The UltraSearch crawler fetch data and hand it to Oracle Text to be indexed.
- Oracle Nameserver is still available, but deprecate in favor of LDAP Naming (using the Oracle Internet Directory Server). A nameserver proxy is provided for backwards compatibility as pre-8i client cannot resolve names from an LDAP server.
- Oracle Parallel Server's (OPS) scalebility was improved - now called Real Application Clusters (RAC). Full Cache Fusion implemented. Any application can scale in a database cluster. Applications doesn't need to be cluster aware anymore.
- The Oracle Standby DB feature renamed to Oracle Data Guard. New Logical Standby databases replay SQL on standby site allowing the database to be used for normal read write operations. The Data Guard Broker allows single step fail-over when disaster strikes.
- Scrolling cursor support. Oracle9i allows fetching backwards in a result set.
- Dynamic Memory Management - Buffer Pools and shared pool can be resized on-the-fly. This eliminates the need to restart the database each time parameter changes were made.
- On-line table and index reorganization.
- VI (Virtual Interface) protocol support, an alternative to TCP/IP, available for use with Oracle Net (SQL*Net). VI provides fast communications between components in a cluster.
- Build in XML Developers Kit (XDK). New data types for XML (XMLType), URI's, etc. XML integrated with AQ.
- Cost Based Optimizer now also consider memory and CPU, not only disk access cost as before.
- PL/SQL programs can be natively compiled to binaries.
- Deep data protection - fine grained security and auditing. Put security on DB level. SQL access do not mean unrestricted access.
- Resumable backups and statements - suspend statement instead of rolling back immediately.
- List Partitioning - partitioning on a list of values.
- ETL (eXtract, transformation, load) Operations - with external tables and pipelining.
- OLAP - Express functionality included in the DB.
- Data Mining - Oracle Darwin's features included in the DB.
Oracle 8i (8.1.7)
- Static HTTP server included (Apache)
- JVM Accelerator to improve performance of Java code
- Java Server Pages (JSP) engine
- MemStat - A new utility for analyzing Java Memory footprints
- OIS - Oracle Intergration Server introduced.
- PLSQL Gateway introduced for deploying PL/SQL based solutions on the Web
- Enterprise Manager Enhancements - including new HTML based reporting and Advanced Replication functionality included.
- New Database Character Ser Migration utilility included.
Oracle 8i (8.1.6)
- PL/SQL Server Pages (PSP's)
- DBA Studio Introduced
- Statspack
- New SQL Functions (rank, moving average)
- ALTER FREELISTS command (previously done by DROP/CREATE TABLE)
- Checksums always on for SYSTEM tablespace allowing many possible corruptions to be fixed before writing to disk
- XML Parser for Java
- New PLSQL encrypt/decrypt package introduced
- User and Schemas sepapated
- Numerous Performance Enhancements
Oracle 8i (8.1.5)
- Fast Start recovery - Checkpoint rate auto-adjusted to meet roll forward criteria
- Reorganize indexes/index only tables which users accessing data - Online index rebuilds
- Log Miner introduced - Allows on-line or archived redo logs to be viewed via SQL
- OPS Cache Fusion introduced avoiding disk I/O during cross-node communication
- Advanced Queueing improvements (security, performance, OO4O support
- User Security Improvements - more centralisation, single enterprise user, users/roles across multiple databases.
- Virtual private database
- JAVA stored procedures (Oracle Java VM)
- Oracle iFS
- Resource Management using proirities - resource classes
- Hash and Composite partitioned table types
- SQL*Loader direct load API
- Copy optimizer statistics across databases to ensure same access paths across different environments.
- Stanby Database - Auto shipping and application of redo logs. Read Only queries on standby database allowed.
- Enterprise Manager v2 delivered
- NLS - Euro Symbol supported
- Analyze tables in parallel
- Temporary tables supported.
- Net8 support for SSL, HTTP, HOP protocols
- Transportable tablespaces between databases
- Locally managed tablespaces - automatic sizing of extents, elimination of tablespace fragmentation, tablespace information managed in tablespace (i.e noved from data dictionary) improving tablespace reliability
- Drop Column on table (Finally !!!!!)
- DBMS_DEBUG PL/SQL package, DBMS_SQL replaced by new EXECUTE IMMEDIATE statement
- Progress Monitor to track long running DML,DDL
- Functional Indexes - NLS, case insensitive, descending
Oracle 8.0
- Object Relational database
- Object Types (not just date, character, number as in v7
- SQL3 standard
- Call external procedures
- LOB >1 per table
- Partitioned Tables and Indexes
- export/import individual partitions
- partitions in multiple tablespaces
- online/offline, backup/recover individual partitions
- merge/balance partitions
- Advanced Queuing for message handling
- Many performance improvements to SQL/PLSQL/OCI making more efficient use of CPU/Memory. V7 limits extended (e.g. 1000 columns/table, 4000 bytes VARCHAR2)
- Parallel DML statements
- Connection Pooling ( uses the physical connection for idle users and transparently re-establishes the connection when needed ) to support more concurrent users.
- Improved "STAR" Query optimizer
- Integrated Distributed Lock Manager in Oracle PS (as opposed to Operating system DLM in v7).
- Performance improvements in OPS - global V$ views introduced across all instances, transparent failover to a new node
- Data Cartridges introduced on database (e.g. image, video, context, time, spatial)
- Backup/Recovery improvements - Tablespace point in time recovery, incremental backups, parallel backup/recovery. Recovery manager introduced
- Security Server introduced for central user administration. User password expiry, password profiles, allow custom password scheme. Privileged database links (no need for password to be stored)
- Fast Refresh for complex snapshots, parallel replication, PL/SQL replication code moved in to Oracle kernel. Replication manager introduced.
- Index Organized tables
- Deferred integrity constraint checking (deferred until end of transaction instead of end of statement).
- SQL*Net replaced by Net8
- Reverse Key indexes
- Any VIEW updateable
- New ROWID format
Oracle 7.3
- Partitioned Views
- Bitmapped Indexes
- Asynchronous read ahead for table scans
- Standby Database
- Deferred transaction recovery on instance startup
- Updatable Join Views (with restrictions)
- SQLDBA no longer shipped.
- Index rebuilds
- db_verify introduced
- Context Option
- Spatial Data Option
- Tablespaces changes - Coalesce, Temporary Permanent,
- Trigger compilation, debug
- Unlimited extents on STORAGE clause.
- Some init.ora parameters modifiable - TIMED_STATISTICS
- HASH Joins, Antijoins
- Histograms
- Dependencies
- Oracle Trace
- Advanced Replication Object Groups
- PL/SQL - UTL_FILE
Oracle 7.2
- Resizable, autoextend data files
- Shrink Rollback Segments manually
- Create table, index UNRECOVERABLE
- Subquery in FROM clause
- PL/SQL wrapper
- PL/SQL Cursor variables
- Checksums - DB_BLOCK_CHECKSUM, LOG_BLOCK_CHECKSUM
- Parallel create table
- Job Queues - DBMS_JOB
- DBMS_SPACE
- DBMS Application Info
- Sorting Improvements - SORT_DIRECT_WRITES
Oracle 7.1
- ANSI/ISO SQL92 Entry Level
- Advanced Replication - Symmetric Data replication
- Snapshot Refresh Groups
- Parallel Recovery
- Dynamic SQL - DBMS_SQL
- Parallel Query Options - query, index creation, data loading
- Server Manager introduced
- Read Only tablespaces
Oracle 7.0
- Database Integrity Constraints (primary, foreign keys, check constraints, default values)
- Stored procedures and functions, procedure packages
- Database Triggers
- View compilation
- User defined SQL functions
- Role based security
- Multiple Redo members - mirrored online redo log files
- Resource Limits - Profiles
- Much enhanced Auditing
- Enhanced Distributed database functionality - INSERTS, UPDATES,DELETES, 2PC
- Incomplete database recovery (e.g SCN)
- Cost based optimiser
- TRUNCATE tables
- Datatype changes (i.e VARCHAR2 CHAR, VARCHAR)
- SQL*Net v2, MTS
- Checkpoint process
- Data replication - Snapshots
SQL*Load技巧三则
SQL*Load技巧三则
by fuyuncat
1.1 SQL*Load过滤数据
LOAD DATA
INFILE 'mydata.dat' BADFILE 'mydata.bad' DISCARDFILE 'mydata.dis'
APPEND
INTO TABLE my_selective_table
WHEN (01) <> 'H' and (01) <> 'T' and (30:37) = '20031217'
(
region CONSTANT '31',
service_key POSITION(01:11) INTEGER EXTERNAL,
call_b_no POSITION(12:29) CHAR
)
其中,01表示一个字符,30:37表示从30个字符到37个字符。
注意:在When条件中,不支持OR。可以采用以下代替方法:
LOAD DATA
INFILE 'mydata.dat' BADFILE 'mydata.bad' DISCARDFILE 'mydata.dis'
APPEND
INTO TABLE my_selective_table
WHEN (01) <> 'H' and (01) <> 'T'
(
region CONSTANT '31',
service_key POSITION(01:11) INTEGER EXTERNAL,
call_b_no POSITION(12:29) CHAR
)
INTO TABLE my_selective_table
WHEN (30:37) = '20031217'
(
region CONSTANT '31',
service_key POSITION(01:11) INTEGER EXTERNAL,
call_b_no POSITION(12:29) CHAR
)
1.2 SQL*Load时过滤字段
LOAD DATA
TRUNCATE INTO TABLE T1
FIELDS TERMINATED BY ','
( field1,
field2 FILLER,
field3
)
1.3 SQL*Load导入BLOB和CLOB字段
LOAD DATA
INFILE *
INTO TABLE image_table
REPLACE
FIELDS TERMINATED BY ','
(
image_id INTEGER(5),
file_name CHAR(30),
image_data LOBFILE (file_name) TERMINATED BY EOF
)
BEGINDATA
001,image1.gif
002,image2.jpg
彻底将一个数据文件从表空间中删除
彻底将一个数据文件从表空间中删除
by fuyuncat
首先说明一下alter database datafile ... offline drop:
在非归档模式下,可以使用... offline drop,在归档模式下,使用... offline. 这个命令的意思并不是从表空间将这个数据文件彻底删除,而是说将这个数据文件“冻结”住:它的scn不在变化,不会再向它写入任何数据;但是原有存在这个文件中对象和数据还可以继续使用。因此在使用这个命令后,通过修改控制文件将它删除,数据库在启动时就会报文件丢失的错误,并且会在数据字典中产生一个MISGXXXXX的纪录。因此,以一个数据文件是无法被直接从数据库中删除掉的。
如果需要减少表空间的数据文件,可以采用以下办法:
export除表空间的内容:exp ... tablespaces=xxx;
使用include content子句删除表空间:drop tablespace xxx include content;
重见表空间,使之不包括需要去除掉的数据文件;
import表空间的所有数据对象。
使用shutdown immediate无法关闭数据库(长时间无反应)情况下,如何关闭数据库
使用shutdown immediate无法关闭数据库(长时间无反应)情况下,如何关闭数据库
by fuyuncat
alter system checkpoint;shutdown abortstartup restrictshutdown immediate利用RMAN克隆数据库
利用RMAN克隆数据库
by fuyuncat
1、 在目标机器上创建一个新的init.ora文件,注意修改其中SID、DBNAMES、DUMP_DIR等参数
2、 在目标机器上用orapwd命令创建一个新的password文件
3、 在目标机器上设者相关的环境变量(ORACLE_SID等)
4、 在目标机器上启动sqlplus,执行startup nomount
5、 执行以下RMAN脚本:
connect target sys/secure@origdb --源DB
connect catalog rman/rman@catdb --源CATALOG
connect auxiliary / --目标DB
run {
set newname for datafile 1 to '/ORADATA/system01.dbf';
set newname for datafile 2 to '/ORADATA/undotbs01.dbf';
set newname for datafile 3 to '/ORADATA/users01.dbf';
set newname for datafile 4 to '/ORADATA/indx01.dbf';
set newname for datafile 5 to '/ORADATA/example01.dbf';
allocate auxiliary channel dupdb1 type disk;
set until sequence 2 thread 1;
duplicate target database to dupdb
logfile
GROUP 1 ('/ORADATA/redo01.log') SIZE 200k REUSE,
GROUP 2 ('/ORADATA/redo02.log') SIZE 200k REUSE;
}
注意:如果目标DB的数据文件和源DB的相同,就没有必要执行set newname命令了。
Latch、enqueue和lock、semaphore的区别
------fuyuncat
Latch是Oracle为了保护SGA区中的数据不被同时访问的内部机制。Latch利用了一些原子器件的操作流程,如TEST-AND-SET。Latch相对Lock来说更加严格,他们总是排他的(Exclusive)。Latch从来不会进入队列(queue),而是spin或者sleep,直到获取到资源,否则就会超时(time out)。
Enqueue和Lock实际上是一个事物的两个名字。他们都支持队列(queue)和并发(concurrency)。他们在队列中的管理方式是“先进先出”(FIFO)的方式。
Semaphore是操作系统用来控制等待一种机制。它受到这些Unix参数的控制:semmni,semmns和semmsl。这些参数的通常这样设置:
· Semmns=所有实例的processes参数值之和
· Semmni=同时运行的实例数
· Semms=semmns
Oracle 10G 中新出现的enqueue代码
"This enqueue is used to serialize access to an advisor task"
AS :
"Synchronizes new service activation"
CT :
"A general class of locks used by change tracking for
various purposes"
DP :
"Synchronizes access to LDAP parameters"
FU :
"This enqueue is used to serialize the capture of the DB Feature Usage and High Water Mark Statistics"
IT :
"This enqueue is used for making temp table meta-data pinning, recreation code for slave on other instance atomic so that deadlock won't happen."
JS :
"Synchronizes accesses to the job cache"
MW :
"This enqueue is used to serialize the calibration of the
manageability schedules with the Maintenance Window "
RO :
"Coordinates flushing of multiple objects"
RS :
"Lock held by a space reclaimable operation to allow other operations to wait for it"
TB :
"Synchronizes writes to the SQL Tuning Base Existence Cache"
TL :
"Serializes threshold log table read and update"
TQ :
"Synchronizes access to queue table"
WF :
"This enqueue is used to serialize the flushing of snapshots"
WP :
"This enqueue handles concurrency between purging and baselines"
TC :
"Lock held to guarantee uniqueness of a tablespace checkpoint"
如何定位锁类型
我们通常知道的锁一般就是TM、TX等。但实际上Oracle有很多种类型的锁。当你的系统中发生很多enqueue等待事件时,如何定位是那种锁呢?这里介绍一种方法... ...
全文链接:http://www.hellodba.com/Doc/identify_lock.htm
如何将单实例模式改为RAC
如何将单实例模式改为RAC
by fuyuncat
1. Make a full database backup before you change anything.2. Copy the existing $ORACLE_HOME/dbs/init<SID1>.ora to $ORACLE_HOME/dbs/init<db_name>.ora. Add the following parameters to $ORACLE_HOME/dbs/init<db_name>.ora: *.cluster_database = TRUE *.cluster_database_instances = 2 *.undo_management=AUTO (Add if you don't have it ) <SID1>.undo_tablespace=undotbs (undo tablespace which already exists) <SID1>.instance_name=RAC1 <SID1>.instance_number=1 <SID1>.thread=1 <SID1>.local_listener=LISTENER_RAC1 where LISTENER_RAC1 is an entry in the tnsnames.ora file like: LISTENER_RAC1 = (ADDRESS = (PROTOCOL = TCP)(HOST = <node1>)(PORT = 1521)) Keep only one line in $ORACLE_HOME/dbs/init<SID1>.ora: ifile=$ORACLE_HOME/dbs/init<db_name>.ora You could also create a common spfile from this pfile and add a line like spfile=$ORACLE_HOME/dbs/spfile<db_name>.ora in each init<SIDn>.ora 3. Open your database and run $ORACLE_HOME/rdbms/admin/catclust.sql to create cluster database specific views within the existing instance.4. Recreate control file if you defined maxinstances to be 1 when you created the single instance database. To check your current setting of maxinstances, run the following command while the database is mounted or open and connected as a user with DBA privileges: % sqlplus /nolog SQL> connect / as sysdba SQL> startup mount SQL> alter database backup controlfile to trace; The trace file is located in udump directory. Check the maxinstance value in the CREATE CONTROLFILE statement. Please refer to Note 118931.1 Recreating the Controlfile in RAC and OPS 5. Add instance specific parameters in the init<db_name>.ora for the second instance on the second node and set appropriate values for it: *** Names may need to be modified <SID2>.instance_name=RAC2 <SID2>.instance_number=2 <SID2>.local_listener=LISTENER_RAC2 <SID2>.thread=2 <SID2>.undo_tablespace=UNDOTBS2 <SID2>.cluster_database = TRUE <SID2>.cluster_database_instances = 2 where LISTENER_RAC2 is an entry in the tnsnames.ora file like: LISTENER_RAC2 = (ADDRESS = (PROTOCOL = TCP)(HOST = <node2>)(PORT = 1521)) 6. From the first instance, mount the database and run the following command: *** Path names, file names, and sizes will need to be modified alter database add logfile thread 2 group 3 ('/dev/RAC/redo2_01_100.dbf') size 100M, group 4 ('/dev/RAC/redo2_02_100.dbf') size 100M; alter database enable public thread 2; 7. Create a second Undo Tablespace from the existing instance: *** Path names, file names, and sizes will need to be modified CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE '/dev/RAC/undotbs_02_210.dbf' SIZE 200M ; 8. Set ORACLE_SID and ORACLE_HOME environment variables on the second node.关于跳跃式索引(Skip Scan Index)的浅析
在Oracle9i中,有一个新的特性:跳跃式索引(Skip Scan Index)。当表有一个复合索引,而在查询中有除了索引中第一列的其他列作为条件,并且优化器模式为CBO,这时候查询计划就有可能使用到SS。此外,还可以通过使用提示index_ss(CBO下)来强制使用SS ... ...
全文链接:http://www.hellodba.com/Doc/skiped_index.htm
Oracle 10G 新特性——闪回表
如果某个用户不小心删除了一个十分重要的表,后果将非常严重。在9i中提供的闪回特性只能恢复DML语句造成的影响,而无法恢复DDL语句的影响。DBA只能通过重建一张表,然后从备份数据中导入。
利用Oracle 10G中的闪回表的特性,DBA可以轻松完成这项工作,并将影响降到最小。下面就举一个例子说明... ...
全文链接:http://www.hellodba.com/Doc/Oracle%2010G_flashback.htm
Oracle 10G 新特性——闪回表
如果某个用户不小心删除了一个十分重要的表,后果将非常严重。在9i中提供的闪回特性只能恢复DML语句造成的影响,而无法恢复DDL语句的影响。DBA只能通过重建一张表,然后从备份数据中导入。
利用Oracle 10G中的闪回表的特性,DBA可以轻松完成这项工作,并将影响降到最小... ...
全文链接:http://www.hellodba.com/Doc/Oracle%2010G_flashback.htm
Oracle 10G 新特性——表空间管理
DBA们经常会遇到一个这样令人头疼的问题:不知道谁在Oracle上创建了一个用户,创建时,没有给这个用户指定默认表空间,所以这个用户就会采用默认的表空间——system表空间。导致系统表空间迅速被用户数据占满,直至宕机。
在10G中,DBA有办法避免这种问题了——在线指定系统默认表空间... ...
全文链接:http://www.hellodba.com/Doc/Oracle%2010G_tablespace_management.htm
Oracle 10G 新特性——等待接口
在处理被ADDM捕捉的突发的性能问题中,10g等待接口提供非常有价值的数据用于诊断。作为一个DBA,你可能遇到过很多次用户抱怨“数据库非常慢了”。那么你是如何定位这种问题的呢?你第一步要做的肯定是查看是否有会话在等待数据库内部或外部的什么资源。
Oracle提供了一个简单但是又很有效的机制来获取这些信息:视图V$SESSION_WAIT。这一视图提供了各种信息以帮助诊断如一个会话正在等待和已经等待的事件、及等待了多少、等待时间多长。例如,如果会话正在等待事件“db file sequential read”,字段P1和P2就标识会话正在等待的数据块的file_id和block_id。
对于大多数等待事件来说,这个视图已经足够了。但由于以下两个原因,它很难成为一个强有力的优化工具... ...
全文链接:http://www.hellodba.com/Doc/10g_wait.htm
Oracle 10G 新特性——物化视图
在10g将查询重写并且引进了新的强大的调优建议者使管理物化视图变得容易多了。
物化视图(Materialized Views MVs),也被称为快照,现在已经被广泛应用了。MV将一个查询的结果存储在一个段中,并且当用户提交查询时返回查询结果,而不需要重新执行查询——如果查询会被执行多次(经常出现在数据仓库环境中),这就会非常有效。MV可以从基础表中完全刷新或通过使用快速刷新机制增量刷新。
全文链接:http://www.hellodba.com/Doc/Oracle%2010G_materialized_view.htm
Oracle 10G 新特性——工作量自动收集
当数据库发生了性能问题时,如何去定位?比较常用的方法是采用一个既定的模式:解决诸如“是不是同一问题的再现?”、“是否在某一特殊时间段发生?”、“两个问题之间是否存在联系?”等问题,这样通常能得到一个比较好的诊断结果。作为一个DBA,你可能使用一个第三方或者自己开发的工具来收集数据库运行期间的精细统计数据,并从中得到性能度量数据。你需要将这些发生问题时的度量数据与当前数据进行比较。重现以前的时间能使现在的问题变得明朗。因此,持续的收集相关统计数据对于性能分析来说十分重要。在某些情况下,在解决收集统计数据这方面的问题上有自己内置的工具——statspack。尽管在某些情况下的作用非常大,但它缺乏解决性能问题所必须的健壮性。提供了一个标志性的改进特性:自动工作量存储(Automatic Workload Repository AWR)。AWR是随着数据库一起被安装的,它不仅能收集统计数据,还能从统计数据中分析出度量数据... ...
全文链接:http://www.hellodba.com/Doc/10g_awr.htm
Oracle 10G 新特性——审计
审计功能对于DBA来说,是一项非常好的对数据库发生结构性变化的监控工具。
在Oracle 10g中,审计功能得到了大大的提升,可以在非常细节的层次上捕捉用户的动作。它可以是手动审计、基于触发器审计... ...
全文链接:http://www.hellodba.com/Doc/10g_audit.htm
Oracle 10G 新特性——SQL*PLUS的改进
在Oracle 10G中,SQL Plus这一小小而又强大的DBA工具已经得到了显著的改进,包括十分有用的提示和高级文件操作... ...
全文链接:http://www.hellodba.com/Doc/10g_sqlplus.htm
Oracle 10G 新特性——RMAN
RMAN增量备份方案、增量备份的离线恢复、恢复预览、从resetlogs中恢复、文件压
缩等被重新设计后变得更加强大了。
大多数人都赞同RMAN就是Oracle事实上的数据库备份工具。尽管早期版本的RMAN已经很强大,但是人们对它的期待还是有很多。很多DBA对于一些很希望有但实际上没有的特性很烦恼。很幸运,在10g中解决了很多问题并且增加了很多受期待的特性,下面就一起看一下。
全文链接:http://www.hellodba.com/Doc/10g_rman.htm
Oracle 10G 新特性——ADDM和查询优化建议器
从最终权威那获得SQL调优的帮助:Oracle数据库本身!通过使用SQL profiles来确定查询行为、学习如何使用ADDM快速和轻松地解决普通的性能问题
作为一个高级DBA,你当然不愿总是被调优某条SQL语句这种杂事缠身。
在10g中,你有了自动数据库诊断监视器(Automatic Database Diagnostic Monitor ADDM),他是一个不知疲倦的收集数据库性能统计信息来定位性能瓶颈、分析SQL语句和不停的提供各种类型的建议以提高性能的机器DBA,它一般和其他“建议器”如SQL Tuning Advisor一起工作。在本文中,你将了解到它是如何工作的。
全文链接:http://www.hellodba.com/Doc/Oracle%2010G_addm_advisor.htm
Oracle 10G 新特性——ADDM和查询优化建议器
从最终权威那获得SQL调优的帮助:Oracle数据库本身!通过使用SQL profiles来确定查询行为、学习如何使用ADDM快速和轻松地解决普通的性能问题
作为一个高级DBA,你当然不愿总是被调优某条SQL语句这种杂事缠身。
在10g中,你有了自动数据库诊断监视器(Automatic Database Diagnostic Monitor ADDM),他是一个不知疲倦的收集数据库性能统计信息来定位性能瓶颈、分析SQL语句和不停的提供各种类型的建议以提高性能的机器DBA,它一般和其他“建议器”如SQL Tuning Advisor一起工作。在本文中,你将了解到它是如何工作的。
全文链接:http://www.hellodba.com/Doc/Oracle%2010G_addm_advisor.htm
Oracle 10G 新特性——增强的CONNECT BY子句
为了更好的查询一个树状结构的表,在Oracle的PL/SQL中提供乐一个诱人的特性——CONNECT BY子句。它大大的方便了我们查找树状表:遍历一棵树、寻找某个分支……,但还是存在一些不足。在Oracle 10G,就对这个特性做了增强 ......
全文链接:http://www.hellodba.com/Doc/10g_connect_by.htm
Stream Replication
--By Fuyuncat
--+++++++++++++++++++++Ä¿±ê»úÆ÷
:+++++++++++++++++++++++++++++++++++++++++++++++++
--======================STREAMS SETUP =================================
--==Instance
Setup===============================^_^===================================
CONN sys/sys@web AS SYSDBA
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=10;
ALTER SYSTEM SET AQ_TM_PROCESSES=10;
ALTER SYSTEM SET GLOBAL_NAMES=TRUE;
ALTER SYSTEM SET COMPATIBLE='9.2.0' SCOPE=SPFILE;
ALTER SYSTEM SET LOG_PARALLELISM=1 SCOPE=SPFILE;
ALTER SYSTEM SET LOGMNR_MAX_PERSISTENT_SESSIONS=10 SCOPE=SPFILE;
ALTER SYSTEM SET OPEN_LINKS=6 SCOPE=SPFILE;
STARTUP FORCE;
--=======Stream Administrator Setup================--
CONN sys/sys@web AS SYSDBA
CREATE USER strmadmin IDENTIFIED BY strmadmin
DEFAULT TABLESPACE ring QUOTA UNLIMITED ON ring;
GRANT CONNECT, RESOURCE, SELECT_CATALOG_ROLE, AQ_ADMINISTRATOR_ROLE TO
strmadmin;
GRANT SELECT ANY DICTIONARY TO STRMADMIN;
GRANT EXECUTE ON DBMS_AQADM TO strmadmin;
GRANT EXECUTE ON DBMS_CAPTURE_ADM TO strmadmin;
GRANT EXECUTE ON DBMS_PROPAGATION_ADM TO strmadmin;
GRANT EXECUTE ON DBMS_STREAMS_ADM TO strmadmin;
GRANT EXECUTE ON DBMS_APPLY_ADM TO strmadmin;
GRANT EXECUTE ON DBMS_FLASHBACK TO strmadmin;
GRANT EXECUTE ON DBMS_RULE_ADM TO strmadmin;
GRANT EXECUTE ON DBMS_AQ TO STRMADMIN;
BEGIN
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.CREATE_EVALUATION_CONTEXT_OBJ,
grantee => 'STRMADMIN',
grant_option => TRUE);
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.CREATE_RULE_SET_OBJ,
grantee => 'STRMADMIN',
grant_option => TRUE);
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.CREATE_RULE_OBJ,
grantee => 'STRMADMIN',
grant_option => TRUE);
END;
/
BEGIN
DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE(
privilege => 'ENQUEUE_ANY',
grantee => 'STRMADMIN',
admin_option => FALSE);
END;
/
BEGIN
DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE(
privilege => 'DEQUEUE_ANY',
grantee => 'STRMADMIN',
admin_option => FALSE);
END;
/
BEGIN
DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE(
privilege => 'MANAGE_ANY',
grantee => 'STRMADMIN',
admin_option => TRUE);
END;
/
BEGIN
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.CREATE_ANY_RULE_SET,
grantee => 'STRMADMIN',
grant_option => TRUE);
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.ALTER_ANY_RULE_SET,
grantee => 'STRMADMIN',
grant_option => TRUE);
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.EXECUTE_ANY_RULE_SET,
grantee => 'STRMADMIN',
grant_option => TRUE);
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.CREATE_ANY_RULE,
grantee => 'STRMADMIN',
grant_option => TRUE);
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.ALTER_ANY_RULE,
grantee => 'STRMADMIN',
grant_option => TRUE);
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.EXECUTE_ANY_RULE,
grantee => 'STRMADMIN',
grant_option => TRUE);
END;
/
BEGIN
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.EXECUTE_ANY_EVALUATION_CONTEXT,
grantee => 'STRMADMIN',
grant_option => TRUE);
END;
/
connect STRMADMIN/STRMADMIN
BEGIN
DBMS_STREAMS_ADM.SET_UP_QUEUE(
queue_table => 'STREAMS_QUEUE_TABLE',
queue_name => 'STREAMS_QUEUE',
queue_user => 'STRMADMIN');
END;
/
BEGIN
DBMS_STREAMS_ADM.ADD_TABLE_RULES(
table_name => 'hw.t_userinfo',
streams_type => 'APPLY',
streams_name => 'STRMADMIN_APPLY',
queue_name => 'STRMADMIN.STREAMS_QUEUE',
include_dml => true,
include_ddl => true,
source_database => 'ABC');
END;
/
BEGIN
DBMS_APPLY_ADM.ALTER_APPLY(
apply_name => 'STRMADMIN_APPLY',
apply_user => 'hw');
END;
/
BEGIN
DBMS_APPLY_ADM.SET_PARAMETER(
apply_name => 'STRMADMIN_APPLY',
parameter => 'DISABLE_ON_ERROR',
value => 'N' );
END;
/
BEGIN
DBMS_APPLY_ADM.START_APPLY(
apply_name => 'STRMADMIN_APPLY');
END;
/
--+++++++++++++++++++++Ô´»úÆ÷
:+++++++++++++++++++++++++++++++++++++++++++++++++
CONN sys/sys@abc AS SYSDBA
CREATE TABLESPACE logmnr_ts DATAFILE '/dev/vg_data/rreport_idx'
SIZE 25 M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE('logmnr_ts');
ALTER TABLE hr.employee2 ADD SUPPLEMENTAL LOG GROUP log_group_emp_pk
(employee_id) ALWAYS;
--==Instance
Setup===============================^_^===================================
CONN sys/sys@abc AS SYSDBA
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=10;
ALTER SYSTEM SET AQ_TM_PROCESSES=10;
ALTER SYSTEM SET GLOBAL_NAMES=TRUE;
ALTER SYSTEM SET COMPATIBLE='9.2.0' SCOPE=SPFILE;
ALTER SYSTEM SET LOG_PARALLELISM=1 SCOPE=SPFILE;
ALTER SYSTEM SET LOGMNR_MAX_PERSISTENT_SESSIONS=10 SCOPE=SPFILE;
ALTER SYSTEM SET OPEN_LINKS=6 SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;
--=======Stream Administrator Setup================--
CONN sys/sys@abc AS SYSDBA
CREATE USER strmadmin IDENTIFIED BY strmadmin
DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
GRANT CONNECT, RESOURCE, SELECT_CATALOG_ROLE, AQ_ADMINISTRATOR_ROLE TO
strmadmin;
GRANT SELECT ANY DICTIONARY TO STRMADMIN;
GRANT EXECUTE ON DBMS_AQADM TO strmadmin;
GRANT EXECUTE ON DBMS_CAPTURE_ADM TO strmadmin;
GRANT EXECUTE ON DBMS_PROPAGATION_ADM TO strmadmin;
GRANT EXECUTE ON DBMS_STREAMS_ADM TO strmadmin;
GRANT EXECUTE ON DBMS_APPLY_ADM TO strmadmin;
GRANT EXECUTE ON DBMS_FLASHBACK TO strmadmin;
GRANT EXECUTE ON DBMS_RULE_ADM TO strmadmin;
GRANT EXECUTE ON DBMS_AQ TO STRMADMIN;
BEGIN
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.CREATE_EVALUATION_CONTEXT_OBJ,
grantee => 'STRMADMIN',
grant_option => TRUE);
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.CREATE_RULE_SET_OBJ,
grantee => 'STRMADMIN',
grant_option => TRUE);
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.CREATE_RULE_OBJ,
grantee => 'STRMADMIN',
grant_option => TRUE);
END;
/
BEGIN
DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE(
privilege => 'ENQUEUE_ANY',
grantee => 'STRMADMIN',
admin_option => FALSE);
END;
/
BEGIN
DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE(
privilege => 'DEQUEUE_ANY',
grantee => 'STRMADMIN',
admin_option => FALSE);
END;
/
BEGIN
DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE(
privilege => 'MANAGE_ANY',
grantee => 'STRMADMIN',
admin_option => TRUE);
END;
/
BEGIN
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.CREATE_ANY_RULE_SET,
grantee => 'STRMADMIN',
grant_option => TRUE);
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.ALTER_ANY_RULE_SET,
grantee => 'STRMADMIN',
grant_option => TRUE);
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.EXECUTE_ANY_RULE_SET,
grantee => 'STRMADMIN',
grant_option => TRUE);
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.CREATE_ANY_RULE,
grantee => 'STRMADMIN',
grant_option => TRUE);
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.ALTER_ANY_RULE,
grantee => 'STRMADMIN',
grant_option => TRUE);
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.EXECUTE_ANY_RULE,
grantee => 'STRMADMIN',
grant_option => TRUE);
END;
/
BEGIN
DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE(
privilege => DBMS_RULE_ADM.EXECUTE_ANY_EVALUATION_CONTEXT,
grantee => 'STRMADMIN',
grant_option => TRUE);
END;
/
connect STRMADMIN/STRMADMIN
CREATE DATABASE LINK ibmora connect to STRMADMIN identified by STRMADMIN
using 'ibmora';
BEGIN
DBMS_STREAMS_ADM.SET_UP_QUEUE(
queue_name => 'STREAMS_QUEUE',
queue_table =>'STREAMS_QUEUE_TABLE',
queue_user => 'STRMADMIN');
END;
/
BEGIN
DBMS_STREAMS_ADM.ADD_TABLE_RULES(
table_name => 'hr.employee2',
streams_type => 'CAPTURE',
streams_name => 'STRMADMIN_CAPTURE',
queue_name => 'STRMADMIN.STREAMS_QUEUE',
include_dml => true,
include_ddl => true,
source_database => 'ABC');
END;
/
BEGIN
DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES(
table_name => 'hr.employee2',
streams_name => 'STRMADMIN_PROPAGATE',
source_queue_name => 'STRMADMIN.STREAMS_QUEUE',
destination_queue_name => 'STRMADMIN.STREAMS_QUEUE@ibmora',
include_dml => true,
include_ddl => true,
source_database => 'ABC');
END;
/
!exp USERID=SYSTEM/MANAGER@abc TABLES=hr.employee2 FILE=tables.dmp
GRANTS=Y ROWS=Y LOG=exportTables.log OBJECT_CONSISTENT=Y INDEXES=Y
STATISTICS = NONE
!imp USERID=SYSTEM/MANAGER@ibmora FULL=Y CONSTRAINTS=Y FILE=tables.dmp
IGNORE=Y GRANTS=Y ROWS=Y COMMIT=Y LOG=importTables.log
STREAMS_INSTANTIATION=Y
--+++++++++++++++++++++Ä¿±ê»úÆ÷
:+++++++++++++++++++++++++++++++++++++++++++++++++
connect STRMADMIN/STRMADMIN
BEGIN
DBMS_CAPTURE_ADM.START_CAPTURE(
capture_name => 'STRMADMIN_CAPTURE');
END;
/
Ô´½ÚµãÇå³ý£º
connect / as sysdba
@remove_streams92.plb
exec remove_streams92.remove_streams('strmadmin')
ALTER TABLE hr.employee2 DROP SUPPLEMENTAL LOG GROUP log_group_emp_pk;
--optional
connect STRMADMIN/STRMADMIN
DROP DATABASE LINK ibmora ;
conn / as sysdba
drop user strmadmin cascade;
Ä¿±ê½ÚµãÇå³ý£º
CONNECT sys/sys@web as sysdba
connect / as sysdba
SQL>@remove_streams92.plb
exec remove_streams92.remove_streams('strmadmin')
ALTER TABLE hr.employee2 DROP SUPPLEMENTAL LOG GROUP log_group_emp_pk;
--optional
conn / as sysdba
drop user strmadmin cascade;
Oracle提示
ORACLE数据库是一个复杂的、高度可调的软件产品。对于Oracle的系统参数是高度可调的,对于单个SQL语句也能通过使用提示来调整其优化规则...
全文链接:http://www.hellodba.com/Doc/Oracle_hint(1).htm
Oracle XML DB 之浅入浅出
XML DB是Oracle 9.2中出现的新特性,这里介绍了如何在Oracle中存储、控制、使用XML...
全文链接:http://www.hellodba.com/Doc/oracle_xml_db.htm
Oracle10g数据库自动诊断监视工具(ADDM)使用指南(第三章)
在Oracle9i及之前,DBA们已经拥有了很多很好用的性能分析工具,比如,tkprof、sql_trace、statspack、set event 10046&10053等等。这些工具能够帮助DBA很快的定位性能问题。但这些工具都只给出一些统计数据,然后再由DBA们根据自己的经验进行优化...
全文链接:
http://www.hellodba.com/Doc/oracle10g_addm(1).htm
Oracle10g数据库自动诊断监视工具(ADDM)使用指南(第二章)
在Oracle9i及之前,DBA们已经拥有了很多很好用的性能分析工具,比如,tkprof、sql_trace、statspack、set event 10046&10053等等。这些工具能够帮助DBA很快的定位性能问题。但这些工具都只给出一些统计数据,然后再由DBA们根据自己的经验进行优化...
全文链接:
http://www.hellodba.com/Doc/oracle10g_addm(1).htm


