如何在 Ubuntu 上安装 PostgreSQL

LightNode
By LightNode ·

引言

PostgreSQL,通常简称为 Postgres,是一个强大的开源对象关系数据库系统。经过30多年的积极开发,PostgreSQL 以其可靠性、功能强大和性能卓越而赢得了良好的声誉。

在 Ubuntu 上安装 PostgreSQL 是许多开发者和数据库管理员的热门选择,原因如下:

  1. 兼容性: Ubuntu 作为最广泛使用的 Linux 发行版之一,与 PostgreSQL 有极佳的兼容性。

  2. 性能: Ubuntu 的高效性与 PostgreSQL 强大的架构相结合,可实现高性能的数据库操作。

  3. 安全性: Ubuntu 和 PostgreSQL 都以强大的安全特性而闻名,使这种组合非常适合处理敏感数据。

  4. 社区支持: Ubuntu 和 PostgreSQL 都拥有庞大而活跃的社区,确保在需要时能够轻松获得帮助。

  5. 免费开源: 两个系统都是免费使用和开源的,允许进行经济高效的部署,并在需要时进行定制。

本指南将引导您完成在 Ubuntu 系统上安装 PostgreSQL 的过程,从准备工作到基本使用。无论您是在搭建开发环境还是准备生产服务器,本教程都将为您提供在 Ubuntu 上启动和运行 PostgreSQL 所需的必要步骤。

前提条件

在开始安装过程之前,确保您的系统满足必要的要求并且您拥有适当的权限是很重要的。让我们来看看前提条件:

Ubuntu 系统要求

  1. Ubuntu 版本: 本指南适用于 Ubuntu 20.04 LTS (Focal Fossa) 及更新版本。然而,为了稳定性,建议使用最新的长期支持(LTS)版本。

  2. 系统资源: PostgreSQL 可以在资源有限的系统上运行,但为了获得最佳性能,请考虑以下建议:

    • CPU: 1 GHz 或更快的处理器
    • 内存: 至少 1 GB (生产环境建议 4 GB 或更多)
    • 存储: PostgreSQL 安装需要 512 MB,外加数据库所需的额外空间
  3. 网络连接: 您需要有活跃的网络连接来下载 PostgreSQL 及其依赖项。

用户权限

要安装 PostgreSQL,您需要在 Ubuntu 系统上拥有 sudo 权限。这意味着您应该以 root 用户身份登录,或拥有可以使用 sudo 执行 root 权限命令的账户。

要检查您的用户是否拥有 sudo 权限,可以在终端中运行以下命令:

sudo -v

如果系统提示您输入密码,且命令执行时没有出现错误,则表示您的用户拥有 sudo 权限。

终端访问

由于我们将使用终端进行大部分安装和配置过程,您应该熟悉使用命令行界面(CLI)。

备份数据

如果您要在已有重要数据的系统上安装 PostgreSQL,在进行任何重大软件安装之前,最好先备份您的数据。

更新系统

在安装 PostgreSQL 之前,确保您的 Ubuntu 系统是最新的非常重要。这一步骤很重要,原因如下:

  1. 安全性: 更新通常包含重要的安全补丁。
  2. 稳定性: 最新的更新可以修复 bug 并提高系统稳定性。
  3. 兼容性: 拥有最新的软件包可以防止在 PostgreSQL 安装过程中出现潜在的兼容性问题。

更新 Ubuntu 的步骤

按照以下步骤更新您的 Ubuntu 系统:

  1. 打开终端。您可以按 Ctrl + Alt + T 或在 Ubuntu 仪表板中搜索"终端"来完成此操作。

  2. 首先,更新用于升级和新软件包安装的软件包列表。运行以下命令:

    sudo apt update
    

    此命令刷新可用软件包及其版本的列表,但不会安装或升级任何软件包。

  3. 更新完成后,将已安装的软件包升级到最新版本:

    sudo apt upgrade
    

    此命令将显示即将升级的软件包列表。按 'Y' 然后按 'Enter' 确认并继续升级。

  4. 可选地,您可以运行完整的系统升级,这也会智能地处理新版本软件包的依赖关系变化:

    sudo apt full-upgrade
    

    使用此命令时要谨慎,因为它可能会在需要时删除一些软件包以升级其他软件包。

  5. 升级过程完成后,最好重启系统以确保所有更新都正确应用:

    sudo reboot
    

