eygle.com   eygle.com
eygle.com  
 
本站推荐: 《深入浅出Oracle》内容简介
Today | 03/12 | 03/11 | 03/10 | 03/09 | 03/08 | 03/07 | 03/06 | 03/05 | 03/04 | 03/03
 123
 123

  2010-03-13 Sat

20:32 杭州五年 (4191 Bytes) » DBA notes

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

今天到医院拔掉了一颗让我困扰已久的智齿,现在还有点迷迷糊糊的发烧。整个过程比我想象的顺利得多,一下子如释重负的感觉。有朋友说,拔牙会影响记忆力,如果真是这样,那现在应该多写一些东西,以便在遗忘后还能让我回忆起往事。

时间真的是快,2005 年的今天,我来杭工作。那时候牙齿应该都还好好的,最起码第一年体检的时候没什么毛病,经过五年的爬摸滚打,没想到事业不立,这追随我的牙齿兄弟就已经开始掉队了。我要把我的牙扔到楼下去(这是我们老家的风俗,上牙往下扔),老婆对我说,你以为还能象小孩子那样再长出来一颗啊? 是啊,我再不可能长"智慧"了啊。

我以前从没想过会在这个城市生活这么久,杭州"离天堂太近",仍旧无法让我喜欢。这城市不停的有人来,不停的有人走。最近就有一个朋友要离开杭州去创业了,,不知道什么时候开始,"创业"这个词对年轻人有挥之不去的吸引力,我认识的一些朋友,不在创业,就是在准备去创业的路上。可看看这整个商业环境,还是挺令人寒心的。不过,千军万马,总有人杀出血路。

再过几天,我在阿里巴巴集团旗下支付宝的工作就满五周年了。在阿里巴巴,五年陈员工,会有一枚定制的戒指。五年,就这样告一段落。或许,我该记录一下过去的那些痛并快乐的日子作为纪念.....

--EOF--


最近文章|Recent Articles

本站赞助商:豆瓣网

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

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

00:03 贵在坚持 (331 Bytes) » 我呸
为鸟看海啸,
看鸟《海云台》,
这么多年过去鸟,
韩国还是这么崇尚一惊一乍...

  2010-03-12 Fri

23:16 暂缓迷恋 Cassandra (4334 Bytes) » DBA notes

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

最近 Twitter 和 Digg 的技术团队都放出话来说要从 Mysql + Memcached 的组合迁移到 Cassandra 环境(Refer 12),这些消息又会让不少人跃跃欲试,恨不得也把自家网站迁移到 Cassandra 下面过把瘾,我相信有些公司的团队又要言必称 Cassandra 了。

Twitter 和 Digg 对数据存储引擎的需求相当独特:写操作密集,基本无修改需求,读操作则多数是分散多次读取汇总展示(想象一下你 Twitter页面上同时显示好友们的 Tweet 内容)。对 MySQL 来说,Sharding 后几乎是被当作简单的存储引擎来用的,即使是加上 Memcached ,对数据读取开销相当大(Refer),因为这时候即使是最合理用索引,I/O开销也不是最优的--走的是索引范围扫描嘛。Cassandra 则相当于预存了计算结果,这要得益于其 Flexible schema 特性,按照既定规则写入,读取直接取预排序的范围键值结果(这其实是偏 OLAP 的应用,而非 OLTP)。

Twitter 和 Digg 这两家网站的数据结构其实并不复杂,尤其是 Twitter ,相当的简约(当然并不简单)。或许有人说,把 Cassandra 开源的 Facebook 不也在用呢吗 ? Facebook 数据结构不复杂么?没错,Facebook 数据结构很复杂,不过使用 Cassandra 的场景其实和 Twitter / Digg 几乎一致的---只是用在 inbox 这个地方的数据处理而已。

不要迷恋 Cassandra ,如果应用场景不合适,那么对你来说永远都只是个传说。。

--EOF--


最近文章|Recent Articles

本站赞助商:豆瓣网

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

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

14:11 How to Use DBMS_ADVANCED_REWRITE in Oracle 10g (8624 Bytes) » Chanel [K]

在Oracle10g之后,提供了DBMS_ADVANCED_REWRITE包,具有强大的查询重写功能,可以让我们在数据库层面实现很多微妙的调整。假设我们有一个应用,但是现在无法直接修改应用程序的编码,但是又想能够让应用程序的某些SQL产生我们想要的变化,那么就可以使用DBMS_ADVANCED_REWRITE包。

