技术交流QQ群:①185473046   ②190706903   ③203744115   网站地图
登录

下次自动登录
现在的位置: 首页PostgreSQL>正文
Linux下源码编译安装PostgreSQL数据库
2022年06月04日 PostgreSQL 暂无评论 ⁄ 被围观 4,428次+

PostgreSQL是一个功能非常强大的、源代码开放的关系型数据库,PostgreSQL被业界誉为“最先进的开源数据库”,主要面向企业复杂查询SQL的OLTP业务场景, 支持NoSQL数据类型(hstore/JSON/XML)

一、防火墙配置

CentOS 7.x 8.x 默认使用的是firewall作为防火墙,这里改为iptables防火墙。

1、关闭firewall:

systemctl stop firewalld.service #停止firewall

systemctl disable firewalld.service #禁止firewall开机启动

systemctl mask firewalld

systemctl stop firewalld

yum remove firewalld

2、安装iptables防火墙

yum install iptables-services #安装

vi /etc/sysconfig/iptables #编辑防火墙配置文件

# sample configuration for iptables service

# you can edit this manually or use system-config-firewall

# please do not ask us to add additional ports/services to this default configuration

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 5432 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited

-A FORWARD -j REJECT --reject-with icmp-host-prohibited

COMMIT

:wq! #保存退出

systemctl restart iptables.service #最后重启防火墙使配置生效

systemctl enable iptables.service #设置防火墙开机启动

/usr/libexec/iptables/iptables.init restart #重启防火墙

防火墙端口说明:

PostgreSQL默认使用tcp 5432端口

二、关闭SELINUX

vi /etc/selinux/config

#SELINUX=enforcing #注释掉

#SELINUXTYPE=targeted #注释掉

SELINUX=disabled #增加

:wq! #保存退出

setenforce 0 #使配置立即生效

三、下载软件包

官方网站:https://www.postgresql.org/

源码包下载地址:https://www.postgresql.org/ftp/source/

目前最新稳定版:https://ftp.postgresql.org/pub/source/v14.3/postgresql-14.3.tar.gz

上传postgresql-14.3.tar.gz到/usr/local/src目录下

四、安装编译工具包

yum install tcl tcl-devel uuid-devel perl-ExtUtils-Embed readline-devel zlib-devel pam-devel libxml2-devel libxslt-devel openldap-devel python-devel gcc-c++ openssl-devel cmake gcc* readline-devel

五、编译安装postgresql

5.1创建目录

mkdir -p /usr/local/pgsql #创建安装目录

mkdir -p /usr/local/pgsql/data #创建数据库存放目录

mkdir -p /data/log/pg_log  #创建数据库日志存放目录

5.2编译PostgreSQL

cd /usr/local/src

tar zxvf postgresql-14.3.tar.gz #解压

cd postgresql-14.3

./configure --prefix=/usr/local/pgsql --with-openssl --with-pgport=5432 --with-tcl --with-perl --with-python --with-libxml --with-libxslt --with-ossp-uuid --with-pam --with-ldap

gmake world #gmake包括第三方插件全部编译

gmake install-world #包括第三方插件全部安装

5.3创建运行用户

#创建PostgreSQL运行用户,PostgreSQL不允许使用root用户运行服务

#创建用户群组postgres

groupadd postgres

#创建用户postgres,并加入postgres组

useradd -g postgres postgres

#设置权限

chown postgres.postgres -R /usr/local/pgsql

chown postgres.postgres -R /usr/local/pgsql/data

chown postgres:postgres /data/log/pg_log  #设置日志目录权限

chmod 700  /data/log/pg_log  #设置日志目录权限

5.4把postgresql加入系统环境变量

vi /etc/profile #添加如下3行内容

export PGHOME=/usr/local/pgsql

export PGDATA=/usr/local/pgsql/data

export PATH=$PATH:$PGHOME/bin

export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH

:wq! #保存退出

source /etc/profile

5.5初始化数据库

#切换到postgres用户

su - postgres

#初始化数据库

/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data --encoding=UTF8 --lc-collate=en_US.UTF-8 --lc-ctype=en_US.UTF-8

#启动数据库

