Database 类别下的文章

Oracle 10g 的 Data Pump 是个不错的新特性,因为新(其实 10g 也发布好几年了),所以也存在不少问题。

比如 EXPDP 的 EXCLUDE 参数,expdp help=y 输出的内容是这样说明的:

EXCLUDE Exclude specific object types, e.g. EXCLUDE=TABLE:EMP.

可是实际上用这样的格式却是不正确的,会得到一个错误提示信息:

ORA-39071: Value for EXCLUDE is badly formed.

正确的格式是啥? 如果第一次遇到或许还有些不知就里,莫明其妙。在 ITpub 上有个讨论,有朋友贴的文档给出了正确的语法:

EXCLUDE=TABLE:"IN ('TABLENAME1', 'TABLENAME2')"

对于 EXCLUDE/INCLUDE 参数还要注意的是二者不能共用。此外,Linux 和 Windows 下的命令行可能要对转义符号注意一点。

这个语法问题存在好久了,应该算是文档的 Bug ? Oracle 还没有进行修正。

EXPDP 我还遇到另外一个问题,生成的文件超过 99 个就会报错。有谁遇到过没?

--EOF--

BTW: 最近看到有朋友批评我写的东西没意思,其实首先要明确一点,我写的东西基本上是比较简单的所谓"技术", 另外我也不知道写什么有意思,众口难调,而且,写多了我也腻。

Oracle 10gR2 的可靠性

最近手气特好,手边的这一套 Oracle 10gR2 几乎一天遇到一个 Bug。

昨天遇到的问题是查询结果不正确(这可是最为严重的问题了)。大致情况和 Bug 4604970 - Wrong results with 'hash group by' aggregation enabled 相符。通过修改初始化参数 optimizer_features_enable 可以避免这个问题。

今天遇到的问题是:

ORA-27054: NFS file system where the file is created
or resides is not mounted with correct options

这个 Bug 到现在还没有彻底的解决办法,只能通过 hard 方式 mount nfs 目录来避免。

还好这个库的要求也不太高,否则可真的要吃不了兜着走。

Oracle 10g 从发布到现在可不短了。但是从产品的可靠性来看与 9iR2 可差远了。除了 Data Pump 这样的 DW 杀手特性之外,真的很难找到使用 10g 的合适理由。虽然 Oracle 一再暗示已经有绝大多数用户迁移到了 10g 版本,很难让人相信这是真的。

--EOF--

在 Red Hat Enterprise Linux Server 上安装 Oracle 的时候,如果误打误撞顺利的话可能一个错误都碰不到,如果不顺利可能每一步都有槛。以下是几个小建议,可能会让一些朋友少一点麻烦。

1. 安装 OS 时候请选择 "Install Default Software Servers"

很多朋友在安装操作系统的时候会选择 Custom 模式安装软件包, 这样看上去似乎会灵活一些,但是也带来潜在的极多麻烦。数据库软件依赖的包如果缺少的话,再次安装就麻烦了--软件之间的依赖性非常让人闹心的。RHEL 又没有对 YUM/APT 等自动解决依赖性工具的正式支持。

2. 参考 Oracle Validated Configuration

Oracle 这个服务很好。每个配置清单都是经厂商验证过可行的,参考性比较大。尤其是关于当前版本的临时 Patch 参考,更是必需要着重处理。

3. OS 安装文件 .iso 在服务器上放置一份

对数据库来说,一般都是远程操作服务器,如果临时需要安装文件,总不能跑到机房再把光盘扔里面吧? 这时这个 iso image就有用场了。如果上面说的第一条是定制安装 OS 的话,那么几乎就会用到安装光盘. 很多人要找安装包就从网上 rpmfind.net 之类的地方随便找个 RPM 包安装,强烈反对这样做。

另外:Werner Puschitz 的安装参考要超过 Oracle 的官方指导。必读。

几个小小建议,行家眼里不值一哂。

--EOF--

Oracle 10g 关于 NLS 的环境变量发生了一点变化:

For RDBMS 7.2.x version the variable is called ORA_NLS.

For version 7.3.x the variable is called ORA_NLS32.

For Oracle 8, 8i and 9 variable is called ORA_NLS33.

For Oracle 10g the variable is called ORA_NLS10.

ORA_NLS33 的设置值:

ORA_NLS33 = $ORACLE_HOME/ocommon/nls/admin/data

而 ORA_NLS10 只需要设置:

ORA_NLS10 = $ORACLE_HOME/nls/data

定义了 ORA_NLS10 则不需要单独定义 ORA_NLS33 等参数了。

目前应该仍然是向后兼容 ORA_NLS33 的。

更多信息参考 Metalink: Note:77442.1

--EOF--

最近一期的 Oracle 杂志(电子版地址)中介绍了一家新兴的社会网络交友站点 Bebo.com 采用 Oracle 的一些信息。这是第一次看到 Web 2.0 公司采用 Oracle 数据库而不是 MySQL 。