drop table t;
create table t as select object_id,object_name from dba_objects;
drop table t1;
create table t1 as select object_id,object_name from dba_objects where 1=0;
SQL> select count(*) from t;

  COUNT(*)
----------
     16636

SQL> select count(*) from t1;

  COUNT(*)
----------
         0

现在我们有表T和T1,表结构相同,但是表T中有1.6万记录,而表T1中没有记录,如果说我们的应用中有一个SQL多次地查询表T的总记录数,占用了大量的CPU和逻辑读,而这样的count记录数又是完全没有用处的,但是我们无法修改应用程序去掉这个SQL,那么我们就可以通过DBMS_ADVANCED_REWRITE包来讲查询表T的SQL转变为查询表T1,这样就大大减少了这条SQL的逻辑读。

首先DBMS_ADVANCED_REWRITE包的执行权限必须显式赋给需要的用户。

CONN sys/password AS SYSDBA

GRANT EXECUTE ON DBMS_ADVANCED_REWRITE TO kamus;

CONN kamus/password

BEGIN
  SYS.DBMS_ADVANCED_REWRITE.declare_rewrite_equivalence (
     name             => 't_rewrite',
     source_stmt      => 'SELECT count(*) FROM t',
     destination_stmt => 'SELECT count(*) FROM t1',
     validate         => FALSE,
     rewrite_mode     => 'TEXT_MATCH');
END;
/

然后需要设置会话层面的QUERY_REWRITE_INTEGRITY参数,该参数默认值为ENFORCED,表示只有重写后的SQL输出结果跟原结果完全一样时,查询才会被真正重写,在这里需要修改为TRUSTED。

SQL> ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED;
SQL> set autot on
SQL> select count(*) from t;

  COUNT(*)
----------
         0

Execution Plan
----------------------------------------------------------
Plan hash value: 238181912

----------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |     1 |    13 |     2   (0)| 00:00:01 |
|   1 |  VIEW               |      |     1 |    13 |     2   (0)| 00:00:01 |
|   2 |   SORT AGGREGATE    |      |     1 |       |            |          |
|   3 |    TABLE ACCESS FULL| T1   |     1 |       |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo size
        417  bytes sent via SQL*Net to client
        416  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> ALTER SESSION SET QUERY_REWRITE_INTEGRITY = ENFORCED;
SQL> select count(*) from t;

  COUNT(*)
----------
     16636

Execution Plan
----------------------------------------------------------
Plan hash value: 2966233522

-------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |    22   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| T    | 16639 |    22   (0)| 00:00:01 |
-------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         69  consistent gets
          0  physical reads
          0  redo size
        420  bytes sent via SQL*Net to client
        416  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL>

可以看到在重写之后,执行计划中显示直接去查询表T1,而consistent gets也从查询表T需要的69减少为3。

可以从[USER|ALL|DBA]_REWRITE_EQUIVALENCES视图中获得查询重写的信息。

SQL> select * from user_rewrite_equivalences;

OWNER  NAME       SOURCE_STMT               DESTINATION_STMT          REWRITE_MO
------ ---------- ------------------------- ------------------------- ----------
KAMUS  T_REWRITE  SELECT count(*) FROM t    SELECT count(*) FROM t1   TEXT_MATCH

DBMS_ADVANCED_REWRITE包也有限制,不可以重写牵涉到SYS用户对象的SQL。

drop table t1;
create table t1 as select * from all_tables where 1=0;

SQL> BEGIN
  2    SYS.DBMS_ADVANCED_REWRITE.declare_rewrite_equivalence (
  3       name             => 't_rewrite',
  4       source_stmt      => 'SELECT count(*) FROM all_tables',
  5       destination_stmt => 'SELECT count(*) FROM t1',
  6       validate         => FALSE,
  7       rewrite_mode     => 'TEXT_MATCH');
  8  END;
  9  /
BEGIN
*
ERROR at line 1:
ORA-30354: Query rewrite not allowed on SYS relations
ORA-06512: at "SYS.DBMS_ADVANCED_REWRITE", line 29
ORA-06512: at "SYS.DBMS_ADVANCED_REWRITE", line 185
ORA-06512: at line 2

在测试中,如果destination_stmt中包含SYS用户对象,是可以成功创建查询重写的,但是在执行SQL的时候却会报ORA-03113错误,后台出现ORA-07445错误,无法正常执行。

SQL> BEGIN
  2    SYS.DBMS_ADVANCED_REWRITE.declare_rewrite_equivalence (
  3       name             => 't_rewrite',
  4       source_stmt      => 'SELECT count(*) FROM t1',
  5       destination_stmt => 'SELECT count(*) FROM all_tables',
  6       validate         => FALSE,
  7       rewrite_mode     => 'TEXT_MATCH');
  8  END;
  9  /

