Oracle搭建后优化
1. 开启归档:
SQL> shutdown immediate; 先进行一致性关库
SQL> startup mount; 启动到mount状态
SQL> alter database archivelog; 开启归档 (noarchivelog关闭归档)
SQL> alter database open; 开启数据库
2. 关闭oracle自动内存管理:
AMM(Automatic Memory Management)自动内存管理,分配一整块内存区域,Oracle数据库自动分配管理SGA和PGA的内存。具体通过设置两个参数MEMORY_MAX_TARGET和MEMORY_TARGET达到需求效果。
1) 查看当前sga_target和pga_aggregate_target参数:
2) 修改相关参数把sga和pga参数改为0:
SQL> alter system set sga_max_size=0 scope=spfile;
SQL> alter system set sga_target=0 scope=spfile;
SQL> alter system set pga_aggregate_target=0 scope=spfile;
3) 重新启动数据库:
修改完成。
3. 密码策略:
- 10g开始oracle对数据库的所有密码默认过期时间都是180天
设置无限制:
SQL> alter profile default limit PASSWORD_LIFE_TIME unlimited; - 密码登录错误次数限制:
设置无限制:
SQL> alter profile default limit FAILED_LOGIN_ATTEMPTS unlimited;
4. oralce审计,用来监视和记录用户使用数据库的操作,11g以后默认开启,10g默认关闭,建议关闭。
Audit_sys_operations:
默认为false,当设置为true时,所有sys用户(包括以sysdba, sysoper身份登录的用户)的操作都会被记录(修改需实重启数据库)
SQL> alter system set audit_sys_operations=TRUE scope=spfile;
Audit_trail:
None:是默认值,不做审计;
DB:将audit trail 记录在数据库的审计相关表中,如aud$,审计的结果只有连接信息;
DB,Extended:这样审计结果里面除了连接信息还包含了当时执行的具体语句;
OS:将audit trail 记录在操作系统文件中,文件名由audit_file_dest参数指定;
XML:10g里新增的。
SQL> alter system set audit_trail=db,extended scope=spfile; 开启审计
SQL> startup force; 激活审计
5. 延时段创建关闭。
Oracle 11.2 中,当创建一个空表或空分区时,为了快速创建速度,Oracle 并不会立即分配初始段和空间,实际的表段(Table Segement )被延迟到第一行数据插入时。
可以通过修改参数DEFERRED_SEGMENT_CREATION 来更改此特性,设置为TRUE ,表示启用该功能。
SQL> alter system set deferred_segment_creation=false;
该参数为动态参数,不需要重启数据库。
延时段创建带来的问题就是在使用exp/imp进行导出导入时,不会包含这些空表(数据泵expdp不存在这个问题,expdp可以导出空表),所以,在迁移数据的时候可能会导致遗漏部分空表。可以通过如下的SQL 语句找到所有的空表(未分配任何区的表)。
针对这个问题的解决方法有:
① 最原始最笨的办法(不推荐):INSERT一行,再ROLLBACK或者删除就可以产生SEGMENT了。该方法是在空表中插入数据,再删除,则会产生SEGMENT,此时再导出时就可以导出空表。
② 设置DEFERRED_SEGMENT_CREATION参数。设置DEFERRED_SEGMENT_CREATION参数为FALSE来禁用“延迟段创建”,无论是空表还是非空表,都会分配SEGMENT。需要注意的是,该值设置后只对后面新增的表产生作用,对之前建立的空表(已经存在的)不起作用,仍不能导出。
③ 使用ALLOCATE EXTENT。使用ALLOCATE EXTENT可以为数据库的每一张表分配EXTENT。批量生成脚本:
SELECT 'ALTER TABLE '||D.OWNER||'.'||D.TABLE_NAME||' ALLOCATE EXTENT;' EXEC_SQL FROM DBA_TABLES D WHERE D.SEGMENT_CREATED='NO' AND D.OWNER IN ('LHR','ABC'); --注意修改用户名
执行以上SQL产生的脚本后即可为每一个空表分配段,然后执行exp命令即可。
总结一下,当数据库服务器的版本为11.2.0.1或使用exp 11.2.0.1工具进行导出的时候,需要注意空表的问题。由于延迟段创建的特性,会导致空表不能正常导出。从Oracle 11.2.0.2开始,已经不存在该问题了。
6. 在线日志调整:
建议每个节点5组,每组一个日志文件,,每个日志文件不小于400M(视业务而定)
添加日志组:
SQL> alter database add logfile group 5 '/u01/app/oracle/oradata/orcl/redo05.log' size 400m;
修改已存日志组日志文件大小:
1)切换当前日志到新创建的日志组:
SQL> alter system switch logfile;
2)手动触发检查点,将脏块全部写入数据文件(active -> inactive)
SQL> alter system checkpoint;
3)删除旧的日志组:
SQL> alter database drop logfile group 1;
SQL> alter database drop logfile group 2;
SQL> alter database drop logfile group 3;
4)在系统上删除对应的数据文件:
[oracle@oracle10g orcl]$ \rm redo01.log redo02.log redo03.log
5)重建日志组1,2,3:
SQL> alter database add logfile group 3 '/u01/app/oracle/oradata/orcl/redo03.log' size 400m;
6)切换测试:
修改成功。
7. 打补丁:
https://blog.csdn.net/hufeng719/article/details/62231471 补丁下载地址(10g)
https://www.cnblogs.com/taowang2016/archive/2013/03/13/2957679.html 补丁操作流程
8. 配置sqlplus:
sqlplus在启动时会读取glogin.sql脚本,在脚本中增加define_editor=vim即可在sqlplus中调用vim命令
[oracle@oracle10g ~]$ cd /u01/app/oracle/product/10.2.0/db_1/sqlplus/admin/
[oracle@oracle10g admin]$ vim glogin.sql
重新进入sqlplus即可。
sqlplus显示身份和sid
同理在上述文件中追加
9. 为Oracle开启大页
而在Redhat Linux中,内存都是以页的形式划分的,默认情况下每页是4K,这就意味着如果物理内存很大,则映射表的条目将会非常多,会影响CPU的检索效率。因为内存大小是固定的,为了减少映射表的条目,可采取的办法只有增加页的尺寸。这种增大的内存页尺寸在Linux 2.1中,称为Big page;在AS 3/4中,称为Hugepage
在Linux中配置hugepage可以提高oracle的性能,减少oracle sga的页交换,类似于aix中的lagepage。
当你主机的物理内存为64G,设SGA>=32G时,建议开启大页
设置大页的方法:
1、关闭Oracle Database 11g中的AMM(Automatic Memory Management),即把两个参数MEMORY_TARGET / MEMORY_MAX_TARGET设为0
如果alter system set MEMORY_MAX_TARGET=0 scope=spfile;重启后发现没有改为0,可以alter system reset memory_max_target; 来设置
2、参考metalink(文档 ID 401749.1)提供的脚本,计算hugepages的大小
脚本内容如下:
#!/bin/bash
#
# hugepages_settings.sh
#
# Linux bash script to compute values for the
# recommended HugePages/HugeTLB configuration
# Note: This script does calculation for all shared memory
# segments available when the script is run, no matter it
# is an Oracle RDBMS shared memory segment or not.
# This script is provided by Doc ID 401749.1 from My Oracle Support
# http://support.oracle.com
# Welcome text
echo "
This script is provided by Doc ID 401749.1 from My Oracle Support
(http://support.oracle.com) where it is intended to compute values for
the recommended HugePages/HugeTLB configuration for the current shared
memory segments. Before proceeding with the execution please note following:
* For ASM instance, it needs to configure ASMM instead of AMM.
* The 'pga_aggregate_target' is outside the SGA and
you should accommodate this while calculating SGA size.
* In case you changes the DB SGA size,
as the new SGA will not fit in the previous HugePages configuration,
it had better disable the whole HugePages,
start the DB with new SGA size and run the script again.
And make sure that:
* Oracle Database instance(s) are up and running
* Oracle Database 11g Automatic Memory Management (AMM) is not setup
(See Doc ID 749851.1)
* The shared memory segments can be listed by command:
# ipcs -m
Press Enter to proceed..."
read
# Check for the kernel version
KERN=`uname -r | awk -F. '{ printf("%d.%d\n",$1,$2); }'`
# Find out the HugePage size
HPG_SZ=`grep Hugepagesize /proc/meminfo | awk '{print $2}'`
if [ -z "$HPG_SZ" ];then
echo "The hugepages may not be supported in the system where the script is being executed."
exit 1
fi
# Initialize the counter
NUM_PG=0
# Cumulative number of pages required to handle the running shared memory segments
for SEG_BYTES in `ipcs -m | cut -c44-300 | awk '{print $1}' | grep "[0-9][0-9]*"`
do
MIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q`
if [ $MIN_PG -gt 0 ]; then
NUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`
fi
done
RES_BYTES=`echo "$NUM_PG * $HPG_SZ * 1024" | bc -q`
# An SGA less than 100MB does not make sense
# Bail out if that is the case
if [ $RES_BYTES -lt 100000000 ]; then
echo "***********"
echo "** ERROR **"
echo "***********"
echo "Sorry! There are not enough total of shared memory segments allocated for
HugePages configuration. HugePages can only be used for shared memory segments
that you can list by command:
# ipcs -m
of a size that can match an Oracle Database SGA. Please make sure that:
* Oracle Database instance is up and running
* Oracle Database 11g Automatic Memory Management (AMM) is not configured"
exit 1
fi
# Finish with results
case $KERN in
'2.2') echo "Kernel version $KERN is not supported. Exiting." ;;
'2.4') HUGETLB_POOL=`echo "$NUM_PG*$HPG_SZ/1024" | bc -q`;
echo "Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL" ;;
'2.6') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
esac
# End
运行结果如下:
(注:一页为2M,这个值不可改,84*2M=168M),实际上hugepages与参数sga_max_size有关,比sga_max_size的值稍微大一点点(比SGA_MAX_SIZE最少要多加一页,2M的页不要分配超过sga_max_size太多,会造成内存的浪费)
- 设置hugepages,在内核参数中添加一行,vi /etc/sysctl.conf
vm.nr_hugepages = 84
[root@oracle10g ~]# vi /etc/sysctl.conf
[root@oracle10g ~]# sysctl -p - 设定/etc/security/limits.conf文件,以K为单位,必须大于sga_max_size,这里设定为180000
oracle soft memlock 180000
oracle hard memlock 180000 - 检查是否生效:
[oracle@oracle10g ~]$ ulimit -l
180000 - 重启数据库---注原来的orale用户的窗口退到root用户,重新su - oracle
- 查看大页是否正常被使用:
[oracle@oracle10g ~]$ watch -n1 'cat /proc/meminfo |grep -i HugePage'
使用了hugepage之后,SGA就默认pin在内存里了,那么就不用lock sga了。