暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ORACLE 隐藏参数优化

原创 楚枫默寒 2024-11-01
269

针对以下参数进行优化调整

NAMEISDEFAULTNAMEISDEFAULT
audit_trailFALSEsga_max_sizeFALSE
cluster_databaseTRUEsga_targetFALSE
compatibleFALSEundo_retentionFALSE
control_file_record_keep_timeFALSE_b_tree_bitmap_plansFALSE
cpu_countTRUE_cleanup_rollback_entriesFALSE
db_filesFALSE_clusterwide_global_transactionsFALSE
deferred_segment_creationFALSE_datafile_write_errors_crash_instanceFALSE
enable_ddl_loggingFALSE_gc_undo_affinityFALSE
open_cursorsFALSE_index_partition_large_extentsFALSE
optimizer_features_enableTRUE_memory_imm_mode_without_autosgaFALSE
parallel_force_localFALSE_optimizer_adaptive_cursor_sharingFALSE
parallel_max_serversFALSE_optimizer_extended_cursor_sharingFALSE
pga_aggregate_targetFALSE_optimizer_extended_cursor_sharing_relFALSE
processesFALSE_optimizer_null_aware_antijoinFALSE
resource_limitFALSE_optimizer_use_feedbackFALSE
resource_manager_planFALSE_partition_large_extentsFALSE
sec_case_sensitive_logonFALSE_undo_autotuneFALSE
session_cached_cursorsFALSE_use_adaptive_log_file_syncFALSE

脚本如下:(sga 大小可跟据自身情况修改大小)

  1. 备份现在有 pfile 文件
  2. 自动对比参数配置
  3. 自动判断是否 RAC 环境
  4. 生成调整命令
#!/bin/bash

#==============================================================#
# File    :  oracle_check.sh                                   #
# Ctime   :  2022-01-20                                        #
# Mtime   :  2025-10-24                                        #
# Desc    :  Oracle Database Config for single/standlone/rac   #
# Version :  2.3.0                                             #
# Author  :  楚枫默寒                                          #
# Copyright (C) 2022-2099                                      #
# Note    :  Check_Oracle.sh Y 显示说明                        #
#            Check_Oracle.sh 不显示说明(默认)                  #
#==============================================================#

if [[ ! $USER == "oracle" ]];then
    echo "请使用oracle用户执行"
    exit 1
fi

function color_setting(){
    RC='\033[31;1m'        #红色 error
    GC='\033[32;1m'        #绿色 success
    YC='\033[33;1m'        #黄色 warning
    BC='\033[34;1m'        #蓝色 output
    DC='\033[35;1m'        #粉色 detail
    AC='\033[36;1m'        #天蓝 info
    EC='\033[0m'           #黑白 EC
}