/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start #启动

/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile stop #停止

/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile restart #重启

/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile status #查看状态

5.6设置PostgreSQL开机启动

5.6.1使用init启动(适合CentOS 7.x)

#切换到root

su - root

#拷贝启动文件

cp /usr/local/src/postgresql-14.3/contrib/start-scripts/linux /etc/init.d/postgresql

#设置运行权限

chmod +x /etc/init.d/postgresql

#编辑修改

vi /etc/init.d/postgresql

prefix=/usr/local/pgsql #安装目录

PGDATA="/usr/local/pgsql/data" #数据库存放目录

PGUSER=postgres #运行用户

:wq! #保存退出

service postgresql start

service postgresql restart

service postgresql stop

chkconfig postgresql on

5.6.2使用Systemd启动(适合CentOS 7.x 8.x )

vi /usr/lib/systemd/system/postgresql.service

[Unit]

Description=The PostgreSQL Database Server

After=syslog.target

After=network.target

[Service]

Type=forking

User=postgres

Group=postgres

ExecStart=/usr/local/pgsql/bin/pg_ctl start -D /usr/local/pgsql/data

ExecStop=/usr/local/pgsql/bin/pg_ctl stop

ExecReload=/usr/local/pgsql/bin/pg_ctl reload -D /usr/local/pgsql/data

TimeoutSec=300

[Install]

WantedBy=multi-user.target

:wq! #保存退出

systemctl daemon-reload

systemctl start postgresql

systemctl enable postgresql

systemctl restart postgresql

systemctl status postgresql

5.6.3使用启动脚本(适合CentOS 7.x 8.x)

#切换到su -  postgres用户下操作

#创建编辑启动脚本

vi  /usr/local/pgsql/pgsql.sh

#!/bin/bash

# 设置 PostgreSQL 安装路径和数据目录

PG_BIN="/usr/local/pgsql/bin"

PG_DATA="/usr/local/pgsql/data" # 修改为你的数据目录路径

PG_LOG="/usr/local/pgsql/data/pg_server.log" #启动日志路径

# 启动 PostgreSQL

start_postgresql() {

echo "Starting PostgreSQL..."

${PG_BIN}/pg_ctl -D ${PG_DATA} start -l ${PG_LOG} > /dev/null 2>&1

if [ $? -eq 0 ]; then

echo "PostgreSQL started successfully."

else

echo "Failed to start PostgreSQL."

fi

}

# 关闭 PostgreSQL

stop_postgresql() {

echo "Stopping PostgreSQL..."

${PG_BIN}/pg_ctl -D ${PG_DATA} stop -l ${PG_LOG} > /dev/null 2>&1

if [ $? -eq 0 ]; then

echo "PostgreSQL stopped successfully."

else

echo "Failed to stop PostgreSQL."

fi

}

# 重启 PostgreSQL

restart_postgresql() {

echo "Restarting PostgreSQL..."

${PG_BIN}/pg_ctl -D ${PG_DATA} restart -l ${PG_LOG} > /dev/null 2>&1

if [ $? -eq 0 ]; then

echo "PostgreSQL restarted successfully."

else

echo "Failed to restart PostgreSQL."

fi

}

# 检查 PostgreSQL 状态

check_postgresql_status() {

${PG_BIN}/pg_ctl -D ${PG_DATA} status -l ${PG_LOG} > /dev/null 2>&1

if [ $? -eq 0 ]; then

echo "PostgreSQL is running."

else

echo "PostgreSQL is not running."

fi

}

# 根据输入参数执行对应操作

case $1 in

start)

start_postgresql

;;

stop)

stop_postgresql

;;

restart)

restart_postgresql

;;

status)

check_postgresql_status

;;

*)

echo "Usage: $0 {start|stop|restart|status}"

exit 1

;;

esac

:wq! #保存退出

#添加脚本执行权限

chmod +x  /usr/local/pgsql/pgsql.sh

sh  /usr/local/pgsql/pgsql.sh      start|stop|restart|status

#添加开机启动

#切换到root用户下执行

vi   /etc/rc.d/rc.local

su - postgres -c "/bin/sh  /usr/local/pgsql/pgsql.sh  start "

