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

免费领!适配所有数据库的OS 一键优化神器

热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者比较重要的内容,希望大家能够喜欢,不足之处请大家多提宝贵地意见,我们一起提升,守住自己的饭碗。

关注公众号,技术道路不迷路

 

#!/bin/bash
# 文件: db_os_optimize.sh
# 功能: 操作系统参数优化(数据库场景专用)
# 兼容: CentOS/RHEL 7+/Ubuntu 18.04+/Debian 9+
# 说明: 需root权限执行,优化项包含网络、内存、文件描述符、安全、IO等

##############################################################################
# 配置区(可根据实际需求调整)
##############################################################################
TARGET_USER="${1:-root}"  # 目标用户(默认root)
TIME_ZONE="Asia/Shanghai"     # 系统时区
SWAPPINESS=0                  # 禁用Swap(数据库推荐)
MAX_OPEN_FILES=655360         # 最大文件描述符
MAX_PROCESS=655360            # 最大进程数
FIREWALL_ACTION="open"        # 防火墙动作:open(开放常用端口)/close(关闭)/keep(保持不变)
DB_PORT="54321"               # 数据库端口(需开放时使用)

##############################################################################
# 工具函数
##############################################################################
# 日志输出(带时间戳)
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 2>&1
}

##############################################################################
# 前置检查
##############################################################################
# 检查root权限
if [ "$(id -u)" -ne 0 ]; then
    error_exit "脚本必须以root用户执行,当前用户: $(whoami)"
fi

# 检查目标用户是否存在
if ! id -u "$TARGET_USER" >/dev/null 2>&1; 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_TYPE="rhel"
elif [ -f etc/lsb-release ] || [ -f etc/debian_version ]; then
    OS_TYPE="debian"
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/4KB=1048576)
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         # 禁用Swap(0=优先使用物理内存)
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 2>&1 || 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 2>&1 || log "WARN" "重启sshd服务失败(systemd)"
elif command_exist service; then
    service sshd restart >/dev/null 2>&1 || 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

# 历史命令优化
HISTSIZE=1000000                 # 历史命令记录条数
HISTFILESIZE=2000000             # 历史文件最大行数
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "  # 历史命令带时间戳
HISTCONTROL=ignoredups:ignorespace  # 忽略重复命令和空格开头的命令

# 环境变量优化
export LC_ALL=C                   # 统一字符集
export LANG=C
export TMOUT=0                    # 禁用自动退出
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]
Description=Disable Transparent Huge Pages (THP)
After=sysinit.target local-fs.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled && echo never > /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target
EOF


    # 启用并立即执行
    systemctl daemon-reload
    systemctl enable disable-thp >/dev/null 2>&1
    systemctl start disable-thp >/dev/null 2>&1
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/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
    setenforce 0 >/dev/null 2>&1  # 临时关闭
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-port=22/tcp
            firewall-cmd --reload >/dev/null 2>&1
            log "INFO" "已开放端口: 22, $DB_PORT"
            ;;
        close)
            systemctl stop firewalld
            systemctl disable firewalld >/dev/null 2>&1
            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 2>&1
            log "INFO" "已开放端口: 22, $DB_PORT"
            ;;
        close)
            ufw disable >/dev/null 2>&1
            log "INFO" "已关闭防火墙"
            ;;
        keep)
            log "INFO" "保持防火墙当前配置"
            ;;
    esac
fi

# 7.4 设置系统时区
log "INFO" "设置系统时区为: $TIME_ZONE"
timedatectl set-timezone "$TIME_ZONE" >/dev/null 2>&1
# 同步时间(需安装ntp/chrony)
if command_exist chronyd; then
    systemctl start chronyd
    systemctl enable chronyd >/dev/null 2>&1
elif command_exist ntpd; then
    systemctl start ntpd
    systemctl enable ntpd >/dev/null 2>&1
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 2>&1  # 临时生效,重启后完全生效

# 7.7 关闭自动更新(避免系统不稳定)
log "INFO" "关闭系统自动更新..."
if [ "$OS_TYPE" = "rhel" ]; then
    systemctl stop yum-cron >/dev/null 2>&1
    systemctl disable yum-cron >/dev/null 2>&1