function file_create(){
    ALTIME=$(date +%Y%m%d_%H%M%S)
    BACKPATH='/home/oracle' 
    DBNAME=$ORACLE_SID
    
    # 定义默认SQL文件路径
    DEFAULT_SQL_FILE="/tmp/oracle_check_default.sql"
    DEFAULT_LOG_FILE="/tmp/oracle_check_default.log"
    PARAMETER_CONF_FILE='/tmp/oracle_check_para_conf.conf'
    
    ORACLE_CHECK_GE_FILE="/tmp/oracle_check_ge.txt"
    ORACLE_CHECK_11_FILE="/tmp/oracle_check_11.txt"
    ORACLE_CHECK_RA_FILE="/tmp/oracle_check_ra.txt"
    ORACLE_CHECK_AL_FILE="/tmp/oracle_check_al.txt"
    
    os_memory_total=$(awk '/MemTotal/{print $2}' /proc/meminfo) || { echo "Error: Failed to get MemTotal from /proc/meminfo"; exit 1; }
    sga_target=$((${os_memory_total} * 8 * 8 / 100 / 1024))
    pga_target=$((${os_memory_total} * 8 * 2 / 100 / 1024))
    cpu_core=$(egrep 'processor' /proc/cpuinfo  |wc -l)
    if [[ ${cpu_core} -gt 2 ]];then let "set_cpu=${cpu_core}-2"; else let "set_cpu=${cpu_core}-1"; fi
    
echo "
[NAME]                                 |[VALUE]                                                                                    |[db_version]
sga_target                             |${sga_target}                                                                              |mode_gen
sga_max_size                           |${sga_target}                                                                              |mode_gen
pga_aggregate_target                   |${pga_target}                                                                              |mode_gen
audit_trail                            |NONE                                                                                       |mode_gen
_b_tree_bitmap_plans                   |FALSE                                                                                      |mode_gen
_cleanup_rollback_entries              |2000                                                                                       |mode_gen
control_file_record_keep_time          |31                                                                                         |mode_gen
cpu_count                              |${set_cpu}                                                                                 |mode_gen
_datafile_write_errors_crash_instance  |FALSE                                                                                      |mode_gen
db_files                               |60000                                                                                      |mode_gen
deferred_segment_creation              |FALSE                                                                                      |mode_gen
event                                  |'28401 trace name context forever,level 1', '10949 trace name context forever,level 1'     |mode_gen
job_queue_processes                    |1000                                                                                       |mode_gen
open_cursors                           |3000                                                                                       |mode_gen
_optimizer_adaptive_cursor_sharing     |FALSE                                                                                      |mode_gen
_optimizer_use_feedback                |FALSE                                                                                      |mode_gen
parallel_max_servers                   |64                                                                                         |mode_gen
processes                              |3000                                                                                       |mode_gen
session_cached_cursors                 |1000                                                                                       |mode_gen
_undo_autotune                         |FALSE                                                                                      |mode_gen
undo_retention                         |10800                                                                                      |mode_gen
_optimizer_extended_cursor_sharing     |NONE                                                                                       |mode_gen
_optimizer_extended_cursor_sharing_rel |NONE                                                                                       |mode_gen
enable_ddl_logging                     |TRUE                                                                                       |mode_11
_index_partition_large_extents         |FALSE                                                                                      |mode_11
_memory_imm_mode_without_autosga       |FALSE                                                                                      |mode_11
_optimizer_null_aware_antijoin         |FALSE                                                                                      |mode_11
_partition_large_extents               |FALSE                                                                                      |mode_11
_PX_use_large_pool                     |TRUE                                                                                       |mode_11
resource_limit                         |TRUE                                                                                       |mode_11
resource_manager_plan                  |'force:'                                                                                   |mode_11
sec_case_sensitive_logon               |FALSE                                                                                      |mode_11
_use_adaptive_log_file_sync            |FALSE                                                                                      |mode_11
_gc_policy_time                        |0                                                                                          |mode_rac
_clusterwide_global_transactions       |FALSE                                                                                      |mode_rac
_gc_undo_affinity                      |FALSE                                                                                      |mode_rac
parallel_force_local                   |TRUE                                                                                       |mode_rac" |awk -F '|' '{printf "%-40s%-95s%-10s\n",$1,"|"$2,"|"$3}' > ${PARAMETER_CONF_FILE}

echo "
    _b_tree_bitmap_plans|说明:对于OLTP系统,Oracle可能会将两个索引上的ACCESS PATH得到的rowid进行bitmap操作再回表,这种操作有时逻辑读很高,对于此类SQL使用复合索引才能从根本上解决问题.
    _datafile_write_errors_crash_instance|说明:在PDB由于某些原因丢失数据文件后,允许CDB继续运行.注意:只对PDB的非系统数据文件有效.
    _cleanup_rollback_entries|该参数指定回滚时每次回滚的ENTRIES个数,默认为100,设置成2000加快回滚速度.
    _gc_policy_time|DRM(Dynamic Resource Mastering)负责将Cache资源Remaster到频繁访问这部分数据的节点上,从而提高RAC的性能.但是DRM在实际使用中存在诸多Bug,频繁的DRM会引发实例长时间Hang住甚至是宕机,建议关闭DRM.
    _gc_undo_affinity|建议关闭集群 Undo Affinity,降低集群交互,避免触发相关BUG.
    _memory_imm_mode_without_autosga|说明:11.2.0.3开始,即使是手工管理内存方式下,如果某个POOL内存吃紧,Oracle仍然可能会自动调整内存,用这个参数来关闭这种行为.
    _optimizer_adaptive_cursor_sharing|隐含参数_optimizer_adaptive_cursor_sharing能控制自适应式游标共享的部分行为,由Oracle自适应的处理绑定变量的窥探,但这可能会触发性能问题.Oracle建议在非技术指导下,将其关闭掉.
    _optimizer_adaptive_plans|说明:关闭自适应执行计划.
    _optimizer_ads_use_result_cache|说明:12c中关闭result_cache,容易触发latch free等bug.
    _optimizer_aggr_groupby_elim|19567916.8,Wrong results when GROUP BY uses nested queries in 12.1.0.2.
    _optimizer_cost_based_transformation|说明:关闭COST查询转换.
    _optimizer_extended_cursor_sharing|建议禁用自适应游标共享,将隐含参数_optimizer_extended_cursor_sharing设置为NONE.
    _optimizer_extended_cursor_sharing_rel|建议禁用自适应游标共享,将隐含参数_optimizer_extended_cursor_sharing_rel设置为NONE.
    _optimizer_mjc_enabled|说明:某些场景下,需要MERGEJOINCARTESIAN.
    _optimizer_null_aware_antijoin|用于解决在反连接(Anti-Join)时,关联列上存在空值(NULL)或关联列无非空约束的问题.但是该参数不稳定,存在较多的Bug,为避免触发相关Bug,建议关闭.
    _optimizer_reduce_groupby_key|说明:'Wrong results from OUTER JOIN with a bind variable and a GROUP BY clause'.
    _optimizer_use_feedback|基数反馈(CardinalityFeedback)是Oracle11.2中引入的关于SQL性能优化的新特性,该参数存在不稳定因素,可能会带来执行效率的问题,建议关闭优化器反馈
    _partition_large_extents|建议关闭分区使用大的初始化区(Extent).
    _PX_use_large_pool|并行执行的从属进程在工作时需要交换数据和信息,默认从SharedPool中分配内存空间.当_PX_use_large_pool=TRUE时并行进程将从LargePool中分配内存,减少对共享池(SharedPool)的争用.
    _undo_autotune|隐含参数_undo_autotune负责undo retention(即undo段的保持时间)的自动调整,若由Oracle自动负责undo retention,则Oracle会根据事务量来占用undo表空间,可能会形成undo表空间的争用,建议将其关闭.
    _use_adaptive_log_file_sync|Oracle默认启用,可能会导致比较严重的写日志等待(log file sync的平均单次等待时间较高),建议关闭此功能.
    _index_partition_large_extents|初始化分区大小为8M,创建具有大量分区的表时,耗时大幅增长,对比关闭该特性的情况会大非常多,建议关闭.
    sec_case_sensitive_logon|数据库密码默认区分大小写,建议关闭.
    audit_trail|由于审计表(AUD$)存放在SYSTEM表空间,因此为了不影响系统的性能,保护SYSTEM表空间,建议把AUD$移动到其他的表空间上,或者关闭审计.
    control_file_record_keep_time|指定控制文件记录的保留时间.
    deferred_segment_creation|延迟段创建会导致使用Direct方式的Export出来的DMP文件无法正常导入(文档ID1604983.1),建议关闭延迟段创建的特性.
    enable_ddl_logging|说明:在11g里面,打开这个参数可以将ddl语句记录在alert日志中.以便于某些故障的排查.建议在OLTP类系统中使用.
    event|说明:这个参数主要设置2个事件:
    event|1)10949事件用于关闭11g的自动serial direct path read特性,避免出现过多的直接路径读,消耗过多的IO资源.
    event|2)28401事件用于关闭11g数据库中用户持续输入错误密码时的延迟用户验证特性,避免用户持续输入错误密码时产生大量的row cache lock或library cache lock等待,严重时使数据库完全不能登录.
    job_queue_processes|说明:默认1000,建议调整为CPU核数.
    optimizer_dynamic_sampling|(默认2)说明:动态采样,有些场景下,可根据时间情况调大采样级别,比如调到4.
    optimizer_index_cost_adj|(默认100)说明:优化器计算通过索引扫描访问表数据的cost开销某些场景下,值越大优化器越倾向于使用全表扫描.相反,值越小,优化器越倾向于使于索引扫描.可根据实际情况进行调整,比如调小到40.
    parallel_force_local|为了降低集群间的数据交互,建议并行进程强制在本地实例分配,以便降低集群间的数据交互.
    parallel_max_servers|说明:这个参数默认值与CPU相关,OLTP系统中将这个参数设置小一些,可以避免过多的并行对系统造成冲击.
    _clusterwide_global_transactions |通常是因为 OGG  经典抽取模式不支持分布式事务才设置的,建议关闭.">/tmp/oracle_check_explain.txt

