这是一个懒人部署openGauss的shell脚本,经测试可以在生产环境部署轻量版单节点的openGauss6.0.2。
以下是shell脚本全文,使用前请将IP、端口等变量改为自己的实际环境。

#!/bin/bash
# 在CentOS7上部署openGauss6.0.2的脚本

# 配置参数
INSTALL_PACKAGE="openGauss-Server-6.0.2-CentOS7-x86_64.tar.bz2"
DOWNLOAD_URL="https://opengauss.obs.cn-south-1.myhuaweicloud.com/6.0.2/CentOS7/x86/${INSTALL_PACKAGE}"
INSTALL_DIR="/app/openGauss"
DATA_DIR="/data/openGauss"
USER="omm"
GROUP="dbgrp"
PASSWORD="YourPassWord"
SERVER_IP="192.168.1.11"
PORT="5432"

# 检查是否以root用户运行
if [ "$(id -u)" -ne 0 ]; then
    echo "错误:此脚本需要以root用户运行。" >&2
    exit 1
fi

# 打印信息函数
info() {
    echo -e "\033[1;34m[INFO] $1\033[0m"
}

# 打印成功信息函数
success() {
    echo -e "\033[1;32m[SUCCESS] $1\033[0m"
}

# 打印错误信息函数
error() {
    echo -e "\033[1;31m[ERROR] $1\033[0m" >&2
    exit 1
}

info "开始部署openGauss 6.0.2..."

# 检查并安装必要的依赖,确保包含python3和pip3
info "检查并安装必要的依赖,包括python3和pip3..."
yum install -y bzip2 libaio-devel flex bison ncurses-devel glibc-devel patch redhat-lsb-core net-tools python3 python3-devel python3-pip

# 验证python3和pip3是否安装成功
info "验证python3和pip3安装..."
if ! command -v python3 &> /dev/null; then
    error "python3安装失败,请手动安装"
fi

if ! command -v pip3 &> /dev/null; then
    error "pip3安装失败,请手动安装"
fi

success "python3和pip3验证通过"

# 检查安装包是否存在
info "检查安装包是否存在..."
if [ -f "${INSTALL_PACKAGE}" ]; then
    info "安装包已存在,无需下载。"
else
    info "安装包不存在,开始从服务器下载..."
    if ! wget "${DOWNLOAD_URL}"; then
        error "下载安装包失败,请检查网络连接或下载地址。"
    fi
    success "安装包下载成功。"
fi

# 检查并创建组
info "检查并创建组 ${GROUP}..."
if grep -q "^${GROUP}:" /etc/group; then
    info "组 ${GROUP} 已存在。"
else
    groupadd ${GROUP}
    if [ $? -eq 0 ]; then
        success "组 ${GROUP} 创建成功。"
    else
        error "组 ${GROUP} 创建失败。"
    fi
fi

# 检查并创建用户
info "检查并创建用户 ${USER}..."
if id -u "${USER}" >/dev/null 2>&1; then
    info "用户 ${USER} 已存在。"
else
    useradd -g ${GROUP} ${USER}
    if [ $? -eq 0 ]; then
        echo "${PASSWORD}" | passwd --stdin ${USER}
        success "用户 ${USER} 创建并设置密码成功。"
    else
        error "用户 ${USER} 创建失败。"
    fi
fi

# 配置sysctl参数,将kernel.sem设置为"250 32000 100 512"
info "配置sysctl参数..."
SYSCTL_CONF="/etc/sysctl.conf"
SYSCTL_PARAMS=(
    "kernel.sem=250 32000 100 512"  # 按要求设置kernel.sem的值
    "kernel.shmmni=4096"
    "kernel.shmall=1073741824"
    "kernel.shmmax=4398046511104"
    "net.core.netdev_max_backlog=10000"
    "net.core.rmem_default=262144"
    "net.core.rmem_max=4194304"
    "net.core.wmem_default=262144"
    "net.core.wmem_max=1048576"
    "net.ipv4.ip_local_port_range=9000 65500"
    "net.ipv4.tcp_fin_timeout=60"
    "net.ipv4.tcp_synack_retries=5"
    "vm.overcommit_memory=0"
    "vm.swappiness=1"
)

# 先备份sysctl.conf
cp "${SYSCTL_CONF}" "${SYSCTL_CONF}.bak-$(date +%F_%H%M%S)"

