# 一、安装说明
# 1、源码定义安装说明
# 源码安装PostgreSQL可以自定义配置,省去很多apt默认安装带来的配置冲突,在后续使用中会遇到诸多问题。一般生产都是推荐源码安装,更灵活,标准化。
# 提前说明安装中的各文件路径供参考。
# PostgreSQL目录[自定义创建,pg内容均存放在该目录下]:/opt/pgsql/
# 源码目录:/opt/pgsql/postgresql-16.2
# 安装目录:/opt/pgsql/pgsql-16.2
# 数据目录:/opt/pgsql/data
# 用户目录:/home/postgres
# 2、官网地址
# PostgreSQL的官方地址:https://www.postgresql.org
# PostgreSQL的国内社区:http://www.postgres.cn/v2/home
# 编译后的程序下载地址:
# https://www.postgresql.org/download/
# 编译源代码下载地址
# https://www.postgresql.org/ftp/source/
# 3、避免权限不够,可以直接使用root安装
# 建议以下可以直接使用root用户进行操作
su root
# 4、刷新本地包索引
# Ubuntu系统设置中没有software & Updates
# sudo apt-get install software-properties-gtk
apt-get update
apt-get upgrade
# sudo apt-get install aptitude
# 安装make
apt-get install make
# 二、下载安装包和依赖包
# 1、安装依赖包
# 此问题为系统定位不到软件包,无法安装
apt-get install build-essential
apt-get install libreadline-dev
apt-get install zlib1g zlib1g-dev
apt-get install bison
apt-get install flex
apt-get install libpq-dev
apt-get install libicu-dev
apt-get install libcommon-sense-perl
apt-get install libjson-perl
apt-get install libjson-xs-perl
apt-get install libpq5
apt-get install libtypes-serialiser-perl
apt-get install sysstat
# 2、下载安装包
# 两种方法均可下载源码,最简版推荐第二种安装。
# 通过官网https://www.postgresql.org/ftp/source/上的FTP服务器下载tar文件。注:这里下载的安装包不同操作系统均适用。打开官网选择对应的版本 。
# 这里选择最新的16.2版本,点击下载后缀名为tar.gz的文件即可。
# 通过wegt下载到当前路径下,查看官网替换成指定版本对应的名称。
# wget https://ftp.postgresql.org/pub/source/[版本号]/[tar.gz后缀文件名]
# 例如此处下载16.2版本的tar.gz
mkdir -p /opt/pgsql/
cd /opt/pgsql/
wget https://ftp.postgresql.org/pub/source/v16.2/postgresql-16.2.tar.gz
# 三、安装PostgreSQL
# 1、安装源码
# 解压安装包到指定目录下
cd /opt/pgsql/
tar -zxvf postgresql-16.2.tar.gz -C /opt/pgsql/
# 2、配置编译
# 进入解压过的源码文件下,指定安装到/opt/pgsql/pgsql-16.2
# –prefix=prefix安装到prefix指向的目录,否则默认为/usr/local/pgsql
mkdir -p /opt/pgsql/pgsql-16.2
cd /opt/pgsql/postgresql-16.2/
./configure --prefix=/opt/pgsql/pgsql-16.2
# 此处若出现如下报错提示
<!--
configure: error: ICU library not found
If you have ICU already installed, see config.log for details on the
failure. It is possible the compiler isn't looking in the proper directory.
Use --without-icu to disable ICU support.
-->
# 这个错误表明在配置 PostgreSQL 16.2 时,找不到 ICU 库。ICU 是一个用于处理国际化和本地化的开源库。解决这个问题的方法是安装 ICU 库或者禁用 ICU 支持。
# apt-get install libicu-dev
# 如果你不需要 ICU 支持,可以使用 --without-icu 参数禁用它。在运行 ./configure 命令时添加该参数:./configure --without-icu 这样会在编译 PostgreSQL 时禁用 ICU 支持。
# 如果你已经安装了 ICU 库,但是配置时仍然找不到它,可能是因为编译器没有查找到正确的路径。你可以通过设置 LD_LIBRARY_PATH 环境变量来指定 ICU 库的安装路径: export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
# 查看日志
cat config.log
# 我不管咋处理,这个错误都一直有,直接禁用icu
# 禁用icu编译
./configure --prefix=/opt/pgsql/pgsql-16.2 --without-icu
# 3、编译项目,时间比较久
make && make install
# 至此,已完成postgreql的安装。进入/opt/pgsql/pgsql-16.2目录可以看到安装后的postgresql的文件。
# 4、验证
# 在make install之后,会在前面configure指定的路径中生成几个文件夹bin,include,lib,share文件夹。
# 验证是否安装成功可以运行bin下面的pg_config:
cd /opt/pgsql/pgsql-16.2/bin
./pg_config
# 如果有配置信息,那么安装成功。
# 5、创建用户
# 创建用户组postgres并创建用户postgres
groupadd postgres
useradd -g postgres postgres
id postgres
<!--# 输入如下:
uid=1001(postgres) gid=1001(postgres) groups=1001(postgres)
-->
# 设置密码
passwd postgres
<!--
输入密码,我设置的与root密码相同,好记
-->
# 6、初始化用户
# 创建postgres文件夹
mkdir /home/postgres
# 设置权限
chmod 755 /home/postgres
chown postgres:postgres /home/postgres
# postgres用户初始化
cp -a /etc/skel/. /home/postgres
vim /etc/passwd
# 最后一行为postgres:x:1001:1001::/home/postgres:/bin/sh
# 将sh修改为bash
postgres:x:1001:1001::/home/postgres:/bin/bash
# 7、创建数据目录
# 创建postgresql数据库的数据主目录并修改文件所有者
mkdir -p /opt/pgsql/pgsql-16.2/data
chown postgres:postgres /opt/pgsql/pgsql-16.2/data
# 四、配置PostgreSQL
# 1、配置环境
# 为了方便,可以将该bin路径添加到PATH变量中。
vim /etc/profile
# 在末尾添加如下配置,PGHOME为pg的安装目录路径,PGDATA为pg的数据目录路径。
# PostsQL
export PGHOME=/opt/pgsql/pgsql-16.2
export PGDATA=/opt/pgsql/pgsql-16.2/data
export PATH=$PATH:$PGHOME/bin
# 重新加载系统环境变量
source /etc/profile
# 2、初始化数据库
# 切换到postgre用户,并使用initdb初始化数据库
su - postgres
cd /opt/pgsql/pgsql-16.2/data
initdb
# 如果出现下面这个就初始化成功
<!--
Success. You can now start the database server using:
pg_ctl -D /opt/pgsql/data -l logfile start
-->
# 返回root用户,可以看到data目录下已经被初始化
su root
cd /opt/pgsql/pgsql-16.2/data
ls
<!--
base pg_ident.conf pg_serial pg_tblspc postgresql.auto.conf
global pg_logical pg_snapshots pg_twophase postgresql.conf
pg_commit_ts pg_multixact pg_stat PG_VERSION
pg_dynshmem pg_notify pg_stat_tmp pg_wal
pg_hba.conf pg_replslot pg_subtrans pg_xact
-->
# 3、开机自启动
su root
# 修改启动文件
cd /opt/pgsql/postgresql-16.2/contrib/start-scripts
# 修改linux可执行
chmod a+x linux
# 修改linux文件的两个变量
# prefix设置为postgresql的安装路径:/opt/pgsql/pgsql-16.2
# PGDATA设置为postgresql的数据目录路径:/opt/pgsql/pgsql-16.2/data
# 注意, PGUSER 为运行 postgres 的用户
vim /opt/pgsql/postgresql-16.2/contrib/start-scripts/linux
# 先在顶部添加俩尖括号之间的内容,如下:#! /bin/bash
<!--
### BEGIN INIT INFO
# Provides: hutu
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start hutu daemon at boot time
# Description: Start hutu daemon at boot time
### END INIT INFO
-->
prefix=/opt/pgsql/pgsql-16.2
PGDATA="/opt/pgsql/pgsql-16.2/data"
# 复制到启动路径下,命名为postgresql
# init.d无法配置自动重启
# cp linux /etc/init.d/postgresql
cp /opt/pgsql/postgresql-16.2/contrib/start-scripts/linux /usr/local/bin/postgresql
# 更改文件可执行
# chmod +x /etc/init.d/postgresql
chmod +x /usr/local/bin/postgresql
# 创建一个 systemd 服务单元文件,让系统在启动时自动执行该脚本。创建并编辑一个新的服务单元文件,例如 postgresql.service:
vim /etc/systemd/system/postgresql.service
# 在编辑器中添加以下内容
# 这里的 ExecStart 指定了要执行的脚本文件的完整路径。
[Unit]
Description=PostgreSQL RDBMS
After=network.target
[Service]
Type=forking
User=postgres
Group=postgres
ExecStart=/opt/pgsql/pgsql-16.2/bin/pg_ctl start -D /opt/pgsql/pgsql-16.2/data -s -o "-p 5432"
ExecStop=/opt/pgsql/pgsql-16.2/bin/pg_ctl stop -D /opt/pgsql/pgsql-16.2/data -s -m fast
ExecReload=/opt/pgsql/pgsql-16.2/bin/pg_ctl reload -D /opt/pgsql/pgsql-16.2/data -s
[Install]
WantedBy=multi-user.target
<!--
# 测试脚本,废
[Unit]
Description=PostgresqlAutoStart
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/postgresql
[Install]
WantedBy=multi-user.target
-->
# 保存并退出编辑器
# 重新加载 systemd 管理的服务文件,使新的服务单元生效
systemctl daemon-reload
# 启用服务,使其在系统启动时自动执行
systemctl enable postgresql.service
systemctl start postgresql
# 现在,你的脚本文件应该会在系统启动时自动执行了。你可以重新启动系统来验证该功能是否正常运行
# 查看启动列表
systemctl list-unit-files
# update-rc.d命令没有启动成功,改成systemctl控制
# 然后使用 update-rc.d 命令将该脚本添加到系统的启动目录中
# update-rc.d postgresql defaults
# 4、重启查看状态
su root
systemctl status postgresql
# 其他常用命令
<!--
systemctl daemon-reload
systemctl stop postgresql
systemctl start postgresql
systemctl status postgresql
systemctl enable postgresql.service
systemctl disable postgresql.service
systemctl restart postgresql
-->
# 5、启动验证
# 进入postgres用户启动postgresql,测试创建数据库和数据表。
# 切换postgres用户
su - postgres
# 进入postgresql
psql
# 查看数据库,默认数据库postgres和template0、template1
\l
# 创建数据数据库testdb
create database testdb;
# 看到已经创建数据库testdb
\l
# 进入数据库testdb
\c testdb;
<!--
You are now connected to database "testdb" as user "postgres".
-->
# 创建表
create table t_user (id integer, name text);
# 插入测试数据
insert into t_user values (1,'hutu');
insert into t_user values (2,'糊涂');
# 查询数据
select * from t_user;
<!--
id | name
----+------
1 | hutu
2 | 糊涂
(2 rows)
-->
# 查看数据表
\d
<!--
List of relations
Schema | Name | Type | Owner
--------+--------+-------+----------
public | t_user | table | postgres
(1 row)
-->
# 退出psql窗口
\q
# 6、常用运维操作
# 修改/pgsql/postgresql/data目录下的两个文件。
# postgresql.conf 配置PostgreSQL数据库服务器的相应的参数。
# pg_hba.conf 配置对数据库的访问权限。
# 修改监听所有网络以及数据库连接数
# 修改配置文件
# 先备份
cd /opt/pgsql/pgsql-16.2/data
cp postgresql.conf postgresql.conf.bak20240402
vim /opt/pgsql/pgsql-16.2/data/postgresql.conf
# listen_addresses = 'localhost' 监听本机,'*'监听所有网络
listen_addresses = '*'
# max_connections 数据库的连接数根据具体需求更改
# 远程访问
cd /opt/pgsql/pgsql-16.2/data
cp pg_hba.conf pg_hba.conf.bak20240402
vim /opt/pgsql/pgsql-16.2/data/pg_hba.conf
# 在文件的最下方加上下面的这句话,最后一个 trust 表示所有用户不需要密码,需要密码要设置为 md5:
host all all 0.0.0.0/0 md5
# 找到最下面这一行,加入如下内容,这样局域网的人才能访问。
<!--
# IPv4 local connections:
host all all 127.0.0.1/32 trust
-->
host all all 0.0.0.1/0 trust
# 加入后如下:
<!--
# IPv4 local connections:
host all all 0.0.0.1/0 trust
host all all 127.0.0.1/32 trust
-->
# 基础运维命令
# 切换postgres用户
su - postgres
# 重启服务
systemctl restart postgresql
# 停止服务
systemctl stop postgresql
# 查询状态服务
systemctl status postgresql
# 启动服务
systemctl start postgresql
# 防火墙
# 切换root用户
su - root
# 防火墙 允许5432 端口
ufw allow 5432
# 修改密码
# 切换用户
su - postgres
# 客户端登录
psql
psql -U postgres -h 127.0.0.1 -p 5432
# 查看本机IP,使用ip局域网连接
su root
ifconfig
su - postgres
psql -U postgres -h 192.168.48.129 -p 5432
# 输入postgre的数据库密码即可,我为123456
# 修改密码
alter user postgres with password '123456';
ALTER ROLE