首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >PostgreSQL介绍和PostgreSQL包安装

PostgreSQL介绍和PostgreSQL包安装

原创
作者头像
Raymond运维
发布2025-09-23 00:03:33
发布2025-09-23 00:03:33
5580
举报
文章被收录于专栏:干货分享干货分享

PostgreSQL介绍和安装

1.PostgreSQL介绍

t1
t1

图1 PostgreSQL

PostgreSQL 是一个功能强大的开源对象关系型数据库系统,它使用和扩展了 SQL 语言,并结合了许多特性,能够安全地存储和扩展最复杂的数据工作负载。PostgreSQL 的起源可以追溯到 1986 年,作为加州大学伯克利分校的 POSTGRES 项目的一部分,并且在核心平台上拥有超过 35 年的活跃开发经验。

PostgreSQL 因其经过验证的架构、可靠性、数据完整性、强大的功能集、可扩展性以及开源社区对软件的持续贡献而赢得了良好的声誉,以始终如一地提供高性能和创新的解决方案。PostgreSQL 支持所有主要操作系统,自 2001 年以来一直符合 ACID 标准,并拥有强大的附加组件,如流行的 PostGIS 地理空间数据库扩展器。毫无疑问,PostgreSQL 已成为许多人和组织的开源关系数据库首选。

开始使用 PostgreSQL 从未如此简单——选择一个您想要构建的项目,让 PostgreSQL 安全且稳健地存储您的数据。

为什么选择 PostgreSQL?

PostgreSQL 拥有许多旨在帮助开发人员构建应用程序、管理员保护数据完整性和构建容错环境的功能,并帮助您管理数据,无论数据集大小。除了免费和开源之外,PostgreSQL 还具有高度的可扩展性。例如,您可以定义自己的数据类型,构建自定义函数,甚至无需重新编译数据库即可用不同的编程语言编写代码!

PostgreSQL 努力在与传统特性不矛盾或导致糟糕架构决策的地方符合 SQL 标准。许多 SQL 标准所需的特性都得到了支持,尽管有时语法或功能略有不同。随着时间的推移,可以预期会有更多的符合性。截至 2023 年 9 月的 16 版本,PostgreSQL 至少符合 SQL:2023 核心符合性的 177 个强制性特性中的 170 个。截至撰写本文时,还没有关系数据库完全符合此标准。

以下是 PostgreSQL 中发现的 various 特性的非详尽列表,每个主要版本都会添加更多:

  • 数据类型
    • 原始类型:整数、数值、字符串、布尔值
    • 结构化:日期/时间、数组、范围/多范围、UUID
    • 文档:JSON/JSONB、XML、键值(Hstore)
    • 几何:点、线、圆、多边形
    • 自定义:复合、自定义类型
  • 数据完整性
    • UNIQUE、NOT NULL
    • 主键
    • 外键
    • 排除约束
    • 显式锁、咨询锁
  • 并发性、性能
    • 索引:B 树、多列、表达式、部分
    • 高级索引:GiST、SP-Gist、KNN Gist、GIN、BRIN、覆盖索引、布隆过滤器
    • 复杂的查询规划器/优化器、仅索引扫描、多列统计
    • 事务、嵌套事务(通过保存点)
    • 多版本并发控制(MVCC)
    • 读查询和构建 B 树索引的并行化
    • 表分区
    • SQL 标准中定义的所有事务隔离级别,包括可序列化
    • 表达式的即时(JIT)编译
  • 可靠性、灾难恢复
    • 预写式日志(WAL)
    • 复制:异步、同步、逻辑
    • 点时间恢复(PITR)、活动备用
    • 表空间
  • 安全性
    • 认证:GSSAPI、SSPI、LDAP、SCRAM-SHA-256、证书等
    • 强大的访问控制系统
    • 列和行级安全性
    • 使用证书和另一种方法进行多因素认证
  • 可扩展性
    • 存储函数和过程
    • 过程语言:PL/pgSQL、Perl、Python 和 Tcl。还有其他语言可通过扩展使用,例如 Java、JavaScript (V8)、R、Lua 和 Rust
    • SQL/JSON 构造函数、查询函数、路径表达式和 JSON_TABLE
    • 外部数据包装器:使用标准 SQL 接口连接到其他数据库或流
    • 表的可定制存储接口
    • 许多提供额外功能的扩展,包括 PostGIS
  • 国际化、文本搜索
    • 支持国际字符集,例如通过 ICU 排序规则
    • 不区分大小写和不区分重音的排序规则
    • 全文搜索

PostgreSQL 文档中还有许多您可以发现的特性。此外,PostgreSQL 具有高度的可扩展性:许多特性,如索引,都定义了 API,因此您可以使用 PostgreSQL 扩展来解决您的挑战。

PostgreSQL 已被证明在它能够管理的数据量以及它可以容纳的并发用户数量方面具有高度的可扩展性。有许多生产环境中的 PostgreSQL 集群管理着许多 TB 的数据,以及管理着 PB 数据的专业系统。

2.PostgreSQL安装

2.1 主机初始化

2.1.1 设置网卡名

  • Rocky Linux 9/10、Almalinux 9/10、CentOS Stream 9/10、AnolisOS 23、OpenCloudOS 9:
  • 创建 systemd 链接文件: 创建 /etc/systemd/network/70-eth0.link 文件。
代码语言:javascript
复制
[root@rocky10 ~]# mkdir -p /etc/systemd/network/
[root@rocky10 ~]# touch /etc/systemd/network/70-eth0.link