for param in "${SYSCTL_PARAMS[@]}"; do
    key=$(echo "${param}" | awk '{print $1}' | cut -d'=' -f1)
    value=$(echo "${param}" | cut -d'=' -f2-)
    
    if grep -q "^${key}=" "${SYSCTL_CONF}"; then
        current_value=$(sysctl -n "${key}")
        # 处理有空格的参数值
        if [ "$(echo ${current_value} | tr -d ' ')" != "$(echo ${value} | tr -d ' ')" ]; then
            info "更新sysctl参数 ${key}${value}"
            sed -i "s/^${key}=.*/${key}=${value}/g" "${SYSCTL_CONF}"
        else
            info "sysctl参数 ${key} 已正确配置"
        fi
    else
        info "添加sysctl参数 ${key}=${value}"
        echo "${key}=${value}" >> "${SYSCTL_CONF}"
    fi
done

# 应用sysctl配置
if sysctl -p >/dev/null 2>&1; then
    success "sysctl参数配置完成并生效。"
else
    error "sysctl参数应用失败,请检查配置。"
fi

# 配置limits.conf
info "配置limits.conf..."
LIMITS_CONF="/etc/security/limits.conf"
LIMITS_ENTRIES=(
    "${USER} soft nofile 65536"
    "${USER} hard nofile 65536"
    "${USER} soft nproc 131072"
    "${USER} hard nproc 131072"
)

# 备份limits.conf
cp "${LIMITS_CONF}" "${LIMITS_CONF}.bak-$(date +%F_%H%M%S)"

for entry in "${LIMITS_ENTRIES[@]}"; do
    user=$(echo "${entry}" | awk '{print $1}')
    type=$(echo "${entry}" | awk '{print $2}')
    item=$(echo "${entry}" | awk '{print $3}')
    
    if grep -q "^${user} ${type} ${item}" "${LIMITS_CONF}"; then
        info "limits.conf中已存在 ${user} ${type} ${item} 的配置"
    else
        info "添加 ${entry} 到limits.conf"
        echo "${entry}" >> "${LIMITS_CONF}"
    fi
done
success "limits.conf配置完成。"

# 检查并创建安装目录
info "检查并创建安装目录 ${INSTALL_DIR}..."
if [ -d "${INSTALL_DIR}" ]; then
    if [ "$(ls -A ${INSTALL_DIR})" ]; then
        error "安装目录 ${INSTALL_DIR} 已存在且不为空,可能导致冲突。"
    else
        info "安装目录 ${INSTALL_DIR} 已存在且为空,将使用该目录。"
    fi
else
    # 创建目录时同时设置父目录权限
    mkdir -p -m 755 "$(dirname "${INSTALL_DIR}")"
    mkdir -p -m 755 "${INSTALL_DIR}"
    if [ $? -eq 0 ]; then
        success "安装目录 ${INSTALL_DIR} 创建成功。"
    else
        error "安装目录 ${INSTALL_DIR} 创建失败。"
    fi
fi

# 检查并创建数据目录
info "检查并创建数据目录 ${DATA_DIR}..."
if [ -d "${DATA_DIR}" ]; then
    if [ "$(ls -A ${DATA_DIR})" ]; then
        error "数据目录 ${DATA_DIR} 已存在且不为空,可能导致冲突。"
    else
        info "数据目录 ${DATA_DIR} 已存在且为空,将使用该目录。"
    fi
else
    # 创建目录时同时设置父目录权限
    mkdir -p -m 755 "$(dirname "${DATA_DIR}")"
    mkdir -p -m 755 "${DATA_DIR}"
    if [ $? -eq 0 ]; then
        success "数据目录 ${DATA_DIR} 创建成功。"
    else
        error "数据目录 ${DATA_DIR} 创建失败。"
    fi
fi

# 设置目录权限 - 确保omm用户拥有完全权限
info "设置目录权限,确保${USER}用户拥有完全访问权限..."
# 先设置父目录权限,确保可以访问
chown -R ${USER}:${GROUP} "$(dirname "${INSTALL_DIR}")"
chown -R ${USER}:${GROUP} "$(dirname "${DATA_DIR}")"
chmod -R 755 "$(dirname "${INSTALL_DIR}")"
chmod -R 755 "$(dirname "${DATA_DIR}")"

