postgresql中的 pg_dump和pg_restore

一、postgresql中的 pg_dump和pg_restore

使用 pg_dumppg_restore 对数据进行备份和还原。 其中pg_restore 恢复还原采用的是创建语句

1.1 pg_dump和pg_restore

  1. 数据库备份:pg_dump
  2. 数据库恢复:pg_restore

使用pg_dump的自定义转储格式。. 如果PostgreSQL所在的系统上安装了zlib压缩库,自定义转储格式将在写出数据到输出文件时对其压缩。这将产生和使用gzip时差不多大小的转储文件,但是这种方式的一个优势是其中的表可以被有选择地恢复。

下面的命令使用自定义转储格式来转储一个数据库:
pg_dump -Fc dbname > filename
自定义格式的转储不是psql的脚本,只能通过pg_restore恢复,例如:
pg_restore -d dbname filename


1.2 环境准备

  1. centos7
  2. postgresql10

1.3 使用 pg_dump和pg_restore 备份和还原

  • 备份某个database,备份结果以自定义压缩格式输出:

Ident authentication failed for user “postgres” 注意IP 不要使用 localhost, 使用真实的IP,否则需要修改配置文件来支持。

pg_dump -h 18*.**.136.109  -p 5432 -U postgres -F c -b -v -f    /home/soft/leetcode  leetcode

# 输入IP 端口、用户名。 输入的位置: /home/soft/leetcode ;dump的数据库为 leetcode
# 需要修改这几个不同的位置即可。

postgresql中的 pg_dump和pg_restore_第1张图片

在做pg_dump 时发现版本不一致,出现下面错误,现在需要设置版本顺序:

pg_dump: server version: 10.8; pg_dump version: 9.2.24
pg_dump: aborting because of server version mismatch
在这里插入图片描述
sudo find / -name pg_dump
sudo ln -sfn /usr/pgsql-9.6/bin/pg_dump /usr/bin/pg_dump
参考:https://askubuntu.com/questions/646603/how-do-i-solve-a-server-version-mismatch-with-pg-dump-when-i-need-both-postgre


  • 恢复数据库 pg_restore

因为是同一个数据库:为了演示,先删除leetcode、在创建leetcode。 然后使用pg_restore 进行恢复。

-- drop database leetcode;
-- create database leetcode;

数据库恢复(从那个文件恢复到那个数据库),恢复语句

因为之前不小心安装了不同版本的插件,导致了出现下面错误,跟pg_dump一样,需要调整默认的pg_restore顺序

pg_restore: [archiver] unsupported version (1.13) in file header
在这里插入图片描述
sudo find / -name pg_restore
sudo ln -sfn /usr/pgsql-10/bin/pg_restore /usr/bin/pg_restore

 pg_restore -h 18*.**.136.109 -p 5432 -U postgres -W -d leetcode  -v /home/soft/leetcode

postgresql中的 pg_dump和pg_restore_第2张图片

看到上述界面,基本上就完成了整个过程。


小结

通过上诉两个步骤就完成了数据库的备份和还原。需要注意:在使用pg_restore 还原时,一定要注意,其SQL脚本是创建脚本,不是更新脚本,需要考究是否适合你的使用场景。另外还需要注意数据库名是否存在;如果脚本需要添加 IF EXISTS 则删除,则需要查询文档添加相关参数。

补充: 有关pg_dumppg_restore 这个两个命令的参数详细信息,可以通过 pg_dump --help 和 pg_restore --help 查看。

……

过来很久以后,遇到了两个问题!


二、 续集

第一个:其中有一张表特别大的日志表,使用pg_restore恢复的时候,发现很久很久都不能恢复,而这个日志表中的数据不是很重要,可以忽略。那么是否可以在pg_dump这个数据库的时候,剔除这个表呢?

第二个:想利用Windows的上pg库的工具,不用再将备份包上传到服务器


2.1 剔除某个表

在第一此做数据备份的时候,有一张日志表特别大,但是不是很重要,需要将这个表剔除。所以需要更加详细的知道dump命令的参数使用。

C:\Users\Administrator>cd C:\Program Files\PostgreSQL\9.6\bin


C:\Program Files\PostgreSQL\9.6\bin>pg_dump.exe --help
pg_dump 把一个数据库转储为纯文本文件或者是其它格式.

用法:
  pg_dump [选项]... [数据库名字]

一般选项:
  -f, --file=FILENAME          输出文件或目录名
  -F, --format=c|d|t|p         输出文件格式 (定制, 目录, tar)
                               明文 (默认值))
  -j, --jobs=NUM               执行多个并行任务进行备份转储工作
  -v, --verbose                详细模式
  -V, --version                输出版本信息,然后退出
  -Z, --compress=0-9           被压缩格式的压缩级别
  --lock-wait-timeout=TIMEOUT  在等待表锁超时后操作失败
  -?, --help                   显示此帮助, 然后退出

