使用 pg_dump
和pg_restore
对数据进行备份和还原。 其中pg_restore
恢复还原采用的是创建语句
使用pg_dump的自定义转储格式。. 如果PostgreSQL所在的系统上安装了zlib压缩库,自定义转储格式将在写出数据到输出文件时对其压缩。这将产生和使用gzip时差不多大小的转储文件,但是这种方式的一个优势是其中的表可以被有选择地恢复。
下面的命令使用自定义转储格式来转储一个数据库:
pg_dump -Fc dbname > filename
自定义格式的转储不是psql的脚本,只能通过pg_restore恢复,例如:
pg_restore -d dbname filename
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
# 需要修改这几个不同的位置即可。
在做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
因为是同一个数据库:为了演示,先删除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
看到上述界面,基本上就完成了整个过程。
通过上诉两个步骤就完成了数据库的备份和还原。需要注意:在使用pg_restore
还原时,一定要注意,其SQL脚本是创建脚本,不是更新脚本,需要考究是否适合你的使用场景。另外还需要注意数据库名是否存在;如果脚本需要添加 IF EXISTS 则删除,则需要查询文档添加相关参数。
补充: 有关
pg_dump
和pg_restore
这个两个命令的参数详细信息,可以通过 pg_dump --help 和 pg_restore --help 查看。
……
过来很久以后,遇到了两个问题!
第一个:其中有一张表特别大的日志表,使用pg_restore恢复的时候,发现很久很久都不能恢复,而这个日志表中的数据不是很重要,可以忽略。那么是否可以在pg_dump这个数据库的时候,剔除这个表呢?
第二个:想利用Windows的上pg库的工具,不用再将备份包上传到服务器
在第一此做数据备份的时候,有一张日志表特别大,但是不是很重要,需要将这个表剔除。所以需要更加详细的知道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
在电脑管理,查看服务,找到pg。 查看属性后,可以看到安装目录。然后在cmd中进入该目录:
联接选项:
-h, --host=主机名 数据库服务器的主机名或套接字目录
-p, --port=端口号 数据库服务器的端口号
-U, --username=名字 以指定的数据库用户联接
-w, --no-password 永远不提示输入口令
-W, --password 强制口令提示 (自动)
--role=ROLENAME 在恢复前执行SET ROLE操作
后来有加需求了……
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的时候,需要服务器和本地的版本一致。否者会失败