验证更新

系统重启后,您可以通过检查 Ubuntu 版本来验证更新是否成功:

lsb_release -a

此命令将显示有关您的 Ubuntu 发行版的信息,包括版本号。

添加 PostgreSQL 仓库

虽然 PostgreSQL 在 Ubuntu 的默认仓库中可用,但通常不是最新版本。为确保我们安装最新的稳定版 PostgreSQL,我们将向系统添加官方 PostgreSQL 仓库。

为什么要添加官方 PostgreSQL 仓库?

  1. 最新版本: 官方仓库提供最新版本的 PostgreSQL。
  2. 及时更新: 通过官方仓库可以更快获得安全补丁和 bug 修复。
  3. 一致性: 使用官方仓库确保 PostgreSQL 及其扩展之间的兼容性。

添加 PostgreSQL 仓库的步骤

按照以下步骤将 PostgreSQL 仓库添加到您的 Ubuntu 系统:

  1. 首先,我们需要添加 PostgreSQL 签名密钥。这个密钥用于验证我们即将安装的软件包的真实性。运行以下命令:

    sudo apt-get install wget ca-certificates
    wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
    
  2. 接下来,我们需要将 PostgreSQL 仓库添加到系统的源列表中。在 /etc/apt/sources.list.d/ 目录中创建一个名为 pgdg.list 的新文件:

    sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
    

    此命令创建一个包含仓库信息的新文件。$(lsb_release -cs) 部分会自动检测您的 Ubuntu 版本并插入正确的代号。

  3. 添加仓库后,再次更新软件包列表以包含新添加的 PostgreSQL 仓库:

    sudo apt update
    

验证仓库添加

要验证 PostgreSQL 仓库是否已成功添加,您可以检查 pgdg.list 文件的内容:

cat /etc/apt/sources.list.d/pgdg.list

您应该看到类似以下的一行:

deb http://apt.postgresql.org/pub/repos/apt focal-pgdg main

(注意: "focal" 可能会被替换为您的 Ubuntu 版本代号)

安装 PostgreSQL

现在我们已经添加了 PostgreSQL 仓库并更新了系统,我们准备安装 PostgreSQL 了。这个过程很简单,只需几个简单的命令就可以完成。

安装 PostgreSQL 的命令

我们将使用 apt 包管理器来安装 PostgreSQL。以下是安装最新版 PostgreSQL 及一个常用扩展的命令:

sudo apt install postgresql postgresql-contrib

让我们来解析这个命令:

  • postgresql: 这是 PostgreSQL 的核心包。
  • postgresql-contrib: 这个包包含一些不属于核心 PostgreSQL 系统但经常有用的额外实用程序和功能。

在安装过程中,系统可能会提示您确认安装。如果出现提示,输入 'Y' 并按 Enter 键继续。

验证安装

安装完成后,重要的是要验证 PostgreSQL 是否正确安装并运行。以下是几种验证方法:

  1. 检查 PostgreSQL 版本:

    psql --version
    

    这应该显示已安装的 PostgreSQL 版本。

  2. 检查 PostgreSQL 服务的状态:

    sudo systemctl status postgresql
    

    您应该看到指示服务处于活动(运行)状态的输出。

  3. 验证 PostgreSQL 是否在监听连接:

    sudo ss -tunelp | grep 5432
    

    此命令检查 PostgreSQL 是否在其默认端口(5432)上监听。如果 PostgreSQL 正常运行,您应该看到输出。

PostgreSQL 初始设置

当您在 Ubuntu 上安装 PostgreSQL 时,它会自动创建一个名为 postgres 的新用户账户。这个账户与默认的 Postgres 角色相关联。要使用这个账户与 PostgreSQL 交互,您可以这样切换:

sudo -i -u postgres

然后,您可以通过输入以下命令访问 PostgreSQL 提示符:

psql