elif [ "$OS_TYPE" = "debian" ]; then
    systemctl stop unattended-upgrades >/dev/null 2>&1
    systemctl disable unattended-upgrades >/dev/null 2>&1
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. 1. 赋予执行权限:chmod +x enhance_os_param.sh
  2. 2. 执行脚本(默认目标用户kingbase
    ):./enhance_os_param.sh
  3. 3. 自定义目标用户:./enhance_os_param.sh mydbuser
  4. 4. 执行后建议:重新登录Shell + 重启系统(确保所有优化生效)

注意事项

  • • 脚本仅适用于数据库服务器(生产环境建议先在测试机验证)
  • • 防火墙开放端口可根据实际需求修改DB_PORT
    变量
  • • 共享内存参数(kernel.shmmax
    )可根据物理内存调整(建议设为物理内存的50%-80%)
  • • 若需启用SELINUX,需手动调整SELINUX=permissive
    并配置数据库相关策略

 

好书推荐

告别加班做表!AI+Excel双驱动,让数据会说话!

“大咖”思维+AI智能加持,秒出高颜值图表,从新手到高手一本通关!

Excel Home创始人周庆麟联手业内专家,帮助读者彻底做好Excel图表!

关键点

AI赋能:AI+Excel双驱动,一键生成专业图表,重构数据分析工作流,带你进入智能图表新纪元。

大咖思维:不仅教技巧,更传授“大咖”成熟的Excel图表设计制作思路,新手能入门,高手能精进。

阅读零压力:告别枯燥的说明书式教程,语言活泼、图文并茂,阅读更轻松,学完即用。

直击高频痛点:解决Excel图表制作中可能遇到的各类难题,轻松搞定各类图表,精准把控办公高手的实操思路,高效提升工作效率。

学练闭环:本书附有检测练习,帮助读者检验学习效果。

内容简介

本书以实际工作流程为主线,融合“大咖”多年积累的设计经验与AI技术赋能的全新方法,通过AI与Excel的深度协作,重塑高效办公新范式,帮助读者打破固化思维,成为兼具技术力与创新力的办公达人。

本书共分为9章。先分析普通人制作Excel图表效率低下的原因,展现高手们的思维和习惯,让读者了解成为图表高手的最佳学习路径。然后以“大咖”的逻辑思维为主线,分别介绍了走出Excel图表制作误区、成为图表高手的技术准备、让图表美出新高度、基础图表的逆袭、高级图表制作技巧解密、动态交互图表、使用AI制作数据看板等内容,让读者由简到繁地学会制作Excel图表,厘清思路,达到高手境界。最后介绍常用的图表工具及实用技巧,让读者能又快又好地制作图表。

本书为全新升级的AI加强版,旨在为Excel注入自动化、精准化与前瞻性的分析能力。本书既适合有一定Excel图表基础并想快速提升Excel图表技能的读者学习和使用,又可作为企业培训与办公软件教学的前沿教材,同时为初学者提供“技术+AI”双引擎驱动的学习路径,助力读者快速掌握Excel图表应用。

作者简介

周庆麟:网名Kevin,中国资深的微软全球最有价值专家(MVP)之一,Excel Home创始人、站长,曾参与和策划编写了几十本Office技术畅销图书,同时也是一名优秀的技术顾问和培训讲师,有着丰富的授课经验。

孔长征:深耕Excel及数据分析领域20多年。作为国内早期Office图书创作者,主导策划并编写了数十本Office办公类畅销图书,累计影响数百万用户。擅长将复杂数据处理逻辑转化为通俗易懂的操作指南,帮助职场人士高效掌握数据处理、可视化分析等核心技能,提升工作效率。

周奎奎:畅销书作者,资深培训讲师,拥有超过10年的Office培训实战经历,曾参与出版20多本Office相关图书,受众人数超30万,对Office在销售、人力、财务、行政领域的应用有丰富的实战经验。

 

京东:https://item.jd.com/14569319.html
当当:https://product.dangdang.com/29965549.html



END
往期文章回顾

文中的概念来源于互联网,如有侵权,请联系我删除。

欢迎关注公众号:小周的数据库进阶之路,一起交流AI、数据库、中间件和云计算等技术。如果觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。



文章转载自小周的数据库进阶之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论