:wq!  #保存退出

#默认/etc/rc.local没有执行权限,需要手动添加执行权限

chmod +x /etc/rc.d/rc.local

5.7进入postgresql控制台

#初始化数据库后,默认会生成一个名为postgres的数据库和一个名为postgres的数据库用户,没有密码。

#postgres用户作为数据库的管理员,用来创建其他新的数据库和数据库用户。

#切换到postgres用户

su - postgres

#进入控制台

psql -U postgres -d postgres -h 127.0.0.1 -p 5432

参数:-U指定用户,-d指定数据库,-h指定服务器,-p指定端口。

#命令简写,当前的Linux系统用户postgres,同时也是PostgreSQL的数据库用户postgres,同时PostgreSQL内部有与当前系统用户同名的数据库postgres

#直接使用psql命令即可登录控制台

#修改数据库用户postgres的密码为postgres

ALTER USER postgres WITH PASSWORD 'postgres';

postgres=# ALTER USER postgres WITH PASSWORD 'postgres';

ALTER ROLE

postgres=#\q #退出控制台

5.8修改配置文件

#修改数据库配置文件

vi /usr/local/pgsql/data/postgresql.conf

port = 5432

max_connections = 1000

listen_addresses = '*' #监听本机所有ip,也可以按需设置

log_destination = 'csvlog' #日志格式,值为stderr,csvlog,syslog,and eventlog之一

logging_collector = on    #开启日志功能,默认是off不启用日志

log_directory = 'log'   #日志路径,默认是PGDATA的相对路径,即{PGDATA}/log,可以使用自定义目录

#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'  #日志文件命名形式,默认为每秒一个文件(postgresql-2023-02-28_231548.log)

log_filename = 'postgresql-%d.log'  #日志文件命名方式,最多保存一个月的日志

#同时要打开log_truncate_on_rotation = on,否则日志以追加的方式显示在后面

log_file_mode = 0600 #日志文件权限

log_rotation_age = 1d   #单个日志文件的生存期,默认1天,在日志文件大小没有达到log_rotation_size时,一天只生成一个日志文件

log_rotation_size = 1024MB  #单个日志文件的大小,如果时间没有超过log_rotation_age,一个日志文件最大只能到1024M,否则将新生成一个日志文件

log_truncate_on_rotation = on #当日志文件已存在时,该配置如果为off,新生成的日志将在文件尾部追加,如果为on,则会覆盖原来的日志

log_lock_waits = off  #控制当一个会话等待时间超过deadlock_timeout而被锁时是否产生一个日志信息。在判断一个锁等待是否会影响性能时是有用的,缺省是off

log_statement = 'none'  # none, ddl, mod, all 控制记录哪些SQL语句,none不记录;ddl记录所有数据定义命令,比如CREATE,ALTER,和DROP 语句;mod记录所有ddl语句,加上数据修改语句INSERT,UPDATE等;all记录所有执行的语句,将此配置设置为all可跟踪整个数据库执行的SQL语句

log_duration = on  #记录每条SQL语句执行完成消耗的时间,将此配置设置为on,用于统计哪些SQL语句耗时较长

log_min_duration_statement = 0   #-1表示不可用,0将记录所有SQL语句和它们的耗时,>0只记录那些耗时超过(或等于)这个值(ms)的SQL语句,log_min_duration_statement会将SQL语句和耗时在同一行记录

log_connections = off  #不记录连接日志

log_disconnections = off  #不记录连接断开日志

log_line_prefix = '%m [%p] %u %d %r'   #日志输出格式,根据需要设置(能够记录时间,用户名称,数据库名称,客户端IP和端口等信息)

log_timezone = 'Asia/Shanghai'   #日志时区,和服务器设置同一个时区

:wq! #保存退出

#设置数据库访问权限

vi /usr/local/pgsql/data/pg_hba.conf #添加修改

# TYPE DATABASE USER ADDRESS METHOD

# IPv4 local connections:

host all all 127.0.0.1/32 trust

host all all 0.0.0.0/0 md5

#所有数据库(all)、所有用户(all)、从本机(127.0.0.1/32)均可免密访问(trust)