这将使您登录到 PostgreSQL 提示符,您会看到类似这样的内容:

psql (13.x)
输入 "help" 来获取帮助。

postgres=#

要退出 PostgreSQL 提示符,输入:

\q

要返回到您的常规用户账户,只需输入:

exit

恭喜! 您已经成功在 Ubuntu 系统上安装了 PostgreSQL。在下一节中,我们将介绍如何根据您的需求配置 PostgreSQL。

配置 PostgreSQL

安装 PostgreSQL 后,根据您的需求正确配置它很重要。本节将介绍创建新数据库、设置新用户以及配置身份验证方法。

创建新数据库

默认情况下,PostgreSQL 创建一个名为 postgres 的数据库。然而,为您的项目创建单独的数据库是一个好习惯。以下是创建新数据库的方法:

  1. 切换到 postgres 用户:

    sudo -i -u postgres
    
  2. 访问 PostgreSQL 提示符:

    psql
    
  3. 使用 CREATE DATABASE 命令创建新数据库:

    CREATE DATABASE myproject;
    

    myproject 替换为您想要的数据库名称。

  4. 您可以使用以下命令验证数据库创建:

    \l
    

    这将列出所有数据库。

设置新用户

建议为每个应用程序创建一个新用户,而不是使用默认的 postgres 超级用户。方法如下:

  1. 在 psql 提示符下,创建一个新用户:

    CREATE USER myuser WITH PASSWORD 'mypassword';
    

    myusermypassword 替换为您想要的用户名和密码。

  2. 授予新用户对新数据库的权限:

    GRANT ALL PRIVILEGES ON DATABASE myproject TO myuser;
    
  3. 您可以使用以下命令验证用户创建:

    \du
    

    这将列出所有用户及其角色。

配置身份验证方法

PostgreSQL 使用不同的身份验证方法,这些方法在 pg_hba.conf 文件中配置。以下是修改它的方法:

  1. 退出 PostgreSQL 提示符:

    \q
    
  2. 用文本编辑器打开 pg_hba.conf 文件(您可能需要 sudo 权限):

    sudo nano /etc/postgresql/13/main/pg_hba.conf
    

    注意: 如果版本号不同,请将 13 替换为您的 PostgreSQL 版本号。

  3. 该文件包含决定用户如何进行身份验证的行。典型配置可能如下所示:

    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    local   all             postgres                                peer
    local   all             all                                     md5
    host    all             all             127.0.0.1/32            md5
    host    all             all             ::1/128                 md5
    
    • local 表示通过 Unix 域套接字连接
    • host 表示通过 TCP/IP 连接
    • md5 表示密码认证
    • peer 表示系统用户名直接映射到 PostgreSQL 用户名
  4. 修改后,保存文件并退出编辑器。

  5. 重启 PostgreSQL 使更改生效:

    sudo systemctl restart postgresql
    

请记住,这些是基本配置。根据您的具体需求,特别是在安全性至关重要的生产环境中,您可能需要进一步调整设置。

基本 PostgreSQL 命令

现在我们已经安装并配置了 PostgreSQL,让我们探索一些基本命令,这些命令将帮助您与数据库交互。这些命令对于管理数据库、表格和执行基本操作至关重要。

连接到 PostgreSQL

  1. 以 postgres 用户身份连接:

    sudo -i -u postgres
    
  2. 启动 PostgreSQL 交互式终端:

    psql
    
  3. 连接到特定数据库:

    psql -d myproject
    

    myproject 替换为您的数据库名称。

数据库操作

  1. 列出所有数据库:

    \l
    
  2. 连接到特定数据库:

    \c myproject
    
  3. 创建新数据库:

    CREATE DATABASE newdb;
    
  4. 删除数据库:

    DROP DATABASE newdb;
    

表格操作

  1. 列出当前数据库中的表格:

    \dt
    
  2. 创建新表格:

    CREATE TABLE users (
        id SERIAL PRIMARY KEY,
        name VARCHAR(100),
        email VARCHAR(100) UNIQUE NOT NULL
    );
    
  3. 描述表格结构:

    \d users
    
  4. 删除表格:

    DROP TABLE users;
    

