今天,数据库的使用已经深入到了各个行业的方方面面,随着大型数据库应用的增加,动辄涉及到TB级数据量的存储与读取,数据库的读写效率日益成为整体系统的瓶颈所在。越来越多的系统管理员已经意识到:提高数据库的读写速度,走出海量数据和访问量压力的瓶颈,是提高整体系统的运行效率的关键。 在这里,笔者将向大家介绍使用磁盘管理工具给Oracle提速的一些方法。当我们希望给Oracle提速的时候,我们首先必须了解在oracle运行过程中,瓶颈来自于哪些方面,我们通过哪些方面去给Oracle提速。
瓶颈来自于哪里
一、 操作系统的单写锁
首先我们知道,Unix系统是一个多用户的操作系统,为了保持文件的一致性,操作系统一般会在某个用户对数据库进行读写操作的时候,为该文件加一个单写锁(single write lock),这样可以避免其它人继续操作这个文件,可以保证数据文件的可靠性。
但是加锁和解锁的过程如此复杂,在获得文件一致性和安全性的同时,牺牲掉了大量的系统性能,有什么办法可以既保证数据库系统的文件一致性,又不致于浪费掉大量的系统性能呢?
二、写缓存和磁盘读写
我们知道,在数据库的数据在读写的时候,首先都需要经过缓存,缓存命中率对于数据库的读写效率起着至关重要的作用。那么我们如何提高缓存的命中率呢?
一般数据库在读写的时候都会保存一份cache,然而文件系统在读写系统文件的时候也会生成一份cache,这样缓存中就会留有冗余的数据,影响缓存使用的利用率。我们怎样消除缓存中这部分冗余的数据呢?
三、提高磁盘读写效率
在Oracle 9i版本以后,Oracle本身都自带有磁盘管理组件(Oracle disk manager)来管理数据文件,提高I/O吞吐量,不过本文将为大家介绍另外一种磁盘管理工具,能够进一步优化磁盘数据结构,提高数据吞吐量。大家有兴趣,可对两种系统优化工具进行一下对比测试。
化磁盘文件系统和数据分布
由于数据库的读写与磁盘文件系统、数据分布等等规则密切相关,我们可以使用一些磁盘管理工具来优化磁盘的文件系统和数据分布规则。
对于Unix系统的单写锁问题造成数据库读写效率低下的情况,我们知道,为了提高读写速度,Unix操作系统在提供单写锁功能的同时,还提供了异步读写(asynchronous I/O)和直接读写(direct I/O)的API,允许应用程序不加锁的写入文件。因此,一些磁盘管理工具软件可以利用这个特点, 让数据库文件跳过这些单写锁,按照裸设备的读写方式写这些文件,从而提高数据库的读写性能。
同时,大多数磁盘管理工具都能够自动监控数据读写存取的频度,选择将一些读写频繁的数据文件直接加载到内存中,这样,磁盘管理工具软件能保证读出和写入这些文件,整个过程对于Oracle是完全透明的。
笔者在这里将以2个2000行的相同的数据库更新来进行测试,以Vetitas storage foundation为例,来测试Veritas Storage Foundation对Oracle数据库的提速效果。
Quick I/O系统优化实例介绍
Veritas Storage Foundation本身是一个管理软件的套件,其中的Quick I/O与cache I/O功能组件能够分别解决单写锁和缓存命中率问题。利用Quick I/O这个特性来读写文件,需要将VxFS文件系统的文件转换成Quick IO文件,然后storage foundation才能减少这些文件的读写的锁控制和cache的控制。
下面我们来看一下Quick IO的用法:
1. 确定目前数据库的数据文件的位置;
2. 确定是否该目录属于VxFS文件系统,Qick IO是建立在VxFS文件系统上的,如果不属于VxFS文件系统将无法使用Qick IO。
3. 同时,我们还需要确定是否Quick IO正在使用,可以通过如下命令行:
# dbed_checkconfig -S $ORACLE_SID -H $ORACLE_HOME
来确定,输入命令行之后,从屏幕输出中我们可以看到有关Quick IO的信息:
Examining Quick I/O settings.
10 files are not configured to use Quick I/O.
同时必须要注意,使用该命令的时候,$ORACLE_SID所属的实例必须是启动的状态。
4. 获得QIO所能够转换的数据库文件的列表,生成mkqio.dat文件。
在这里,我们输入:#qio_getdbfiles_ora,屏幕输出如下:
这里需要注意的是:该命令会自动跳过temporary tablespace的文件,这是因为oracle的临时文件支持把数据写到未分配的存储区域,但是quick IO不支持,所以如果将这种文件转换成Quick IO文件,可能会引起oracle的写失败。
5. 这时必须停止oracle数据库,否则在数据库文件转换成Quick IO文件时会失败。
6. 停止oracle数据库后,我们可以将VxFS类型的数据库文件转换为Quick文件,命令行如下:#qio_convertdbfiles_ora
这时候,我们重启oracle数据库,这时会发现数据库的读写速度就会加快。一般来说,数据库读写加快的比例和具体用户的需求有关,以笔者所做的两个2000行的数据更新进行测试的结果,速度提高了10%。Veritas官方的说法认为,这个提高的比例大概在5%-20%左右,不过具体应用过程中,能做到10%的速度提高还是很不错的,有兴趣的朋友可以自己试一试。
利用Cache QIO提高oracle读写
使用cache QIO的关键在于统计出来哪些数据库文件被频繁使用,因为内存的总数是有限的,将有限的资源利用到最需要的地方,正是我们这些数据库管理员所追求的。下面我们说明一下cache QIO的用法:
1. 第一步必须清空QIO的统计信息,命令行如下:
#qiostat -r /oracle/oradata/glob_ora/*.dbf
#qiostat /oracle/oradata/glob_ora/*.dbf
这时,输出结果如下,我们可以看见QIO的信息已经完全清空。
2. 下面,我们可以进入数据库做几个常见的读写操作,来判断哪些文件被读写过了,并且判断读写的频次。
我们通过以下命令行来查询哪些文件被读写过了:
#qiostat /oracle/oradata/glob_ora/*.dbf
这时,在输出结果中,我们留意这一行:
说明该文件被读写的次数比较多。
3. 将该文件系统转为Cache QIO文件系统
#vxtunefs -o qio_cache_enable=1 /oracle
注:关闭就是将该值设置为0
4. 重复上面的1-3步骤来测试哪些数据被读写过了。这时,我们可以发现,第二步的数据库读写操作对文件的读写几乎为0,那就是因为磁盘管理工具已经将你的读写记录到了内存中一个专属的地方,由磁盘管理工具来负责对文件的读写。
需要注意的是,这一步骤对普通用户是屏蔽的,提高了数据库用户的数据文件读写速的,这个时候数据库的读写可靠性将由磁盘管理工具软件storage foundation来维护。
优化数据结构提高读写速度
在Oracle 9i之后,oracle使用oracle磁盘管理组件(Oracle Disk Manager)来管理数据文件,提高oracle数据库的输入输出数据吞吐量。Oracle磁盘管理的原理是通过直接将用户数据拷贝到裸设备上,从而减少内核对数据文件加锁和减少多余cache,所以它基本应用在裸设备上,由oracle来管理和控制对于裸设备的读写。
我们仍然以Veritas的磁盘管理工具软件Storage Foundation为例来说明磁盘管理工具软件对数据文件的优化。Veritas Storage Foundation的组件ODM和Oracle自带的系统优化是同样的原理,唯一不同的是,它可以将数据写在Veritas VxFS文件系统的基础上,至于该软件与Oracle自带的优化功能孰优孰劣,读者可以自己测试一下,根据笔者的经验,由于Veritas Storage Foundation本身是专业的磁盘管理工具软件,在针对Oracle数据库的系统优化上,还是有非常明显的效果。
但是,Veritas Storage Foundation的ODM组件与Quick IO还是有所不同。他们的区别在于使用Quick IO需要转换数据库文件,然而ODM的使用对于用户来说是透明的。另外oracle 9i之前的用户只能使用Quick IO功能,并不支持ODM功能,同时Quick IO和ODM不能同时使用。
下面我们来说明一下ODM的用法:
1. 确认ODM的序列号已经安装;
# /opt/VRTS/bin/vxlictest -n "VERITAS Storage Foundation
for Oracle" -f "ODM"
2. 确定ODM软件包已经安装(以solaris为例):
# pkginfo |grep VRTSodm
3. 确认odm的库文件存在:
# ls –l /opt/VRTSodm/lib/sparcv9/libodm.so (64位操作系统)
# ls –l /opt/VRTSodm/lib/libodm.so (32位操作系统)
4. 确认Quick IO没有被使用
$ dbed_checkconfig -S $ORACLE_SID -H $ORACLE_HOME
5. 停止oracle 数据库。如果Quick IO 不存在,可以忽律步骤6-7;
6. 将quick IO数据文件转换为ODM文件格式:
# /opt/VRTS/bin/qio_getdbfiles -T ora –a
得出Quick IO的数据库文件
# /opt/VRTS/bin/qio_convertdbfiles -T ora –u
将刚才得出的数据库文件转换为非Quick IO的文件
7. 查看ODM是否在当前数据库已经被使用:
$ grep ODM /oracle/admin/ORCL/bdump/alert_ORCL.log
如果该命令得出“Oracle instance running with ODM: Veritas #.# ODM Library, Version #.#”,则说明ODM已经是启动的了;否则就是没有启动。
8. 将原来的odm库文件用Veritas的替换:
# mv /oracle/lib/libodm9.so /oracle/lib/libodm9.so.old
将原有的库文件备份;
# ln -s /opt/VRTSodm/lib/sparcv9/libodm.so /oracle/lib/libodm9.so
用Veritas的库文件替换
9. 因为ODM功能无法与QIO功能一起使用,所以使用ODM之前,必须关闭cache quick IO功能;
# vxtunefs -o qio_cache_enable=0 $ORACLE_BASE/oradata
重新启动oracle数据库
10. 验证ODM已经启动
$ grep ODM /oracle/admin/ORCL/bdump/alert_ORCL.log
可以得出Veritas ODM的版本信息
$ dbed_checkconfig -S $ORACLE_SID -H $ORACLE_HOME
可以在输出中看到“NOTICE: It appears that your system is ODM enabled.”
这样,oracle的ODM功能就成功启动了,至于数据库读写速度加快了多少,大家有兴趣可自行测试下,并与前面的Quick IO相对比下。
阅读(433) | 评论(0) | 转发(0) |