PL/SQL procedure successfully completed.

SQL> select * from user_rewrite_equivalences;

OWNER  NAME       SOURCE_STMT               DESTINATION_STMT          REWRITE_MO
------ ---------- ------------------------- ------------------------- ----------
KAMUS  T_REWRITE  SELECT count(*) FROM t1   SELECT count(*) FROM all_ TEXT_MATCH
                                            tables

SQL> ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED;

Session altered.

SQL> select count(*) from t1;
select count(*) from t1
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 8360
Session ID: 135 Serial number: 22

13:55 植树节 (893 Bytes) » Google 黑板报 -- Google 中国的博客网志



今天是中国的植树节。中国植树造林的历史可以追溯到3000年以前。新中国成立之后,植树造林、发展林业成为国家建设的战略任务,而其成为中国公民的一项法定义务则始于改革开放之初。1979年2月23日,在第五届全国人大常委会第六次会议上,根据国务院提议,为动员全国各族人民植树造林,加快绿化祖国,改善环境,造福子孙后代,决定每年3月12日为中国的植树节。
13:19 ORA-01017 When Connect SYSDBA by SQL Developer (5334 Bytes) » Chanel [K]

在尝试使用SQL Developer用SYSDBA连接数据库时总是报ORA-01017错误。

ORA-01017: invalid username/password; logon denied

实际上用户名密码是正确的,并且在数据库服务器上使用SQL*Plus通过监听连接也是正常的。

C:\Users\Kamus>sqlplus "sys/oracle@orcl11g as sysdba"

SQL*Plus: Release 11.1.0.7.0 - Production on Fri Mar 12 12:17:01 2010

Copyright (c) 1982, 2008, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
With the Partitioning, OLAP and Real Application Testing options

SQL> 

真正的问题是因为数据库密码文件缺失了。在windows下,Oracle数据库密码文件是储存在%ORACLE_HOME%\database目录下,命名为PWD%SID%.ora。

密码文件不存在,数据库实例完全可以正常启动,只是在尝试通过监听登陆SYSDBA的时候就会报ORA-01017错误。

那么为什么在本地使用SQL*Plus是正常的,这实际上是一个错觉,因为在Windows中Oracle默认安装以后会在sqlnet.ora文件中设置SQLNET.AUTHENTICATION_SERVICES = (NTS),这表示支持“Windows NT native authentication”方式登陆数据库,也就是属于OSDBA组的Windows用户不用提供密码也可以通过SYSDBA登陆数据库。sqlnet.ora文件位于%ORACLE_HOME%\network\admin目录下。

我们随便使用一个不存在的用户名密码都是可以登录数据库的。

C:\Users\Kamus>sqlplus "NotExist/nopassword@orcl11g as sysdba"

SQL*Plus: Release 11.1.0.7.0 - Production on Fri Mar 12 13:10:49 2010

Copyright (c) 1982, 2008, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
With the Partitioning, OLAP and Real Application Testing options

SQL>

修改SQLNET.AUTHENTICATION_SERVICES参数为NONE之后。

SQLNET.AUTHENTICATION_SERVICES = (NONE)

再次测试用SQL*Plus登陆,报ORA-01031错误,即使提供正确的SYS用户密码也会报同样的错误,因为此时密码文件不存在,不能通过密码文件校验SYS用户密码是否正确,而又不允许通过NTS方式登陆数据库。

C:\Users\Kamus>sqlplus "NotExist/nopassword@orcl11g as sysdba"

SQL*Plus: Release 11.1.0.7.0 - Production on Fri Mar 12 13:14:07 2010

Copyright (c) 1982, 2008, Oracle.  All rights reserved.

ERROR:
ORA-01031: insufficient privileges

Enter user-name:

重新创建密码文件,保持sqlnet.ora文件中SQLNET.AUTHENTICATION_SERVICES = (NONE)。

orapwd file=D:\oracle\product\11.1.0\db_1\database\PWDorcl11g.ora password=oracle

这样就只能通过正确的SYS用户和密码才可以用SYSDBA登陆数据库了。

C:\Users\Kamus>sqlplus / as sysdba

SQL*Plus: Release 11.1.0.7.0 - Production on Fri Mar 12 13:18:32 2010

Copyright (c) 1982, 2008, Oracle.  All rights reserved.

ERROR:
ORA-01031: insufficient privileges

Enter user-name:
C:\Users\Kamus>
C:\Users\Kamus>sqlplus sys/oracle as sysdba

