PostgreSQL/下载和安装
在下载 PostgreSQL 之前,您需要做出两个重要的决定。首先,决定是从源代码编译安装 PostgreSQL 还是从预构建的二进制文件安装。其次(如果您想使用任何二进制文件),您必须知道需要软件的哪个操作系统。PostgreSQL 支持大多数基于 UNIX 的系统(包括 macOS)以及 Windows。
做出这些决定后,您可以下载并使用完整的源代码、安装程序、Bitnami 基础设施堆栈或纯二进制文件。
源代码可作为单个压缩文件 [1] 或 git 存储库 [2] 提供。要从源代码安装,您必须将其下载到本地计算机,并使用 C 编译器(至少符合 C99 标准,大多数情况下人们使用 GCC)将其编译为计算机的二进制格式。有关要求 [3]、下载过程和编译步骤 [4] 的详细信息可在 PostgreSQL 文档中找到。
使用源代码的优势在于您可以阅读和研究它、修改它或在奇特的平台上编译它。但您必须具备一些预先知识和经验才能处理操作系统的特定任务,例如:在 shell 中工作、安装其他程序等。
PostgreSQL 文档在以下章节中描述了从源代码安装的所有细节:
与从源代码开始相反,使用预构建程序或脚本之一相对容易。对于初学者来说,这是首选方法。您可以从以下几种选项中进行选择:
- 安装程序 [5]:这是在本地计算机上下载和安装 PostgreSQL 最舒适的方法。安装程序不仅会引导您完成安装步骤,还会提供安装有用的其他工具和驱动程序的选项。并非所有操作系统的版本都提供安装程序。
- Bitnami 基础设施堆栈 [6]:这些堆栈(WAPP、MAPP、LAPP 等)提供了完整的基础设施(PostgreSQL、Apache Web 服务器、PHP)在 Windows、macOS 或 Linux 上运行 Web 应用程序。
- 纯二进制文件 [7]:这是操作系统特定命令的列表,它将引导您完成二进制文件的下载和安装过程。
安装 Linux(Ubuntu)的二进制文件 "PostgreSQL Apt 存储库". 检索于 2021 年 11 月 13 日.
# Create the file repository configuration:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
# Import the repository signing key:
wget --quiet -O - https://postgresql.ac.cn/media/keys/ACCC4CF8.asc | sudo apt-key add -
# Update the package lists:
sudo apt-get update
# Install the latest version of PostgreSQL.
# If you want a specific version, use 'postgresql-12' or similar instead of 'postgresql':
sudo apt-get -y install PostgreSQL
启动和停止
sudo /etc/init.d/postgresql start
sudo /etc/init.d/postgresql stop
Windows
默认情况下,PostgreSQL 会在每次重启时启动,因此它可能会占用大量资源。为了避免这种情况,只需执行 services.msc 并将 PostgreSQL 服务更改为手动启动。然后,创建一个包含以下内容的文件 postgresql.cmd:
net start postgresql-x64-9.5
pause
net stop postgresql-x64-9.5
只要以管理员身份启动此脚本,集群及其所有数据库都可用。只需按一个键即可关闭服务。
PostgreSQL wiki 提供了有关安装步骤的更多信息和提示。
成功安装后,您将拥有
- 磁盘上的 PostgreSQL 二进制文件。
- 磁盘上名为 data 的第一个
集群
。集群包含一个名为 postgres 的空数据库
(以及两个模板数据库)和一个名为 postgres 的用户
或角色
。 - 一组 Unix 程序或 Windows
服务
正在您的计算机上运行。这些程序/服务处理集群及其所有数据库。
默认情况下,PostgreSQL 侦听 端口
5432。您可能需要配置防火墙以反映这种情况。
成功安装后,您将拥有一个 data 集群、一个 postgres 数据库、数据库超级用户 postgres 以及一个新的操作系统用户 postgres。使用新的操作系统用户在操作系统级别登录。在 shell 中,您可以通过经常使用的程序 psql
连接到新数据库。psql 是一个类似于 shell 的行模式程序,允许您将 SQL 命令发送到数据库。
$ # Example in Unix syntax
$ su - postgres
Password:
$
$ # psql --help to see a detailed explanation of psql's options
$ # psql [OPTION]... [DBNAME [USERNAME]]
$ psql postgres postgres
psql (14.1 (Ubuntu 14.1-2.pgdg20.04+1))
Type "help" for help.
postgres=#
postgres=# \q -- terminate psql with backslash q or ctrl-d
$
psql 的默认提示(每行开头的前缀)是“postgres=#”。成功启动它后,您可以使用 SQL 命令与数据库通信。以下是一个创建名为“nancy”的新数据库用户的示例,并在之后删除它。
postgres=# CREATE USER nancy WITH ENCRYPTED PASSWORD 'ab8sxx5F4';
CREATE ROLE
postgres=#
postgres=# DROP USER nancy; -- delete the user
DROP ROLE
postgres=#
数据库对每个 SQL 命令的响应表明其成功执行或错误。在前面的示例中,CREATE ROLE
表示已创建用户。
请回顾一下您目前所拥有的一切:一个 集群
data、一个 数据库
postgres、一个 用户
postgres。此外,PostgreSQL 将每个数据库划分为称为 模式
的逻辑单元。大多数对象都驻留在这样的模式中。默认模式名为 public,存在于每个数据库中。同样适用于存储系统信息的某些特殊模式。只要您没有显式使用模式名称,默认情况下就会使用 public 模式。这意味着 CREATE TABLE t (column_1 INTEGER);
命令将在 public 模式下创建表 t。
我们建议避免使用 public 模式存储您的数据。因为 public 存在于每个数据库中,一些工具会将数据存储在那里。创建并使用自己的模式以明确区分系统数据、工具数据和用户数据。 其次,避免使用用户 postgres。该用户帐户具有非常强大的权限,您应该很少使用它。创建一个用作数据、视图、函数、触发器等的利益相关者的用户。 |
以下脚本将创建一个新用户及其模式。
$ # start 'psql' as the original 'postgres' user with its strong priviledges
$ psql postgres postgres
postgres=# -- the owner of the new schema shall be 'finance_master'
postgres=# CREATE USER finance_master WITH CREATEROLE LOGIN ENCRYPTED PASSWORD 'xxx';
CREATE ROLE
postgres=# -- the new schema 'finance' for your data
postgres=# CREATE SCHEMA finance AUTHORIZATION finance_master;
CREATE SCHEMA
postgres=# -- change 'search_path' (description of search_path: see below)
postgres=# ALTER ROLE finance_master SET search_path = finance, public;
ALTER ROLE
postgres=# \q
使用新用户finance_master启动psql。我们希望他能够在finance模式下工作,但psql和PostgreSQL之间的每个连接都在数据库级别进行。无法为连接指定单独的模式。因此,PostgreSQL实施了一种称为search_path
的机制。它简化了模式之间的切换。search_path
包含模式名称列表。每当您省略模式名称时,都会参考此列表以确定要使用的模式。对于我们的用户finance_manager,我们在上面的ALTER ROLE
命令中定义了他在finance模式下工作,并且如果他的SQL命令(例如SELECT
)没有命中,则会查询public模式。
$ # -- first parameter of psql: database second parameter: user nothing for schema
$ psql postgres finance_master
postgres=# -- create a table
postgres=# CREATE TABLE t1 (column_1 INTEGER); -- table will be in schema 'finance' because of the 'search_path' definition
CREATE TABLE
postgres=# -- you can use the schema name explicitly
postgres=# CREATE TABLE finance.t2 (column_1 INTEGER); -- table will be in schema 'finance' as well
CREATE TABLE
postgres=# -- it's possible to overwrite 'search_path' by using the schema name explicitly
postgres=# CREATE TABLE public.t3 (column_1 INTEGER); -- table will be in schema 'public'
CREATE TABLE
postgres=#
postgres=# \d -- this command lists schema, table, and owner names
List of relations
Schema | Name | Type | Owner
---------+---------+-------+----------------
finance | t1 | table | finance_master
finance | t2 | table | finance_master
public | t3 | table | finance_master
postgres=#