Oracle · 2016-10-10 0

ORACLE上线封版检查

1.oracle封版检查

一般新上线一套oracle库,作为DBA需要根据应用对数据库的需求做出容量评估,然后根据评估结果我们需要给出数据库的配置。封板检查非常重要,关系到一套库是否可用,数据库一旦上线,不可能让你经常修改配置,我见过一套8i的库连续运行8年多没有重启过。那么数据库上线前我们需要做哪些检查呢?这里给出一些参考。

2.主机参数设置

不同版本oracle,不同操作系统,参数都不一样,具体参考oracle官方文档:http://docs.oracle.com/en/database/database.html

以linux为例:

2.1内核参数:

kernel.shmmax = 274877906944	(单个共享内存段的最大值,假如服务器内存512GB,可以以内存一半为准得出该值 256G*1024*1024*1024)
kernel.shmmni = 4096			(共享内存段的最大数量缺省 4096即可)		
kernel.shmall = 4294967296		(共享内存的总页数 缺省值即可)
fs.file-max = 6815744			(文件句柄最大数目)
net.ipv4.ip_local_port_range = 9000 65500 (程序可使用的IPv4端口范围)
net.core.rmem_default = 262144	(套接字接收缓冲区大小的缺省值)
net.core.rmem_max = 4194304		(套接字接收缓冲区大小的最大值)
net.core.wmem_default = 262144  (套接字发送缓冲区大小的缺省值)
net.core.wmem_max = 2097152		(套接字发送缓冲区大小的最大值)
fs.aio-max-nr = 1048576			(并发未完成的请求)
kernel.sem = 5010 641280 5010 128
#以kernel.sem = 250 32000 100 128为例:
#250是参数semmsl的值,表示一个信号量集合中能够包含的信号量最大数目。
#32000是参数semmns的值,表示系统内可允许的信号量最大数目。
#100是参数semopm的值,表示单个semopm()调用在一个信号量集合上可以执行的操作数量。
#128是参数semmni的值,表示系统信号量集合总数。
/*swap相关配置*/
vm.vfs_cache_pressure=200
vm.swappiness=10
vm.min_free_kbytes=524288

2.2 oracle用户和grid用户最大process和Open file数目:

grid soft nproc 65536
grid hard nproc 65536
grid soft nofile 65536
grid hard nofile 65536
oracle soft nproc 65536
oracle hard nproc 65536
oracle soft nofile 65536
oracle hard nofile 65536

2.3 linux大页配置

如今PC服务器性能强劲,稳定性也相比IOE时代大幅提升,企业使用X86那是非常明智选择。PC服务器内存可以轻松达到TB级别,上TB的内存,自然少不了huge page,至于为何要使用huge page,大家可以参考网上许多博文,讲解都非常不错。针对oracle场景,配置方法如下:

1)找出HugePageSize的大小,一般是2M
cat /proc/meminfo | grep -i HugePage
2)找出Oracle所需Shared Memory的大小
ipcs -m
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 98304      root       600        393216     2          dest         
0x00000000 131073     root       600        393216     2          dest         
0x00000000 163842     root       600        393216     2          dest         
0x00000000 196611     root       600        393216     2          dest         
0x00000000 229380     root       600        393216     2          dest         
0x00000000 262149     root       600        393216     2          dest         
0x00000000 294918     root       600        393216     2          dest         
0x00000000 327687     root       600        393216     2          dest         
0x048cd068 393224     oracle     660        26845642752 204                     
以上例子中为26845642752,如果有多个实例(DB和ASM),可能会有多行
3)计算所需页数
每行中的bytes除以页大小,结果+1,然后汇总,比如上例中:26845642752/2097152+1=12802
4)设置OS参数(/etc/sysctl.conf)vm.nr_hugepages,比如上例中:vm.nr_hugepages=12802
5)执行sysctl -p生效
6)启动实例,检查是否使用
取消transparent_hugepage,方法:
echo Never >/sys/kernel/mm/transparent_hugepage/enabled

关闭透明大页(transparent_hugepage)可以使用如下脚本(centos 6.7下面):

[root@hpc02 home]# lsb_release -a
LSB Version:    :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID: CentOS
Description:    CentOS release 6.7 (Final)
Release:        6.7
Codename:       Final
[root@hpc02 home]# ls -l /etc/rc.local 
lrwxrwxrwx. 1 root root 13 Jul  3 19:17 /etc/rc.local -> rc.d/rc.local
[root@hpc02 home]# cat /etc/rc.local 
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
   echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

echo 504 > /proc/sys/vm/hugetlb_shm_group 
#/etc/rc.d/init.d/realserver.sh start
#/etc/rc.d/init.d/keepalived start

2.3.NTP设置

某些生产环境的RAC使用NTP(,哈哈…..)。NTP服务设置必须以-x模式启动,如果没有 -x选项,在时间差异超过特定(取决于平台)阈值时,NTP将向前或向后调整系统时钟。大幅度向后调整时间会导致 Clusterware 以为错过了签到,从而发生节点驱逐的情况。(血泪史,吐血推荐)

LINUX平台(oracle linux和redhat linux):
cat  /etc/sysconfig/ntpd ,显示结果如下为正常:

# Drop root to id 'ntp:ntp' by default. 
OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid" 
# Set to 'yes' to sync hw clock after successful ntpdate 
SYNC_HWCLOCK=no 
# Additional options for ntpdate
NTPDATE_OPTIONS=""

LINUX平台(SUSE linux):

cat /etc/sysconfig/ntp , 显示结果如下为正常:

