目录
一、PostgreSQL 概述
二、基本使用
(一)登录数据库
(二)数据库操作
1. 列出数据库
2. 创建数据库
3. 删除数据库
4. 切换数据库
5. 查看数据库大小
(三)数据表操作
1. 列出表
2. 创建表
3. 复制表
4. 删除表
5. 查看表结构
三、模式操作命令
(一)创建模式
(二)在指定模式中创建表
(三)切换当前模式
(四)查看当前所在 schema
(五)查看搜索路径(Search Path)
(六)PostgreSQL 的模式隔离性
四、数据操作
(一)添加数据
(二)查询数据
(三)修改数据
五、备份与恢复
(一)备份
(二)从转储中恢复
六、远程连接 PostgreSQL
(一)配置访问权限
(二)重启服务
(三)验证远程连接
七、重置密码
(一)备份配置文件
(二)修改配置文件
(三)重启服务
(四)修改密码
(五)恢复 pg_hba.conf 配置文件
PostgreSQL(简称 pgsql)是一款功能强大的开源关系型数据库,具备稳定性、扩展性以及对 SQL 标准的严格遵循等显著特点。这些优势使其在企业级开发与数据分析场景中得到广泛应用。本笔记将围绕 pgsql 的日常使用展开,涵盖从基础登录到核心操作的完整流程,助力读者掌握数据库连接管理、库表创建与操作、模式(Schema)设计、远程访问权限配置以及账户安全维护等关键技能。
在登录 PostgreSQL 时,必须使用 postgres 用户。具体操作步骤如下:
[root@bogon ~]# su -- postgres # 切换到 postgres 用户
[postgres@bogon ~]$ /usr/local/pgsql/bin/psql # 启动 psql 客户端
登录成功后,命令提示符将变为 “postgres=#”,其中 “postgres” 表示当前所在的数据库。
1. 列出数据库
在 PostgreSQL 中,有三种常用的列出数据库的方法:
postgres=# SELECT datname FROM pg_database;
2. 创建数据库
使用 CREATE DATABASE 语句创建新的数据库,示例如下:
postgres=# create database mydb;
3. 删除数据库
若要删除不再需要的数据库,可使用 DROP DATABASE 语句,示例如下:
postgres=# drop database mydb;
4. 切换数据库
在 psql 中,使用 \c 元命令切换当前连接的数据库,示例如下:
postgres=# \c mydb
You are now connected to database "mydb" as user "postgres".
mydb=#
5. 查看数据库大小
postgres=# SELECT pg_database_size('mydb');
postgres=# SELECT pg_size_pretty(pg_database_size('mydb'));
1. 列出表
在 PostgreSQL 中,有多种列出表的方法:
mydb=# \dt;
mydb=# \d
mydb=# \d+
mydb=# \dt my_schema.*
mydb=# \dt *.*
mydb=# SELECT * FROM pg_tables WHERE schemaname = 'public';
2. 创建表
PostgreSQL 支持标准的 SQL 类型,如 int、smallint、real、double precision、char (N)、varchar (N)、date、time、timestamp 和 interval 等,还支持其他通用功能的类型和丰富的几何类型,并且可以定制任意数量的用户定义数据类型。创建表的示例如下:
postgres=# create table test(id int, name char(10), age int);
3. 复制表
要将已有的 table_name 表复制为新表 new_table,包括表结构和数据,可使用以下语句:
CREATE TABLE new_table AS TABLE table_name;
例如,将 test 表复制为 test2 表:
postgres=# CREATE TABLE test2 AS TABLE test;
4. 删除表
使用 DROP TABLE 语句删除表,示例如下:
postgres=# drop table test2;
5. 查看表结构
使用 \d 元命令查看表结构,示例如下:
postgres=# \d test;
输出结果将显示表的栏位、类型、校对规则、可空性和预设值等信息。
在 PostgreSQL 中,模式(Schema)是一个逻辑容器,用于组织和管理数据库对象(如表、视图、函数、索引等),类似于文件系统中的文件夹。它可以帮助在同一个数据库中分类存储不同的对象,避免命名冲突,并实现权限隔离。
在当前库 postgres 中创建名为 hr 的模式,示例如下:
postgres=# CREATE SCHEMA hr;
未指定模式时,创建的对象(表、视图等)会按 search_path 顺序创建到第一个可用的模式中。在 postgres 库中的 hr 模式下创建一个名为 employees 的表,示例如下:
postgres=# CREATE TABLE hr.employees (id SERIAL PRIMARY KEY, name TEXT);
切换模式也就是调整 search_path 的搜索范围。
SET search_path TO new_schema;
SET search_path TO hr, public;
使用 current_schema () 函数查看当前所在的 schema,示例如下:
postgres=# SELECT current_schema();
使用 SHOW search_path 命令查看当前的搜索路径,示例如下:
postgres=# SHOW search_path;
PostgreSQL 的模式是数据库内的逻辑分组,不同模式可以存在同名表,这是与 MySQL 的不同之处。跨模式查询需显式指定模式名(如 schemal.users),或通过 search_path 设置默认模式,无需切换数据库连接,所有操作在同一数据库内完成。以下是一个跨模式查询的示例:
postgres=# CREATE DATABASE mydb;
postgres=# \c mydb
mydb=# CREATE SCHEMA schemal;
mydb=# CREATE SCHEMA schema2;
mydb=# CREATE TABLE schemal.users (id int);
mydb=# INSERT INTO schemal.users VALUES(1);
mydb=# CREATE TABLE schema2.users (id int);
mydb=# INSERT INTO schema2.users VALUES(2);
mydb=# SELECT * FROM schemal.users;
mydb=# SELECT * FROM schema2.users;
mydb=# SET search_path TO schemal;
mydb=# SELECT * FROM users; -- 默认访问 schemal.users
mydb=# SET search_path TO schema2;
mydb=# SELECT * FROM users; -- 默认访问 schema2.users
在 postgres 库中新建表 test,并插入数据,示例如下:
postgres=# create table test(id int, name char(10), age int);
postgres=# insert into test values(1,'zhangsan', 18);
使用 SELECT 语句查询表中的数据,示例如下:
postgres=# select * from test;
使用 UPDATE 语句修改表中的数据,示例如下:
postgres=# update test set age=20 where id=1;
pg_dump 是 PostgreSQL 中用于备份数据库的工具。它可以备份整个数据库、单个模式或单个表。以下是使用 pg_dump 备份数据库的基本命令:
pg_dump -U username -h host -p port dbname > dumpfile
其中:
- -U username:指定连接数据库的用户名。
- -h host:指定数据库服务器的主机名或 IP 地址。
- -p port:指定数据库服务器的端口号。
- dbname:指定要备份的数据库名称。
- dumpfile:指定备份文件的名称和路径。
如果没有足够的特权来备份整个数据库,仍然可以使用诸如 -n schema 或 -t table 选项来备份该数据库中能够访问的部分。例如,备份指定模式 schema1 中的数据:
pg_dump -U postgres -h localhost -p 5432 mydb -n schema1 > schema1_backup.sql
要声明 pg_dump 连接哪个数据库服务器,使用命令行选项 -h host 和 -p port。默认主机是本地主机或 PGHOST 环境变量指定的主机,默认端口是环境变量 PGPORT 或(如果 PGPORT 不存在)内建的默认值。pg_dump 默认使用与当前操作系统用户名同名的数据库用户名进行连接,要使用其他名字,要么声明 -U 选项,要么设置环境变量 PGUSER。请注意,pg_dump 的连接也要通过客户认证机制。
pg_dump 对于其他备份方法的一个重要优势是,其输出可以很容易地在新版本的 PostgreSQL 中载入,而文件级备份和连续归档都是极度的服务器版本限定的。pg_dump 也是唯一可以将一个数据库传送到一个不同机器架构上的方法,例如从一个 32 位服务器到一个 64 位服务器。由 pg_dump 创建的备份在内部是一致的,也就是说,转储表现了 pg_dump 开始运行时刻的数据库快照,且在 pg_dump 运行过程中发生的更新将不会被转储。pg_dump 工作的时候并不阻塞其他的对数据库的操作(但是会阻塞那些需要排它锁的操作,比如大部分形式的 ALTER TABLE)。
pg_dump 生成的文本文件可以由 psql 程序读取。从转储中恢复的常用命令是:
psql dbname < dumpfile
其中 dumpfile 就是 pg_dump 命令的输出文件。这条命令不会创建数据库 dbname,必须在执行 psql 前自己从 template0 创建(例如,用命令 createdb -T template0 dbname)。psql 支持类似 pg_dump 的选项用以指定要连接的数据库服务器和要使用的用户名。非文本文件转储可以使用 pg_restore 工具来恢复。
在开始恢复之前,转储库中对象的拥有者以及在其上被授予了权限的用户必须已经存在。如果它们不存在,那么恢复过程将无法将对象创建成具有原来的所属关系以及权限(有时候这就是所需要的,但通常不是)。
默认情况下,psql 脚本在遇到一个 SQL 错误后会继续执行。如果希望在遇到一个 SQL 错误后让 psql 退出,那么可以设置 ON_ERROR_STOP 变量来运行 psql,这将使 psql 在遇到 SQL 错误后退出并返回状态 3,示例如下:
psql --set ON_ERROR_STOP=on dbname < infile
默认情况下,PostgreSQL 只能本地访问,要允许远程连接,需要在 pg_hba.conf 配置文件中进行配置。找到 IPv4 local connections 这一行,在这一行下面添加以下内容:
host all all 0.0.0.0/0 trust
其中:
如果选择使用 md5 或 password 等需要密码的认证方法,需要先为用户设置密码,示例如下:
postgres=# ALTER USER postgres WITH PASSWORD '123456';
配置完 pg_hba.conf 文件后,需要重启 PostgreSQL 服务,使配置生效,示例如下:
[root@localhost ~]# systemctl start postgresql
使用其它主机远程连接本机数据库,根据配置的认证方法不同,操作也有所不同:
[postgres@localhost ~]$ psql -h 192.168.10.102
[postgres@localhost ~]$ psql -h 192.168.10.102
Password for user postgres:
如果忘记了 PostgreSQL 的密码,可以通过以下步骤重置密码:
对 pg_hba.conf 文件进行备份,示例如下:
[root@localhost ^]# cp /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.confbak
修改配置文件以信任本地连接不需要密码,将配置文件中的认证方法(如 scram-sha-256 或者 md5)修改为 trust,示例如下:
[root@localhost ^]# vim /var/lib/pgsql/data/pg_hba.conf
# IPv4 local connections:
host all all 127.0.0.1/32 trust
修改完配置文件后,重启 PostgreSQL 服务,示例如下:
[root@localhost ^]# systemctl restart postgresql
登录数据库修改密码,密码自定义,示例如下:
postgres=# ALTER USER postgres WITH PASSWORD 'new_password';
将备份的 pg_hba.confbak 文件的内容覆盖 pg_hba.conf,重启 PostgreSQL 数据库服务器,重新登陆时,如果提示输入密码,则输入刚才修改的密码即可。