Archive for March, 2009

大表拆分终于发布并正常

Wednesday, March 25th, 2009

数据量数以亿计,每日变更量超过2kw,访问最频繁的一张表,终于拆分上线并稳定运行,应用本身没做任何修改。对于我们来说,是里程碑的事件,未将来用廉价硬件满足海量数据的高并发访问需求打下了坚实的基础。

Oracle 基于成本的优化器 CBO公式汇总

Saturday, March 21st, 2009

操作
Cost公式
Card公式

全表扫描
blocks / db_multi_block_read
num_rows * table selective

索引范围扫描
blevel + leaf_blocks * index selective
index.num_rows * index selective

通过索引rowid访问表
clustering_factor * table selective
table.num_rows * table selective

索引全扫描
leaf_blocks / db_multi_block_read
index.num_rows * index selective

嵌套循环连接
outer card * inner cost
Join Selectivity =
((num_rows(t1) - num_nulls(t1.c1)) / num_rows(t1)) *
((num_rows(t2) - num_nulls(t2.c2)) / num_rows(t2)) /
greater(num_distinct(t1.c1), num_distinct(t2.c2))
Join Cardinality =
Join Selectivity *
filtered cardinality(t1) * filtered cardinality(t2)

哈希连接
cost of access t1 + cost [...]

关于IPC (进程间通信)

Wednesday, March 18th, 2009

在操作系统中,进程间通信一般有以下几种: 共享内存,信号量,管道,消息队列等 。
1. 共享内存 。 共享内存一般适合于进程间共享大量的数据。 如oracle中的SGA就是用了共享内存来实现数据交换的 ,由于多个进程共同存取共一份数据,所以引进了 lock ,latch 锁机制来保证数据的完整性。
共享内存实现一般有如下步骤:
1) 进程A向操作系统申请了一块内存区域用作共享内存,并给这块内存赋予一个键值(key),例如我现在申请一块键值为123456 的共享内存,代码如下
shmid=shmget((key_t)123456,sizeof(struct shm_buffer),0666|IPC_CREAT);
2) [...]

MySQL 5.1 中 Innodb 的事务完整性Bug

Tuesday, March 17th, 2009

今天和 51.com 的 MySQL DBA 景春同学一起遇到了个 MySQL 非常扯淡的Bug:在 5.1 版本中,Innodb 存储引擎如果使用autocommit=0的情况下,单条SQL在执行过程中如果异常中断的话,事务完整性可能无法保证,不论是STATEMENT还是 MIXED的binlog_format,都存在相同的问题,可以重现,屡试不爽。
测试环境如下:
OS:SunOS 5.10 Generic_137138-09
DB:MySQL 5.1.31/32-log Source distribution
binlog_format:MIXED/STATEMENT
tx_isolation:REPEATABLE-READ
测试脚本如下:

[root@dc-5 /tmp]#cat deletetest.sh
#/bin/sh
mysql -uadmin -h127.0.0.1 -pxxx -e”set autocommit=0;delete from test.test;”
[root@dc-5 /tmp]#cat killtest.sh
#/bin/sh
mysqladmin -uroot processlist |grep “admin”|awk ‘{print $2}’|xargs mysqladmin -uroot kill

将删除的脚本放到后台执行,然后执行kill脚本:

[root@dc-5 /tmp]#time ./deletetest.sh &
[1] 6708
[root@dc-5 /tmp]#./killtest.sh
ERROR 1053 (08S01) at line 1: Server shutdown in progress
real    0m2.901s
user    0m0.007s
sys  [...]

数据水平切分后的主键全局唯一方案

Monday, March 16th, 2009

现在通过数据的水平切分(sharding)来实现数据库 Scale Out 的解决方案受到了越来越多人的青睐,但是在切分过程中可能遇到的问题也肯定不在少数,如切分规则的设计,切分后的访问路由,切分后的主键的全局唯一等等。
这里我主要列举几个可以使用在 MySQL 数据库主键全局唯一方案及其优劣,供大家参考:

通过应用程序生成一个GUID,然后和数据一起插入切分后的集群。优点是维护简单,实现也容易。缺点是应用的计算成本较大,且GUID比较常,占用数据库存储空间较大,涉及到应用的开发。
通过独立的应用程序事先在数据库中生成一系列唯一的 ID,各应用程序通过接口或者自己去读取再和数据一起插入到切分后的集群中。优点是全局唯一主键简单,维护相对容易。缺点是实现复杂,需要应用开发。
通过中心数据库服务器利用数据库自身的自增类型(如 MySQL的 auto_increment 字段),或者自增对象(如 Oracle 的 Sequence)等先生成一个唯一 ID 再和数据一起插入切分后的集群。优点是?好像没有特别明显的优点。缺点是实现较为复杂,且整体可用性维系在这个中心数据库服务器上,一旦这里crash 了,所有的集群都无法进行插入操作,涉及到应用开发。
通过集群编号加集群内的自增(auto_increment类型)两个字段共同组成唯一主键。优点是实现简单,维护也比较简单,对应用透明。缺点是引用关联操作相对比较复杂,需要两个字段,主键占用空间较大,在使用 InnoDB 的时候这一点的副作用很明显。
通过设置每个集群中自增 ID 起始点(auto_increment_offset),将各个集群的ID进行绝对的分段来实现全局唯一。当遇到某个集群数据增长过快后,通过命令调整下 一个 ID 起始位置跳过可能存在的冲突。优点是实现简单,且比较容易根据 ID 大小直接判断出数据处在哪个集群,对应用透明。缺点是维护相对较复杂,需要高度关注各个集群 ID 增长状况。
通过设置每个集群中自增 ID 起始点(auto_increment_offset)以及 ID 自增步长(auto_increment_increment),让目前每个集群的起始点错开 1,步长选择大于将来基本不可能达到的切分集群数,达到将 ID 相对分段的效果来满足全局唯一的效果。优点是实现简单,后期维护简单,对应用透明。缺点是第一次设置相对较为复杂。

除了上述方案之外,各位网友如果想到什么比较巧妙的解决方案,希望能不吝分享。
原文链接:http://www.jianzhaoyang.com/database/sharding_groups_global_pk

不要过度迷信小型机

Tuesday, March 10th, 2009

在 IT 行业很多工程师(尤其是很多 DBA)的心目中,都把小型机视为解决性能问题的终极武器,认为小型机的处理能力要远大于 PS Server。在几年前,可能也确实是这样。但随着近几年 X86 架构芯片技术的飞速发展,PC Server 的处理能力已经越来越强悍,不断的给我们带来惊喜。
最近几年的小型机市场,基本上被 IBM 吃掉了大部分。虽然可能并不完全是因为其 Power 芯片处理能力与其他厂商的芯片相比有优势,但其处理能力方面的优异表现确实是一个很重要的因素。所以最近几年我们一直关注着 IBM 小型机与其他主机的处理能力比较,当然比较是基于 Oracle 数据库所做的一些测试。
测试基本模型如下:

在待测主机上安装好 Oracle 数据库,配置足够装载下所有数据的 SGA,将 Oracle 的 Redo 日志放在内存文件系统上。然后在我们技术能力范围内对 Oracle 进行相应的调优。
使用我们真实的线上数据抽样(约10GB),Import 进入待测试主机上的 Oracle 数据库中。
通过 PL/SQL 编写出模拟我们在线业务中最为典型的事务逻辑,然后使用C++编写多线程程序作为压力测试客户端。
通过多台主机运行压力测试程序,平缓的给待测主机增加压力,待测主机的 CPU 利用率基本用完为止。

测试数据的收集主要通过恒定时间段的 Oracle 数据库自身性能数据采样(statspack),然后分析 statspak 中的每秒事务数。以往经验显示,基本上当客户端压力线程到达一定数量之后,处理量就比较稳定甚至下降。然后我们从中取出每秒事务数的最大值,做为该机器的 处理能力分值。
这个测试模型主要消耗的资源是主机的 CPU + RAM 的能力,而且当初也得到了 IBM 实验室的人认可。
通过这几年对几种主机处理能力跟踪测试情况来看,IBM Power 芯片的优势已经越来越不明显了,甚至其 Power 5+ 芯片的处理能力已经不如某些型号的 Intel x86 芯片的处理能力了,部分主机处理能力对比数据如下:
近四五年来的测试数据:
Sun [...]

IIS无法启动,错误代码127

Monday, March 9th, 2009

KB939373 已禁用 IIS Admin 服务

慎用函数内存表

Tuesday, March 3rd, 2009

也许这个名字不太准确,函数内存表也就是通过一个函数运算,返回一个array,这个返回的数组可以作为普通表与其他的
表做join,或者别的操作,比如我们这边就有个函数
Pkg_Privilege_Util.str2varlist,传入一个字符串,就返回一个数组,当inlist的传值超过1000个时,就是用这个函数
 
testuser@testdb>explain plan for
  2  SELECT sah.ACCOUNT_ID
  3    FROM sfa_account_history sah, sfa_opportunity so
  4   WHERE (sah.member_id LIKE :1 AND sah.account_id = so.account_id AND
  5         (sales_id in
  6         (select login_id
  7              from admin_user_role aur, admin_user au
  8             where aur.user_id = au.login_id
  9               and aur.org_id in (SELECT *
 10               FROM THE (SELECT CAST(pkg_privilege_util.str2numlist(’30′, ”, ”, ”, ”) AS
 11               numtabletype) [...]

阿里巴巴DBA出品