如果转载本站文章到其他任何博客,论坛,股吧,请提供引用链接。违者必究!
May 7th, 2013 | Categories: Boring | Tags:

DDL commands require exclusive locks on internal structures. If these locks are not available the commands return with an “ORA-00054: resource busy” error message. This can be especially frustrating when trying to modify objects that are accessed frequently. To get round this Oracle 11g includes the DDL_LOCK_TIMEOUT parameter, which can be set at instance or session level using the ALTER SYSTEM and ALTER SESSION commands respectively.The DDL_LOCK_TIMEOUT parameter indicates the number of seconds a DDL command should wait for the locks to become available before throwing the resource busy error message. The default value is zero, means not wait and just fire ora-0054 if session can’t get DDL lock.

在production环境上,使用也要小心,因为该pending timeout的DDL enqueue会阻塞后来的DML操作。

测试如下

1) session A 执行Update后不提交

ORACLE@ORADB:prod SQL> select * from lock_tab;

ID
———-
1
2

ORACLE@ORADB:prod SQL> update lock_tab set id=3 where id=1;

1 row updated.

2)Session B 执行DDL操作,为了获得表上的exclusive lock会等待DDL_LOCK_TIMEOUT秒。

ORACLE@ORADB:prod SQL> alter table lock_tab add newcol varchar2(1);
alter table lock_tab add newcol varchar2(1)
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

ORACLE@ORADB:prod SQL> ALTER SESSION SET ddl_lock_timeout=30;

Session altered.

ORACLE@ORADB:prod SQL> set timing on
ORACLE@ORADB:prod SQL> alter table lock_tab add newcol varchar2(1);
alter table lock_tab add newcol varchar2(1)
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

Elapsed: 00:00:30.01

3)在session B等待的30秒中,Session C执行DML操作会被Session B阻塞。Session B timeout后,该DML才能执行成功。

ORACLE@ORADB:prod SQL>  delete from lock_tab where id=2;

1 row deleted.

Elapsed: 00:00:24.30

因此不要在Production中设置较高的DDL_LOCK_TIMEOUT.

May 7th, 2013 | Categories: Boring | Tags:

INDEX Hint in Oracle的过去式

/*+ index (tab_name index_name) */

现代式,10g中引入:

/*+ index(my_tab my_tab(col_1, col_2)) */

Using the index on my_tab that starts with the columns col_1 and col_2.

April 18th, 2013 | Categories: Boring | Tags:

搞运维的也要注意沟通的方式和技巧.

April 7th, 2013 | Categories: Boring | Tags: ,

最近开始接触Cassandra,感觉它比较Oracle更适合做audit或者logging. 由于参考的概念多,又是bigtable又是Dynamo ,Cassandra体系结构还挺复杂的。

在这里罗列一些keyword作为点,争取以后将他们连成面。

1. Tunable consistent ( “eventually consistent” is a bit misleading)

2. Column-oriented / Schema-Free

3. decentralized(“server symmetry.”)

4. (distribution design on )Dynamo

5. (data model on)Bigtable

6. CAP

cap

Read more…

April 3rd, 2013 | Categories: Boring | Tags:

这个library_cache_objects_heavily_accessed.sql的脚本挺有用的,可以查看哪些library cache object在被频繁的引用。

Select * from (
Select case when (kglhdadr = kglhdpar) then ‘Parent’ else ‘Child ‘||kglobt09 end cursor,
kglhdadr ADDRESS,substr(kglnaobj,1,20) name, kglnahsh hash_value,kglobtyd type,kglobt23 LOCKED_TOTAL,kglobt24 PINNED_TOTAL,kglhdexc EXECUTIONS,kglhdnsp NAMESPACE
from x$kglob
order by kglobt24 desc)
where rownum <= 20
/

Order by kglobt24 或者kglobt23 都可以。当有mutex contention的时候不妨运行一下。

April 1st, 2013 | Categories: Boring | Tags:

可以使用type对象类型来实现类似cursor的功能:将结果集作为column返回。

prod SQL> CREATE or replace TYPE emp_type IS OBJECT ( NAME VARCHAR2(32), EMAIL VARCHAR2(32));
/
Type created.

prod SQL> CREATE TYPE emp_tab_t IS TABLE OF emp_type;
2 /
Type created.

prod SQL> select * from emp;

NAME EMAIL DEPTNO
——————– ——————– ———-
alex alex@oracle.com 30
bin bin@oracle.com 10
gui gui@oracle.com 40
dd dd@oracle.com 20
tom tom@.oracle.com 10
jerry jerry@oracle.com 20
steven steven@oracle.com 30

7 rows selected.

prod SQL> select * from dept;

DEPTNO DEPTNAME
———- ———-
10 abc
20 efg
30 last
40 sales

