shell脚本自动安装 PostgreSQL 13

  • A+
所属分类:Shell
#!/bin/bash
# PostgreSQL 13 自动部署脚本 - 适用于 CentOS 系统
# 脚本功能:自动下载、编译、配置并启动 PostgreSQL 13.4

# 定义颜色变量
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # 无颜色

# 检查是否以 root 权限运行
if [ "$(id -u)" -ne 0 ]; then
    echo -e "${RED}错误: 请使用 root 权限运行此脚本${NC}"
    exit 1
fi

# 打印脚本开始信息
echo -e "${YELLOW}===== 开始部署 PostgreSQL 13.4 =====${NC}"

# 1. 安装编译依赖
echo -e "${YELLOW}正在安装依赖...${NC}"
yum -y install gcc make readline-devel zlib-devel openssl-devel
if [ $? -ne 0 ]; then
    echo -e "${RED}依赖安装失败,请检查网络连接或系统状态${NC}"
    exit 1
fi
echo -e "${GREEN}依赖安装完成${NC}"

# 2. 下载并解压源码包
echo -e "${YELLOW}正在下载 PostgreSQL 源码包...${NC}"
PG_VERSION="13.4"
PG_PACKAGE="postgresql-${PG_VERSION}.tar.gz"
PG_URL="https://ftp.postgresql.org/pub/source/v${PG_VERSION}/${PG_PACKAGE}"

# 检查是否已存在安装包,存在则跳过下载
if [ ! -f "$PG_PACKAGE" ]; then
    wget $PG_URL
    if [ $? -ne 0 ]; then
        echo -e "${RED}下载失败,请手动下载 ${PG_URL}${NC}"
        exit 1
    fi
else
    echo -e "${YELLOW}安装包已存在,跳过下载${NC}"
fi

echo -e "${YELLOW}正在解压安装包...${NC}"
tar -xzvf $PG_PACKAGE
if [ $? -ne 0 ]; then
    echo -e "${RED}解压失败,请检查安装包完整性${NC}"
    exit 1
fi
cd postgresql-${PG_VERSION}
echo -e "${GREEN}解压完成${NC}"

# 3. 配置编译选项
echo -e "${YELLOW}正在配置编译参数...${NC}"
INSTALL_DIR="/usr/local/pgsql-${PG_VERSION}"
DATA_DIR="/data/pgsql"
PG_USER="postgres"

./configure --prefix=$INSTALL_DIR \
            --with-openssl \
            --with-zlib \
            --with-readline \
            --enable-thread-safety
if [ $? -ne 0 ]; then
    echo -e "${RED}配置失败,请检查编译环境${NC}"
    exit 1
fi
echo -e "${GREEN}配置完成${NC}"

# 4. 编译并安装
echo -e "${YELLOW}正在编译 PostgreSQL...这可能需要较长时间${NC}"
make world
if [ $? -ne 0 ]; then
    echo -e "${RED}编译失败,请检查编译日志${NC}"
    exit 1
fi

echo -e "${YELLOW}正在安装 PostgreSQL...${NC}"
make install-world
if [ $? -ne 0 ]; then
    echo -e "${RED}安装失败${NC}"
    exit 1
fi

# 建立软连接
ln -s $INSTALL_DIR /usr/local/pgsql
echo -e "${GREEN}编译安装完成${NC}"

# 5. 创建用户和数据目录
echo -e "${YELLOW}正在创建用户和数据目录...${NC}"
useradd $PG_USER
mkdir -p $DATA_DIR
chown -R $PG_USER:$PG_USER $DATA_DIR
chmod 700 $DATA_DIR
echo -e "${GREEN}用户和目录创建完成${NC}"

# 6. 初始化数据目录(交互式输入密码)
echo -e "${YELLOW}请设置 postgres 用户密码(输入密码不显示):${NC}"
read -s PG_PASSWORD
echo ""

echo -e "${YELLOW}正在初始化数据目录...${NC}"
su - $PG_USER -c "/usr/local/pgsql/bin/initdb -D $DATA_DIR --encoding=UTF8 --locale=en_US.UTF-8 --pwfile=<(echo '$PG_PASSWORD')"
if [ $? -ne 0 ]; then
    echo -e "${RED}初始化失败,请检查权限或密码格式${NC}"
    exit 1
fi
echo -e "${GREEN}数据目录初始化完成${NC}"

# 7. 配置 systemd 服务
echo -e "${YELLOW}正在配置开机自启动服务...${NC}"
cat > /usr/lib/systemd/system/postgresql.service << EOF
[Unit]
Description=PostgreSQL 13 database server
After=network.target

[Service]
Type=forking
User=$PG_USER
Group=$PG_USER
Environment=PGDATA=$DATA_DIR
ExecStart=/usr/local/pgsql/bin/pg_ctl start -D \$PGDATA -s -w -t 300
ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D \$PGDATA -s -m fast
ExecReload=/usr/local/pgsql/bin/pg_ctl reload -D \$PGDATA -s
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

# 8. 启动服务
echo -e "${YELLOW}正在启动 PostgreSQL 服务...${NC}"
systemctl daemon-reload
systemctl start postgresql
systemctl enable postgresql

if [ $? -ne 0 ]; then
    echo -e "${RED}服务启动失败,请检查日志:journalctl -xe${NC}"
    exit 1
fi
echo -e "${GREEN}服务启动成功并设置为开机自启${NC}"

# 9. 配置远程访问
echo -e "${YELLOW}正在配置远程访问...${NC}"
# 修改 pg_hba.conf(允许所有IP通过md5认证连接)
sed -i '/host    all             all             127.0.0.1\/32            md5/a host    all             all             0.0.0.0\/0          md5' $DATA_DIR/pg_hba.conf
# 修改 postgresql.conf(监听所有IP)
sed -i 's/^#listen_addresses = .*/listen_addresses = ''*'''/g' $DATA_DIR/postgresql.conf'

# 重启服务使配置生效
systemctl restart postgresql
echo -e "${GREEN}远程访问配置完成${NC}"

# 10. 配置环境变量
echo -e "${YELLOW}正在配置环境变量...${NC}"
cat > /etc/profile.d/pgsql.sh << EOF
export PATH=\$PATH:/usr/local/pgsql/bin
EOF
source /etc/profile
echo -e "${GREEN}环境变量配置完成${NC}"

# 11. 本地登录测试
echo -e "${YELLOW}正在测试本地登录...${NC}"
su - $PG_USER -c "psql -U $PG_USER -d postgres -c 'SELECT version();'"
if [ $? -ne 0 ]; then
    echo -e "${RED}登录测试失败,请检查密码或配置${NC}"
    exit 1
fi
echo -e "${GREEN}登录测试成功${NC}"

# 12. 输出完成信息
echo -e "${GREEN}===== PostgreSQL 13.4 部署完成 =====${NC}"
echo -e "${YELLOW}安装目录: ${INSTALL_DIR}${NC}"
echo -e "${YELLOW}数据目录: ${DATA_DIR}${NC}"
echo -e "${YELLOW}登录命令: ${NC}psql -U postgres -d postgres"
echo -e "${YELLOW}远程连接配置:${NC} 已允许所有IP通过 md5 认证连接"
echo -e "${YELLOW}建议操作:${NC} 创建普通用户并设置数据库权限(避免使用超级用户)"
shell脚本自动安装 PostgreSQL 13
xxx