#从任何ip(0.0.0.0/0 )都需要输入正确的密码(md5)才能访问,ip可按需设置

#重启服务,由于当前是在postgres用户下,会提示输入root用户的密码才能重启

systemctl restart postgresql

#注意

在postgres用户下,从本机登录postgres数据库,无论pg_hba.conf文件里面设置的是trust还是md5,均可免密登录。

在其他用户(root)下,从本机登录postgres数据库,pg_hba.conf文件里面设置的是trust,免密访问。

在其他用户(root)下,从本机登录postgres数据库,pg_hba.conf文件里面设置的是md5,则需要输入数据库用户postgres的密码才能登录。

5.9设置postgresql数据库客户端psql版本和服务端server版本一致

#查看客户端版本命令:psql --version

psql (PostgreSQL) 10.15

#客户端版本为10.15,我们安装的服务端版本是14.3

#查找客户端psql的路径命令:which -a psql

/usr/bin/psql

/data/server/pgsql/bin/psql

#备份默认的版本

mv /usr/bin/psql /usr/bin/psql.bak

#软连接新版本到默认路径

ln -s /data/server/pgsql/bin/psql /usr/bin/psql

#再次查看客户端版本:psql --version

psql (PostgreSQL) 14.3

#现在postgresql数据库客户端psql版本和服务端server版本已经一致了。

六、使用客户端远程连接PostgreSQL数据库

Windows下PostgreSQL数据库客户端连接工具推荐:

Navicat 15 for PostgreSQL

pgAdmin 4

数据库地址:192.168.21.179

连接端口:5432

数据库名:postgres

数据库用户名:postgres

数据库用户密码:postgres

出现Crypt key is missing,pgAdmin 4第一次打开时要设置一个密码。

扩展阅读:

#创建数据库用户dbuser并设置密码为123456

CREATE USER dbuser WITH PASSWORD '123456';

#创建数据库testdb,指定所有者为dbuser

CREATE DATABASE testdb OWNER dbuser;

#设置用户权限,把testdb数据库的所有权限都赋予dbuser,否则dbuser只能登录控制台,没有任何数据库操作权限

GRANT ALL PRIVILEGES ON DATABASE testdb to dbuser;

#PG日志相关参数

log_destination = 'csvlog' #日志格式,值为stderr,csvlog,syslog,and eventlog之一

logging_collector = on #启用日志

log_directory = 'log' #日志文件存储目录

log_filename = 'postgresql-%j.log' #日志文件命名方式,最多保存一年的日志.同时和参数log_truncate_on_rotation = on同时使用,否则日志以追加的方式显示在后面

log_truncate_on_rotation = on #是否截断日志文件

log_file_mode = 0600 #日志文件权限 log_truncate_on_rotation = on #是否截断日志文件

#重点参数说明

log_destination = 'csvlog'

log_filename = 'postgresql-%j.log'

log_truncate_on_rotation = on

log_destination建议设置为csvlog,以便将日志链接到postgresql中查看

log_filename 设置日志文件名,需结合log_truncate_on_rotation = on使用,可根据自己的需要调整

例如:

log_filename = 'postgresql-%i.log' #最多保存12小时的日志,每小时一个文件

log_filename = 'postgresql-%h.log' #最多保存24小时的日志,每小时一个文件

log_filename = 'postgresql-%w.log' #最多保存一周的日志,每天一个文件

log_filename = 'postgresql-%d.log' #最多保存一个月的日志,每天一个文件

log_filename = 'postgresql-%j.log' #最多保存一年的日志,每天一个文件

log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' #按照时间命令,每天一个文件,并且最多保留1个月的日志

至此,Linux下源码编译安装PostgreSQL数据库完成。

     

  系统运维技术交流QQ群:①185473046 系统运维技术交流□Ⅰ ②190706903 系统运维技术交流™Ⅱ ③203744115 系统运维技术交流™Ⅲ

给我留言

您必须 [ 登录 ] 才能发表留言!



Copyright© 2011-2024 系统运维 All rights reserved
版权声明:本站所有文章均为作者原创内容,如需转载,请注明出处及原文链接
陕ICP备11001040号-3