# 定义SQL模板内容
sql_template=$(cat <<'EOF'
SET line 900 newpage none heading off feedback off pagesize 0 echo on newp none trimout on trimspool on
col NAME for a50
col VALUE for a120
spool /tmp/oracle_check_default.log
select NAME||'|'||NVL(VALUE,'NULL')||'|'||decode(issys_modifiable,'FALSE','SPFILE','IMMEDIATE','BOTH') scope from v$parameter where NAME in ('cpu_count','audit_trail','event','sga_target','sga_max_size',
'pga_aggregate_target','cluster_database','processes','open_cursors','session_cached_cursors','db_files','_undo_autotune','undo_retention','control_file_record_keep_time',
'_b_tree_bitmap_plans','optimizer_features_enable','deferred_segment_creation','_optimizer_adaptive_cursor_sharing','_optimizer_extended_cursor_sharing','_optimizer_extended_cursor_sharing_rel',
'_optimizer_use_feedback','_cleanup_rollback_entries','_datafile_write_errors_crash_instance','parallel_max_servers','resource_limit','resource_manager_plan','_optimizer_null_aware_antijoin',
'_PX_use_large_pool','_partition_large_extents','_index_partition_large_extents','_use_adaptive_log_file_sync','_memory_imm_mode_without_autosga','enable_ddl_logging',
'sec_case_sensitive_logon','parallel_force_local','_gc_policy_time','_gc_undo_affinity','_clusterwide_global_transactions','job_queue_processes');
EOF
)