基本查询示例

  1. 向表格插入数据:

    INSERT INTO users (name, email) VALUES ('张三', '[email protected]');
    
  2. 从表格中选择所有数据:

    SELECT * FROM users;
    
  3. 更新表格中的数据:

    UPDATE users SET name = '李四' WHERE id = 1;
    
  4. 从表格中删除数据:

    DELETE FROM users WHERE id = 1;
    

其他有用的命令

  1. 显示 PostgreSQL 版本:

    SELECT version();
    
  2. 列出所有用户及其角色:

    \du
    
  3. 显示当前用户和数据库:

    \conninfo
    
  4. 从文件执行命令:

    \i filename.sql
    
  5. 退出 psql:

    \q
    

请记住,这些只是基本命令,可以帮助您入门。PostgreSQL 提供了广泛的高级功能和命令,用于更复杂的操作和优化。

维护 PostgreSQL

正确维护您的 PostgreSQL 安装对于确保最佳性能、数据完整性和安全性至关重要。本节涵盖了一些您应该熟悉的基本维护任务。

启动和停止 PostgreSQL 服务

  1. 启动 PostgreSQL 服务:

    sudo systemctl start postgresql
    
  2. 停止 PostgreSQL 服务:

    sudo systemctl stop postgresql
    
  3. 重启 PostgreSQL 服务:

    sudo systemctl restart postgresql
    
  4. 检查 PostgreSQL 服务的状态:

    sudo systemctl status postgresql
    

备份和恢复数据库

定期备份您的数据库对于数据保护至关重要。PostgreSQL 提供了几种备份和恢复方法。

创建备份

  1. 备份单个数据库:

    pg_dump dbname > dbname.sql
    
  2. 备份所有数据库:

    pg_dumpall > all_databases.sql
    

从备份恢复

  1. 恢复单个数据库:

    psql dbname < dbname.sql
    
  2. 恢复所有数据库:

    psql -f all_databases.sql postgres
    

更新 PostgreSQL

保持 PostgreSQL 更新对于安全性和性能很重要。以下是更新方法:

  1. 更新软件包列表:

    sudo apt update
    
  2. 升级 PostgreSQL:

    sudo apt upgrade postgresql postgresql-contrib
    

监控 PostgreSQL

  1. 检查活动连接:

    SELECT * FROM pg_stat_activity;
    
  2. 监控数据库大小:

    SELECT pg_size_pretty(pg_database_size('dbname'));
    
  3. 检查表格大小:

    SELECT relname, pg_size_pretty(pg_total_relation_size(relid))
    FROM pg_catalog.pg_statio_user_tables
    ORDER BY pg_total_relation_size(relid) DESC;
    

清理和分析

PostgreSQL 使用 MVCC(多版本并发控制),这可能导致表格和索引膨胀。VACUUM 命令有助于管理这个问题:

  1. 清理特定表格:

    VACUUM tablename;
    
  2. 清理和分析(更新统计信息)数据库:

    VACUUM ANALYZE;
    
  3. 对于自动清理,确保在 postgresql.conf 文件中启用了 autovacuum:

    autovacuum = on
    

日志管理

PostgreSQL 日志可以提供宝贵的信息,用于故障排除和性能调优:

  1. 查找日志文件位置:

    SHOW log_directory;
    SHOW log_filename;
    
  2. 您可以在 postgresql.conf 文件中修改日志设置,以调整记录的内容和方式。

请记住,这些是基本的维护任务。对于生产环境,您可能需要更高级的策略,包括设置复制、负载均衡和实施更复杂的备份和监控解决方案。

常见问题解决

即使经过仔细的设置和维护,您也可能遇到 PostgreSQL 安装的问题。以下是一些常见问题及其解决方案:

权限问题

  1. 问题: 尝试访问 PostgreSQL 时出现"权限被拒绝"错误。

    解决方案:

    • 确保用户拥有必要的权限:
      sudo -i -u postgres
      createuser --interactive
      
    • 授予用户必要的权限:
      GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
      
  2. 问题: 无法使用 Ubuntu 用户访问 PostgreSQL。

    解决方案:

    • 创建一个与 Ubuntu 用户同名的 PostgreSQL 角色:
      sudo -u postgres createuser --interactive
      