NTPD_OPTIONS="-x -u ntp"

AIX平台:

cat /etc/rc.tcpip ,显示结果如下为正常:

start /usr/sbin/xntpd "$src_running" "-x"

3.数据库参数设置

3.1 手工管理内存

关闭自动内存管理:

alter system set memory_target =  0  sid=’*’ scope=spfile;
alter system set sga_target    =  0  sid=’*’ scope=spfile;

3.2 SGA/PGA设置

内存一般分配原则:

SGA + PGA = 总内存X40%                                

/*某些同学可能说40%太小了,至少搞个70%。当需要扩容的时候咋办,应用要求连接数加5000个,如果你很早就把所有内存用完了,扩容你就蒙逼了*/
SGA : PGA = 5:1
SGA = db_cache + shared_pool + others
db_cache_size : shared_pool_size : others = 5:1:1

常用操作系统内存查看:

HPUX:machinfo

AIX:svmon -G -O unit=GB

LINUX:free -g

3.3 redo配置

每个thread建8组日志,单实例8组,RAC双实例16组, 一组日志的大小为2G。/*这个没有绝对的,这个配置在大多数场景下都可以应对*/

select thread#, group#,bytes/1024/1024/1024 GB from v$log;

3.4 Control file组数

至少建3组control file

3.5 TEMP表空间设置

如果存储允许,就搞大点吧,某些场景下,需要很多temptablespace.一般中型数据库给个60GB,顺便关闭文件的自动扩展。

3.6 UNDO表空间设置

如果条件允许,也尽量给大点,一般中型数据库给个60GB,关闭文件自动扩展

3.7 processes设置

Process值具体情况具体分析,以设置3000 process数为例:/*根据应用的需求来吧*/

alter system set processes = 3000 sid=’*’scope=spfile;

3.8 db_files设置

这个参数设置的值的大小不会影响效率,只是单纯的控制数据文件的个数,尽量设大,否则当数据文件数量超过该参数的上限时报错ORA-00059;当然,这个值得大小还要考虑操作系统对open files的限制。

alter system set db_files = 5000 sid=’*’scope=spfile;

3.9 LOCK SGA

alter system set lock_sga=true sid=’*’scope=spfile;

注意:AIX操作系统锁定SGA要对oracle用户进行内存锁定附权,否则起库时报ORA-27125

You need to give the oracle Unix user memory locking privileges at the OS level.
The way to solve the issue differs from one OS to another. 
To solve the issue on IBM AIX please implement the below:

1. 把 v_pinshm 参数设置为 1:
# vmo -o v_pinshm=1


2. 给oracle用户赋权 CAP_BYPASS_RAC_VMM,CAP_PROPAGATE:
# chuser capabilities=CAP_BYPASS_RAC_VMM,CAP_PROPAGATE oracle

3. 起库

3.10 UNDO RETENTION设置

该参数决定了回滚段的最小保留时间,可动态调整,具体值根据业务特点设置

alter system set “_undo_autotune”=false scope=both sid=’*’;

alter system set undo_retion=3600 sid=’*’ scope=both;

3.11 关闭DRM

alter system set “_gc_policy_time”=0 sid=’*’ scope=spfile;

alter system set “_gc_undo_affinity”=false sid=’*’ scope=spfile;

3.12 关闭密码延迟验证

11G引入了延迟密码验证,在输入错误的密码后,后续如果还是采用错误的密码登陆,将会导致密码延迟验证,而且会导致失败登陆延长。如果有多个会话同时登陆,将会导致会话HANG住,出现一些LATCH的竞争。
可以通过如下事件来屏蔽密码的延迟验证:

alter system set event = ‘28401 trace name context forever, level 1’ sid =’*’scope = spfile;

3.13  Cursor_sharing

强制重用cursor,可以减少对shared_pool的争用

alter system set cursor_sharing=force sid=’*’scope=spfile;

3.14 Parallel_force_local

在11.2以前,当用户发出并行查询,Oracle会将负载分配到所有的实例上,而在11.2中,Oracle提供了初始化参数,可以限制并行只运行在当前实例上。

alter system set parallel_force_local=true sid=’*’ scope=spfile;

3.15 open_cursors

设定每个session最多能同时打开多少个cursor

alter system set open_cursors=500 sid=’*’scope=spfile;

取值方法:

执行如下SQL:

SELECT MAX(A.VALUE) AS HIGHEST_OPEN_CUR, P.VALUE AS MAX_OPEN_CUR
FROM V$SESSTAT A, V$STATNAME B, V$PARAMETER P
WHERE A.STATISTIC# = B.STATISTIC#
AND B.NAME = 'opened cursors current'
AND P.NAME = 'open_cursors'
GROUP BY P.VALUE;

HIGHEST_OPEN CUR是实际打开的cursors 的最大值,MAX_OPEN_CUR是参数Open_cursors的设定值,如果二者太接近,甚至触发eRA一01000错误,那么你就应该调大参数Open_cursors的设定值。如果问题依旧没有解决,盲目增大Open_cursors也是不对的,这个时候你得通知应用程序的代码是否合理,比如说应用程序是否打开了游标,却没有在它完成工作后没有及时关闭。
相反 如果HIGHEST_OPEN_CUR 远远小于MAX_OPEN_CUR,则说明open_cursors 设置过大,浪费系统资源。

3.16 session_cached_cursors

设定每个session最多可以缓存多少个关闭掉的cursor

Alter system set session_cached_cursors=200 sid=’*’scope=spfile;