通过源码编译安装
1. 下载源码
在PostgreSQL官方主页https://www.postgresql.org/ftp/source/下载区选择所需格式的源码包下载;
wget https://ftp.postgresql.org/pub/source/v12.3/postgresql-12.3.tar.gz
下载之后解压
tar xf postgresql-12.3.tar.gz
2. 运行configure程序配置编译选项
运行configure程序之前,需要先准备好编译环境和安装必要的包:
yum groupinstall "Development tools"
yum install -y bison flex readline-devel zlib-devel
在源代码目录中运行configure --help命令查看支持的配置编译选项:
cd postgresql-12.3
./configure --help|less
PostgreSQL支持的编译选项众多,常用的编译选项有:
- --prefix=PREFIX:指定安装目录,默认的安装目录为”/usr/local/pgsql“;
- --includedir=DIR:指定C和C++的头文件目录,默认的安装目录为”PREFIX/include“;
- --with-pgport=PORTNUM:指定初始化数据目录时的默认端口,这个值可以在安装之后进行修改(需要重启数据库),修改它只在自行制作RPM包时有用,其它时候意义并不大;
- --with-blocksize=BLOCKSIZE:指定数据文件的块大小,默认的是8kB,如果在OLAP场景下可以适当增加这个值到32kB,以提高OLAP的性能,但在OLTP场景下建议使用8kB默认值;
- --with-segsize=SEGSIZE:指定单个文件的大小,默认是1GB;
- --with-wal-blocksize=BLOCKSIZE:指定WAL文件的块大小,默认是8kB;
- --with-wal-segsize=SEGSIZE:指定单个WAL文件的大小,默认是16MB。
由于”--with-xxx-size“这4个参数都只能在编译的时候指定,所以在修改它们之前,请提前做好规划和严格的测试,否则后期再做调整,只能将数据导出重新导入,如果数据量很大会令人抓狂。
运行configure配置编译选项如下所示:
./configure --prefix=/web/pgsql12/ --with-pgport=5432
运行configure程序的国产中,如果遇到类似”configure:error:readline library not found“的错误,说明缺少所需的包或者开发包,通过yum进行安装即可。
3. 编译安装
在Linux中,PostgreSQL的编译和安装使用GNU make程序,编译使用gmake命令,安装使用gmake install命令。如果希望在编译和安装时,一次性将文档及附加模块全部进行编译和安装,可以使用gmake world命令和gmake install-world命令。对于已经安装的数据库,再单独对文档和模块进行编译和安装也是可以的,但仍然推荐使用带有world的编译和安装命令一次做完这些事,这样可以保证网络中所有数据库软件的一致性,也避免给后期维护工作带来麻烦。
执行gmak或gmake world程序进行编译,如下所示:
gmake
如果使用gmake进行编译,当看到最后一行的输出为”All of PostgreSQL successfully made. Ready to install.“说明已经编译成功。
如果使用gmake world进行编译,当看到最后一行的输出为”PostgreSQL,contrib,and documentation successfully made. Ready to install.“说明已经编译成功。
gamke install
如果使用gmake install进行安装,当看到最后一行的输出为”PostgreSQL installation complete.“说明已经安装成功。
如果使用gmake install-world进行安装,当看到最后一行的输出为”PostgreSQL,contrib,and documentation installation complete.“说明已经安装成功。
查看安装的PostgreSQL版本的命令如下所示:
/web/pgsql12/bin/postgres --version
postgres (PostgreSQL) 12.3
4. 设置一个软链接
有时候我们为了方便工作,会自己写一些shell或Python脚本处理一些定时任务,经常会通过类似/web/pg12.x这样的全路径调用一些工具,使用环境变量也会有一些其它的问题存在,如何尽可能的避免这种麻烦?很简单。
创建一个/web/pgsql的软链接指向当前版本即可,命令如下:
ln -s /web/pgsql12 /web/pgsql
当进行了版本变更之后,不需要调整大量的脚本,只需要修改这个软链接即可。
至此,我们已经成功的安装了PostgreSQL数据库:
tree -L 1 /web/pgsql12/
/web/pgsql12/
├── bin
├── include
├── lib
└── share
5. 创建操作系统用户
groupadd -g 1005 postgres
useradd -g 1005 -u 1005 postgres
id postgres
uid=1005(postgres) gid=1005(postgres) 组=1005(postgres)
注意事项: - 出于安全考虑,这个操作系统用户不能是root或者具有操作系统管理员权限的账号,例如拥有sudo权限的用户;
- 如果是部署集群,建议配置NTP服务,统一集群中每个节点的操作系统用户的uid和gid,如果集群中某些节点的数据库操作系统用户的uid和gid与其它节点不一致,可以通过groupmod命令和usermod命令进行修改,例:
groupmod -g 100 postgres
usermod -u 100 -g 100 postgres
6. 创建数据目录
也就是在磁盘上初始化一个数据的存储区域,通常我们称之为数据目录。
mkdir -p /web/data_5432
将数据目录的属主修改为我们创建的操作系统用户,并且修改数据目录的权限为0700,修改目录权限这一步其实并不需要,因为initdb会回收除PostgreSQL用户之外所有用户的访问权限。但我们应该明确知道数据目录包含所有存储在数据库里的数据,保护这个目录不受未授权的访问非常重要。
chown -R postgres.postgres /web/data_5432
chmod 0700 /web/data_5432
7. 初始化数据目录
[root@bl68 web]# /web/pgsql12/bin/initdb --help
initdb initializes a PostgreSQL database cluster.
Usage:
initdb [OPTION]... [DATADIR]
Options:
-A, --auth=METHOD 为本地用户指定pg_hba.conf文件中的认证方法,可以为md5、trust、password等,为了安装方便,默认的值是trust,但是除非你信任数据库实例所在服务器上的所有本地用户
--auth-host=METHOD 指定通过TCP/IP连接的本地用户在pg_hba.conf中使用的认证方法;
--auth-local=METHOD 指定通过UNIX Socket连接的本地用户在pg_hba.conf文件中的认证方法;
[-D, --pgdata=]DATADIR 将要初始化的数据目录,其它选项都可以省略,只有这个选项是必需;
-E, --encoding=ENCODING 设置数据库的默认编码,实际它是设置了template的编码,因为其它新创建的数据库都是以template1为模板克隆的。
-g, --allow-group-access 设置允许的用户组在数据目录的读或执行权限。
--locale=LOCALE 设置区域
--lc-collate=, --lc-ctype=, --lc-messages=LOCALE
--lc-monetary=, --lc-numeric=, --lc-time=LOCALE
为指定的分类设置区域
--no-locale 等价于 --locale=C
--pwfile=FILE 从一个文件读取第一行作为数据库超级用户的口令
-T, --text-search-config=CFG 设置默认的文本搜索设置
-U, --username=NAME 设置数据库超级用户的用户名,默认是postgres
-W, --pwprompt 在initdb的过程中为数据库超级用户设置一个密码。
-X, --waldir=WALDIR 指定预写日志(WAL)的存储目录
--wal-segsize=SIZE 指定单个WAL文件的大小,默认是8kB
su - postgres
/web/pgsql12/bin/initdb -D /web/data_5432/
至此数据库目录初始化完成。
8. 启动和停止数据库服务器
启动
su - postgres
/web/pgsql12/bin/pg_ctl -D /web/data_5432/ start
查看状态
/web/pgsql12/bin/pg_ctl -D /web/data_5432/ status
停止
/web/pgsql12/bin/pg_ctl -D /web/data_5432/ stop