SQL*Plus: Release 11.1.0.7.0 - Production on Fri Mar 12 13:18:44 2010

Copyright (c) 1982, 2008, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
With the Partitioning, OLAP and Real Application Testing options

SQL>

同样在这种配置下,SQL Developer也可以正常用SYSDBA登陆数据库了。

01:03 紧紧滴祝福 (259 Bytes) » 我呸
胡锦涛慰问福建劳动人民,
胡紧紧握住一砣大爷滴手,
大爷亦紧紧握住胡滴手手,
最后
大爷终于说:祝你早日升官!
——据说只在福建当地电视台播出滴片段...
01:03 真羡慕你们 (441 Bytes) » 我呸
可以在孙悟空间
看到这么好滴展览
汤汤同学滴作品+雕塑展

 





地址:广州中山五路大马站17楼
...

  2010-03-11 Thu

23:55 使用数据库存图片 (3929 Bytes) » Alibaba DBA Team

图片是网站上很重要的资源,用户发布的产品图片,用户的logo,AV男,兽兽女,犀利哥等等等等,一个稍具规模的网站,图片的数量可能是千万级,这种资源的特点就是文件小,数量大,每个文件在几字节到几K不等,所以针对图片的访问,基本是非常离散的IO,考验的是系统的磁盘并发和CPU处理能力

一般网站,图片都是存放专门的图片服务器,可集中也可以分布式,比如有条件的可以购买昂贵的NAS存储,由主机拖着,以NFS或者HTTP的方式,供前面的应用访问,或者使用多台廉价PC,图片分布打散到每个机器,前台应用解决图片存取和访问策略,以便充分利用所有资源,在应用与图片服务器中间还可能加一层cache,来缓冲前台的访问压力

上面所说的方法,弊端是有很多的
1.文件系统一定是要使用的,为了管理数千万的图片,必须进行目录分层,因为一个目录下不可能存放太多的文件,前期的目录规划要考虑后期的扩展,还有图片分布均匀,这样做下来,往往目录的深度会达到5层甚至7层
2.数据迁移,备份怎么做?高级的NAS存储,有自己的卷复制,但这个粒度太粗,如果要细分到底层或中间层,会有点力不从心,对于这种大数据量的小文件拷贝,PC也是非常吃力
3.每一个图片的访问,基本会做5-7次的目录跳转,转换到磁盘,也可能有10次物理IO了,在并发量上来的时候,磁盘会是个瓶颈,当然,分布式是个方向

这里想到了另外一种方法,利用数据库来存放图片,存储的方式就是现在最流行的key-value

create table mypic
(
key number not null,
pic blob
);

create index ind_picid on mypic(key);

key是图片名称,事先最好统一规划一下,使用number数字来命名,并针对key建立索引
VALUE就是图片内容,用blob来保存
访问一个图片的方式就是:
获取图片名称  数据key
走key上的索引,定位到记录表记录
根据表记录,定位到图片的blob,并读取

这个方法的优点:
1.单个图片的访问路径缩短,数字索引比较小,分区做的好的话可能小到两层,从索引到表,到blob段,大概是4-5跳
并且KEY是区分度非常高的数据类型,在索引每层的横向检索中,不会超过1个数据块,而文件目录结构中,子目录繁多,
要遍历这层的inode后,才知道具体跳转的下层位置
2.备份方式比较灵活,可以基于整个数据库,或者单独的表,数据的迁移,删除,都是基于表级别的,比较直观,方便
3.可以在数据库层面,考虑图片的水平拆分,垂直拆分,分表,分库,都不错
4.数据库的复制技术可以派上用场,读写分离

这里数据库完全是当成一个KEY-VALUE的存储在用,我们可以考虑将一些廉价的PC堆在一起,做成一个picdb的群集,
大致画了一个草图,当然在WEB与picdb间应该还有层cache的,这个方法是YY出来的,可能很多地方不成熟,但SY强身,YY强国,没有想法,哪来的动力?欢迎各位专业人士拍砖

ppp1

23:41 蠢蠢欲病 (343 Bytes) » Julia----瞬间与记忆在此过渡。。。。。。

白天上班晚上带孩子,真的好累哦

盖小咪太调皮了,数都数不清怎样调皮法

决定尽快送他去幼儿园改造,蒙台梳利,钢琴,英语,绘画!

快点!把盖小咪变成一个斯斯文文的孩子行不行?

好累啊,救命啊!


13:52 今年几部奥斯卡电影 » 木木:木有书读

  2010-03-10 Wed