prod SQL> select dept.*, CAST( multiset( select name, email from emp where emp.deptno = dept.deptno ) AS emp_tab_t ) emp_tab_t from dept where deptno=10;

DEPTNO DEPTNAME EMP_TAB_T(NAME, EMAIL)
———- ———- ——————————————————————————————
10 abc EMP_TAB_T(EMP_TYPE(’bin’, ‘bin@oracle.com’), EMP_TYPE(’tom’, ‘tom@.oracle.com’))
20 efg EMP_TAB_T(EMP_TYPE(’dd’, ‘dd@oracle.com’), EMP_TYPE(’jerry’, ‘jerry@oracle.com’))
30 last EMP_TAB_T(EMP_TYPE(’alex’, ‘alex@oracle.com’), EMP_TYPE(’steven’, ’steven@oracle.com’))
40 sales EMP_TAB_T(EMP_TYPE(’gui’, ‘gui@oracle.com’))

查询的执行计划如下

———————————————————————–
| Id  | Operation                   | Name    | Rows  | Bytes | Cost  |
———————————————————————–
|   0 | SELECT STATEMENT            |         |       |       |     1 |
|*  1 |  TABLE ACCESS FULL          | EMP     |     1 |    20 |     1 |
|   2 |  TABLE ACCESS BY INDEX ROWID| DEPT    |     1 |    29 |     1 |
|*  3 |   INDEX RANGE SCAN          | DEPTIDX |     1 |       |     1 |
———————————————————————–
Predicate Information (identified by operation id):
—————————————————
1 - filter(”EMP”.”DEPTNO”=:B1)
3 - access(”DEPTNO”=:B1)

查询多次后,v$open_cursor显示4个以”table_1_ff_32ae_0_0_0″表示的KGL handle.

declare
deptname VARCHAR2(32);
var_emp_tab emp_tab_t;
begin
for i in ( select rownum rr from user_objects where rownum<=1000 ) loop
begin
select dept.deptname, CAST( multiset( select name, email from emp
where emp.deptno = dept.deptno ) AS emp_tab_t ) emp_tab_t into deptname,var_emp_tab
from dept where deptno=i.rr;
exception when others then null; end;
end loop;
end;
/

prod SQL> select * from v$open_cursor where sid = ( select sid from v$mystat where rownum=1) order by sql_text;