Bebo 当前大约有 2700 万用户,每月大约有 40 亿 PV,而每月的增长率大约有 25%--非常惊人。所以有消息说 Google 发布的一份报告中,Bebo 被搜索的频度超过 MySpace。

Bebo 最开始使用的是 Oracle 标准版,运行在一个 2 CPU 服务器上, 操作系统是 SuSE 企业版。标准版是有一些局限性的,所以后来升级到了 Oracle 的企业版。Bebo 创始人 Michael Birch 介绍说,每天用户上传的图片量大约是 120 万张,需要保存为 5 种格式,这些(应该是图片的元数据等信息吧)都是通过数据库来处理的。并且已经构建了 Standby 数据库。

Oracle 把 Bebo 的经验作为 Oracle 在中小企业上的成功案例来介绍的。Bebo 最初为什么选用 Oracle ? "不能承受宕机损失, 不能允许丢失数据?" 如果是出于这样的考虑,那么成本高一点也是必需要承受的。

在 .com 的那一波浪潮中,Oracle 是大赢家之一,在 Web 2.0 这一次,MySQL 斩获不小。

--EOF--

补充, Bebo 似乎非常喜欢 Oracle 10g 的 Index Organized Table 特性。最新的消息是 Bebo 被 AOL 收购,收购价格:8.5 亿美元.

OTN 上下载文件,有的时候是比较烦人的事情。估计是出于负载均衡的原因,直接使用浏览器看到的地址还要经过几次 http 302 跳转才可以看到。而这个跳转是要带着 Session 走的,如果使用多线程下载工具就有可能到一个很小的错误页面文件。新版本的 FlashGet 就有这毛病。

如果准备安装的服务器在远程,参考这里的方法,用 Wget 直接下载其实也并不费事。

现通过浏览器获知该数据文件的 URL 地址。然后来个投石问路看看具体的跳转情况:

$ wget --limit-rate=150k \ http://download.oracle.com/otn/linux/oracle10g/ \ 10201/10201_database_linux_x86_64.cpio.gz http://download.oracle.com/otn/linux/oracle10g/ \ 10201/10201_database_linux_x86_64.cpio.gz => `10201_database_linux_x86_64.cpio.gz' Resolving download.oracle.com... 213.35.100.1 Connecting to download.oracle.com[213.35.100.1]:80... connected. HTTP request sent, awaiting response... 302 Found
Location: http://download-
west.oracle.com/otn/linux/oracle10g/10201/ 10201_database_linux_x86_64.cpio.gz [following] http://download-west.oracle.com/otn/linux/oracle10g/10201/ 10201_database_linux_x86_64.cpio.gz
=> `10201_database_linux_x86_64.cpio.gz' Resolving download-west.oracle.com... 206.204.21.139 Connecting to download-west.oracle.com[206.204.21.139]:80... connected. HTTP request sent, awaiting response... 302 Found
Location: https://profile.oracle.com/jsp/realms/otnLogin.jsp?
remoteIp=218.108.233.1&globalId=&redirectUrl=http%3a%2f%2fdownload-
west.oracle.com%3a80%2fotn%2flinux%2foracle10g%2f10201%
2f10201_database_linux_x86_64.cpio.gz [following] --16:11:01-- https://profile.oracle.com/jsp/realms/otnLogin.jsp? remoteIp=218.108.233.1&globalId=&redirectUrl=http%3a%2f%2fdownload- west.oracle.com%3a80%2fotn%2flinux%2foracle10g%2f10201% 2f10201_database_linux_x86_64.cpio.gz => `otnLogin.jsp? \ remoteIp=218.108.233.1&globalId=&redirectUrl=http:%2F%2Fdownload-
west.oracle.com:80%2Fotn%2Flinux%2Foracle10g%2F10201%
2F10201_database_linux_x86_64.cpio.gz' Resolving profile.oracle.com... 141.146.8.116 Connecting to profile.oracle.com[141.146.8.116]:443... connected.
HTTP request sent, awaiting response... 200 OK Length: 4,106 [text/html]

输出实在是有点恶心,我在适当的地方做了换行处理。要在第二个 Location 处下手:

https://profile.oracle.com/jsp/realms/otnLogin.jsp?remoteIp=218.108.233.1&globalId=&redirectUrl=http%3a%2f%2fdownload-west.oracle.com%3a80%2fotn%2flinux%2foracle10g%2f10201%2f10201_database_linux_x86_64.cpio.gz

在这个地址后添加 &username=YOURPASSWORD&password=YOURPASSWORD&submit=Continue . YOURUSERNAME/YOURPASSWORD 是在 OTN 上的用户名与口令。然后提交如下的命令即可:

wget --limit-rate=128K --post-data="https://profile.oracle.com/jsp/realms/otnLogin.jsp? \ remoteIp=218.108.233.1&globalId=&redirectUrl=http%3a%2f%2fdownload- \ west.oracle.com%3a80%2fotn%2flinux%2foracle10g%2f10201% \ 2f10201_database_linux_x86_64.cpio.gz \ &username=YOURUSERNAME&password=YOURPASSWORD&submit=Continue" \ https://profile.oracle.com/jsp/reg/loginHandler.jsp

