目录
一:基本使用
1.登录数据库
2.数据库操作
2.1列出库
2.2创建库
2.3删除库
2.4切换库
2.5查看库大小
3.数据表操作
3.1 列出表
3.2创建表
3.3复制表
3.4删除表
4.模式操作命令
4.1创建模式
4.2默认模式
4.3删除模式
4.4查看所有模式
4.5 在指定模式中创建表(Create Table in Schema)
4.6切换当前模式
4.7查看当前所在schema
4.8查看搜索路径(Search Path)
4.9PostgreSQL 的模式隔离性
核心特性:
5.数据操作
5.1添加数据
5.2查询数据
5.3修改数据
5.4删除数据
6.备份与恢复
6.1SQL转储
6.2从转储中恢复
6.3使用pg_dumpall
7.远程连接
7.1修改PostgreSQL监听地址
7.2配置访问权限
目标
操作步骤
7.3重启服务
7.4验证远程连接
8.配置密码
8.1备份配置文件
8.2修改配置文件
8.3重启服务
8.4修改密码
8.5恢复pg_hba.conf配置文件。
一:基本使用
1.登录数据库
Pgsql 登录时,必须使用 postgres 用户,登录后的命令提示符为 “postgres=#”postgres 表示你当前所在的库
[root@bogon ~]# su - postgres
[postgres@bogon ~]$ /usr/local/pgsql/bin/psql
psql (16.3)
Type "help" for help.
postgres=#
2.数据库操作
2.1列出库
常用的三种方法如下
方法一
postgres=# \l
在 PostgreSQL 的交互式终端 psql 中,“\” 开头的命令称为元命令(类似MySQL 的 SHOW 语句),用于快速管理数据库
常用元命令有:
\l 列出所有数据库。
\c [数据库名] 或 \connect [数据库名]
\dn 列出所有模式(Schema)。
\db 列出所有表空间。
? 显示 pgsql 命令的说明 (元命令查询帮助)
\q 退出 psql
\dt 列出当前数据库的所有表
\d [TABLE] 查看表结构
\du 列出所有用户
方法二
postgres=# \l+
\l+ 的输出比 \l 多了 Size, Tablespace 和 Description 列
+:扩展输出,显示更多字段或详细信息
方法三
使用 SQL 命令
postgres=# SELECT datname FROM pg_database;
pg_database 是系统表,它存储了 PostgreSQL 实例中所有数据库的元信息(如数据库名称、所有者、编码等)。属于系统目录(System Catalog);类似 MySQL的 information_schema,但 PostgreSQL 的系统目录更底层且直接存储在pg_catalog 模式中。
pg_database 是系统目录表,所以无论当前连接到哪个数据库,该表始终可见系统表默认属于 pg_catalog 模式,而 pg_catalog 始终位于搜索路径(search_path)的首位。因此,查询时无需显式指定模式(如 pg_catalog.pg_database)。
2.2创建库
postgres=# create database mydb;
CREATE DATABASE
2.3删除库
postgres=# dorp database mydb;
DORP DATABASE
2.4切换库
postgres=# \cmydb
You are now connected to database "mydb" as user "postgres".
mydb=#
2.5查看库大小
函数以字节为单位返回数据库的大小
-- 以字节为单位返回'mydb'数据库的大小
postgres=# SELECT pg_database_size('mydb');
pg_database_size
------------------
7594499
(1 行记录)
-- 将'mydb'数据库大小字节数转为易读值
postgres=# SELECT pg_size_pretty(pg_database_size('mydb'));
pg_size_pretty
-------------------
7417 kB
(1 行记录)
3.数据表操作
3.1 列出表
列出表的常用方法:
mydb=# \dt;
列出表(显示 search_path 中模式里的表,默认 public)
mydb=# \d
列出表,视图和序列
mydb=# \d+
mydb=#\dt my_schema.*
列出指定模式下的表(例如 my_schema)
mydb=#\dt .
查看当前数据库的所有表(包括系统表)
mydb=#SELECT * FROM pg_tables WHERE schemaname = 'public';
使用 SQL 方式列出当前数据库中 public 模式下的所有表及其详细信息
pg_tables 是视图;属于 pg_catalog 模式,但它是基于 pg_class 和pg_namespace 的逻辑视图,并非物理表。无需切换数据库,直接查询pg_catalog.pg_tables 即可获取当前数据库的表信息
3.2创建表
create table test();
3.3复制表
create table 新表名 as table 表名;
3.4删除表
drop table 表名;
4.模式操作命令
4.1创建模式
CREATE SCHEMA [schema_name] [ AUTHORIZATION user_name ];
- 参数说明:
schema_name
:要创建的模式名称(可选,默认使用当前用户名作为模式名)。AUTHORIZATION user_name
:指定模式的所有者(可选,默认归当前用户所有)。
-- 创建名为 "sales" 的模式,所有者为 "admin"
CREATE SCHEMA sales AUTHORIZATION admin;
-- 直接使用当前用户名创建模式(无需指定名称)
CREATE SCHEMA;
4.2默认模式
PostgreSQL 的默认模式为 public
,但可通过以下方式修改用户的默认模式:
语法:
ALTER ROLE [user_name] SET search_path TO [schema_name];
示例:
-- 将用户 "user1" 的默认模式设置为 "sales"
ALTER ROLE user1 SET search_path TO sales;
4.3删除模式
DROP SCHEMA [schema_name] [CASCADE | RESTRICT];
- 参数说明:
CASCADE
:级联删除模式下的所有数据库对象(如表、视图等)。RESTRICT
:默认选项,若模式非空则拒绝删除(需先清空内容)。
示例:
-- 删除空模式 "temp"
DROP SCHEMA temp;
-- 强制删除包含对象的模式 "old_data" 及其所有内容
DROP SCHEMA old_data CASCADE;
4.4查看所有模式
方法 1:使用 SQL 查询系统表
SELECT schema_name FROM information_schema.schemata;
方法 2:使用 PostgreSQL 元命令(psql 客户端)
\dn -- 列出所有模式及其所有者
4.5 在指定模式中创建表(Create Table in Schema)
语法:
CREATE TABLE [schema_name].[table_name] (
column1 data_type,
column2 data_type,
...
);
示例:
-- 在 "sales" 模式中创建 "orders" 表
CREATE TABLE sales.orders (
order_id INT PRIMARY KEY,
order_date DATE,
amount NUMERIC
);
4.6切换当前模式
通过修改 search_path
参数切换默认模式,后续操作将优先在该模式下执行。
语法:
SET search_path TO [schema_name [, schema_name,...]];
示例:
-- 将当前搜索路径设置为 "sales"(后续创建表默认在此模式)
SET search_path TO sales;
-- 添加多个模式(按顺序搜索)
SET search_path TO sales, public; -- 先查找 "sales",再查找 "public"
4.7查看当前所在schema
方法 1:查询 search_path
参数
SHOW search_path;
输出示例:
search_path
-------------
sales, public
方法 2:使用函数 current_schema()
SELECT current_schema();
输出示例:
current_schema
----------------
sales
4.8查看搜索路径(Search Path)
SHOW search_path; -- 或直接查询系统变量
4.9PostgreSQL 的模式隔离性
核心特性:
-
命名空间隔离:
- 不同模式下可存在同名表,通过
schema_name.table_name
区分。 - 示例:
sales.orders
和public.orders
是两个独立的表。
- 不同模式下可存在同名表,通过
-
权限控制:
- 模式权限与数据库对象权限分离,可通过
GRANT/REVOKE
控制用户对模式的访问。
sql
GRANT USAGE ON SCHEMA sales TO app_user; -- 允许用户访问 "sales" 模式 GRANT CREATE ON SCHEMA sales TO app_user; -- 允许用户在模式中创建对象
- 模式权限与数据库对象权限分离,可通过
-
数据隔离层级:
- 模式是数据库内的逻辑隔离单位(非物理隔离),适用于多租户场景(如按租户划分模式)。
- 与数据库级隔离相比,模式更轻量,但安全性依赖权限配置。
-
迁移与备份:
- 可通过
pg_dump
单独导出某个模式的数据:bash
pg_dump -h host -U user -d dbname -n schema_name > schema_backup.sql
- 可通过
5.数据操作
5.1添加数据
在postgres库,新建表test
postgres=# create table test (id int,name char (10),age int);
CREATE TABLE
postgres=# insert into test values (1,'zhangsan',18);
INSERT 0 1
5.2查询数据
postgres=# select * from test;
5.3修改数据
postgres=# update test set age=20 where id=1;
UPDATE 1
postgres=# select * from test;
5.4删除数据
postgres=# delete from test where id=1;
DELETE 1
postgres=# select * from test;
6.备份与恢复
- PostgreSQL 数据库应当被定期地备份。虽然过程相当简单,但清晰地理解其底层技术和假设是非常重要的。
有三种不同的基本方法来备份 PostgreSQL 数据:
- SQL 转储
- 文件系统级备份
- 连续归档
每一种都有其优缺点,我们主要以 SQL 转储为主。
6.1SQL转储
SQL 转储方法的思想是创建一个由 SQL 命令组成的文件,当把这个文件回馈给服务器时,服务器将利用其中的 SQL 命令重建与转储时状态一样的数据库。PostgreSQL 为此提供了工具 pg_dump。这个工具的基本用法是:
pg_dump dbname > dumpfile
正如你所见,pg_dump 把结果输出到标准输出。我们后面将看到这样做有什么用处。尽管上述命令会创建一个文本文件,pg_dump 可以用其他格式创建文件以支持并行和细粒度的对象恢复控制。
pg_dump 是一个普通的 PostgreSQL 客户端应用(尽管是个相当聪明的东西)。这就意味着你可以在任何可以访问该数据库的远端主机上进行备份工作。但是请记住 pg_dump 不会以任何特殊权限运行。具体说来,就是它必须要有你想备份的表的读权限,因此为了备份整个数据库你几乎总是必须以一个数据库超级用户来运行它(如果你没有足够的特权来备份整个数据库,你仍然可以使用诸如 -n schema 或 -t table 选项来备份该数据库中你能够访问的部分)。
要声明 pg_dump 连接哪个数据库服务器,使用命令行选项 -h host 和 -p port。默认主机是本地主机或你的 PGHHOST 环境变量指定的主机。类似地,默认端口是环境变量 PGPORT 或(如果 PGPORT 不存在)内建的默认值。(服务器通常有相同的默认值,所以还算方便。)
和任何其他 PostgreSQL 客户端应用一样,pg_dump 默认使用与当前操作系统用户名同名的数据库用户名进行连接。要使用其他名字,要么声明 -U 选项,要么设置环境变量 PGUSER。请注意 pg_dump 的连接也要通过客户认证机制。
pg_dump 对于其他备份方法的一个重要优势是,pg_dump 的输出可以很容易地在新版本的 PostgreSQL 中载入,而文件级备份和连续归档都是极度的服务器版本限定的。pg_dump 也是唯一可以将一个数据库传送到一个不同机器架构上的方法,例如从一个 32 位服务器到一个 64 位服务器。
由 pg_dump 创建的备份在内部是一致的,也就是说,转储表现了 pg_dump 开始运行时刻的数据库快照,且在 pg_dump 运行过程中发生的更新将不会被转储。pg_dump 工作的时候并不阻塞其他的对数据库的操作。(但是会阻塞那些需要排他锁的操作,比如大部分形式的 ALTER TABLE。)
6.2从转储中恢复
pg_dump 生成的文本文件可以由 psql 程序读取。从转储中恢复的常用命令是:
psql dbname < dumpfile
其中 dumpfile 就是 pg_dump 命令的输出文件。这条命令不会创建数据库 dbname,你必须在执行 psql 前自己从 template0 创建(例如,用命令 createdb -T template0 dbname)。psql 支持类似 pg_dump 的选项用以指定要连接的数据库服务器和要使用的用户名。参阅 psql 的手册获取更多信息。非文本文件转储可以使用 pg_restore 工具来恢复。
在开始恢复之前,转储库中对象的拥有者以及在其上被授予了权限的用户必须已经存在。如果它们不存在,那么恢复过程将无法将对象创建成具有原来的所属关系以及权限(有时候这就是你所需要的,但通常不是)。
默认情况下,psql 脚本在遇到一个 SQL 错误后会继续执行。你也许希望在遇到一个 SQL 错误后让 psql 退出,那么可以设置 ON_ERROR_STOP 变量来运行 psql,这将使 psql 在遇到 SQL 错误后退出并返回状态 3:
psql --set ON_ERROR_STOP=on dbname < infile
不管怎样,你将只能得到一个部分恢复的数据库。作为另一种选择,你可以指定让整个恢复作为一个单独的事务运行,这样恢复要么完全完成要么完全回滚。这种模式可以通过向 psql 传递 -1 或 --single-transaction 命令行选项来指定。在使用这种模式时,注意即使是很小的一个错误也会导致运行了数小时的恢复被回滚。但是,这仍然比在一个部分恢复后手工清理复杂的数据库要好。
pg_dump 和 psql 读写管道的能力使得直接从一个服务器转储一个数据库到另一个服务器成为可能,例如:
pg_dump -h host1 dbname | psql -h host2 dbname
注意:
pg_dump 产生的转储是相对于 template0。这意味着在 template1 中加入的任何语言、过程等都会被 pg_dump 转储。结果是,如果在恢复时使用的是一个自定义的 template1,你必须从 template0 创建一个空的数据库,正如上面的例子所示。
一旦完成恢复,在每个数据库上运行 ANALYZE 是明智的举动,这样优化器就有有用的统计数据了。
6.3使用pg_dumpall
pg_dump 每次只转储一个数据库,而且它不会转储关于角色或表空间(因为它们是集簇范围的)的信息。为了支持方便地转储一个数据库集簇的全部内容,提供了 pg_dumpall 程序。pg_dumpall 备份一个给定集簇中的每一个数据库,并且也保留了集簇范围的数据,如角色和表空间定义。该命令的基本用法是:
pg_dumpall > dumpfile
转储的结果可以使用 psql 恢复:
psql -f dumpfile postgres
(实际上,你可以指定恢复到任何已有数据库名,但是如果你正在将转储载入到一个空集簇中则通常要用(postgres)。在恢复一个 pg_dumpall 转储时常常需要具有数据库超级用户访问权限,因为它需要恢复角色和表空间信息。如果你在使用表空间,请确保转储中的表空间路径适合于新的安装。
pg_dumpall 工作时会发出命令重新创建角色、表空间和空数据库,接着为每一个数据库 pg_dump。这意味着每个数据库自身是一致的,但是不同数据库的快照并不同步。
集簇范围的数据可以使用 pg_dumpall 的 --globals-only 选项来单独转储。如果在单个数据库上运行 pg_dump 命令,上述做法对于完全备份整个集簇是必需的。
7.远程连接
7.1修改PostgreSQL监听地址
默认 PostgreSQL 监听的地址是 127.0.0.1,别的机器无法远程连接上,所以需要调整,修改 postgresql.conf 文件。
通过 dnf 安装的 pgsql 配置文件在
/var/lib/pgsql/data/postgresql.conf
通过源码编译安装的 pgsql 配置文件在
/usr/local/pgsql/data/postgresql.conf
7.2配置访问权限
目标
通过 pg_hba.conf
文件设置允许远程连接的 IP 地址段及认证方式。
操作步骤
-
定位配置文件
- DNF/YUM 安装:路径为
/var/lib/pgsql/data/pg_hba.conf
。 - 源码编译安装:路径为
/usr/local/pgsql/data/pg_hba.conf
。
- DNF/YUM 安装:路径为
-
编辑配置文件
在文件末尾添加允许远程连接的规则,格式如下:# TYPE DATABASE USER ADDRESS METHOD host all all 192.168.1.0/24 md5 # 允许 192.168.1.0/24 网段通过密码认证连接 host all all 0.0.0.0/0 md5 # 允许所有 IP 地址通过密码认证连接(不推荐生产环境)
- 参数说明:
TYPE
:连接类型,host
表示 TCP/IP 连接。DATABASE
:允许访问的数据库名,all
表示所有数据库。USER
:允许访问的用户名,all
表示所有用户。ADDRESS
:允许连接的 IP 地址段(/24
表示子网掩码,0.0.0.0/0
表示所有地址)。METHOD
:认证方式,md5
表示密码认证,trust
表示无需密码(不安全,仅测试用)。
- 参数说明:
-
保存并退出文件
7.3重启服务
systemctl restart postgresql
7.4验证远程连接
psql -h 192.168.10.102
8.配置密码
8.1备份配置文件
对 pg_hba.conf 文件,进行备份
[root@localhost ~]# cp /var/lib/pgsql/data/postgresql.conf /var/lib/pgsql/data/postgresql.confbak
8.2修改配置文件
修改配置文件以信任本地连接不需要密码。将配置文件中的 scram - sha - 256 或者 md5 修改为 trust
[root@localhost ~]# vim /var/lib/pgsql/data/postgresql.conf
8.3重启服务
[root@localhost ~]# systemctl restart postgresql
8.4修改密码
登录数据库修改密码,密码自定义
postgres=# ALTER USER postgres WITH PASSWORD 'new_password';
ALTER ROLE
8.5恢复pg_hba.conf配置文件。
将 postgresql.confbak 文件的内容覆盖 pg_hba.conf,重启 PostgreSQL 数据库服务器,重新登陆时,如果提示输入密码,则输入刚才修改的密码即可