一键部署openGauss6.0.2轻量版单节点
这是一个懒人部署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 ]; thenecho "错误:此脚本需要以root用户运行。" >&2exit 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" >&2exit 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; thenerror "python3安装失败,请手动安装"
fiif ! command -v pip3 &> /dev/null; thenerror "pip3安装失败,请手动安装"
fisuccess "python3和pip3验证通过"# 检查安装包是否存在
info "检查安装包是否存在..."
if [ -f "${INSTALL_PACKAGE}" ]; theninfo "安装包已存在,无需下载。"
elseinfo "安装包不存在,开始从服务器下载..."if ! wget "${DOWNLOAD_URL}"; thenerror "下载安装包失败,请检查网络连接或下载地址。"fisuccess "安装包下载成功。"
fi# 检查并创建组
info "检查并创建组 ${GROUP}..."
if grep -q "^${GROUP}:" /etc/group; theninfo "组 ${GROUP} 已存在。"
elsegroupadd ${GROUP}if [ $? -eq 0 ]; thensuccess "组 ${GROUP} 创建成功。"elseerror "组 ${GROUP} 创建失败。"fi
fi# 检查并创建用户
info "检查并创建用户 ${USER}..."
if id -u "${USER}" >/dev/null 2>&1; theninfo "用户 ${USER} 已存在。"
elseuseradd -g ${GROUP} ${USER}if [ $? -eq 0 ]; thenecho "${PASSWORD}" | passwd --stdin ${USER}success "用户 ${USER} 创建并设置密码成功。"elseerror "用户 ${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[@]}"; dokey=$(echo "${param}" | awk '{print $1}' | cut -d'=' -f1)value=$(echo "${param}" | cut -d'=' -f2-)if grep -q "^${key}=" "${SYSCTL_CONF}"; thencurrent_value=$(sysctl -n "${key}")# 处理有空格的参数值if [ "$(echo ${current_value} | tr -d ' ')" != "$(echo ${value} | tr -d ' ')" ]; theninfo "更新sysctl参数 ${key} 为 ${value}"sed -i "s/^${key}=.*/${key}=${value}/g" "${SYSCTL_CONF}"elseinfo "sysctl参数 ${key} 已正确配置"fielseinfo "添加sysctl参数 ${key}=${value}"echo "${key}=${value}" >> "${SYSCTL_CONF}"fi
done# 应用sysctl配置
if sysctl -p >/dev/null 2>&1; thensuccess "sysctl参数配置完成并生效。"
elseerror "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[@]}"; douser=$(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}"; theninfo "limits.conf中已存在 ${user} ${type} ${item} 的配置"elseinfo "添加 ${entry} 到limits.conf"echo "${entry}" >> "${LIMITS_CONF}"fi
done
success "limits.conf配置完成。"# 检查并创建安装目录
info "检查并创建安装目录 ${INSTALL_DIR}..."
if [ -d "${INSTALL_DIR}" ]; thenif [ "$(ls -A ${INSTALL_DIR})" ]; thenerror "安装目录 ${INSTALL_DIR} 已存在且不为空,可能导致冲突。"elseinfo "安装目录 ${INSTALL_DIR} 已存在且为空,将使用该目录。"fi
else# 创建目录时同时设置父目录权限mkdir -p -m 755 "$(dirname "${INSTALL_DIR}")"mkdir -p -m 755 "${INSTALL_DIR}"if [ $? -eq 0 ]; thensuccess "安装目录 ${INSTALL_DIR} 创建成功。"elseerror "安装目录 ${INSTALL_DIR} 创建失败。"fi
fi# 检查并创建数据目录
info "检查并创建数据目录 ${DATA_DIR}..."
if [ -d "${DATA_DIR}" ]; thenif [ "$(ls -A ${DATA_DIR})" ]; thenerror "数据目录 ${DATA_DIR} 已存在且不为空,可能导致冲突。"elseinfo "数据目录 ${DATA_DIR} 已存在且为空,将使用该目录。"fi
else# 创建目录时同时设置父目录权限mkdir -p -m 755 "$(dirname "${DATA_DIR}")"mkdir -p -m 755 "${DATA_DIR}"if [ $? -eq 0 ]; thensuccess "数据目录 ${DATA_DIR} 创建成功。"elseerror "数据目录 ${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}" ]; thenerror "安装目录 ${INSTALL_DIR} 所有者或组设置不正确"
fiif [ "$(stat -c %U "${DATA_DIR}")" != "${USER}" ] || [ "$(stat -c %G "${DATA_DIR}")" != "${GROUP}" ]; thenerror "数据目录 ${DATA_DIR} 所有者或组设置不正确"
fisuccess "目录权限设置完成,${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 "安装包解压成功,并重新确认权限。"
elseerror "安装包解压失败。"
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}"; thensuccess "安装脚本数据目录替换完成"elseerror "数据目录替换失败,请手动检查安装脚本"fi
elseerror "未找到安装脚本 ${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}"; thensuccess "安装命令执行完成"
elseerror "安装命令执行失败,详细日志请查看 ${INSTALL_DIR}/simpleInstall/install.log"
fi# 检查安装是否成功
info "检查安装是否成功..."
if [ -f "${DATA_DIR}/postmaster.pid" ]; thensuccess "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"
elseerror "安装失败,详细原因请查看日志:${INSTALL_DIR}/simpleInstall/install.log"
fiinfo "部署流程结束"