连接问题

  1. 问题: "连接被拒绝"错误。

    解决方案:

    • 检查 PostgreSQL 是否正在运行:
      sudo systemctl status postgresql
      
    • 如果没有运行,启动它:
      sudo systemctl start postgresql
      
    • 确保 PostgreSQL 在 postgresql.conf 中监听正确的地址:
      listen_addresses = 'localhost'  # 或 '*' 表示所有接口
      
  2. 问题: 无法远程连接。

    解决方案:

    • 修改 pg_hba.conf 以允许远程连接:
      host    all    all    0.0.0.0/0    md5
      
    • 更新 postgresql.conf:
      listen_addresses = '*'
      
    • 重启 PostgreSQL:
      sudo systemctl restart postgresql
      

版本冲突

  1. 问题: PostgreSQL 版本与已安装的扩展不兼容。

    解决方案:

    • 检查 PostgreSQL 版本:
      psql --version
      
    • 确保扩展兼容。您可能需要升级扩展:
      ALTER EXTENSION extension_name UPDATE TO 'new_version';
      

性能问题

  1. 问题: 查询速度慢或整体性能差。

    解决方案:

    • 使用 EXPLAIN ANALYZE 了解查询执行情况:
      EXPLAIN ANALYZE SELECT * FROM large_table WHERE condition;
      
    • 确保适当的索引:
      CREATE INDEX idx_name ON table_name (column_name);
      
    • 调整 postgresql.conf 中的 PostgreSQL 配置参数:
      shared_buffers = 256MB
      effective_cache_size = 768MB
      
  2. 问题: 数据库膨胀导致性能下降。

    解决方案:

    • 定期运行 VACUUM 和 ANALYZE:
      VACUUM ANALYZE;
      
    • 考虑设置 autovacuum 进行自动维护。

磁盘空间问题

  1. 问题: 磁盘空间不足。

    解决方案:

    • 识别大型表格和索引:
      SELECT relname, pg_size_pretty(pg_total_relation_size(relid))
      FROM pg_catalog.pg_statio_user_tables
      ORDER BY pg_total_relation_size(relid) DESC;
      
    • 删除不必要的数据或归档旧数据。
    • 考虑对非常大的表格进行分区。

请记住,这些是一般解决方案。具体步骤可能因您的特定 PostgreSQL 版本和系统配置而异。在对数据库或其配置进行重大更改之前,请务必备份您的数据。

在 Ubuntu 上安装 PostgreSQL

常见问题解答(FAQ)

问: 如何查看我正在运行的 PostgreSQL 版本?

: 您可以在终端中使用以下命令:

psql --version

或者,如果您已经在 psql 提示符下:

SELECT version();

问: 我可以在同一个 Ubuntu 系统上安装多个版本的 PostgreSQL 吗?

: 是的,可以安装多个版本。但是,您需要仔细管理端口和数据目录以避免冲突。

问: 如何更改 PostgreSQL 用户密码?

: 您可以使用以下 SQL 命令更改密码:

ALTER USER username WITH PASSWORD '新密码';

问: 如何启用对我的 PostgreSQL 服务器的远程访问?

: 您需要修改 postgresql.confpg_hba.conf 文件。在 postgresql.conf 中,设置 listen_addresses = '*',在 pg_hba.conf 中,添加一行如 host all all 0.0.0.0/0 md5。记得在进行这些更改后重启 PostgreSQL。

问: PostgreSQL 中 TRUNCATE 和 DELETE 有什么区别?

: TRUNCATE 更快,因为它移除表中的所有行而不逐个扫描它们。DELETE 一行一行地删除,并在事务日志中记录删除操作。TRUNCATE 还会重置序列,并且不会触发 DELETE 触发器。

问: 如何提高 PostgreSQL 的性能?

: 提高性能的一些方法包括:

  • 适当的索引
  • 定期 VACUUM 和 ANALYZE
  • 优化查询
  • 调整 PostgreSQL 配置参数
  • 升级硬件(特别是增加内存)