使用PostgreSQL转储清单

在使用PostgreSQL这么多年之后,有时会惊讶地发现,在某种程度上,某些实用程序具有的功能对很多人来说仍然相对未知。让我介绍一下清单。

pg_dump和pg_ restore都有开关,使我们能够在创建和恢复逻辑转储时对特定的感兴趣对象(如函数、表、数据等)进行分区。但是,当我们查看几十个(如果不是几百个)对象时,将这种粒度表示为参数可能会变得过于复杂。

输入清单

PostgreSQL转储不仅存储数据库的对象和数据,还存储它们的描述性元数据。当生成为文本文件时,PostgreSQL清单在一行中详细说明每个对象。然后可以通过删除或重新排序来编辑这些行。编辑后的文件可与pg_restore一起使用,以按规定顺序恢复实体。

下面是它的工作原理;第一步是使用自定义压缩参数-Fc生成标准转储

# generate the logical dump
pg_dump -C -Fc mydatabase > mydatabase.db

创建转储后,将使用pg_restore和-l开关生成清单,该开关将转到标准输出:

# generate a manifest, the meta data, sic description, of the logical dump
pg_restore -l mydatabase.db > mydatabase_manifest.ini

与配方一样,清单随后用于按照其指示读取和恢复转储:

# restore the dump using the manifest
pg_restore -L mydatabase_manifest.ini -d postgres mydatabase.db

当然,在生成和读取清单之间,您也可以利用编辑清单的机会:

因此,让我们使用更现实的方法,即pgbench。第一步初始化基准数据库,注意使用外键:

dropdb --if-exists pgbench
createdb pgbench
pgbench -i --foreign-keys -s 50 pgbench

让我们通过添加包括物化视图在内的多个视图来使景观复杂化:

psql pgbench <<_eof_
    create or replace view v1_pgbench_accounts as select * from pgbench_accounts;
    create or replace view v2_pgbench_accounts as select * from pgbench_accounts;
    create or replace view v3_pgbench_accounts as select * from pgbench_accounts;
    create materialized view m_pgbench_accounts as select * from v1_pgbench_accounts order by random() limit 1e3;
_eof_

现在让我们创建数据库转储。请记住,清单只能在使用自定义格式开关-Fc创建转储时生成。

pg_dump -Fc -C pgbench > pgbench.db

现在,让我们生成清单。我选择使用文件名的ini扩展名,因为我的代码编辑器将分号识别为注释行,并相应地对其进行着色:

pg_restore -C -l pgbench.db > pgbench_manifest.ini

按照生成和恢复逻辑转储的正常过程,从下面列出的输出中可以看到创建数据库的命令,即-C开关,后面是视图、表定义、数据填充和约束,最后是物化视图的数据填充:

;
; Archive created at 2022-08-24 10:21:46 PDT
;     dbname: pgbench
;     TOC Entries: 25
;     Compression: -1
;     Dump Version: 1.14-0
;     Format: CUSTOM
;     Integer: 4 bytes
;     Offset: 8 bytes
;     Dumped from database version: 14.0
;     Dumped by pg_dump version: 14.0
;
;
; Selected TOC Entries:
;
3361; 1262 25332 DATABASE - pgbench postgres
211; 1259 25339 TABLE public pgbench_accounts postgres
213; 1259 25380 VIEW public v1_pgbench_accounts postgres
216; 1259 25392 MATERIALIZED VIEW public m_pgbench_accounts postgres
212; 1259 25342 TABLE public pgbench_branches postgres
209; 1259 25333 TABLE public pgbench_history postgres
210; 1259 25336 TABLE public pgbench_tellers postgres
214; 1259 25384 VIEW public v2_pgbench_accounts postgres
215; 1259 25388 VIEW public v3_pgbench_accounts postgres
3353; 0 25339 TABLE DATA public pgbench_accounts postgres
3354; 0 25342 TABLE DATA public pgbench_branches postgres
3351; 0 25333 TABLE DATA public pgbench_history postgres
3352; 0 25336 TABLE DATA public pgbench_tellers postgres
3200; 2606 25354 CONSTRAINT public pgbench_accounts pgbench_accounts_pkey postgres
3202; 2606 25350 CONSTRAINT public pgbench_branches pgbench_branches_pkey postgres
3198; 2606 25352 CONSTRAINT public pgbench_tellers pgbench_tellers_pkey postgres
3207; 2606 25360 FK CONSTRAINT public pgbench_accounts pgbench_accounts_bid_fkey postgres
3205; 2606 25375 FK CONSTRAINT public pgbench_history pgbench_history_aid_fkey postgres
3203; 2606 25365 FK CONSTRAINT public pgbench_history pgbench_history_bid_fkey postgres
3204; 2606 25370 FK CONSTRAINT public pgbench_history pgbench_history_tid_fkey postgres
3206; 2606 25355 FK CONSTRAINT public pgbench_tellers pgbench_tellers_bid_fkey postgres
3355; 0 25392 MATERIALIZED VIEW DATA public m_pgbench_accounts po

