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

PostgreSQL介绍和PostgreSQL包安装

原创
作者头像
Raymond运维
发布2025-09-11 17:05:01
发布2025-09-11 17:05:01
1900
代码可运行
举报
文章被收录于专栏:干货分享干货分享
运行总次数:0
代码可运行

PostgreSQL介绍和安装

1.PostgreSQL介绍

图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 文件。 [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 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:f8:60:8f brd ff:ff:ff:ff:ff:ff altname enp3s0 inet 172.31.7.16/21 brd 172.31.7.255 scope global dynamic noprefixroute ens160 valid_lft 1791sec preferred_lft 1791sec inet6 fe80::20c:29ff:fef8:608f/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 下的配置文件。 [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、UOS Server v20:
    • 修改 GRUB 配置文件: 打开 /etc/default/grub 文件,添加以下内容到 GRUB_CMDLINE_LINUX 行 net.ifnames=0 biosdevname=0 执行以下命令: sed -ri.bak '/^GRUB_CMDLINE_LINUX=/s@"$@ net.ifnames=0 biosdevname=0"@' /etc/default/grub 然后更新 GRUB 配置: grub2-mkconfig -o /boot/grub2/grub.cfg 如果是 UEFI 引导系统,更新命令为: # 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 文件,并添加以下内容: SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="<网卡MAC地址>", NAME="eth0" **注意:**创建Udev这个步骤只在AnolisOS 8上执行。 将 <网卡MAC地址> 替换为实际网卡的 MAC 地址。 [root@anolis8 ~]# 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:c5:38:3b brd ff:ff:ff:ff:ff:ff altname enp2s1 inet 172.31.7.15/21 brd 172.31.7.255 scope global dynamic noprefixroute ens33 valid_lft 1590sec preferred_lft 1590sec inet6 fe80::20c:29ff:fec5:383b/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 文件,并配置网卡参数,例如: 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: # 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 行 net.ifnames=0 biosdevname=0 执行以下命令: sed -ri.bak '/^GRUB_CMDLINE_LINUX=/s@"$@net.ifnames=0 biosdevname=0"@' /etc/default/grub 然后更新 GRUB 配置: grub-mkconfig -o /boot/grub/grub.cfg 如果是 UEFI 引导系统,更新命令为: # 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
    • 修改网卡配置文件: # 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
  • 重启系统: reboot 重启后,网卡名称将变为 eth0

2.1.2 设置ip地址

代码语言:javascript
代码运行次数:0
运行
复制
ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`

# IP变量是ip地址,PREFIX变量是子网掩码位数;GATEWAY变量是网关地址;PRIMARY_DNS变量是主DNS,BACKUP_DNS变量是备用DNS,根据自己的需求修改。
IP=172.31.0.10
PREFIX=21
GATEWAY=172.31.0.2
PRIMARY_DNS=223.5.5.5
BACKUP_DNS=180.76.76.76

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

代码语言:javascript
代码运行次数:0
运行
复制
cat > /etc/NetworkManager/system-connections/${ETHNAME}.nmconnection <<-EOF
[connection]
id=${ETHNAME}
type=ethernet
interface-name=${ETHNAME}

[ipv4]
address1=${IP}/${PREFIX},${GATEWAY}
dns=${PRIMARY_DNS};${BACKUP_DNS};
method=manual
EOF

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

代码语言:javascript
代码运行次数:0
运行
复制
cat > /etc/sysconfig/network-scripts/ifcfg-${ETHNAME} <<-EOF
NAME=${ETHNAME}
DEVICE=${ETHNAME}
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
IPADDR=${IP}
PREFIX=${PREFIX}
GATEWAY=${GATEWAY}
DNS1=${PRIMARY_DNS}
DNS2=${BACKUP_DNS}
EOF

Ubuntu:

代码语言:javascript
代码运行次数:0
运行
复制
# Ubuntu Server 18.04 LTS
cat > /etc/netplan/01-netcfg.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    ${ETHNAME}:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}] 
      gateway4: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]

# Ubuntu Server 20.04 LTS
cat > /etc/netplan/00-installer-config.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    ${ETHNAME}:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}] 
      gateway4: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
EOF

# Ubuntu Server 22.04/24.04 LTS
cat > /etc/netplan/50-cloud-init.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    ${ETHNAME}:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}]
      routes:
        - to: default
          via: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
EOF

Debian:

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

openSUSE:

代码语言:javascript
代码运行次数:0
运行
复制
cat > /etc/sysconfig/network/ifcfg-${ETHNAME} <<-EOF
STARTMODE='auto'
BOOTPROTO='static'
IPADDR='${IP}/${PREFIX}'
EOF
touch /etc/sysconfig/network/routes
cat > /etc/sysconfig/network/routes  <<-EOF
default ${GATEWAY} - -
EOF
sed -ri  's/(NETCONFIG_DNS_STATIC_SERVERS=).*/\1"'${PRIMARY_DNS}' '${BACKUP_DNS}'"/g' /etc/sysconfig/network/config

2.1.3 配置镜像源

Rocky:

代码语言:javascript
代码运行次数:0
运行
复制
# 阿里云镜像站Rocky系统镜像源地址是:mirrors.aliyun.com/rockylinux,火山引擎镜像站Rocky系统镜像源地址是:mirrors.volces.com/rockylinux,后面地址是rockylinux,使用下面命令执行
MIRROR=mirrors.aliyun.com
sed -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

# 搜狐镜像站Rocky系统镜像源地址是:mirrors.sohu.com/Rocky,后面地址是Rocky,使用下面命令执行
MIRROR=mirrors.sohu.com
sed -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

# 其余镜像站Rocky系统镜像源地址后面地址都是rocky,使用下面命令执行
MIRROR=mirrors.tencent.com
sed -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

dnf clean all && dnf makecache

Almalinux:

代码语言:javascript
代码运行次数:0
运行
复制
MIRROR=mirrors.tencent.com
OLD_MIRROR=$(sed -rn '/^.*baseurl=/s@.*=http.*://(.*)/(.*)/\$releasever/.*/$@\1@p' /etc/yum.repos.d/almalinux*.repo | head -1)
sed -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
代码运行次数:0
运行
复制
cat update_mirror.pl
#!/usr/bin/perl

use strict;
use warnings;
use autodie;

# 要修改镜像源,请去修改url变量!
my $url = 'mirrors.aliyun.com';
my $mirrors = "https://$url/centos-stream";

if (@ARGV < 1) {
    die "Usage: $0 <filename1> <filename2> ...\n";
}

while (my $filename = shift @ARGV) {
    my $backup_filename = $filename . '.bak';
    rename $filename, $backup_filename;

    open my $input, "<", $backup_filename;
    open my $output, ">", $filename;

    while (<$input>) {
        s/^metalink/# metalink/;

        if (m/^name/) {
            my (undef, $repo, $arch) = split /-/;
            $repo =~ s/^\s+|\s+$//g;
            ($arch = defined $arch ? lc($arch) : '') =~ s/^\s+|\s+$//g;

            if ($repo =~ /^Extras/) {
                $_ .= "baseurl=${mirrors}/SIGs/\$releasever-stream/extras" . ($arch eq 'source' ? "/${arch}/" : "/\$basearch/") . "extras-common\n";
            } else {
                $_ .= "baseurl=${mirrors}/\$releasever-stream/$repo" . ($arch eq 'source' ? "/" : "/\$basearch/") . ($arch ne '' ? "${arch}/tree/" : "os") . "\n";
            }
        }

        print $output $_;
    }
}

rpm -q perl &> /dev/null || { echo -e "\\033[01;31m "安装perl工具,请稍等..."\033[0m";yum -y install perl ; }

perl ./update_mirror.pl /etc/yum.repos.d/centos*.repo

dnf clean all && dnf makecache

CentOS Stream 8:

代码语言:javascript
代码运行次数:0
运行
复制
MIRROR=mirrors.aliyun.com
sed -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

dnf clean all && dnf makecache

CentOS 7:

代码语言:javascript
代码运行次数:0
运行
复制
MIRROR=mirrors.aliyun.com
OS_RELEASE_FULL_VERSION=`cat /etc/centos-release | sed -rn 's/^(CentOS Linux release )(.*)( \(Core\))/\2/p'`
sed -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

yum clean all && yum makecache

Ubuntu Server 24.04 LTS:

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

apt update

Ubuntu Server 18.04/20.04/22.04 LTS:

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

apt update

Debian:

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

apt update

openEuler:

代码语言:javascript
代码运行次数:0
运行
复制
MIRROR=mirrors.aliyun.com
OLD_MIRROR=$(awk -F'/' '/^baseurl=/{print $3}' /etc/yum.repos.d/openEuler.repo | head -1)
sed -i.bak -e 's|^metalink=|#metalink=|g' -e 's|http.*://'${OLD_MIRROR}'|https://'${MIRROR}'/openeuler|g' /etc/yum.repos.d/openEuler.repo

dnf clean all && dnf makecache

AnolisOS:

代码语言:javascript
代码运行次数:0
运行
复制
OLD_MIRROR=$(sed -rn '/^.*baseurl=/s@.*=http.*://(.*)/(.*)/\$releasever/.*/$@\1@p' /etc/yum.repos.d/AnolisOS*.repo | head -1)

# 中国科学院软件研究所镜像站AnolisOS系统镜像源地址是:mirror.iscas.ac.cn/openanolis,后面地址是openanolis,使用下面命令执行
MIRROR=mirror.iscas.ac.cn
sed -i.bak -e 's|http.*://'${OLD_MIRROR}'/anolis|https://'${MIRROR}'/openanolis|g' /etc/yum.repos.d/AnolisOS*.repo

# 其余镜像站AnolisOS系统镜像源地址后面地址都是anolis,使用下面命令执行
MIRROR=mirrors.aliyun.com
sed -i.bak -e 's|http.*://'${OLD_MIRROR}'/anolis|https://'${MIRROR}'/anolis|g' /etc/yum.repos.d/AnolisOS*.repo

dnf clean all && dnf makecache

OpenCloudOS:

代码语言:javascript
代码运行次数:0
运行
复制
MIRROR=mirrors.tencent.com
OLD_MIRROR=$(awk -F'/' '/^baseurl=/{print $3}' /etc/yum.repos.d/OpenCloudOS*.repo | head -1)
sed -i.bak -e 's|http.*://'${OLD_MIRROR}'|https://'${MIRROR}'|g' /etc/yum.repos.d/OpenCloudOS*.repo

dnf clean all && dnf makecache

openSUSE:

代码语言:javascript
代码运行次数:0
运行
复制
MIRROR=mirrors.aliyun.com
OLD_MIRROR=$(awk -F'/' '/^baseurl=/{print $3}' /etc/zypp/repos.d/repo-*.repo | head -1)
sed -i.bak 's|http.*://'${OLD_MIRROR}'|https://'${MIRROR}'/opensuse|g' /etc/zypp/repos.d/repo-*.repo

zypper clean && zypper refresh

2.1.4 关闭防火墙

代码语言:javascript
代码运行次数:0
运行
复制
# Rocky、Almalinux、CentOS、openEuler、AnolisOS、OpenCloudOS、openSUSE、Kylin Server、UOS Server
systemctl disable --now firewalld

# CentOS 7还要执行下面命令
systemctl disable --now NetworkManager

# Ubuntu
systemctl disable --now ufw

# Debian默认没有安装防火墙,不用设置

2.1.5 禁用SELinux

代码语言:javascript
代码运行次数:0
运行
复制
# Rocky、Almalinux、CentOS、openEuler、AnolisOS、OpenCloudOS、Kylin Server、UOS Server
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

# Ubuntu、Debian和openSUSE默认没有安装SELinux,不用设置

2.1.6 禁用AppArmor

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

2.1.7 设置时区

代码语言:javascript
代码运行次数:0
运行
复制
timedatectl set-timezone Asia/Shanghai
echo 'Asia/Shanghai' >/etc/timezone

# Ubuntu还要设置下面内容
cat >> /etc/default/locale <<-EOF
LC_TIME=en_DK.UTF-8
EOF

2.1.8 内核参数优化

代码语言:javascript
代码运行次数:0
运行
复制
cat > /etc/sysctl.conf <<EOF 
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.shmmni = 4096
kernel.sem = 50100 64128000 50100 1280
fs.file-max = 7672460
net.ipv4.ip_local_port_range = 9000 65000
net.core.rmem_default = 1048576
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
EOF

sysctl -p

2.1.9 优化资源限制参数

代码语言:javascript
代码运行次数:0
运行
复制
cat > /etc/security/limits.conf <<EOF
*	- nofile 100000
*	- nproc 100000
*	- memlock 60000
EOF

2.2 包安装

2.2.1 Yum资源库安装PostgreSQL

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

代码语言:javascript
代码运行次数:0
运行
复制
[root@rocky10 ~]# yum list postgresql-server --showduplicates
Last metadata expiration check: 0:01:09 ago on Mon 08 Sep 2025 12:24:57 PM CST.
Available Packages
postgresql-server.x86_64                                 16.8-1.el10_0                                  appstream
postgresql-server.x86_64                                 16.10-1.el10_0                                 appstream

[root@rocky10 ~]# yum -y install postgresql-server

# 默认无法启动
[root@rocky10 ~]# systemctl start postgresql
Job for postgresql.service failed because the control process exited with error code.
See "systemctl status postgresql.service" and "journalctl -xeu postgresql.service" for details.

# 看日志提示做初始化
[root@rocky10 ~]# tail -f /var/log/messages 
Sep  8 12:27:04 rocky10 systemd[1]: Finished man-db-cache-update.service.
Sep  8 12:27:04 rocky10 systemd[1]: run-p1373-i1673.service: Deactivated successfully.
Sep  8 12:27:27 rocky10 systemd[1]: Starting postgresql.service - PostgreSQL database server...
Sep  8 12:27:27 rocky10 postgresql-check-db-dir[1426]: Directory "/var/lib/pgsql/data" is missing or empty. # 提示,目录“/var/lib/pgsql/data”缺失或为空。
Sep  8 12:27:27 rocky10 postgresql-check-db-dir[1426]: Use "/usr/bin/postgresql-setup --initdb" # 提示,使用“/usr/bin/postgresql-setup --initdb”
Sep  8 12:27:27 rocky10 postgresql-check-db-dir[1426]: to initialize the database cluster.
Sep  8 12:27:27 rocky10 postgresql-check-db-dir[1426]: See /usr/share/doc/postgresql16/README.rpm-dist for more information.
Sep  8 12:27:27 rocky10 systemd[1]: postgresql.service: Control process exited, code=exited, status=1/FAILURE
Sep  8 12:27:27 rocky10 systemd[1]: postgresql.service: Failed with result 'exit-code'.
Sep  8 12:27:27 rocky10 systemd[1]: Failed to start postgresql.service - PostgreSQL database server.

# 可以看到数据目录是空的
[root@rocky10 ~]# ls /var/lib/pgsql/data

# 初始化数据库
[root@rocky10 ~]# postgresql-setup --initdb
 * Initializing database in '/var/lib/pgsql/data'
 * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log

# 现在数据目录有文件了
[root@rocky10 ~]# ls /var/lib/pgsql/data
base    pg_commit_ts  pg_ident.conf  pg_notify    pg_snapshots  pg_subtrans  PG_VERSION  postgresql.auto.conf
global  pg_dynshmem   pg_logical     pg_replslot  pg_stat       pg_tblspc    pg_wal      postgresql.conf
log     pg_hba.conf   pg_multixact   pg_serial    pg_stat_tmp   pg_twophase  pg_xact

[root@rocky10 ~]# systemctl enable --now  postgresql

# 验证成功
[root@rocky10 ~]# sudo -u postgres psql -c "SELECT version();"
                                                    version                                                    
---------------------------------------------------------------------------------------------------------------
 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
(1 row)

[root@rocky10 ~]# su - postgres
[postgres@rocky10 ~]$ psql
psql (16.10)
Type "help" for help.

postgres=# help
You are using psql, the command-line interface to PostgreSQL.
Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit
postgres=# \q

使用PostgreSQL官方资源库:

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

图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,然后根据下面提示操作。

图3 PostgreSQL添加资源库

代码语言:javascript
代码运行次数:0
运行
复制
# 安装存储库RPM
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-10-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# 禁用内置的postgresql
sudo dnf -qy module disable postgresql

# 替换国内镜像源
[root@rocky10 ~]# sed -i.bak 's|download.postgresql.org/pub|mirrors.nju.edu.cn/postgresql|g' /etc/yum.repos.d/pgdg-redhat-all.repo

[root@rocky10 ~]# yum list postgresql*-server --showduplicates
Last metadata expiration check: 0:23:29 ago on Mon 08 Sep 2025 01:58:12 PM CST.
Available Packages
postgresql-server.x86_64                                16.8-1.el10_0                                   appstream
postgresql-server.x86_64                                16.10-1.el10_0                                  appstream
postgresql13-server.x86_64                              13.21-2PGDG.rhel10                              pgdg13   
postgresql13-server.x86_64                              13.22-1PGDG.rhel10                              pgdg13   
postgresql14-server.x86_64                              14.18-2PGDG.rhel10                              pgdg14   
postgresql14-server.x86_64                              14.19-1PGDG.rhel10                              pgdg14   
postgresql15-server.x86_64                              15.13-2PGDG.rhel10                              pgdg15   
postgresql15-server.x86_64                              15.14-1PGDG.rhel10                              pgdg15   
postgresql16-server.x86_64                              16.9-3PGDG.rhel10                               pgdg16   
postgresql16-server.x86_64                              16.10-1PGDG.rhel10                              pgdg16   
postgresql17-server.x86_64                              17.5-3PGDG.rhel10                               pgdg17   
postgresql17-server.x86_64                              17.6-1PGDG.rhel10                               pgdg17 

# 安装PostgreSQL
dnf install -y postgresql17-server

# 初始化数据库
[root@rocky10 ~]# postgresql-17-setup initdb
Initializing database ... OK

# 启动服务
systemctl enable --now postgresql-17

# 验证成功
[root@rocky10 ~]# sudo -u postgres psql -c "SELECT version();"
                                                 version                                                  
----------------------------------------------------------------------------------------------------------
 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
(1 row)

[root@rocky10 ~]# su - postgres
[postgres@rocky10 ~]$ psql
psql (17.6)
Type "help" for help.

postgres=# help
You are using psql, the command-line interface to PostgreSQL.
Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit
postgres=# \q

2.2.2 Apt资源库安装PostgreSQL

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

代码语言:javascript
代码运行次数:0
运行
复制
root@ubuntu2404:~# apt update

root@ubuntu2404:~# apt-cache madison postgresql
postgresql | 16+257build1.1 | https://mirrors.aliyun.com/ubuntu noble-updates/main amd64 Packages
postgresql | 16+257build1 | https://mirrors.aliyun.com/ubuntu noble/main amd64 Packages

root@ubuntu2404:~# apt install -y postgresql

root@ubuntu2404:~# systemctl enable --now  postgresql

root@ubuntu2404:~# sudo -u postgres psql -c "SELECT version();"
                                                               version                                                                
--------------------------------------------------------------------------------------------------------------------------------------
 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

root@ubuntu2404:~# su - postgres
postgres@ubuntu2404:~$ psql
psql (16.9 (Ubuntu 16.9-0ubuntu0.24.04.1))
Type "help" for help.

postgres=# help
You are using psql, the command-line interface to PostgreSQL.
Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit
postgres=# \q

使用PostgreSQL官方资源库:

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

图4 PostgreSQL添加资源库

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

图5 PostgreSQL添加资源库

代码语言:javascript
代码运行次数:0
运行
复制
# 导入存储库签名密钥:
sudo apt install curl ca-certificates
sudo install -d /usr/share/postgresql-common/pgdg
sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc

# 创建存储库配置文件:
. /etc/os-release
sudo sh -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"

# 替换国内镜像源
root@ubuntu2404:~# sed -i。bak 's|apt.postgresql.org/pub|mirrors.aliyun.com/postgresql|g' /etc/apt/sources.list.d/pgdg.list 

# 更新包列表:
sudo apt update

root@ubuntu2404:~# apt-cache madison postgresql
postgresql | 17+281.pgdg24.04+1 | https://apt.postgresql.org/pub/repos/apt noble-pgdg/main amd64 Packages
postgresql | 16+257build1.1 | https://mirrors.aliyun.com/ubuntu noble-updates/main amd64 Packages
postgresql | 16+257build1 | https://mirrors.aliyun.com/ubuntu noble/main amd64 Packages

# 安装最新版本的PostgreSQL:
# 如果你想要一个特定的版本,请使用“postgresql-17”或类似的版本,而不是“postgresql”
sudo apt -y install postgresql-17

root@ubuntu2404:~# systemctl enable --now  postgresql

root@ubuntu2404:~# sudo -u postgres psql -c "SELECT version();"
                                                              version                                                              
-----------------------------------------------------------------------------------------------------------------------------------
 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
(1 row)

root@ubuntu2404:~# su - postgres
postgres@ubuntu2404:~$ psql
psql (17.4 (Ubuntu 17.4-1.pgdg24.04+2))
Type "help" for help.

postgres=# help
You are using psql, the command-line interface to PostgreSQL.
Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit
postgres=# \q

2.2.3 SUSE资源库安装PostgreSQL

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

代码语言:javascript
代码运行次数:0
运行
复制
opensuse15:~ # zypper search "postgresql*-server"
Loading repository data...
Reading installed packages...

S | Name                | Summary                                                   | Type
--+---------------------+-----------------------------------------------------------+--------
  | postgresql-server   | The Programs Needed to Create and Run a PostgreSQL Server | package
  | postgresql10-server | The Programs Needed to Create and Run a PostgreSQL Server | package
  | postgresql12-server | The Programs Needed to Create and Run a PostgreSQL Server | package
  | postgresql13-server | The Programs Needed to Create and Run a PostgreSQL Server | package
  | postgresql14-server | The Programs Needed to Create and Run a PostgreSQL Server | package
  | postgresql15-server | The Programs Needed to Create and Run a PostgreSQL Server | package
  | postgresql16-server | The Programs Needed to Create and Run a PostgreSQL Server | package
  | postgresql17-server | The Programs Needed to Create and Run a PostgreSQL Server | package

opensuse15:~ # zypper install -y postgresql17-server

opensuse15:~ # systemctl enable --now postgresql

opensuse15:~ # sudo -u postgres psql -c "SELECT version();"
                                       version                                        
--------------------------------------------------------------------------------------
 PostgreSQL 17.6 on x86_64-suse-linux-gnu, compiled by gcc (SUSE Linux) 7.5.0, 64-bit
(1 row)

opensuse15:~ # su - postgres
postgres@opensuse15:~> psql
psql (17.6)
Type "help" for help.

postgres=# help
You are using psql, the command-line interface to PostgreSQL.
Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit
postgres=# \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 归档