控制输出内容选项:
  -a, --data-only              只转储数据,不包括模式
  -b, --blobs                  在转储中包括大对象
  -c, --clean                  在重新创建之前,先清除(删除)数据库对象
  -C, --create                 在转储中包括命令,以便创建数据库
  -E, --encoding=ENCODING      转储以ENCODING形式编码的数据
  -n, --schema=SCHEMA          只转储指定名称的模式
  -N, --exclude-schema=SCHEMA  不转储已命名的模式
  -o, --oids                   在转储中包括 OID
  -O, --no-owner               在明文格式中, 忽略恢复对象所属者

  -s, --schema-only            只转储模式, 不包括数据
  -S, --superuser=NAME         在明文格式中使用指定的超级用户名
  -t, --table=TABLE            只转储指定名称的表
  -T, --exclude-table=TABLE    不转储指定名称的表
  -x, --no-privileges          不要转储权限 (grant/revoke)
  --binary-upgrade             只能由升级工具使用
  --column-inserts             以带有列名的INSERT命令形式转储数据
  --disable-dollar-quoting     取消美元 (符号) 引号, 使用 SQL 标准引号
  --disable-triggers           在只恢复数据的过程中禁用触发器
  --enable-row-security        启用行安全性(只转储用户能够访问的内容)
  --exclude-table-data=TABLE   不转储指定名称的表中的数据
  --if-exists              当删除对象时使用IF EXISTS
  --inserts                    以INSERT命令,而不是COPY命令的形式转储数据
  --no-security-labels         不转储安全标签的分配
  --no-synchronized-snapshots  在并行工作集中不使用同步快照
  --no-tablespaces             不转储表空间分配信息
  --no-unlogged-table-data     不转储没有日志的表数据
  --quote-all-identifiers      所有标识符加引号,即使不是关键字
  --section=SECTION            备份命名的节 (数据前, 数据, 及 数据后)
  --serializable-deferrable   等到备份可以无异常运行
  --snapshot=SNAPSHOT          为转储使用给定的快照
  --strict-names               要求每个表和/或schema包括模式以匹配至少一个实体
  --use-set-session-authorization
                               使用 SESSION AUTHORIZATION 命令代替
                ALTER OWNER 命令来设置所有权

联接选项:
  -d, --dbname=DBNAME       对数据库 DBNAME备份
  -h, --host=主机名        数据库服务器的主机名或套接字目录
  -p, --port=端口号        数据库服务器的端口号
  -U, --username=名字      以指定的数据库用户联接
  -w, --no-password        永远不提示输入口令
  -W, --password           强制口令提示 (自动)
  --role=ROLENAME          在转储前运行SET ROLE

如果没有提供数据库名字, 那么使用 PGDATABASE 环境变量
的数值.

报告错误至 <[email protected]>.

可以看见 -T不转储这个某个表。

## 例如排除 op_log 这个表
pg_dump -h 18*.**.136.109  -p 5432 -U postgres -T op_log -F c -b -v -f    /home/soft/leetcode  leetcode

如果想剔除多个表,则可以像下面这样: -T + 加入表名

pg_dump -h 127.0.0.1  -p 5432 -U postgres -T client_debug_log -T trigger_log -F c -b -v -f   /home/pg_backup/tenant_2018120515472257.backups tenant_2018120515472257

2.2 在Windows上利用PG工具进行数据库的恢复

postgresql中的 pg_dump和pg_restore_第3张图片

在电脑管理,查看服务,找到pg。 查看属性后,可以看到安装目录。然后在cmd中进入该目录:

联接选项:
  -h, --host=主机名        数据库服务器的主机名或套接字目录
  -p, --port=端口号        数据库服务器的端口号
  -U, --username=名字      以指定的数据库用户联接
  -w, --no-password        永远不提示输入口令
  -W, --password           强制口令提示 (自动)
  --role=ROLENAME          在恢复前执行SET ROLE操作

如下图所示:使用pg_restore恢复备份包
postgresql中的 pg_dump和pg_restore_第4张图片


后来有加需求了……

只备份表结构

pg_dump命令可以导出数据库中的表结构。

-s  选项用来只导出表结构,而不会导出表中的数据
-t   选项用来指定要导出的数据库表

pg_dump -s -t tlb exampledb > /tmp/tlb  

exampledb是数据库,tlb是exampledb中的表,/tmp/tlb是定向到的文件.
如果数据库是远程的,需要指定主机,端口,用户等
pg_dump -h host  -p port -U username -s -t tablename dbname > struct.sql 

在使用pg_dump的时候,需要服务器和本地的版本一致。否者会失败

你可能感兴趣的:(postgresql,PostgreSQL)