一旦生成,清单现在可以根据我们的需求进行定制,在这种情况下,将恢复数据库转储的子集,如下所示:

1.创建数据库pgbench_restore

2.仅还原视图v1_pgbench_accounts

3.恢复并填充表pgbench_accounts

4.恢复并填充物化视图m_pgbench_accounts

您将注意到,为了恢复表pgbench_accounts,需要不添加所有约束,即删除FK约束。

经过一些编辑后,结果清单如下:

211; 1259 25339 TABLE public pgbench_accounts postgres
213; 1259 25380 VIEW public v1_pgbench_accounts postgres
216; 1259 25392 MATERIALIZED VIEW public m_pgbench_accounts postgres
3353; 0 25339 TABLE DATA public pgbench_accounts postgres
3200; 2606 25354 CONSTRAINT public pgbench_accounts pgbench_accounts_pkey postgres
3355; 0 25392 MATERIALIZED VIEW DATA public m_pgbench_accounts post

有了一点创造力,动态生成适当的清单并不是一个很大的飞跃:

GREP="TABLE public pgbench_accounts|VIEW public v1_pgbench_accounts|MATERIALIZED|DATA public pgbench_accounts|pgbench_accounts_pkey|DATA public m_pgbench_accounts"
 
pg_restore -C -l pgbench.db | grep -E "$GREP" > pgbench_manifest.ini

现在我们继续进行最后的恢复步骤:

dropdb --if-exists pgbench_restore
createdb pgbench_restore
#
# take a look at the generated SQL before uploading the logical dump
#
pg_restore -1 -L pgbench_manifest.ini -f - | less -S
 
#
# the logical dump can now be uploaded
#
pg_restore -1 -L pgbench_manifest.ini -d pgbench_restore pgbench.db

查看结果数据库确认成功:

psql pgbench_restore -c '\d'
                                                 List of relations
 Schema |        Name         |       Type        |  Owner   | Persistence | Access method |  Size
--------+---------------------+-------------------+----------+-------------+---------------+---------
 public | m_pgbench_accounts  | materialized view | postgres | permanent   | heap          | 144 kB  |
 public | pgbench_accounts    | table             | postgres | permanent   | heap          | 640 MB  |
 public | v1_pgbench_accounts | view              | postgres | 

这就是它的全部!

最后一个警告:通过删除整行来编辑清单。无法编辑行本身,因此不要更改任何内容,也不能将新行任意添加到清单中。请记住,清单就像指针,因为它们只能引用数据库转储中已经存在的内容。

作者相关

Robert 的第一台工作计算机是非常用户友好的IBM 360,具有令人敬畏的4MB RAM。经过一轮急需的治疗,克服了使用穿孔卡编程的创伤,他发现了IBM-XT和DOS 2.0的奇迹。几年后,罗伯特迷上了Linux和开源世界,在与CORE的一名成员会面后,他的主要关注点变成了PostgreSQL的所有东西。从那时起,罗伯特在夫妻公司、财富50强公司和许多非常酷的环境中工作,包括原子时代的发源地新墨西哥州著名的洛斯阿拉莫斯国家实验室。尽管不愿意离开加州硅谷通勤生活的愉快体验,但他回到了太平洋西北部,再次体验了真实的天气。如今,他在Percona担任PostgreSQL顾问。

原文标题:Working With PostgreSQL Dump Manifests
原文作者:Robert Bernier
原文链接:https://www.percona.com/blog/working-with-postgresql-dump-manifests/


免责声明:

1、本站资源由自动抓取工具收集整理于网络。

2、本站不承担由于内容的合法性及真实性所引起的一切争议和法律责任。

3、电子书、小说等仅供网友预览使用,书籍版权归作者或出版社所有。

4、如作者、出版社认为资源涉及侵权,请联系本站,本站将在收到通知书后尽快删除您认为侵权的作品。

5、如果您喜欢本资源,请您支持作者,购买正版内容。

6、资源失效,请下方留言,欢迎分享资源链接

文章评论

0条评论