# 设置实际目录的完全权限
chown -R ${USER}:${GROUP} "${INSTALL_DIR}"
chown -R ${USER}:${GROUP} "${DATA_DIR}"
chmod -R 700 "${INSTALL_DIR}"  # 更严格的权限,仅所有者可访问
chmod -R 700 "${DATA_DIR}"     # 更严格的权限,仅所有者可访问

# 验证权限设置
info "验证目录权限设置..."
if [ "$(stat -c %U "${INSTALL_DIR}")" != "${USER}" ] || [ "$(stat -c %G "${INSTALL_DIR}")" != "${GROUP}" ]; then
    error "安装目录 ${INSTALL_DIR} 所有者或组设置不正确"
fi

if [ "$(stat -c %U "${DATA_DIR}")" != "${USER}" ] || [ "$(stat -c %G "${DATA_DIR}")" != "${GROUP}" ]; then
    error "数据目录 ${DATA_DIR} 所有者或组设置不正确"
fi

success "目录权限设置完成,${USER}用户拥有完全访问权限"

# 解压安装包
info "解压安装包到 ${INSTALL_DIR}..."
if tar -jxf "${INSTALL_PACKAGE}" -C "${INSTALL_DIR}"; then
    # 解压后再次确认权限
    chown -R ${USER}:${GROUP} "${INSTALL_DIR}"
    chmod -R 700 "${INSTALL_DIR}"
    success "安装包解压成功,并重新确认权限。"
else
    error "安装包解压失败。"
fi

# 修改安装脚本中的数据目录
info "修改安装脚本中的数据目录为 ${DATA_DIR}..."
INSTALL_SCRIPT="${INSTALL_DIR}/simpleInstall/install.sh"
if [ -f "${INSTALL_SCRIPT}" ]; then
    # 备份原始安装脚本
    cp "${INSTALL_SCRIPT}" "${INSTALL_SCRIPT}.bak-$(date +%F_%H%M%S)"
    
    # 替换默认数据目录$app/data/single_node为自定义目录
    sed -i "s|\$app/data/single_node|${DATA_DIR}|g" "${INSTALL_SCRIPT}"
    sed -i "s|^dataDir=.*|dataDir=${DATA_DIR}|g" "${INSTALL_SCRIPT}"
    sed -i "s|^GAUSSHOME=.*|GAUSSHOME=${INSTALL_DIR}/gaussdb|g" "${INSTALL_SCRIPT}"
    
    # 确保安装脚本有执行权限
    chmod +x "${INSTALL_SCRIPT}"
    chown ${USER}:${GROUP} "${INSTALL_SCRIPT}"
    
    # 验证替换结果
    if grep -q "${DATA_DIR}" "${INSTALL_SCRIPT}"; then
        success "安装脚本数据目录替换完成"
    else
        error "数据目录替换失败,请手动检查安装脚本"
    fi
else
    error "未找到安装脚本 ${INSTALL_SCRIPT}"
fi

# 切换到omm用户执行安装,并自动输入yes创建演示数据库
info "切换到 ${USER} 用户执行安装,将自动创建演示数据库..."
# 使用echo "yes" | 自动应答创建演示数据库的提示
install_cmd="cd ${INSTALL_DIR}/simpleInstall && echo 'yes' | sh install.sh -w '${PASSWORD}' -p ${PORT}"

# 执行安装并捕获输出日志
if su - ${USER} -c "${install_cmd}"; then
    success "安装命令执行完成"
else
    error "安装命令执行失败,详细日志请查看 ${INSTALL_DIR}/simpleInstall/install.log"
fi

# 检查安装是否成功
info "检查安装是否成功..."
if [ -f "${DATA_DIR}/postmaster.pid" ]; then
    success "openGauss 6.0.2 安装成功!"
    info "数据库安装目录: ${INSTALL_DIR}"
    info "数据存储目录: ${DATA_DIR}"
    info "数据库用户: ${USER}"
    info "数据库密码: ${PASSWORD}"
    info "数据库端口: ${PORT}"
    info "登录命令: su - ${USER} && gsql -d postgres -p ${PORT} -r"
else
    error "安装失败,详细原因请查看日志:${INSTALL_DIR}/simpleInstall/install.log"
fi

info "部署流程结束"

Logo

华为鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