适配所有数据库的OS 一键优化神器
#!/bin/bash # 文件: db_os_optimize.sh # 功能: 操作系统参数优化数据库场景专用 # 兼容: CentOS/RHEL 7/Ubuntu 18.04/Debian 9 # 说明: 需root权限执行优化项包含网络、内存、文件描述符、安全、IO等 ############################################################################## # 配置区可根据实际需求调整 ############################################################################## TARGET_USER${1:-root} # 目标用户默认root TIME_ZONEAsia/Shanghai # 系统时区 SWAPPINESS0 # 禁用Swap数据库推荐 MAX_OPEN_FILES655360 # 最大文件描述符 MAX_PROCESS655360 # 最大进程数 FIREWALL_ACTIONopen # 防火墙动作open(开放常用端口)/close(关闭)/keep(保持不变) DB_PORT54321 # 数据库端口需开放时使用 ############################################################################## # 工具函数 ############################################################################## # 日志输出带时间戳 log() { echo [$(date %Y-%m-%d %H:%M:%S)] [$1] $2 } # 错误退出 error_exit() { log ERROR $1 exit 1 } # 备份配置文件 backup_conf() { local conf_path$1 local backup_path${conf_path}.bak.$(date %Y%m%d%H%M%S) if [ -f $conf_path ]; then cp -p $conf_path $backup_path || error_exit 备份$conf_path失败 log INFO 已备份配置文件: $backup_path fi } # 检查命令是否存在 command_exist() { command -v $1 /dev/null 21 } ############################################################################## # 前置检查 ############################################################################## # 检查root权限 if [ $(id -u) -ne 0 ]; then error_exit 脚本必须以root用户执行当前用户: $(whoami) fi # 检查目标用户是否存在 if ! id -u $TARGET_USER /dev/null 21; then log WARN 目标用户$TARGET_USER不存在是否创建(y/n默认n) read -r create_user if [ $create_user y ] || [ $create_user Y ]; then useradd -m -s bin/bash $TARGET_USER || error_exit 创建用户$TARGET_USER失败 log INFO 已创建目标用户: $TARGET_USER else error_exit 目标用户$TARGET_USER不存在脚本退出 fi fi # 检查系统发行版 if [ -f etc/redhat-release ]; then OS_TYPErhel elif [ -f etc/lsb-release ] || [ -f etc/debian_version ]; then OS_TYPEdebian else error_exit 不支持的操作系统发行版 fi log INFO 开始执行操作系统参数优化目标用户: $TARGET_USER系统类型: $OS_TYPE ############################################################################## # 1. 备份关键配置文件 ############################################################################## log INFO 开始备份配置文件... backup_conf /etc/sysctl.conf backup_conf /etc/security/limits.conf backup_conf /etc/ssh/sshd_config backup_conf /etc/bashrc ############################################################################## # 2. 内核参数优化sysctl.conf ############################################################################## log INFO 优化内核参数... SYSCTL_MARKER#add by kingbase (enhanced) # 检查是否已添加优化配置避免重复 if ! grep -q ^$SYSCTL_MARKER /etc/sysctl.conf; then cat etc/sysctl.conf EOF $SYSCTL_MARKER # 共享内存优化数据库核心需求 kernel.shmmax 4294967296 # 最大共享内存段4GB根据物理内存调整 kernel.shmall 1048576 # 共享内存总页数4GB/4KB1048576 kernel.shmmni 8192 # 最大共享内存段数 kernel.sem 5010 64128000 50100 1280 # 信号量配置 # 文件系统优化 fs.file-max $MAX_OPEN_FILES # 系统最大打开文件数 fs.aio-max-nr 1048576 # 异步IO最大请求数 # 内存优化 vm.overcommit_memory 2 # 禁止过度内存分配 vm.overcommit_ratio 90 # 内存过度分配比例物理内存90% vm.swappiness $SWAPPINESS # 禁用Swap0优先使用物理内存 vm.dirty_background_ratio 5 # 后台刷脏页阈值5% vm.dirty_ratio 10 # 强制刷脏页阈值10% vm.dirty_expire_centisecs 3000 # 脏页过期时间30秒 # 网络优化提升并发和连接稳定性 net.ipv4.ip_local_port_range 9000 65500 # 本地端口范围 net.core.somaxconn 65535 # 最大监听队列长度 net.core.netdev_max_backlog 65535 # 网卡接收队列最大长度 net.ipv4.tcp_max_syn_backlog 65535 # TCP半连接队列长度 net.ipv4.tcp_tw_reuse 1 # 复用TIME_WAIT状态的端口 net.ipv4.tcp_tw_recycle 0 # 禁用TCP连接回收避免NAT环境问题 net.ipv4.tcp_fin_timeout 30 # TIME_WAIT超时时间30秒 net.ipv4.tcp_keepalive_time 600 # TCP保活时间10分钟 net.ipv4.tcp_keepalive_intvl 30 # 保活探测间隔30秒 net.ipv4.tcp_keepalive_probes 10 # 保活探测次数 net.ipv4.tcp_max_tw_buckets 200000 # 最大TIME_WAIT数量 EOF # 应用内核参数忽略临时失效的参数 sysctl -p /dev/null 21 || log WARN 部分内核参数需重启系统生效 else log INFO 内核参数已优化跳过重复添加 fi ############################################################################## # 3. 用户资源限制优化limits.conf ############################################################################## log INFO 优化用户资源限制... LIMITS_MARKER#add by kingbase (enhanced) if ! grep -q ^$LIMITS_MARKER /etc/security/limits.conf; then cat etc/security/limits.conf EOF $LIMITS_MARKER # 全局限制 * soft nofile $MAX_OPEN_FILES * hard nofile $MAX_OPEN_FILES * soft nproc $MAX_PROCESS * hard nproc $MAX_PROCESS * soft core unlimited * hard core unlimited * soft memlock unlimited * hard memlock unlimited # root用户限制 root soft nofile $MAX_OPEN_FILES root hard nofile $MAX_OPEN_FILES root soft nproc $MAX_PROCESS root hard nproc $MAX_PROCESS # 目标用户专项限制 $TARGET_USER soft nofile $MAX_OPEN_FILES $TARGET_USER hard nofile $MAX_OPEN_FILES $TARGET_USER soft nproc $MAX_PROCESS $TARGET_USER hard nproc $MAX_PROCESS $TARGET_USER soft memlock unlimited $TARGET_USER hard memlock unlimited EOF # 清除limits.d下的默认限制避免覆盖 if [ -d /etc/security/limits.d ]; then find /etc/security/limits.d -name *.conf -exec sed -i /^\*.*nofile\|^\*.*nproc/d {} \; fi else log INFO 用户资源限制已优化跳过重复添加 fi ############################################################################## # 4. SSH服务优化sshd_config ############################################################################## log INFO 优化SSH服务配置... SSHD_CONF/etc/ssh/sshd_config # 匹配行首可能的空白字符注释原有配置 sed -i s/^[[:space:]]*GSSAPIAuthentication/#GSSAPIAuthentication/g $SSHD_CONF sed -i s/^[[:space:]]*UseDNS/#UseDNS/g $SSHD_CONF sed -i s/^[[:space:]]*UsePAM/#UsePAM/g $SSHD_CONF sed -i s/^[[:space:]]*PasswordAuthentication/#PasswordAuthentication/g $SSHD_CONF # 添加优化配置确保生效 cat $SSHD_CONF EOF # 优化项add by kingbase GSSAPIAuthentication no # 禁用GSSAPI认证加速登录 UseDNS no # 禁用DNS反向解析加速登录 UsePAM yes # 启用PAM认证 PasswordAuthentication yes # 允许密码登录根据需求调整 MaxStartups 100 # 最大并发连接尝试数 MaxSessions 100 # 最大并发会话数 EOF # 重启SSH服务兼容systemd和sysvinit if command_exist systemctl; then systemctl restart sshd /dev/null 21 || log WARN 重启sshd服务失败systemd elif command_exist service; then service sshd restart /dev/null 21 || log WARN 重启sshd服务失败sysvinit fi ############################################################################## # 5. Shell环境优化bashrc ############################################################################## log INFO 优化Shell环境... BASHRC_CONF/etc/bashrc SHELL_MARKER#add by kingbase (enhanced) if ! grep -q ^$SHELL_MARKER $BASHRC_CONF; then cat $BASHRC_CONF EOF $SHELL_MARKER # 启用别名扩展 shopt -s expand_aliases # 历史命令优化 HISTSIZE1000000 # 历史命令记录条数 HISTFILESIZE2000000 # 历史文件最大行数 HISTTIMEFORMAT%Y-%m-%d %H:%M:%S # 历史命令带时间戳 HISTCONTROLignoredups:ignorespace # 忽略重复命令和空格开头的命令 # 环境变量优化 export LC_ALLC # 统一字符集 export LANGC export TMOUT0 # 禁用自动退出 EOF else log INFO Shell环境已优化跳过重复添加 fi ############################################################################## # 6. Cron权限优化cron.allow ############################################################################## log INFO 配置Cron权限... CRON_ALLOW/etc/cron.allow # 确保文件存在且目标用户已添加 touch $CRON_ALLOW chmod 600 $CRON_ALLOW if ! grep -q ^$TARGET_USER$ $CRON_ALLOW; then echo $TARGET_USER $CRON_ALLOW log INFO 已添加$TARGET_USER到cron.allow else log INFO $TARGET_USER已在cron.allow中跳过 fi ############################################################################## # 7. 关键系统优化数据库场景必做 ############################################################################## # 7.1 关闭透明大页THP数据库性能杀手 log INFO 关闭透明大页THP... THP_DISABLE/etc/systemd/system/disable-thp.service if [ ! -f $THP_DISABLE ]; then cat $THP_DISABLE EOF [Unit] DescriptionDisable Transparent Huge Pages (THP) Aftersysinit.target local-fs.target [Service] Typeoneshot ExecStart/bin/sh -c echo never /sys/kernel/mm/transparent_hugepage/enabled echo never /sys/kernel/mm/transparent_hugepage/defrag [Install] WantedBymulti-user.target EOF # 启用并立即执行 systemctl daemon-reload systemctl enable disable-thp /dev/null 21 systemctl start disable-thp /dev/null 21 fi # 临时关闭立即生效 echo never /sys/kernel/mm/transparent_hugepage/enabled 2/dev/null echo never /sys/kernel/mm/transparent_hugepage/defrag 2/dev/null # 7.2 关闭SELINUX避免权限冲突 log INFO 调整SELINUX... if [ $OS_TYPE rhel ]; then sed -i s/^SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config setenforce 0 /dev/null 21 # 临时关闭 fi # 7.3 防火墙配置 log INFO 配置防火墙动作: $FIREWALL_ACTION... if command_exist firewall-cmd; then # CentOS/RHEL防火墙 case $FIREWALL_ACTION in open) firewall-cmd --permanent --add-port$DB_PORT/tcp firewall-cmd --permanent --add-port22/tcp firewall-cmd --reload /dev/null 21 log INFO 已开放端口: 22, $DB_PORT ;; close) systemctl stop firewalld systemctl disable firewalld /dev/null 21 log INFO 已关闭防火墙 ;; keep) log INFO 保持防火墙当前配置 ;; esac elif command_exist ufw; then # Ubuntu/Debian防火墙 case $FIREWALL_ACTION in open) ufw allow 22/tcp ufw allow $DB_PORT/tcp ufw reload /dev/null 21 log INFO 已开放端口: 22, $DB_PORT ;; close) ufw disable /dev/null 21 log INFO 已关闭防火墙 ;; keep) log INFO 保持防火墙当前配置 ;; esac fi # 7.4 设置系统时区 log INFO 设置系统时区为: $TIME_ZONE timedatectl set-timezone $TIME_ZONE /dev/null 21 # 同步时间需安装ntp/chrony if command_exist chronyd; then systemctl start chronyd systemctl enable chronyd /dev/null 21 elif command_exist ntpd; then systemctl start ntpd systemctl enable ntpd /dev/null 21 fi # 7.5 磁盘IO调度器优化根据磁盘类型自动适配 log INFO 优化磁盘IO调度器... for disk in $(lsblk -dn -o NAME | grep -v loop); do disk_path/sys/block/$disk/queue/scheduler if [ -f $disk_path ]; then # SSD/NVMe用mq-deadline机械硬盘用mq-deadline通用最优 echo mq-deadline $disk_path 2/dev/null log INFO 磁盘$disk IO调度器已设置为: mq-deadline fi chmod x db_os_optimite.sh # 7.6 禁用文件系统atime减少磁盘IO root ./db_os_optimite.sh ./db_os_optimite.sh mydbuser sed -i s/\(defaults\)/\1,noatime/ /etc/fstab 2/dev/null mount -o remount / /dev/null 21 # 临时生效重启后完全生效 # 7.7 关闭自动更新避免系统不稳定 log INFO 关闭系统自动更新... if [ $OS_TYPE rhel ]; then systemctl stop yum-cron /dev/null 21 systemctl disable yum-cron /dev/null 21 elif [ $OS_TYPE debian ]; then systemctl stop unattended-upgrades /dev/null 21 systemctl disable unattended-upgrades /dev/null 21 fi ############################################################################## # 执行结果提示 ############################################################################## log INFO 操作系统参数优化完成 log INFO log INFO 需立即生效的操作 log INFO 1. 重新登录Shell用户资源限制生效 log INFO 2. 重启系统部分内核参数、IO调度器完全生效 log INFO log INFO 优化日志和配置备份已保留路径 log INFO - 配置备份/etc/xxx.conf.bak.2025xxxx log INFO - 脚本执行日志可通过终端输出回溯 log INFO 使用说明1. 赋予执行权限chmod x enhance_os_param.sh2. 执行脚本默认目标用户kingbase./enhance_os_param.sh3. 自定义目标用户./enhance_os_param.sh mydbuser4. 执行后建议重新登录Shell 重启系统确保所有优化生效注意事项• 脚本仅适用于数据库服务器生产环境建议先在测试机验证• 防火墙开放端口可根据实际需求修改DB_PORT变量• 共享内存参数kernel.shmmax可根据物理内存调整建议设为物理内存的50%-80%• 若需启用SELINUX需手动调整SELINUXpermissive并配置数据库相关策略