SADDR SID USER_NAME ADDRESS HASH_VALUE SQL_ID
—————- ———- —————————— —————- ———- ————-
SQL_TEXT LAST_SQL_ACTIVE SQL_EXEC_ID
———————————————————— ————— ———–
CURSOR_TYPE
—————————————————————-
00000016EAE47588 3467 ORA_USER 0000001647DC7BD0 239939893 7rppccn74uc9p
DECLARE sid_v number; BEGIN if(( l
DICTIONARY LOOKUP CURSOR CACHED

00000016EAE47588 3467 ORA_USER 00000016095C4F18 3641303126 50qycf7chms2q
SELECT DEPT.DEPTNAME, CAST( MULTISET( SELECT NAME, EMAIL FRO
PL/SQL CURSOR CACHED

00000016EAE47588 3467 ORA_USER 0000001653EFA0A0 1906560325 gmxk70psu7ma5
table_1_ff_10e_0_0_0
OPEN

00000016EAE47588 3467 ORA_USER 00000016A3FF95D0 3476927232 2u83npv7mvcs0
table_1_ff_112_0_0_0
OPEN

00000016EAE47588 3467 ORA_USER 0000001653E575E8 2848369811 am7464anwdb4m
table_1_ff_116_0_0_0
OPEN-RECURSIVE

00000016EAE47588 3467 ORA_USER 0000001647F0DA20 396137131 282×7mnbtt4pb
table_1_ff_32ae_0_0_0
OPEN

只说功能,不说性能。

March 29th, 2013 | Categories: Boring | Tags:

Cursor and Multiset 能够将结果集作为column的值来返回。至于各种开发语言的API如何支持先另说。

先看cursor的例子。

SQL> select * from dept;

DEPTNO DEPTNAME
———- ———-
10 abc
20 efg
30 last

SQL> select * from emp;

NAME                 EMAIL                    DEPTNO
——————– ——————– ———-
alex                 alex@oracle.com               10
bin                  bin@oracle.com                10
gui                  ge@oracle.com                 20
dd                   dd@oracle.com                 20

SQL>  select dept.*,cursor (select * from emp where emp.deptno = dept.deptno) emp_info_ref_cursor  from dept;

DEPTNO DEPTNAME   EMP_INFO_REF_CURSOR
———- ———- ——————–
10 abc        CURSOR STATEMENT : 3

CURSOR STATEMENT : 3

NAME                 EMAIL                    DEPTNO
——————– ——————– ———-
alex                 alex@oracle.com                10
bin                  bin@oracle.com                 10

20 efg        CURSOR STATEMENT : 3

CURSOR STATEMENT : 3

NAME                 EMAIL                    DEPTNO
——————– ——————– ———-
gui                  ge@oracle.com                 20
dd                   dd@oracle.com                  20

30 last       CURSOR STATEMENT : 3

CURSOR STATEMENT : 3

no rows selected

看看Oracle执行了哪些SQL. 发现session 打开了3个与内嵌cursor有关的handle. 不知道为何.

SQL> select sql_text,hash_value from v$open_cursor where sid= ( select sid from v$mystat where rownum=1)

SQL_TEXT                                                     HASH_VALUE
———————————————————— ———-
SELECT “A2″.”NAME” “NAME”,”A2″.”EMAIL” “EMAIL”,”A2″.”DEPTNO” 1373830018
SELECT “A2″.”NAME” “NAME”,”A2″.”EMAIL” “EMAIL”,”A2″.”DEPTNO” 1373830018
SELECT “A2″.”NAME” “NAME”,”A2″.”EMAIL” “EMAIL”,”A2″.”DEPTNO” 1373830018
select dept.*,cursor (select * from emp where emp.deptno = d 2361622133

由于内嵌式的Cursor对每条返回的记录都会去执行,因此当返回记录非常多的时候,child SQL会被频繁的执行,有可能会遇见cursor pin S的性能问题,在production环境使用要多留意些.

March 25th, 2013 | Categories: Family | Tags:

新闻发生地就在我家附近,发生时间是在上周六,那天风有4级左右。出事的充气蹦床去年夏天开张的,还带孩子玩过几次,那时候5元一次,今年开春就涨价了,10元每次,刚开张几天就出事了。该公园有2家提供充气蹦床场所,在该家出事后,另外一家也将蹦床收回了。

还好是下午发生的事情,如果发生在上午,小孩更多,后果更加严重。

请家长注意,风大的时候要减少外出活动,雨大的时候也要减少外出活动,留意吞人的下水井盖。

核心提示】前天下午4点多,石景山半月园公园内,一处充气蹦床突然被大风刮起,正在蹦床上玩耍的5名孩童从床上摔下,随即被送医。目前部分家长已经同蹦床经营方达成赔偿协议。

突然刮起大风,蹦床被吹起,多名孩童被掀到地上。 一名男童紧紧抓住蹦床,不料蹦床竖起,斜靠在灯柱上。最终,该男童从3米多高的位置摔下,被医院诊断为脾脏受伤。

其中一男童脾脏受伤已住院

京华时报讯(记者苗飞飞)前天下午4点多,石景山半月园公园内,一处充气蹦床突然被大风刮起,正在蹦床上玩耍的5名孩童从床上摔下,随即被送医。目前部分家长已经同蹦床经营方达成赔偿协议。

据目击者称,前天下午4点多,六七名儿童正在一个面积约10米的充气蹦床上玩耍,突然刮起了一阵大风,由于充气蹦床底部没有进行固定,蹦床连带多名 儿童被风卷起。“当时有几个孩子直接被从蹦床掀到了地上,还有个小男孩一直抓着蹦床,但蹦床‘飞起来了’,斜着搭在了3米多高的灯柱上,小男孩抓不住了, 直接从高处掉了下来。”事故发生后,多名家长将孩子抱起,并拨打了报警电话。

一名受伤孩子家长称,共有5名孩童被送往301医院检查,除一名伤势较重,其余均为轻微挫伤和擦伤,经简单处理后离开医院。据伤势较重的孩子家 长称,目前孩子已转院,并开始住院治疗,诊断结果为脾脏受伤,已经花去近万元的医疗费,“现在我们各家的医药费都是自己先垫付的,我们可能会通过法律维 权”。

昨天,记者来到公园内,事发充气蹦床已被全部拆除,蹦床管理处所在的房间也已关闭,蹦床附近的一处观赏灯柱有明显的被砸痕迹。据公园内另一家经营充气蹦床业务的商户称,在经营蹦床时,必须在周围固定好柱子,并与蹦床固定好,“出事的那家蹦床平时就没有固定好”。

据了解,事发后充气蹦床经营方相关人员已被警方控制。昨天,在石景山警方鲁谷大街派出所的协调下,多名家长已和蹦床经营方达成赔偿协议,由蹦床经营方支付各家的医疗费。

在达成协议后,充气蹦床经营方相关人员已被释放。

“我们主要是考虑到走法律途径维权的时间长了,我们也没有更多的精力,实在是拖不起。这件事情已经给孩子在精神上造成了阴影,我们就是想提醒下大家,不要再出现这样的情况。”其中一孩童的家长表示。

据了解,半月园公园管理方系石景山芳星园物业管理中心。昨天,管理中心的工作人员表示,领导不在,具体情况不清楚。截至发稿时,公园管理方仍未对此事做出回应。