# 写入SQL模板到目标文件,并添加基本错误处理
if ! echo "$sql_template" > "$DEFAULT_SQL_FILE"; then
    echo "Error: Failed to write to $DEFAULT_SQL_FILE"
    exit 1
fi

    cat > /tmp/oracle_check_bak.sql <<EOF
create pfile='${BACKPATH}/pfile_${DBNAME}_${ALTIME}.ora' from spfile;
EOF

#echo "成功创建 SQL 文件: $DEFAULT_SQL_FILE"
execute_sql "/tmp/oracle_check_default.sql"
execute_sql "/tmp/oracle_check_bak.sql"

}

function split_Bar() {
    echo "#==================================================================================================================================================================================================================================#"
}

function execute_sql() {
    local sql_file=$1
    if [[ $USER == "root" ]]; then
        su - oracle -c "sqlplus -s / as sysdba < $sql_file" || { echo "Error: Failed to execute $sql_file"; exit 1; }
    elif [[ $USER == "oracle" ]]; then
        sqlplus -s / as sysdba < $sql_file >/dev/null || { echo "Error: Failed to execute $sql_file"; exit 1; }
    fi
}

function compare_scripts(){
    if [[ -s ${DEFAULT_LOG_FILE} ]];then
        db_version=$(grep -w "optimizer_features_enable" ${DEFAULT_LOG_FILE} | awk -F '|' '{print $2}')
        raccheck=$(grep -w "cluster_database" ${DEFAULT_LOG_FILE} | awk -F '|' '{print $2}')
        local items_list=$(cat ${PARAMETER_CONF_FILE}|egrep -v '\['|awk -F '|' '{print $1}')               #参数列表
        for param in ${items_list};do
            #当前数据库配置
            local check_comp=$(grep -w "${param}" ${DEFAULT_LOG_FILE}|awk -F '|' '{print $2}'|tr -d "' ")       #提取当前数据库 配置值
            local check_scop=$(grep -w "${param}" ${DEFAULT_LOG_FILE} |awk -F '|' '{print $3}')                 #提取当前数据库 scope值
            #修改对比值
            local modi_comp=$(grep -w "${param}" ${PARAMETER_CONF_FILE}|awk -F '|' '{print $2}'|tr -d "'| ")    #对比值
            local modi_conf=$(grep -w "${param}" ${PARAMETER_CONF_FILE}|awk -F '|' '{print $2}'|tr -s ' ')      #修改值
            local modi_scop=$(grep -w "${param}" ${PARAMETER_CONF_FILE}|awk -F '|' '{print $3}'|tr -d ' ')      #数据库模式
            
            if [[ -z ${check_comp} ]];then
                check_comp=NoSet;
            fi
            
            if [[ -z ${check_scop} ]];then
                check_scop=SPFILE;
            fi
            case ${param} in
                sga_target|sga_max_size|pga_aggregate_target)
                    let check_comp=${check_comp}/1024/1024
                    modi_conf=${modi_conf}"M" ;;
            esac
            case ${modi_scop} in
                mode_gen)
                    ofile=${ORACLE_CHECK_GE_FILE};;
                mode_11)
                    ofile=${ORACLE_CHECK_11_FILE};;
                mode_rac)
                    ofile=${ORACLE_CHECK_RA_FILE};;
            esac
            if [[ ${check_comp} != ${modi_comp} ]] && [[ ${check_comp} -lt ${modi_comp} ]];then
                if [[ ${raccheck} = "FALSE"  ]];then
                echo -e "| ${param} |当前配置为:| ${check_comp} |调整命令:|alter system set \"${param}\"=${modi_conf} scope=${check_scop};" >> ${ofile}
                else
                    echo -e "| ${param} |当前配置为:| ${check_comp} |调整命令:|alter system set \"${param}\"=${modi_conf} sid='*' scope=${check_scop};" >>${ofile}
                fi
            fi
        done
    else
        echo -e ${RC}"未找到配置文件!"${EC}
        exit 1
    fi
}