[root@rocky10 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:02:55:30 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname enx000c29025530
    inet 172.31.15.1/20 brd 172.31.15.255 scope global dynamic noprefixroute ens160
       valid_lft 1776sec preferred_lft 1776sec
    inet6 fe80::20c:29ff:fe02:5530/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

[root@rocky10 ~]# cat > /etc/systemd/network/70-eth0.link << EOF
[Match]
MACAddress=00:0c:29:f8:60:8f

[Link]
Name=eth0
EOF

# 也可以执行下面命令
ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
ETHMAC=`ip addr show ${ETHNANME} | awk -F' ' '/ether/{print $2}'`
mkdir /etc/systemd/network/
touch /etc/systemd/network/70-eth0.link
cat > /etc/systemd/network/70-eth0.link << EOF
[Match]
MACAddress=${ETHMAC}

[Link]
Name=eth0
EOF
  • 修改 NetworkManager 配置文件: 如果使用 NetworkManager 管理网络,需要修改 /etc/NetworkManager/system-connections 下的配置文件。
代码语言:javascript
复制
[root@rocky10 ~]# mv /etc/NetworkManager/system-connections/ens160.nmconnection /etc/NetworkManager/system-connections/eth0.nmconnection

[root@rocky10 ~]# sed -i.bak 's/'ens160'/eth0/' /etc/NetworkManager/system-connections/eth0.nmconnection

# 也可以执行下面命令
mv /etc/NetworkManager/system-connections/${ETHNAME}.nmconnection /etc/NetworkManager/system-connections/eth0.nmconnection
sed -i.bak 's/'${ETHNAME}'/eth0/' /etc/NetworkManager/system-connections/eth0.nmconnection
  • Rocky Linux 8、Almalinux 8、CentOS 7、CentOS Stream 8、openEuler 22.03和24.03 LTS、AnolisOS 8、OpenCloudOS 8、Kylin Server v10/v11、UOS Server v20:
  • 修改 GRUB 配置文件: 打开 /etc/default/grub 文件,添加以下内容到 GRUB_CMDLINE_LINUX 行
代码语言:javascript
复制
net.ifnames=0 biosdevname=0

执行以下命令:

代码语言:javascript
复制
sed -ri.bak '/^GRUB_CMDLINE_LINUX=/s@"$@ net.ifnames=0 biosdevname=0"@' /etc/default/grub

然后更新 GRUB 配置:

代码语言:javascript
复制
grub2-mkconfig -o /boot/grub2/grub.cfg

如果是 UEFI 引导系统,更新命令为:

代码语言:javascript
复制
# Rocky
grub2-mkconfig -o /boot/efi/EFI/rocky/grub.cfg

# Almalinux
grub2-mkconfig -o /boot/efi/EFI/almalinux/grub.cfg

# CentOS
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

# openEuler
grub2-mkconfig -o /boot/efi/EFI/openEuler/grub.cfg

# AnolisOS
grub2-mkconfig -o /boot/efi/EFI/anolis/grub.cfg

# OpenCloudOS
grub2-mkconfig -o /boot/efi/EFI/opencloudos/grub.cfg

# Kylin Server
grub2-mkconfig -o /boot/efi/EFI/kylin/grub.cfg

# UOS Server
grub2-mkconfig -o /boot/efi/EFI/uos/grub.cfg

# UEFI 引导系统可以直接执行下面命令:
EFI_DIR=`find /boot/efi/ -name "grub.cfg" | awk -F"/" '{print $5}'`
grub2-mkconfig -o /boot/efi/EFI/${EFI_DIR}/grub.cfg
  • 创建 Udev 规则文件: 创建 /etc/udev/rules.d/10-network.rules 文件,并添加以下内容:
代码语言:javascript
复制
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="<网卡MAC地址>", NAME="eth0"

注意:创建Udev这个步骤只在AnolisOS 8上执行。

将 <网卡MAC地址> 替换为实际网卡的 MAC 地址。

代码语言:javascript
复制
[root@anolisos8 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:47:02:3f brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 172.31.15.25/20 brd 172.31.15.255 scope global dynamic noprefixroute ens33
       valid_lft 1785sec preferred_lft 1785sec
    inet6 fe80::20c:29ff:fe47:23f/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

[root@anolis8 ~]# cat >> /etc/udev/rules.d/10-network.rules << EOF
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:0c:29:c5:38:3b", NAME="eth0"
EOF

# 也可以执行下面命令
ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
ETHMAC=`ip addr show ${ETHNANME} | awk -F' ' '/ether/{print $2}'`
cat >> /etc/udev/rules.d/10-network.rules << EOF
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="${ETHMAC}", NAME="eth0"
EOF
  • 修改网卡配置文件: 创建 /etc/sysconfig/network-scripts/ifcfg-eth0 文件,并配置网卡参数,例如:
代码语言:javascript
复制
ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
mv /etc/sysconfig/network-scripts/ifcfg-${ETHNAME} /etc/sysconfig/network-scripts/ifcfg-eth0
sed -i.bak 's/'${ETHNAME}'/eth0/' /etc/sysconfig/network-scripts/ifcfg-eth0
  • Ubuntu和Debian:
代码语言:javascript
复制
# Ubuntu和Debian先启用root用户,并设置密码
raymond@ubuntu2404:~$ cat set_root_login.sh 
#!/bin/bash

read -p "请输入密码: " PASSWORD
echo ${PASSWORD} |sudo -S sed -ri 's@#(PermitRootLogin )prohibit-password@\1yes@' /etc/ssh/sshd_config
sudo systemctl restart sshd
sudo -S passwd root <<-EOF
${PASSWORD}
${PASSWORD}
EOF

raymond@ubuntu2404:~$ bash set_root_login.sh 
请输入密码: 123456
[sudo] password for raymond: New password: Retype new password: passwd: password updated successfully
  • 修改 GRUB 配置文件: 打开 /etc/default/grub 文件,添加以下内容到 GRUB_CMDLINE_LINUX 行
代码语言:javascript
复制
net.ifnames=0 biosdevname=0

执行以下命令:

代码语言:javascript
复制
sed -ri.bak '/^GRUB_CMDLINE_LINUX=/s@"$@net.ifnames=0 biosdevname=0"@' /etc/default/grub

然后更新 GRUB 配置:

代码语言:javascript
复制
grub-mkconfig -o /boot/grub/grub.cfg

如果是 UEFI 引导系统,更新命令为:

代码语言:javascript
复制
# Ubuntu
grub-mkconfig -o /boot/efi/EFI/ubuntu/grub.cfg

# Debian
grub-mkconfig -o /boot/efi/EFI/debian/grub.cfg

# UEFI 引导系统可以直接执行下面命令:
EFI_DIR=`find /boot/efi/ -name "grub.cfg" | awk -F"/" '{print $5}'`
grub-mkconfig -o /boot/efi/EFI/${EFI_DIR}/grub.cfg
  • 修改网卡配置文件
代码语言:javascript
复制
# Ubuntu Server 24.04 LTS
ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
sed -i.bak 's/'${ETHNAME}'/eth0/' /etc/netplan/50-cloud-init.yaml

# Ubuntu Server 22.04  LTS
ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
touch /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
cat > /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg <<-EOF
network: {config: disabled}
EOF
sed -i.bak 's/'${ETHNAME}'/eth0/' /etc/netplan/50-cloud-init.yaml

# Ubuntu Server 20.04 LTS
ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
sed -i.bak 's/'${ETHNAME}'/eth0/' /etc/netplan/00-installer-config.yaml

# Ubuntu Server 18.04 LTS
ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
sed -i.bak 's/'${ETHNAME}'/eth0/' /etc/netplan/01-netcfg.yaml

# Debian
ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
sed -i.bak 's/'${ETHNAME}'/eth0/' /etc/network/interfaces
  • 重启系统
代码语言:javascript
复制
reboot

重启后,网卡名称将变为 eth0。

2.1.2 设置ip地址

代码语言:javascript
复制
1ETHNAME=`ip addr |awk -F"[ :]"'/^2/{print $3}'`
2
3# IP变量是ip地址,PREFIX变量是子网掩码位数;GATEWAY变量是网关地址;PRIMARY_DNS变量是主DNS,BACKUP_DNS变量是备用DNS,根据自己的需求修改。
4IP=172.31.0.10
5PREFIX=20
6GATEWAY=172.31.0.2
7PRIMARY_DNS=223.5.5.5
8BACKUP_DNS=180.76.76.76

Rocky Linux 9/10、Almalinux 9/10、CentOS Stream 9/10、AnolisOS 23、OpenCloudOS 9:

代码语言:javascript
复制
1cat> /etc/NetworkManager/system-connections/${ETHNAME}.nmconnection <<-EOF
2[connection]
3id=${ETHNAME}
4type=ethernet
5interface-name=${ETHNAME}
6
7[ipv4]
8address1=${IP}/${PREFIX},${GATEWAY}
9dns=${PRIMARY_DNS};${BACKUP_DNS};
10method=manual
11EOF

Rocky Linux 8、Almalinux 8、CentOS 7、CentOS Stream 8、openEuler 22.03和24.03 LTS、AnolisOS 8、OpenCloudOS 8、Kylin Server v10/v11、UOS Server v20:

代码语言:javascript
复制
1cat> /etc/sysconfig/network-scripts/ifcfg-${ETHNAME}<<-EOF
2NAME=${ETHNAME}
3DEVICE=${ETHNAME}
4ONBOOT=yes
5BOOTPROTO=none
6TYPE=Ethernet
7IPADDR=${IP}
8PREFIX=${PREFIX}
9GATEWAY=${GATEWAY}
10DNS1=${PRIMARY_DNS}
11DNS2=${BACKUP_DNS}
12EOF

Ubuntu:

代码语言:javascript
复制
1# Ubuntu Server 18.04 LTS
2cat> /etc/netplan/01-netcfg.yaml <<-EOF
3network:
4  version: 2
5  renderer: networkd
6  ethernets:
7${ETHNAME}:
8      dhcp4: no
9      dhcp6: no
10      addresses: [${IP}/${PREFIX}]
11      gateway4: ${GATEWAY}
12      nameservers:
13        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
14
15# Ubuntu Server 20.04 LTS
16cat> /etc/netplan/00-installer-config.yaml <<-EOF
17network:
18  version: 2
19  renderer: networkd
20  ethernets:
21${ETHNAME}:
22      dhcp4: no
23      dhcp6: no
24      addresses: [${IP}/${PREFIX}]
25      gateway4: ${GATEWAY}
26      nameservers:
27        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
28EOF
29
30# Ubuntu Server 22.04/24.04 LTS
31cat> /etc/netplan/50-cloud-init.yaml <<-EOF
32network:
33  version: 2
34  renderer: networkd
35  ethernets:
36${ETHNAME}:
37      dhcp4: no
38      dhcp6: no
39      addresses: [${IP}/${PREFIX}]
40      routes:
41        - to: default
42          via: ${GATEWAY}
43      nameservers:
44        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
45EOF

Debian:

代码语言:javascript
复制
1sed-ri-e"s/allow-hotplug/auto/g"-e"s/dhcp/static/g" /etc/network/interfaces
2sed-i'/static/a\address '${IP}'/'${PREFIX}'\ngateway '${GATEWAY}'\ndns-nameservers '${PRIMARY_DNS}' '${BACKUP_DNS}'\n' /etc/network/interfaces

openSUSE:

代码语言:javascript
复制
1cat> /etc/sysconfig/network/ifcfg-${ETHNAME}<<-EOF
2STARTMODE='auto'
3BOOTPROTO='static'
4IPADDR='${IP}/${PREFIX}'
5EOF
6touch /etc/sysconfig/network/routes
7cat> /etc/sysconfig/network/routes  <<-EOF
8default ${GATEWAY} - -
9EOF
10sed-ri's/(NETCONFIG_DNS_STATIC_SERVERS=).*/\1"'${PRIMARY_DNS}' '${BACKUP_DNS}'"/g' /etc/sysconfig/network/config

2.1.3 配置镜像源

Rocky:

代码语言:javascript
复制
1# 阿里云镜像站Rocky系统镜像源地址是:mirrors.aliyun.com/rockylinux,火山引擎镜像站Rocky系统镜像源地址是:mirrors.volces.com/rockylinux,后面地址是rockylinux,使用下面命令执行
2MIRROR=mirrors.aliyun.com
3sed-i.bak-e's|^mirrorlist=|#mirrorlist=|g'-e's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://'${MIRROR}'/rockylinux|g' /etc/yum.repos.d/[Rr]ocky*.repo
4
5# 搜狐镜像站Rocky系统镜像源地址是:mirrors.sohu.com/Rocky,后面地址是Rocky,使用下面命令执行
6MIRROR=mirrors.sohu.com
7sed-i.bak-e's|^mirrorlist=|#mirrorlist=|g'-e's|^#baseurl=http://'${OLD_MIRROR}'/$contentdir|baseurl=https://'${MIRROR}'/Rocky|g' /etc/yum.repos.d/[Rr]ocky*.repo
8
9# 其余镜像站Rocky系统镜像源地址后面地址都是rocky,使用下面命令执行
10MIRROR=mirrors.tencent.com
11sed-i.bak-e's|^mirrorlist=|#mirrorlist=|g'-e's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://'${MIRROR}'/rocky|g' /etc/yum.repos.d/[Rr]ocky*.repo
12
13dnf clean all && dnf makecache

Almalinux:

代码语言:javascript
复制
1MIRROR=mirrors.tencent.com
2OLD_MIRROR=$(sed-rn'/^.*baseurl=/s@.*=http.*://(.*)/(.*)/\$releasever/.*/$@\1@p' /etc/yum.repos.d/almalinux*.repo |head-1)
3sed-i.bak-e's|^mirrorlist=|#mirrorlist=|g'-e's|^# baseurl=https://'${OLD_MIRROR}'|baseurl=https://'${MIRROR}'|g' /etc/yum.repos.d/almalinux*.repo

CentOS Stream 9和10:

代码语言:javascript
复制
1cat update_mirror.pl
2#!/usr/bin/perl
3
4use strict;
5use warnings;
6use autodie;
7
8# 要修改镜像源,请去修改url变量!
9my $url='mirrors.aliyun.com';
10my $mirrors="https://$url/centos-stream";
11
12if(@ARGV <1){
13    die "Usage: $0...\n";
14}
15
16while(my $filename=shift @ARGV){
17    my $backup_filename=$filename.'.bak';
18rename$filename, $backup_filename;
19
20open my $input, "<", $backup_filename;
21open my $output, ">", $filename;
22
23while(<$input>){
24        s/^metalink/# metalink/;
25
26if(m/^name/){
27            my (undef, $repo, $arch)=split /-/;
28$repo=~ s/^\s+|\s+$//g;
29($arch= defined $arch ? lc($arch):'')=~ s/^\s+|\s+$//g;
30
31if($repo=~ /^Extras/){
32$_ .="baseurl=${mirrors}/SIGs/\$releasever-stream/extras".($arch eq 'source' ? "/${arch}/":"/\$basearch/")."extras-common\n";
33}else{
34$_ .="baseurl=${mirrors}/\$releasever-stream/$repo".($arch eq 'source' ? "/":"/\$basearch/").($arch ne '' ? "${arch}/tree/":"os")."\n";
35}
36}
37
38        print $output$_;
39}
40}
41
42rpm-q perl &> /dev/null ||{echo-e"\\033[01;31m "安装perl工具,请稍等..."\033[0m";yum -yinstall perl ;}
43
44perl ./update_mirror.pl /etc/yum.repos.d/centos*.repo
45
46dnf clean all && dnf makecache

CentOS Stream 8:

代码语言:javascript
复制
1MIRROR=mirrors.aliyun.com
2sed-i.bak-e's|^mirrorlist=|#mirrorlist=|g'-e's|^#baseurl=http://mirror.centos.org/$contentdir|baseurl=https://'${MIRROR}'/centos-vault|g' /etc/yum.repos.d/CentOS-*.repo
3
4dnf clean all && dnf makecache

CentOS 7:

代码语言:javascript
复制
1MIRROR=mirrors.aliyun.com
2OS_RELEASE_FULL_VERSION=`cat /etc/centos-release |sed-rn's/^(CentOS Linux release )(.*)( \(Core\))/\2/p'`
3sed-i.bak-e's|^mirrorlist=|#mirrorlist=|g'-e's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://'${MIRROR}'/centos-vault|g'-e"s/\$releasever/${OS_RELEASE_FULL_VERSION}/g" /etc/yum.repos.d/CentOS-*.repo
4
5yum clean all && yum makecache

Ubuntu Server 24.04 LTS:

代码语言:javascript
复制
1MIRROR=mirrors.aliyun.com
2sed-ri"s@^(URIs: )(http.*://)(.*)(/ubuntu).?@\1https://${MIRROR}\4@g" /etc/apt/sources.list.d/ubuntu.sources
3
4apt update

Ubuntu Server 18.04/20.04/22.04 LTS:

代码语言:javascript
复制
1MIRROR=mirrors.aliyun.com
2OLD_MIRROR=`sed-rn"s@^deb http(.*)://(.*)/ubuntu/? $(lsb_release -cs) main.*@\2@p" /etc/apt/sources.list`
3SECURITY_MIRROR=`sed-rn"s@^deb http(.*)://(.*)/ubuntu.* $(lsb_release -cs)-security main.*@\2@p" /etc/apt/sources.list`
4sed-i.bak-e's@http.*://'${OLD_MIRROR}'@https://'${MIRROR}'@g'-e's@http.*://'${SECURITY_MIRROR}'@https://'${MIRROR}'@g' /etc/apt/sources.list
5
6apt update

Debian:

代码语言:javascript
复制
1MIRROR=mirrors.aliyun.com
2OLD_MIRROR=`sed-rn"s@^deb http(.*)://(.*)/debian/? $(lsb_release -cs) main.*@\2@p" /etc/apt/sources.list`
3SECURITY_MIRROR=`sed-rn"s@^deb http(.*)://(.*)/debian-security $(lsb_release -cs)-security main.*@\2@p" /etc/apt/sources.list`
4sed-ri.bak-e's/'${OLD_MIRROR}'/'${MIRROR}'/g'-e's/'${SECURITY_MIRROR}'/'${MIRROR}'/g'-e's/^(deb cdrom.*)/#\1/g' /etc/apt/sources.list
5
6apt update

openEuler:

代码语言:javascript
复制
1MIRROR=mirrors.aliyun.com
2OLD_MIRROR=$(awk -F'/''/^baseurl=/{print $3}' /etc/yum.repos.d/openEuler.repo |head-1)
3sed-i.bak-e's|^metalink=|#metalink=|g'-e's|http.*://'${OLD_MIRROR}'|https://'${MIRROR}'/openeuler|g' /etc/yum.repos.d/openEuler.repo
4
5dnf clean all && dnf makecache

AnolisOS:

代码语言:javascript
复制
1OLD_MIRROR=$(sed-rn'/^.*baseurl=/s@.*=http.*://(.*)/(.*)/\$releasever/.*/$@\1@p' /etc/yum.repos.d/AnolisOS*.repo |head-1)
2
3# 中国科学院软件研究所镜像站AnolisOS系统镜像源地址是:mirror.iscas.ac.cn/openanolis,后面地址是openanolis,使用下面命令执行
4MIRROR=mirror.iscas.ac.cn
5sed-i.bak-e's|http.*://'${OLD_MIRROR}'/anolis|https://'${MIRROR}'/openanolis|g' /etc/yum.repos.d/AnolisOS*.repo
6
7# 其余镜像站AnolisOS系统镜像源地址后面地址都是anolis,使用下面命令执行
8MIRROR=mirrors.aliyun.com
9sed-i.bak-e's|http.*://'${OLD_MIRROR}'/anolis|https://'${MIRROR}'/anolis|g' /etc/yum.repos.d/AnolisOS*.repo
10
11dnf clean all && dnf makecache

OpenCloudOS:

代码语言:javascript
复制
1MIRROR=mirrors.tencent.com
2OLD_MIRROR=$(awk -F'/''/^baseurl=/{print $3}' /etc/yum.repos.d/OpenCloudOS*.repo |head-1)
3sed-i.bak-e's|http.*://'${OLD_MIRROR}'|https://'${MIRROR}'|g' /etc/yum.repos.d/OpenCloudOS*.repo
4
5dnf clean all && dnf makecache

openSUSE:

代码语言:javascript
复制
1MIRROR=mirrors.aliyun.com
2OLD_MIRROR=$(awk -F'/''/^baseurl=/{print $3}' /etc/zypp/repos.d/repo-*.repo |head-1)
3sed-i.bak's|http.*://'${OLD_MIRROR}'|https://'${MIRROR}'/opensuse|g' /etc/zypp/repos.d/repo-*.repo
4
5zypper clean &&zypper refresh

2.1.4 关闭防火墙

代码语言:javascript
复制
1# Rocky、Almalinux、CentOS、openEuler、AnolisOS、OpenCloudOS、openSUSE、Kylin Server、UOS Server
2systemctl disable --now firewalld
3
4# CentOS 7还要执行下面命令
5systemctl disable --now NetworkManager
6
7# Ubuntu
8systemctl disable --now ufw
9
10# Debian默认没有安装防火墙,不用设置

2.1.5 禁用SELinux

代码语言:javascript
复制
1# Rocky、Almalinux、CentOS、openEuler、AnolisOS、OpenCloudOS、Kylin Server、UOS Server
2setenforce 0
3sed-i's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
4
5# Ubuntu、Debian和openSUSE默认没有安装SELinux,不用设置

2.1.6 禁用AppArmor

代码语言:javascript
复制
1# openSUSE发行版默认不启用SELinux,而是使用AppArmor来提供强制访问控制(MAC)功能,需要禁用AppArmor。
2systemctl disable --now apparmor

2.1.7 设置时区

代码语言:javascript
复制
1timedatectl set-timezone Asia/Shanghai
2echo'Asia/Shanghai'>/etc/timezone
3
4# Ubuntu还要设置下面内容
5cat>> /etc/default/locale <<-EOF
6LC_TIME=en_DK.UTF-8
7EOF

2.1.8 内核参数优化

代码语言:javascript
复制
1cat> /etc/sysctl.conf <<EOF
2kernel.shmmax =68719476736
3kernel.shmall =4294967296
4kernel.shmmni =4096
5kernel.sem =5010064128000501001280
6fs.file-max =7672460
7net.ipv4.ip_local_port_range =900065000
8net.core.rmem_default =1048576
9net.core.rmem_max =4194304
10net.core.wmem_default =262144
11net.core.wmem_max =1048576
12EOF
13
14sysctl-p

2.1.9 优化资源限制参数

代码语言:javascript
复制
1cat> /etc/security/limits.conf <<EOF
2*	- nofile 100000
3*	- nproc 100000
4*	- memlock 60000
5EOF

2.2 包安装

2.2.1 Yum资源库安装PostgreSQL

在Rocky、Almalinux、CentOS、openEuler、AnolisOS、OpenCloudOS、Kylin Server、UOS Server上使用系统自带包安装PostgreSQL:

代码语言:javascript
复制
1[root@rocky10 ~]# yum list postgresql-server --showduplicates
2Last metadata expiration check: 0:01:09 ago on Mon 08 Sep 202512:24:57 PM CST.
3Available Packages
4postgresql-server.x86_64                                 16.8-1.el10_0                                  appstream
5postgresql-server.x86_64                                 16.10-1.el10_0                                 appstream
6
7[root@rocky10 ~]# yum -y install postgresql-server
8
9# 默认无法启动
10[root@rocky10 ~]# systemctl start postgresql
11Job for postgresql.service failed because the control process exited with error code.
12See "systemctl status postgresql.service" and "journalctl -xeu postgresql.service"for details.
13
14# 看日志提示做初始化
15[root@rocky10 ~]# tail -f /var/log/messages 
16Sep  812:27:04 rocky10 systemd[1]: Finished man-db-cache-update.service.
17Sep  812:27:04 rocky10 systemd[1]: run-p1373-i1673.service: Deactivated successfully.
18Sep  812:27:27 rocky10 systemd[1]: Starting postgresql.service - PostgreSQL database server...
19Sep  812:27:27 rocky10 postgresql-check-db-dir[1426]: Directory "/var/lib/pgsql/data" is missing or empty. # 提示,目录“/var/lib/pgsql/data”缺失或为空。
20Sep  812:27:27 rocky10 postgresql-check-db-dir[1426]: Use "/usr/bin/postgresql-setup --initdb"# 提示,使用“/usr/bin/postgresql-setup --initdb”
21Sep  812:27:27 rocky10 postgresql-check-db-dir[1426]: to initialize the database cluster.
22Sep  812:27:27 rocky10 postgresql-check-db-dir[1426]: See /usr/share/doc/postgresql16/README.rpm-dist formore information.
23Sep  812:27:27 rocky10 systemd[1]: postgresql.service: Control process exited, code=exited, status=1/FAILURE
24Sep  812:27:27 rocky10 systemd[1]: postgresql.service: Failed with result 'exit-code'.
25Sep  812:27:27 rocky10 systemd[1]: Failed to start postgresql.service - PostgreSQL database server.
26
27# 可以看到数据目录是空的
28[root@rocky10 ~]# ls /var/lib/pgsql/data
29
30# 初始化数据库
31[root@rocky10 ~]# postgresql-setup --initdb
32 * Initializing database in'/var/lib/pgsql/data'
33 * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
34
35# 现在数据目录有文件了
36[root@rocky10 ~]# ls /var/lib/pgsql/data
37base    pg_commit_ts  pg_ident.conf  pg_notify    pg_snapshots  pg_subtrans  PG_VERSION  postgresql.auto.conf
38global  pg_dynshmem   pg_logical     pg_replslot  pg_stat       pg_tblspc    pg_wal      postgresql.conf
39log     pg_hba.conf   pg_multixact   pg_serial    pg_stat_tmp   pg_twophase  pg_xact
40
41[root@rocky10 ~]# systemctl enable --now  postgresql
42
43# 验证成功
44[root@rocky10 ~]# sudo -u postgres psql -c "SELECT version();"
45                                                    version
46---------------------------------------------------------------------------------------------------------------
47 PostgreSQL 16.10 on x86_64-redhat-linux-gnu, compiled by gcc (GCC)14.2.1 20250110(Red Hat 14.2.1-7), 64-bit
48(1 row)
49
50[root@rocky10 ~]# su - postgres
51[postgres@rocky10 ~]$ psql
52psql (16.10)
53Type "help"for help.
54
55postgres=# help
56You are using psql, the command-line interface to PostgreSQL.
57Type:  \copyright for distribution terms
58\h forhelp with SQL commands
59\? forhelp with psql commands
60\g or terminate with semicolon to execute query
61\q to quit
62postgres=# \q

使用PostgreSQL官方资源库:

添加官方资源库,去“https://www.postgresql.org/download”网站下载,在“**Select your operating system family:(选择操作系统系列)**”为:Linux,选择“Select your Linux distribution:(选择你的Linux发行版)"为:Red Hat/Rocky/AlmaLinux,然后根据下面提示操作。

t2
t2

图2 PostgreSQL添加资源库

在"https://www.postgresql.org/download/linux/redhat"页面,选择“**Select Version:(选择版本)**”为:17,选择“Select platform:(选择平台)"为:Red Hat Enterprise,Rocky,AlmaLinux or Oracle Version 10,选择“Select architecture:(选择架构)”为:x86_64,然后根据下面提示操作。

t3
t3

图3 PostgreSQL添加资源库

代码语言:javascript
复制
1# 安装存储库RPM
2sudo dnf install-y https://download.postgresql.org/pub/repos/yum/reporpms/EL-10-x86_64/pgdg-redhat-repo-latest.noarch.rpm
3
4# 禁用内置的postgresql
5sudo dnf -qy module disable postgresql
6
7# 替换国内镜像源
8[root@rocky10 ~]# sed -i.bak 's|download.postgresql.org/pub|mirrors.nju.edu.cn/postgresql|g' /etc/yum.repos.d/pgdg-redhat-all.repo
9
10[root@rocky10 ~]# yum list postgresql*-server --showduplicates
11Last metadata expiration check: 0:23:29 ago on Mon 08 Sep 2025 01:58:12 PM CST.
12Available Packages
13postgresql-server.x86_64                                16.8-1.el10_0                                   appstream
14postgresql-server.x86_64                                16.10-1.el10_0                                  appstream
15postgresql13-server.x86_64                              13.21-2PGDG.rhel10                              pgdg13
16postgresql13-server.x86_64                              13.22-1PGDG.rhel10                              pgdg13
17postgresql14-server.x86_64                              14.18-2PGDG.rhel10                              pgdg14
18postgresql14-server.x86_64                              14.19-1PGDG.rhel10                              pgdg14
19postgresql15-server.x86_64                              15.13-2PGDG.rhel10                              pgdg15
20postgresql15-server.x86_64                              15.14-1PGDG.rhel10                              pgdg15
21postgresql16-server.x86_64                              16.9-3PGDG.rhel10                               pgdg16
22postgresql16-server.x86_64                              16.10-1PGDG.rhel10                              pgdg16
23postgresql17-server.x86_64                              17.5-3PGDG.rhel10                               pgdg17
24postgresql17-server.x86_64                              17.6-1PGDG.rhel10                               pgdg17
25
26# 安装PostgreSQL
27dnf install-y postgresql17-server
28
29# 初始化数据库
30[root@rocky10 ~]# postgresql-17-setup initdb
31Initializing database ... OK
32
33# 启动服务
34systemctl enable--now postgresql-17
35
36# 验证成功
37[root@rocky10 ~]# sudo -u postgres psql -c "SELECT version();"
38                                                 version
39----------------------------------------------------------------------------------------------------------
40 PostgreSQL 17.6 on x86_64-pc-linux-gnu, compiled by gcc (GCC)14.2.1 20250110(Red Hat 14.2.1-7), 64-bit
41(1 row)
42
43[root@rocky10 ~]# su - postgres
44[postgres@rocky10 ~]$ psql
45psql (17.6)
46Type "help"for help.
47
48postgres=# help
49You are using psql, the command-line interface to PostgreSQL.
50Type:  \copyright for distribution terms
51\h forhelp with SQL commands
52\? forhelp with psql commands
53\g or terminate with semicolon to execute query
54\q to quit
55postgres=# \q

2.2.2 Apt资源库安装PostgreSQL

在Ubuntu和Debian上使用系统自带包安装PostgreSQL:

代码语言:javascript
复制
1root@ubuntu2404:~# apt update
2
3root@ubuntu2404:~# apt-cache madison postgresql
4postgresql |16+257build1.1 | https://mirrors.aliyun.com/ubuntu noble-updates/main amd64 Packages
5postgresql |16+257build1 | https://mirrors.aliyun.com/ubuntu noble/main amd64 Packages
6
7root@ubuntu2404:~# apt install -y postgresql
8
9root@ubuntu2404:~# systemctl enable --now  postgresql
10
11root@ubuntu2404:~# sudo -u postgres psql -c "SELECT version();"
12                                                               version
13--------------------------------------------------------------------------------------------------------------------------------------
14 PostgreSQL 16.9(Ubuntu 16.9-0ubuntu0.24.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 13.3.0-6ubuntu2~24.04)13.3.0, 64-bit
15
16root@ubuntu2404:~# su - postgres
17postgres@ubuntu2404:~$ psql
18psql (16.9(Ubuntu 16.9-0ubuntu0.24.04.1))
19Type "help"for help.
20
21postgres=# help
22You are using psql, the command-line interface to PostgreSQL.
23Type:  \copyright for distribution terms
24\h forhelp with SQL commands
25\? forhelp with psql commands
26\g or terminate with semicolon to execute query
27\q to quit
28postgres=# \q

使用PostgreSQL官方资源库:

添加官方资源库,去“https://www.postgresql.org/download”网站下载,在“**Select your operating system family:(选择操作系统系列)**”为:Linux,选择“Select your Linux distribution:(选择你的Linux发行版)"为:Ubuntu,然后根据下面提示操作。

t4
t4

图4 PostgreSQL添加资源库

在"https://www.postgresql.org/download/linux/ubuntu"页面,根据下面提示操作。

t5
t5

图5 PostgreSQL添加资源库

代码语言:javascript
复制
1# 导入存储库签名密钥:
2sudoaptinstallcurl ca-certificates
3sudoinstall-d /usr/share/postgresql-common/pgdg
4sudocurl-o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc
5
6# 创建存储库配置文件:
7. /etc/os-release
8sudosh-c"echo 'deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $VERSION_CODENAME-pgdg main' > /etc/apt/sources.list.d/pgdg.list"
9
10# 替换国内镜像源
11root@ubuntu2404:~# sed -i。bak 's|apt.postgresql.org/pub|mirrors.aliyun.com/postgresql|g' /etc/apt/sources.list.d/pgdg.list 
12
13# 更新包列表:
14sudoapt update
15
16root@ubuntu2404:~# apt-cache madison postgresql
17postgresql |17+281.pgdg24.04+1 | https://apt.postgresql.org/pub/repos/apt noble-pgdg/main amd64 Packages
18postgresql |16+257build1.1 | https://mirrors.aliyun.com/ubuntu noble-updates/main amd64 Packages
19postgresql |16+257build1 | https://mirrors.aliyun.com/ubuntu noble/main amd64 Packages
20
21# 安装最新版本的PostgreSQL:
22# 如果你想要一个特定的版本,请使用“postgresql-17”或类似的版本,而不是“postgresql”
23sudoapt-yinstall postgresql-17
24
25root@ubuntu2404:~# systemctl enable --now  postgresql
26
27root@ubuntu2404:~# sudo -u postgres psql -c "SELECT version();"
28                                                              version
29-----------------------------------------------------------------------------------------------------------------------------------
30 PostgreSQL 17.4(Ubuntu 17.4-1.pgdg24.04+2) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 13.3.0-6ubuntu2~24.04)13.3.0, 64-bit
31(1 row)
32
33root@ubuntu2404:~# su - postgres
34postgres@ubuntu2404:~$ psql
35psql (17.4(Ubuntu 17.4-1.pgdg24.04+2))
36Type "help"for help.
37
38postgres=# help
39You are using psql, the command-line interface to PostgreSQL.
40Type:  \copyright for distribution terms
41\h forhelp with SQL commands
42\? forhelp with psql commands
43\g or terminate with semicolon to execute query
44\q to quit
45postgres=# \q

2.2.3 SUSE资源库安装PostgreSQL

在openSUSE上使用系统自带包安装PostgreSQL:

代码语言:javascript
复制
1opensuse15:~ # zypper search "postgresql*-server"
2Loading repository data...
3Reading installed packages...
4
5S | Name                | Summary                                                   | Type
6--+---------------------+-----------------------------------------------------------+--------
7| postgresql-server   | The Programs Needed to Create and Run a PostgreSQL Server | package
8| postgresql10-server | The Programs Needed to Create and Run a PostgreSQL Server | package
9| postgresql12-server | The Programs Needed to Create and Run a PostgreSQL Server | package
10| postgresql13-server | The Programs Needed to Create and Run a PostgreSQL Server | package
11| postgresql14-server | The Programs Needed to Create and Run a PostgreSQL Server | package
12| postgresql15-server | The Programs Needed to Create and Run a PostgreSQL Server | package
13| postgresql16-server | The Programs Needed to Create and Run a PostgreSQL Server | package
14| postgresql17-server | The Programs Needed to Create and Run a PostgreSQL Server | package
15
16opensuse15:~ # zypper install -y postgresql17-server
17
18opensuse15:~ # systemctl enable --now postgresql
19
20opensuse15:~ # sudo -u postgres psql -c "SELECT version();"
21                                       version
22--------------------------------------------------------------------------------------
23 PostgreSQL 17.6 on x86_64-suse-linux-gnu, compiled by gcc (SUSE Linux)7.5.0, 64-bit
24(1 row)
25
26opensuse15:~ # su - postgres
27postgres@opensuse15:~> psql
28psql (17.6)
29Type "help"for help.
30
31postgres=# help
32You are using psql, the command-line interface to PostgreSQL.
33Type:  \copyright for distribution terms
34\h forhelp with SQL commands
35\? forhelp with psql commands
36\g or terminate with semicolon to execute query
37\q to quit
38postgres=# \q

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PostgreSQL介绍和安装
  • 1.PostgreSQL介绍
  • 2.PostgreSQL安装
    • 2.1 主机初始化
      • 2.1.1 设置网卡名
      • 2.1.2 设置ip地址
      • 2.1.3 配置镜像源
      • 2.1.4 关闭防火墙
      • 2.1.5 禁用SELinux
      • 2.1.6 禁用AppArmor
      • 2.1.7 设置时区
      • 2.1.8 内核参数优化
      • 2.1.9 优化资源限制参数
    • 2.2 包安装
      • 2.2.1 Yum资源库安装PostgreSQL
      • 2.2.2 Apt资源库安装PostgreSQL
      • 2.2.3 SUSE资源库安装PostgreSQL
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档