为了更高的调整数据库的初始化参数,笔者认为管理员在了解各个初始化参数的用途以及调整规则之前,需要先了解一些初始化参数调整的一些共性的内容。具体来说,主要有以下几个方面。
一般只有在大型应用中或者数据据库性能明显下降时才需要修改这个初始化参数。所以从这个角度来讲,初始化参数的调整算是Oracle数据库中的一个高级应用。但是这也是一个Oracle数据库管理员必须要掌握的内容。为了更高的调整数据库的初始化参数,笔者认为管理员在了解各个初始化参数的用途以及调整规则之前,需要先了解一些初始化参数调整的一些共性的内容。具体来说,主要有以下几个方面。
一、需要了解哪些参数不用重新启动即可生效。
在Oracle数据库中,根据生效的时间不同,可以把参数大致分为两类。一类是必须重新启动后才能够修改或者生效的参数;另外一类就是修改后不用重新启动即生效的参数。一般来说,数据库管理员比较喜欢第二类参数,即修改后不需要重新启动立即生效的参数。为什么呢?因为数据库服务器投入生产使用之后,不能够随意重新启动。如果修改后需要重新启动才能够生效,或者需要重新启动后才能够修改参数,那么在调整参数的过程中显然需要中断用户的访问,会增加停机时间。这对于数据库部署来说,打击会非常的大。因为从稳定性与可用性出发,数据库管理员是以最小的停机时间为目标的。而此时人为的增加停机时间,显然跟这个目标有冲突。所以,数据库管理员就需要知道哪些参数是不用重新启动就可以修改与生效的;而哪些参数则必须重新启动才可以。这是数据库管理员再调整参数之前首先需要知道的内容。一方面管理员可以根据这个特性,来评估停机的损失与调整参数可能带来的收益。如果收益大于损失的话,那么仍然有调整初始化参数的必要。二是来确定参数调整的时间。哪些不需要重新启动,即调整参数不会导致停机的情况下,则参数的调整时间相对来说灵活一点,限制不多。但是如果需要调整重新启动才能够生效或者修改的参数,那么就需要选择一个合适的时机了。如需要选择晚上12点以后的时间,这个时段往往使用数据库的用户并不是很多。当然这个时间每个起夜都可能不同。总之就是选择一个使用数据库用户尽量少的时候。如此的话,才能够在最大程度上降低数据库停机造成的损失。
那么哪些参数不需用重新启动就可以被修改呢?其实,数据库管理员只需要查询动态视图,即可以知道哪些参数不用关闭或者重新启动就可以更改。如在动态视同v$parameter中,存储着初始化参数的值。一般来说,可以在查询语句中加入条件issys_modifiable‘FALSE’ or isses_modifiable‘FALSE’(注意他们之间是or的关系,而不是and关系),最后查询出来的参数就是不用关闭或者重新启动数据库就可以设置的初始化参数。同时这些参数也是可以利用ALTER SYSTEM与ALTER SESSION命令可以更改的部分初始化参数。也就是说,不用关闭或者重新启动数据库就可以修改的参数都可以使用上面两个命令来进行重新设置。但是并不是说,利用这两个命令都可以在不用重新启动或者关闭数据库的情况更改初始化参数。简单的说,就是可以利用这两个命令来更改的参数,有些需要重新启动或者关闭数据库,而有些则不用。
二、根据20/80原则来确定需要更改的参数。
Oracle数据库中的初始化参数有上百个。无论出于什么目的,去一一调整这些参数往往是不现实的。一个优秀的数据库管理员,只需要掌握其中少数几个参数的修改即可。往往掌握这几个参数的修改方法、原则以注意事项,就可以完成大部分的数据库维护任务。这就是20/80的规律在其作用。也就是说,只需要掌握20%的参数(其实还远远不到这个比例),就可以完成80%的任务(其实远远高于这个比例)。也就是说,10/90规则对这个Oracle初始化参数来说,可能更加的适用。总之笔者要说的就是,只需要掌握众多初始化参数中的少数几个即可。即使需要通过调整初始化参数来提高数据库性能或者其他目的的,也就是在这几个少数的初始化参数中。对于其他的参数,数据库管理员只需要了解其用途,而不需要了解该如何调整这些参数。因为遇到的几率可以说基本没有。
那么这些重要的参数到底有哪些呢?主要有以下几个参数。最重要的一个参数就是 DB_CACHE_SIZE.这是一个用来调整数据库缓存大小的参数。在必要的时候,调整这个参数的大小,可以提高数据缓存的命中率,从而大幅度的提高数据库的性能。第二个参数是DB_BLOCK_SIZE.这个参数主要是用来指定数据库在建立时所默认的块大小。如果块设置的比较小,则有可能会发生行链化现象,从而降低数据库的性能;也有可能增加数据库的碎片,浪费表空间的存储空间以及降低数据库的查询性能等等。所以根据需要有时候也要调整这个块大小来改善数据库的性能。第三个参数是SHARED_POOL_SIZE参数。这个参数主要是为那些数据字典缓存和共享SQL语句指定了在SGA里所分配的内存。简单的来说,合理配置这个参数,能够同等的共享SQL语句。调整这个参数,也是一种优化数据库性能的常用手段。第四个参数为SGA_MAX_SIZE参数,这个参数指定了SGA可以动态增长的最大内存。在SQLServer数据库中也有类似的参数。一般来说,在同台数据库服务器中若部署有多个应用服务的话,则往往需要合理配置这个参数来避免多个应用服务之间争用内存。如果这个参数设置的不合适的话,则有时候会导致另外一种应用服务由于没有足够的内存而停止服务。第五个参数为LOG_CHECKPOINT_INTERVAL.这个参数主要用来设置检查点的频率。在每个检查点中,数据库系统执行数据写出,将所有脏块(已经修改还没有保存到硬盘中的数据)写入到数据库中对应的数据文件中。默认情况下,如果在数据库缓存中有1/4的数据缓冲区是脏缓冲区,则数据库系统会自动执行检查点。另外一个强制的原则就是在进行日志切换时,也会执行检查点。在一些特定的情况下,如建立数据仓库,需要调整这个参数以满足特定场合的需要。
这五个参数是笔者这几年工作以上遇到的最频繁的初始化参数。基本上数据库维护与性能调优就是围绕着这几个参数来的。为此笔者建议,各位数据库管理员在学习数据库初始化参数的调整技巧时,可以从这几个参数出发。或者说,这几个参数是数据库管理员必须要掌握的。不只是简单的了解,而是需要吃透它。只有如此,在遇到情况时,才可以判断是否需要进行更改,以及应对在更改过程中可能出现的问题。对于其他的一些参数,笔者认为数据库管理员只需要了解其基本用途即可。或许笔者在总结这些参数的时候,有漏掉的地方,欢迎大家来补充。以后若有机会,笔者也会像大家详细介绍在什么情况下该调整什么参数;以及在调整过程中可能会遇到的麻烦。大家若对这方面的话题感兴趣,可以关注笔者后面的文章。
三、使用SPFILE来动态修改参数。
在Oracle10G以后的版本中,还允许数据库管理员使用一个SPFILE来存储实例参数的动态修改。在10G以前的版本中,除非将参数手动的添加到初始参数文件中,否则动态的修改参数在数据库重新启动后都会丢失。这跟环境变量的设置有些类似。但是在10G以后的版本中,在这方面有了很大的改善。如开启SPFILE机制的话,则系统就会启用一个服务器参数文件,在内存中动态改变某些参数的时候,同时将这些改变记录到这个服务器参数文件中。等到下次重新启动时,服务器会读取喜欢个服务器参数文件中的值,用来初始化数据库系统。也就是说,从现在开始一些动态修改的参数也可以永久生效了。这对于数据库管理员来说,无疑是一个福音。
从以上的分析中可以看出,这个数据库参数的调整还是一个比较复杂的工作。笔者认为,管理员在学习如何调整这个参数之前,需要先了解上面这些共性的内容。即参数修改的时间限制、最可能需要调整的参数以及如何让动态参数永远生效等等。这些是做好参数优化工作的基础。