function result_output(){
    local T1="#                                                                                     通   用   参   数                                                                                                                            #"
    local T2="#                                                                                    11G  环 境  参  数                                                                                                                            #"
    local T3="#                                                                                    RAC  环 境  参  数                                                                                                                            #"
    local T4="#                                                                                       无参数需调整!                                                                                                                             #"
    split_Bar
    if [[ -s ${ORACLE_CHECK_GE_FILE} ]]; then
        echo "${T1}"
        split_Bar
        default_list=$(awk -F'|' '{printf $2}' ${ORACLE_CHECK_GE_FILE})
        for dl in ${default_list};do
            case ${dl} in
                sga_target)
                grep -R "sga_target" ${ORACLE_CHECK_GE_FILE}|awk -F'|' '{printf "%s %-45s %-s '${AC}'%15s '${EC}'%s '${AC}'%-136s '${EC}'%-1s\n","#",$2,"|"$3"|",$4,"|"$5"|",$6,"#"}';;
                sga_max_size)
                grep -R "sga_max_size" ${ORACLE_CHECK_GE_FILE}|awk -F'|' '{printf "%s %-45s %-s '${AC}'%15s '${EC}'%s '${AC}'%-136s '${EC}'%-1s\n","#",$2,"|"$3"|",$4,"|"$5"|",$6,"#"}';;
                pga_aggregate_target)
                grep -R "pga_aggregate_target" ${ORACLE_CHECK_GE_FILE}|awk -F'|' '{printf "%s %-45s %-s '${AC}'%15s '${EC}'%s '${AC}'%-136s '${EC}'%-1s\n","#",$2,"|"$3"|",$4,"|"$5"|",$6,"#"}'
                split_Bar;;
                *)
                egrep -R "${dl}" ${ORACLE_CHECK_GE_FILE}|awk -F'|' '{printf "%s %-45s %-s '${AC}'%15s '${EC}'%s '${AC}'%-136s '${EC}'%-1s\n","#",$2,"|"$3"|",$4,"|"$5"|",$6,"#"}';;
            esac
        done
        if [[ ${db_version} =~ ^11 ]] && [[ -s ${ORACLE_CHECK_11_FILE} ]]; then
            split_Bar
            echo "${T2}"
            split_Bar
            awk -F'|' '{printf "%s %-45s %-s '${AC}'%15s '${EC}'%s '${AC}'%-136s '${EC}'%-1s\n","#",$2,"|"$3"|",$4,"|"$5"|",$6,"#"}'  ${ORACLE_CHECK_11_FILE}
        fi
        if [[ ${raccheck} = "TRUE" ]] && [[ -s ${ORACLE_CHECK_RA_FILE} ]]; then
            split_Bar
            echo "${T3}"
            split_Bar
            awk -F'|' '{printf "%s %-45s %-s '${AC}'%15s '${EC}'%s '${AC}'%-136s '${EC}'%-1s\n","#",$2,"|"$3"|",$4,"|"$5"|",$6,"#"}'  ${ORACLE_CHECK_RA_FILE}
        fi
    else
        echo "${T4}"
    fi
    split_Bar
}

function print_instructions(){
    cat ${ORACLE_CHECK_GE_FILE} ${ORACLE_CHECK_11_FILE} ${ORACLE_CHECK_RA_FILE} > ${ORACLE_CHECK_AL_FILE}
    work=$(awk '{print $2}' "${ORACLE_CHECK_AL_FILE}")
    for n in $work; do
        grep -wR "$n" /tmp/oracle_check_explain.txt | awk -F '[|]' '{printf "%-40s%-100s\n",$1,$2}'
    done
}

#==========================#
#         清理输出         #
#==========================#
function main(){
    color_setting
    file_create
    compare_scripts
    clear
    result_output
    if [[ ${1} =~ ^(Y|y)$ ]]; then
        print_instructions
    fi
    rm -f /tmp/oracle_check_*
    rm -f $0
}

main "$@"




最后修改时间:2025-10-24 15:32:46
文章转载自楚枫默寒,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论