如果嫌输出麻烦,可以在最后 -o downloadOracle.log . 新开一个终端窗口 tail -f downloadOracle.log 就可以观察下载进度了。

要养成随时用 Unix 的习惯思考问题,还真是一个需要时间的事情 :)

--EOF--

Oracle 的 MBRC 与 SSTIOMAX

Oracle 初始化参数 DB_FILE_MULTIBLOCK_READ_COUNT (MBRC) 默认值一般是比较低的,在进行一些比较大的数据操作的时候,恰当的调整当前 Session 的 MBRC 的值可能会在 IO 上节省一点时间。

DB_FILE_MULTIBLOCK_READ 这个参数的值并不是可以无限大, 大多数平台下的 Oracle 都是 128。一般 Oracle 的 Block Size 是 8K 。128*8K=1M 。 这个 1M 是大多数操作系统一次最大 I/O 的限制。前面的限制要从这个 1M 推回去,初始化参数 DB_FILE_MULTIBLOCK_READ_COUNT 的最大值之所以定为 128 ,也是一个比较保守的策略。

Oracle 的 Metalink Note:291239.1 有一小段说明:

Each version of Oracle on each port, is shipped with a preset maximum of how much data can be transferred in a single read (which of course is equivalent to the db_file_multiblock_read_count
since the block size is fixed). For 8i and above (on most platforms) this is 1Mb and is referred to as SSTIOMAX.
To determine it for your port and Oracle version, simply set db_file_multiblock_read_count to a nonsensical value and Oracle will size it down for you.

SSTIOMAX 中的 SST 代表什么意思不为人知:

SSTIOMAX is an internal parameter/constant used by oracle, which limits the maximum amount of data transfer in a single IO of a read or write operation. This parameter is fixed and cannot be tuned/changed

要查看当前系统上的 SSTIOMAX 限制,可以通过如下做法简单的得到(trace 10046 的方法似乎麻烦了一些):

foo@DEMO> show parameters db_file_multiblock_read_count
NAME TYPE VALUE ------------------------------------ ----------- ------- db_file_multiblock_read_count integer 16
foo@DEMO> ALTER SESSION SET db_file_multiblock_read_count =256;
Session altered.
foo@DEMO> SELECT VALUE FROM v$parameter WHERE NAME = 'db_file_multiblock_read_count';
VALUE -------------------- 128

正常运行的库,MBRC 并非越大越好(除了 IO 效率有降低的可能,也会有可能影响 CBO 的运行)。后者是我的猜测,因为在 10gR2 上,'db_file_multiblock_read_count' 参数引入了两个相关的隐含参数(Refer):

_db_file_exec_read_count            
_db_file_optimizer_read_count

距离上一次写技术备忘似乎有好久了...这几天比较累

--EOF--

关于世界上的超大数据库

手边有一份 2005 Winter TopTen Award Winners的报告,包含了一些关于世界上排名前几位的 VLDB 的信息。VLDB,超大数据库,其实叫做"狂大数据库"倒是也很贴切。

如果不区分操作系统环境,Yahoo! 力拔数据仓库一项的头筹,单个数据库数据大小接近 100T 。采用的是 Oracle 数据库,部署在 Unix 上, 存储是 EMC 的设备。这是 2005年的数据,雅虎现在每日接近 40 亿 PV,这个数据仓库现在应该远超 100T 了吧。 电信巨头 AT&T 的数据仓库屈居亚军。Amazon 的两个数据仓库也不小,数据量多达 24773 GB,是用 Oracle RAC 实现的,部署在 Linux 操作系统上。

OLTP Top 10

我比较关心 OLTP 数据库的情况。下面这个图表是包括所有操作系统环境的 OLTP 数据库情况。前 10 名中只有两个采用了集群,而且都是集中式集群(Centralized/Cluster)。其余8个席位都采用了 SMP 架构,而且大多是集中式(Centralized)。分布式超大 OLTP 的成功案例看来并不多(只有 1 例,另外有一例是Federated)。让 Fenng 稍微有些惊讶的是 SQL Server 占了三个席位,数据量最大接近 8T 。整个表看来,数据库类别、所用的软件平台还真的比较平均。并非我想象的完全是 DB2/Oracle+Unix 的格局。

世界上 Top 10 OLTP 数据库

Unix 上 OLTP TOP 10


下表是使用 Unix 操作系统 OLTP TOP 10。好家伙,几乎清一色的 Oracle。DB2 不见踪影,只有 Sybase ASE 还算争气,占了一个席位。 9 个 Unix 平台上的 Oracle OLTP DB,只有两个使用了 RAC ,其他都是 Centralized/SMP。

到现在为止,都还没有看到互联网站点的身影。

关于归档

本页包含 Database 类别下的所有文章.

上一类别为 Arch.

Geek 为下一类别.

回到 首页 查看最近发表的文章或者查看所有 归档文章.