在通过手动熟悉安装创建postgreSQL的基础上,我们试图继续解放我们的双手,实现整个部署过程的无干涉全自动过程。实现过程如下:
- 创建一个自动化安装的脚本,一个自动初始化和创建第一个用户数据库的自动化脚本
- 执行脚本,完成安装部署
- 验证结果
下面我们就展示一下这个自动化过程的具体过程:
在正式开始前,先介绍一下演示环境的具体配置:
一台操作系统为Ubuntu20的虚拟机,可以连接外网,内存2G,虚拟硬盘10G。把下面两个脚本文件上传至该服务器某个临时目录。所有操作都是用root用户进行。
脚本1:install_pg.sh
功能介绍:这个脚本主要完成数据库软件的安装过程自动化。有以下几个参数可以选择定制:
- 数据库版本号:必选,目前12以上是试过可以的
- 数据库名称:可选,默认值 db1
- 用户表空间名称:可选,默认值tbs1
- 数据库共享内存:可选,默认值2G, 格式:数字+MB|GB,推荐物理内存的25%
- 临时段内存:可选,默认64MB, 格式:数字+MB|GB
- 会话内存:可选,默认16MB,格式:数字+MB|GB,这是单个会话分配内存,实际使用内存会因为会话数的增加成倍增加
软件安装完成后会调用createdb_pg.sh脚本进行数据库的初始化。操作系统用户新增postgres
#!/bin/bash
PGVERSION=$1
DBNAME=$2
TBSNAME=$3
SHARE_MEM=$4
TEMP_MEM=$5
WORK_MEM=$6
if [ -z $PGVERSION ]; then
echo "Unknown version."
exit
fi
su - postgres -c "psql --version"
if [ $? -eq 0 ]; then
echo "postgresql has already installed."
else
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
if [ $? -ne 0 ]; then
exit 1
fi
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
if [ $? -ne 0 ]; then
exit 1
fi
sudo apt-get update
if [ $? -ne 0 ]; then
exit 1
fi
sudo apt-get -y install postgresql-$PGVERSION
if [ $? -ne 0 ]; then
exit 1
fi
echo "set OS user [postgres] password:"
passwd postgres
fi
echo `chmod +x createdb_pg.sh`
if [ $? -ne 0 ]; then
exit 1
fi
echo `chown -R postgres:postgres createdb_pg.sh`
if [ $? -ne 0 ]; then
exit 1
fi
echo `cp createdb_pg.sh /var/lib/postgresql/createdb_pg.sh`
if [ $? -ne 0 ]; then
exit 1
fi
echo "Start create database"$DBNAME
echo `su - postgres -s /bin/bash /var/lib/postgresql/createdb_pg.sh $PGVERSION $DBNAME $TBSNAME $SHARE_MEM $TEMP_MEM $WORK_MEM`
if [ $? -eq 0 ]; then
echo `systemctl restart postgresql`
echo `systemctl status postgresql`
echo "PostgreSQL-"$PGVERSION" install complete."
else
echo "PostgreSQL-"$PGVERSION" install not complete."
fi
脚本2:createdb_pg.sh
功能介绍:这个脚本主要进行数据库的典型参数的初始化和用户自定义数据库的创建,运行这个脚本有如下几个参数可定制:
- 数据库版本号:必选,目前12以上是试过可以的
- 数据库名称:可选,默认值 db1
- 用户表空间名称:可选,默认值tbs1
- 数据库共享内存:可选,默认值2G, 格式:数字+MB|GB,推荐物理内存的25%
- 临时段内存:可选,默认64MB, 格式:数字+MB|GB
- 会话内存:可选,默认16MB,格式:数字+MB|GB,这是单个会话分配内存,实际使用内存会因为会话数的增加成倍增加
主要初始化项目如下:
初始化超级用户postgres的口令为postgres
生成用户数据库:db1(缺省)
生成用户表空间:tbs1(缺省)
生成用户数据库的管理员及口令:admin/app
配置pg_hba.conf:外网访问数据库权限放开,加密方式采用:scram-sha-256
配置数据库参数:
listen_addresses = '*'
shared_buffers = '2G'(缺省)
temp_buffers = '64MB'(缺省)
work_mem = '16MB'(缺省)
max_connections=500
password_encryption=scram-sha-256
#!/bin/bash
PGVERSION=$1
DBNAME=$2
TBSNAME=$3
SHARE_MEM=$4
TEMP_MEM=$5
WORK_MEM=$6
MAX_CONNECTS=500
PASS_ENCRYPTION='scram-sha-256'
PG_ADMIN=admin
PG_ADMIN_PWD=app
# default value
if [ -z $PGVERSION ]; then
PGVERSION=12
fi
if [ -z $DBNAME ]; then
DBNAME=db1
fi
if [ -z $TBSNAME ]; then
TBSNAME=tbs1
fi
if [ -z $SHARE_MEM ]; then
SHARE_MEM=2GB
fi
if [ -z $TEMP_MEM ]; then
TEMP_MEM=64MB
fi
if [ -z $WORK_MEM ]; then
WORK_MEM=16MB
fi
PG_DATA=/var/lib/postgresql/$PGVERSION/main
PG_DUMP=/var/lib/postgresql/pdump
PG_CONFIG=/etc/postgresql/$PGVERSION/main
if [ -z $PGDATA ]; then
echo "export PGDATA="$PG_DATA >> ~/.bash_login
fi
if [ -z $PGDUMP ]; then
echo "export PGDUMP="$PG_DUMP >> ~/.bash_login
fi
if [ -z $PGCONFIG ]; then
echo "export PGCONFIG="$PG_CONFIG >> ~/.bash_login
fi
echo `source ~/.bash_login`
if [ $? -ne 0 ]; then
exit 1
fi
if [ ! -e $PGDATA ];then
echo "Directory path[$PGDATA] is not exists."
exit 1
fi
if [ ! -e $PGDUMP ];then
echo "Create "$PGDUMP
mkdir $PGDUMP
fi
if [ ! -e $PGCONFIG ];then
echo "Directory path[$PGCONFIG] is not exists."
exit 1
fi
if [ ! -e $PGDATA"/"$TBSNAME ]; then
mkdir $PGDATA"/"$TBSNAME
fi
if [ $? -ne 0 ]; then
exit 1
fi
echo "host all all 0.0.0.0/0 scram-sha-256" >> $PGCONFIG/pg_hba.conf
if [ $? -ne 0 ]; then
exit 1
fi
psql<<EOF
alter user postgres password 'postgres';
alter system set listen_addresses = '*';
alter system set shared_buffers = '$SHARE_MEM';
alter system set temp_buffers = '$TEMP_MEM';
alter system set work_mem = '$WORK_MEM';
alter system set max_connections=$MAX_CONNECTS;
alter system set password_encryption='$PASS_ENCRYPTION';
CREATE ROLE "$PG_ADMIN" SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN PASSWORD '$PG_ADMIN_PWD';
CREATE TABLESPACE $TBSNAME OWNER $PG_ADMIN LOCATION '$PGDATA/$TBSNAME';
create database $DBNAME owner $PG_ADMIN TABLESPACE $TBSNAME;
GRANT ALL PRIVILEGES ON DATABASE $DBNAME TO $PG_ADMIN;
\q
EOF
if [ $? -eq 0 ]; then
echo "PostgreSQL-"$PGVERSION" install successful!"
echo "Database name:"$DBNAME
echo "Admin username/password:"$PG_ADMIN/$PG_ADMIN_PWD
echo "PGDATA="$PGDATA
echo "PGDUMP="$PGDUMP
echo "PGCONFIG="$PGCONFIG
echo "SHARE_MEMERY="$SHARE_MEM
echo "TEMP_MEMERY="$TEMP_MEM
echo "WORK_MEMERY="$WORK_MEM
echo "********create database $DBNAME complete!********"
echo "You can use this comman to confirm new database: su postgres -c \"psql -U $PG_ADMIN -d $DBNAME -c 'select 1;'"
else
echo "PostgreSQL-"$PGVERSION" install not complete."
fi
自动化部署步骤
- 进入脚本文件所在目录/home/temp,并授执行权限
cd /home/temp
chmod +x install_pg.sh
- 执行脚本,这里安装14版本
. install_pg.sh 14
- 检查结果
su - postgres -c "psql -U postgres -d postgres -c'select 1 as n;'"
n
----------
1