PG数据库之间的导入导出(pg_dumpall,pg_dump,psql,pg_restore)

来源:互联网 发布:多人会议软件 编辑:程序博客网 时间:2024/06/07 00:53

参考文献:https://bbs.aliyun.com/read/247030.html?displayMode=1


本文将介绍如何对PG数据库进行导入、导出,主要利用的是PG自带的pg_dump、pg_dumpall、pg_restore、psql等命令,版本是9.4(不同版本的pg_dump \ pg_restore选项可能会有些不同,请注意)

导出、导入的整体思路是:
- 导出全局对象,如用户、编码、权限等,产生文件global-objs.dmp
- 导出每个数据库中的对象、结构,如建库语句、用户、权限、编码、表结构、自定义类型等,产生 [库名]-objs.dmp文件,如dxm-objs.dmp
- 导出每个数据库中的数据,这里分两种来考虑,一个是某库中所有的数据(所有的表),生成单个文件dxm.dmp;一个是针对某库中每个表分别进行导出备份,每个表一个文件,以[库名]-[表名].dmp命名,如dxm-all_types.dmp
- 在目标实例上建立全局对象,即导入global-objs.dmp
- 导入对象,即dxm-objs.dmp文件中的內容
- 导入数据,根据导出的不同,分为一次导入dxm.dmp,和分别导入每个表的文件,如dxm-all_types.dmp


导出过程

可以采用以下步驟完成:
  1. 导出公共对象,比如用户、权限、编码等
  2. 导出某个库上的对象,比如表、type等
  3. 导出某个库上的数据,即各个表的数据等

之后恢复按同样的步驟恢复就可以了。

第一步,导出所有公共对象,包括编码用户、权限等

pg_dumpall命令知识点:
pg_dumpall 可以导出所有数据库,类似 pg_dump,但用得非常少,原因可能是多方面的,
1 pg_dumpall 导出所有数据库到一个脚本文件,维护不方便;
2 pg_dumpall 依次导出所有库,总耗时比并行 pg_dump 各个库要多;
3 pg_dumpall 仅支持导出文件格式,还原时不能使用 pg_restore 有效使用并行等参数。

pg_dumpall相关参数
-g 导出role和tablespace
-r 仅导出role
-t 仅导出tablespace
-f或> 导出对应的文件路径和文件名 
eg.
$ pg_dumpall -g > pg92_globle.sql
$ pg_dumpall -g -f /home/data/ pg92_globle.sql

将所有的结构、对象、编码等必要信息导出
[postgres@cqs]$ pg_dumpall -h 127.0.0.1 -p 5432 -g -f /home/pg/gloable1117.dmp

第二步,导出库上的结构和对象

建议是将结构、对象与数据的导入、导出分开进行,会逻辑更清晰,也更好定位问题。
pg_dump
  -h 主机地址
  -p 端口号
  -U 用户名
  -s  选项,可以将库中所有的对象导出,而不导出数据
  -a  选项,只导出数据部分,不包括结构部分
  -C 选项,可以将建库的语句也输出到文件中;如果手动建库,则需要去除该选项
  -O 选项,如果目标库的用户与源库不同,那么导出的时候最好带上这个选项,去除“ALTER ...  OWNER TO”语句,以解决用户不存在或用户权限问题
   -x 选项,会去除GRANT/INVOKE语句
   -Fc选项,会采用自定义的格式,会占用较小的空间
   -Fd选项,目录格式。导出的时候,"-j NUM"会多线程的导出数据,提高性能,只在"-Fd"选项下有效
...

导出某个库上的结构:
[postgres@cqs ~]$ pg_dump -h 127.0.0.1 -p 5432 -U postgres -s  mydb>/home/postgres/mydb1.dump

第三步,导出数据
只导出数据部分,不包括结构部分,是"-a"选项。使用的指令是 pg_dump

导出的数据支持四种格式:SQL文件、自定义、目录、压缩格式。

SQL文件:只能通过psql来进行恢复,将SQL文件中的SQL语句进行重做,速度较慢,但较为简单,出了问题修改SQL文件即可。但数据量大了之后,单个SQL文件就可以达到很大的规模,将很难处理。

自定义的格式:会对数据进行一定的压缩,且可以利pg_restore进行并发导入。但输出的同样是单个文件,对于数据量过大,同样不太好处理。对于中等大小的实例比较合适,与SQL文件的大小简单对比如下(all_types.dmp是SQL文件):
- -rw-rw-r-- 1 dxm dxm 111736 Jun 2 18:43 all_types.cs
- -rw-rw-r-- 1 dxm dxm 1218139 Jun 2 18:04 all_types.dmp

目录的方式
目录的方式目前比较适合较大的实例,原因如下:
- 可以使用pg_dump的并发导出
- 可以使用pg_restore的并发导入
- 每个表一个文件,不至于单个文件过大(如SQL文件的方式)
- 有数据压缩


恢复数据

恢复数据的时候,根据导出的过程,先恢复对象部分,再对数据进行恢复。
首先恢复全局的信息,包括用户、编码等:
[postgres@cqs backup]$ psql -f /home/postgres/backup/gloable1117.dmp

自定义格式和目录方式,在恢复的时候都是支持多线程的,这对于大数据量有较好的效果。本次不对性能做太多分析,只看下功能。
自定义格式:
[postgres@cqs backup]$pg_restore -j4 -Fc -h 127.0.0.1 -d xxx -U postgres -p 5432 data.dump
目录方式:
[postgres@cqs backup]$pg_restore -Fd -h 127.0.0.1-d dxm -Upostgres-p 5432data.folder
可以看得出来, pg_restore的使用方式要简单很多。这里主要是因为将数据和对象分开来考虑了,所以这一步就只是数据。如果导出的文件包含数据和对象,通过pg_restore也是可以只恢复对象,或者数据。 另外,自定义格式和目录的方式,数据文件并不是可读的,对于数据的安全也是多了一点点保障。
另外,也可以先登录连接对应的数据库后,使用\i filename进行数据恢复
data=# \i /home/postgres/backup/data.sql

0 0
原创粉丝点击