0
点赞
收藏
分享

微信扫一扫

POSTGRESQL逻辑备份中pg_dump参数的理解

七千22 2022-08-07 阅读 148

pg_dump的默认行为

在使用pg_dump之前,先测试一下使用pg_dump对各种数据库对象对导时候的一些默认行为。

当前数据库对象

测试的对象是vicdb数据库,在vicdb数据库中有一个vicdb_s1的schema,同时有一个t1表,在t1表上面有创建对应的视图以及约束

目标数据库:vicdb
目标schema:vicdb_s1
目标表:
vicdb=> \d vicdb_s1.t1
Table "vicdb_s1.t1"
Column | Type | Collation | Nullable | Default
--------+-----------------------+-----------+----------+---------
x | integer | | |
name | character varying(23) | | |
Indexes:
"t1_name_idx" btree (name)

目标序列:
create sequence vicdb_s1.vic_seq start 10;

目标权限:
vicdb=# grant create on schema vicdb_s1 to user1;
GRANT
vicdb=# grant all on table vicdb_s1.t1 to user2;
GRANT
--对象如下
schemaname | objectname | objectowner | objecttype
------------+-------------+-------------+------------
vicdb_s1 | t1 | vic | TABLE
vicdb_s1 | t1_name_idx | vic | INDEX
vicdb_s1 | vic_seq | vic | SEQUENCE
vicdb_s1 | view1 | vic | VIEW
vicdb_s2 | s2_t1 | vic | TABLE

默认行为

  • 对数据库级别

pg_dump -Upostgres -W -d vicdb -h 192.168.202.203  -f vicdb_default

使用如上参数对数据库进行导出,观察导出的文件会发现:

Type: SCHEMA
会自动创建数据库里面的schema,并且会做授权的操作,如果目标库没有schema对应的owner,那么会报错
Type:TABLE
正常的CREATE TABLE和修改表owner的操作
Type: SEQUENCE;
对序列做创建
Type: TABLE DATA
记录了表里面的数据
Type: SEQUENCE SET
虽然之前创建了序列,但是还需要使用pg_catalog.setval设置序列的当前值
Type: INDEX
创建对应的索引
Type: ACL
同步权限

也就是说会导出这个数据库里面所有的东西。

  • 针对Schema

内容同dump一样,但是需要注意如下两点:

1、不会dump其它schema的依赖对象

2、如果指定了-n,那么就不会dump 大对象(blob),需要显示的指定--blobs


  • 针对表

会同步表结构、约束、索引、权限,但是不会同步和表相关的依赖对象(比如视图、外键等),同时,-n或者-N或失效。

pg_dump的相关参数

  • -c 用于控制输出的脚本中是否生成清理该数据库对象的语句,从默认行为中可以看到,在导出的文件中是没有drop 命令的,这样的也就意味着我们在做导入的时候如果遇到对象已经存在,那么就会报错。
  • -C,在任何级别的导出中,导出的文件都不包含create database的操作,可以使用-C选项,让导出的文件包括创建数据库的操作。
  • -n,这个也是常用选项,如果只想导出个别schema,可以使用-n去手工指定需要导出的schema。需要注意的是,如果指定了-n,那么pg_dump将不会导出blob对象,如果需要导出blob需要使用--blobs显示的指定。另外,如果这个schema中的数据库对象有关联到其它schema,pg_dump也不会导出关联的对象。如果不想导出某个schema,可以使用-N排除。
  • -O,该选项只对纯文本格式有意义。在默认情况下,导出的脚本会将导出的对象属主设置为原数据库的属主,如果目标库没有对应数据库对象的属主,那么导入过程就会报错,可以加入-O,让导出的数据库对象没有设置owner的动作。
  • -s,只是导出对象的结构,不导出表数据。
  • -t,表模式的导出
  • -x,常用选项,在导出数据库对象的过程中,默认会导出这个数据库对象的相关权限,如果不需要,可以使用-x禁止导出ACL
  • --insert,默认情况下对表数据的导出使用的copy模式,copy的效率相对较高,但是如果需要将pg导出的数据导入到其它的数据库中,就不能使用copy模式了,这个时候就需要使用--insert。


举报

相关推荐

0 条评论