本站推荐: DBA的新年及圣诞礼物-《深入解析Oracle》
Today | 01/24 | 01/23 | 01/22 | 01/21 | 01/20 | 01/19 | 01/18 | 01/17 | 01/16 | 01/15
 123
 123

  2010-01-25 Mon

18:54 Oracle 代码中的 Radiohead 歌词 (4263 Bytes) » DBA notes

作者:Fenng 发布在 dbanotes.net. BLOG 墙外订阅数量,点击则可进行订阅

这是我接触 Oracle 这么多年来最有趣的一件事儿。

刚才在邮件列表中看到一位叫做 Dennis Yurichev 的安全研究人员提及在 ORACLE.EXE 这个文件代码中包含有 Radiohead 乐队 Creep 这首歌的歌词,立刻验证了一下,果然:

$ strings oracle.exe | grep radiohead
I'm a creep, I'm a winner, what the hell am I doing here.
I don't belong here - radiohead

没错,真的是 Creep 这首歌的歌词。Radiohead 颇受 Geek 程序员的喜爱。看得出加入这段代码的程序员对这份工作并不是很满意..."what the hell am I doing here"...

另外,原歌词是 I'm a weirdo(古怪的人),而不是 winner ,估计是随手写错了。

这位 Dennis Yurichev 还给出了伪代码:

#define STRING "I'm a creep, I'm a winner, what the hell am I doing
here.I don't belong here - radiohead" 
kfasSelfTest_update() { kfasOpen (...);
somestruct.somevalue=STRING;
kfasUpdate (somestruct);
kfasClose (...); newstruct=kfasOpen (...); if (strncmp (newstruct.somevalue, STRING, ...)!=0) { // raise error 99999? kserec1(99999, 1, ...); kserec2(99999, 1, ..., STRING, 1, ...); return 0; };
kfasClose (...);
return 1;
};

据说是 10.2.0.1 之后才有,可能和 Oracle ASM 特性有关,不知道这是 Oracle 哪一位程序员的杰作...

--EOF--

我最喜欢的 Radiohead 作品还是 Paranoid Android ...


最近文章|Recent Articles

本站赞助商:豆瓣网

评论数(1)|添加评论 | 最近作者还说了什么? Follow Fenng@Twitter
本文网址:

DBA Notes 理念: 用简约的技术取得最大的收益...

17:59 简单描述一下buffer cache管理的过程 (43270 Bytes) » Focus on Oracle

我们先来看buffer header的具体结构:

buffer_header_struc_resize.jpg

 

接着,我们再来看跟

buffer cache的管理有关的5LIST,这些LIST可以简单的认为就是存储了上述buffer header结构的双向指针链表(doubly linked lists),这5LIST分别是:

LRU LIST

Buffers containing block images being used

 

LRU AUXILIARY LIST

Buffers ready to be used for I/O or CR build,在实例启动的时候,当前实例的buffer cache中的所有buffer都会被链接到LRU AUXILIARY LIST中,当oracle要从datafile中读一个blockbuffer cache中来的时候,首先就会去扫描LRU AUXILIARY LIST,如果此时LRU AUXILIARY LIST非空,则直接把从datafile中读到的那个block拷到LRU AUXILIARY LIST上那个buffer header所链接的buffer cache block中,同时把这个buffer header再挪到LRU LIST中;如果此时LRU AUXILIARY LIST为空,则表明当前没有free block,此时就需要去扫描LRU LIST

 

WRITE LIST

Dirty Buffers requiring I/O,当LRU AUXILIARY LIST为空的时候,oracle需要去扫描LRU LIST,当扫到一个block,发现它的Flagdirty的时候,oracle会把这个block所对应的buffer headerLRU LIST移到WRITE LIST

 

CHECKPOINT QUEUE LIST

Dirty Buffers requiring I/O,当buffer cache中的block第一次变为dirty的时候,它首先一定会在LRU LIST中存在,并且其Flag会被标记为dirty。同时,oracle会把这个block添加到CHECKPOINT QUEUE LIST中。

 

WRITE AUXILIARY LIST

Dirty Buffers with I/O in progress,当DBWR需要写dirty block的时候,oracle会把那些dirty blockWRITE LIST移到WRITE AUXILIARY LIST,然后开始写。写完了,会把已经写完的dirty blockCHECKPOINT QUEUE LIST中删掉,同时把这些block再从WRITE AUXILIARY LIST移到LRU AUXILIARY LIST

 

简单总结一下,oraclebuffer cache管理最简单的流程就是

oracle首先会去LRU LIST中找,看看要找的block是否已经缓存在buffer cache中,找到了就直接用;找不到就再去LRU AUXILIARY LIST中找free block,如果找到了(即LRU AUXILIARY LIST非空),就去datafile中把要读的那个block拷到LRU AUXILIARY LIST上那个buffer header所链接的buffer cache block中,同时把这个buffer header再挪到LRU LIST中;如果找不到(即此时LRU AUXILIARY LIST为空),则表明当前没有free block,此时就需要去扫描LRU LIST,因为要找一个buffer headerreuse。此时,在扫描LRU LIST的过程中,当扫到一个buffer header,且发现它的Flagdirty的时候,oracle会把这个buffer headerLRU LIST移到WRITE LIST;当WRITE LIST达到一定的阀值,DBWR会写这些buffer header所指向的dirty block,当DBWR需要写dirty block的时候,oracle会把那些dirty block所对应的buffer headerWRITE LIST移到WRITE AUXILIARY LIST,然后开始写。写完了,会把已经写完的dirty block所对应的buffer headerCHECKPOINT QUEUE LIST中删掉,同时把这些dirty block所对应的buffer header再从WRITE AUXILIARY LIST移到LRU AUXILIARY LIST如此循环往复,生生不息!

11:43 《Oracle DBA手记》- 第二章PDF版本下载 (2658 Bytes) » Oracle Life

作者:eygle 发布在 eygle.com

此前已经发布了《Oracle DBA手记》的第一章PDF版本,现在发布第二章的PDF版本。

这一章是老杨(Yangtingkun)所著,目前的版本是我编辑整理后的章节,出版印刷的版式有所不同。老杨的勤奋与著作之丰近2年间无人能及,这本书非常幸运的是邀请到他一展所长。我非常期待老杨将来能够再出版独立著作,对自己进行总结。

好了,现在发布 《Oracle DBA手记》- 第二章 下载链接,希望大家支持。

-The End-



相关文章|Related Articles

评论数量(0)|Add Comments

本文网址:

  2010-01-24 Sun

17:41 Warm January in Sanya (2673 Bytes) » Chanel [K]

几乎没有享受过如此暖和的1月份,在临近春节的时候可以穿着短裤短袖四处走动,这样的感觉实在奇妙。

在三亚住的地方远离市区,位于田独镇,四周看出去就是乡村,但是只要走出房门站在宽宽的走廊上看出去,就是湛蓝的天空和不远处的青山,每当午后,阳光充足,暖风习习。

IMG_0750

从楼下门口的小路走出去,大概不要10分钟,就是田独镇的大街,往山的方向去就是亚龙湾,那里水天一线。

IMG_0736

大街的左侧是田独市场,到了晚上是熙熙攘攘的夜市,夜里11点钟,从家里走出来,牵着老婆的手晃晃悠悠,随便找一处大排档,吃上些烧烤,再来一个新鲜的金椰,插着吸管,你一口我一口,再惬意的生活也不过如此吧。

14:30 好粥道 好味道!plus ITpub网友聚会 (1727 Bytes) » Julia----瞬间与记忆在此过渡。。。。。。

昨晚,老虎赞助ITpub网友聚会好粥道:光华路SOHO(光华路南)的地下一层东边

鲍鱼海鲜粥一流!鲍鱼片和大虾都很鲜美,粥的火候到家,我是广东人,煲粥,我很讲究,到外面吃粥,我要求很高。

此前,除了金湖茶餐厅的粥我觉得不错,北京的其他粥店我都觉得一般,吃过好粥道,我觉得她的粥是最好的。

一周之内吃了三次好粥道的鲍鱼海鲜粥,还介绍了同事吃,同事都觉得很正!

吃海鲜粥加点香菜和一小勺海鲜酱,味道真是锦上添花。而好粥道的奶皇包叉烧包,鸡翅,很多菜都不错。

粥铺装修很Chinese, 还有温馨私密的小天地。

因为难得北方有个好的广东粥铺, Julia有责任广而告之。


昨天网友聚会玩得很开心,笑得回家喉咙都沙哑了。。。




09:24 好粥道 道粥好 - 良朋益友应长聚 (3394 Bytes) » Oracle Life

作者:eygle 发布在 eygle.com

昨晚,ITPUB "北京俱乐部"在Binss(牛总)新近开张的好粥道开了一个大Party,30多人齐聚一堂。

先说说好粥道,这个名字已经选的极佳,再加上此前Julia在公司已经点过这里的特色粥,赞不绝口,所以我也充满期待。当品尝到精心熬制的粥品时,颇绝不虚此行,口齿留香。一般北京的粥铺多数北方粥品,广式熬粥的极少,我在广东吃过的海鲜粥让我第一次见识了粥可以那样做,可以丢进去螃蟹、大虾、鲍鱼等等为佐料,好粥道这里的鲍鱼鲜虾粥让我再次找到了这种感觉。
另外的意外是炒菜,牛蛙、香芹,极其辣,但是很过瘾,就着一点啤酒,回到家仍然忘不了那感觉,其实,当然,吃饭更重要的是感觉。

感觉,大家,就那么渐渐老去。
菜刀、顾三、老牛,还有我,老了,岁月的痕迹无法抵挡,所以感慨,这么多朋友可以多聚聚,莫等闲,牛总就白了少年头。希望以后能多聚聚,有了牛总这个离我很近的据点,以后可以考虑搞一些聚会的活动,甚至技术的交流会,给大家创造一些相聚的机会。

老谷的专业相机里还有大量的照片,记录这次聚会的记忆,2010年,愿大家的前途都更美好。
IMG_4875.jpg

相关文章|Related Articles

评论数量(2)|Add Comments

本文网址:

01:57 详细解析ASSM的Segment Header的结构 (17932 Bytes) » Focus on Oracle

之前已经写过:

"详细解析9i10gdatafile header"

"详细解析LMTdatafile的物理结构"

"详细解析datafilestatus"

"详细解析oracle中的transaction"

"详细解析truncate引发的object checkpoint"

 

这里是详细解析系列的第六篇文章,在这篇文章里,我们逐个byte的解析了9iASSMSegment Header的结构,为什么选9i而不是10g,是因为我用的笔记本上只有9iBBED9iBBED10g不兼容(因为10gdatafile header的结构发生了变化)。

 

详细内容在如下的这篇word文档里:

 

ASSM_Segment_Header_Structure.doc  

 

bing,我答应过你要写一些关于ASSM的东西,这个就算是开头吧,以后我还会继续。

  2010-01-23 Sat

22:35 PostgreSQL安装 (5223 Bytes) » NinGoo.net

Author:NinGoo posted on NinGoo.net

PostgreSQL8.x版本的安装已经非常的简单了。EnterpriseDB制作了一键安装的版本,包括FreeBSD/Linux/Mac OS X/Solaris/Windows平台都有。不过即使使用源码编译,也非常的简单。各个版本的源码可以点这里下载

创建os用户

#useradd -g dba postgres
#su - postgres

编译

$tar -zxvf postgresql-8.4.2.tar.gz
$cd postgresql-8.4.2
$./configure --prefix=/OPT/postgresql --enable-profiling --with-blocksize=8 --with-wal-blocksize=8
$make && make install

其中with-blocksize指定数据块大小,默认8k,with-wal-blocksize指定日志块大小,默认也是8k。更多编译配置选项,可以通过./configure –help查看。

初始化database,注意PostgreSQL在服务端不支持GBK编码。

$cd /opt/postgresql/bin
$ ./initdb --encoding=utf8 -D /opt/postgresql/data
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale en_US.UTF-8.
The default text search configuration will be set to "english".

creating directory /opt/postgresql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 32MB
creating configuration files ... ok
creating template1 database in /opt/postgresql/data/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the -A option the
next time you run initdb.

Success. You can now start the database server using:

    ./postgres -D /opt/postgresql/data
or
    ./pg_ctl -D /opt/postgresql/data -l logfile start

初始化完成后,会在 /opt/postgresql/data目录生成数据库的文件,至此,软件安装完毕,数据库创建完毕。

启动数据库

./pg_ctl -D /opt/postgresql/data/ -l /opt/postgresql/log/alert.log start

启动后,可以发现PostgreSQL实例一共运行了5个进程

$ ps -ef | grep postgres
postgres 17572     1  0 16:41 pts/2    00:00:00 /opt/postgresql/bin/postgres
-D /opt/postgresql/data
postgres 17574 17572  0 16:41 ?        00:00:00 postgres: writer process
postgres 17575 17572  0 16:41 ?        00:00:00 postgres: wal writer process
postgres 17576 17572  0 16:41 ?        00:00:00 postgres: autovacuum launcher process
postgres 17577 17572  0 16:41 ?        00:00:00 postgres: stats collector process
postgres 18679 20791  0 16:47 pts/2    00:00:00 grep postgres

其中wal writer process是日志写进程。


Related Articles

PermLink: http://www.ningoo.net/html/2010/installpostgresql.html

Add Comments(0) | Follow NinGoo@Twitter | Google Reader

11:18 PostgreSQL简介 (6276 Bytes) » NinGoo.net

Author:NinGoo posted on NinGoo.net

上个周末,无聊的时候关注了一下PostgreSQL。第一次尝试去安装PostgreSQL,还是好几年前的事了,那是8.0版本刚出来,终于开始原生的支持windows了,所以在自己电脑上折腾了一个。不过那时候也仅限于安装了一次而已,甚至psql的命令行都不知道怎么用。

同样作为开源关系型数据库,MySQL在这几年获得了更多的关注。大量的互联网公司都基于MySQL来构架系统,也导致MySQL DBA开始火热,一大堆年轻有为的同学投入到其中,渐成燎原之势。MySQL数据库火热了,MySQL AB公司却被sun收购,现在又随着sun要投入Oracle的怀抱,而且欧盟已经无条件批准这个收购,只剩下中国和俄罗斯,大局已定。作为商业数据库的绝对老大,Oracle的这次收购,让MySQL的支持者感到了威胁,其创始人甚至发起了一场保护MySQL(有墙),阻击Oracle收购的运动。

这也是PostgreSQL的机会,最近PostgreSQL的开发节奏很快,8.5已经连续出到了alpha3版,在这个版本中,最吸引我的是hot standby,类似于Oracle11g的active data guard,hot standby也可以在恢复的同时提供读服务,而以往版本,PostgreSQL的物理备库warm standby,则只能处于恢复状态,一旦open,则需要重做,比较痛苦。PostgreSQL的很多特性,都和Oracle相当的类似,甚至有一家商业化的公司EnterpriseDB,在致力于将PostgreSQL打包,使得应用程序从Oracle迁移到PostgreSQL更方便,据说80%的Oracle应用代码甚至不需要做修改就能在PostgreSQL运行。因此,我在twitter上说,如果PostgreSQL在人机交互的工具和配置部分,能够更加友好一点,完全是一个影子版本的Oracle。

PostgreSQL也支持mvcc多版本一致性控制。不过其实现的机制,和innodb的方式比较像,而和Oracle的不一样。Oracle是将变化的前映像记录到单独的undo段中,而PostgreSQL则只是将前映像(Tuples)上做个标记,如果是delete,则相当于是逻辑删除,实际的数据还是在原来的段中,如果是insert,相当于先delete,再insert,而且会在原来的记录上加一条指向新记录的指针,形成一个链表,查询的时候需要沿着这个链表找到一致的数据。这样会造成一个问题,一段时间以后,dml操作使得数据段和索引段中都有大量的前映像信息存在,会严重影响数据查询的效率。PostgreSQL的mvcc的这种实现方式,带来的一个好处是回滚非常快,只需要修改前映像上的几个标志位即可,而不像oracle需要从undo段将前映像再复制回来。但是,这种方便回滚,却会损失查询性能的设计思路,真的比较诡异。PostgreSQL中有一个专门用来清理这些旧版本数据的程序,叫做vacuum。在以前的版本中,需要定期执行vacuum来优化数据存储结构。这对于DBA来说,无疑是一件痛苦的事情。直到8.1版本,引入了autovacuum,系统可以自动来进行这些清理工作,终于人性化了一点点。

在8.3版本,引入了一个新的特性HOT(Heap Only Tuples),主要的目的是努力避免update造成的性能低下的问题。其实这个HOT,说白了很简单,对于update,要实现mvcc,其机制还是一样的,区别在于select,在沿着链表找一致性数据的过程中,如果发现这个检查过的版本已经没有任何事物在引用了,就会顺便把清理工作做掉,而不是像以前要等vacuum来做。因此这会加大一点select的压力,但前人栽树,后人乘凉,接下来需要访问这些数据的其他select就会快很多了,这和Oracle的延迟块清除其实有些类似的,当然两者的设计目的并不一样。


Related Articles

PermLink: http://www.ningoo.net/html/2010/introduce_to_postgresql.html

Add Comments(1) | Follow NinGoo@Twitter | Google Reader

  2010-01-22 Fri

08:59 腊八节快乐 (523 Bytes) » Google 黑板报 -- Google 中国的博客网志



今天是腊八, 祝大家腊八节快乐!