PgSql备份pg_dump与还原手记pg_restore(转)-程序员宅基地

技术标签: 网络  php  数据库  

真没有想到,以前一直是PostgreSQL使用者,突然需要库移植又成了头一招了!原来它与mysql命令行操作区别还挺大。
不用怕,但绝对要细心,因为数据库操作是网站的核心,一旦出现损坏或丢失,后果就非常严重了。
我先写了步骤,然后按计划进行,虽然也出现了错误,但最终还是安全移植了。这里记录在案,以备后用。
备份还原方法:pg_dump和pg_restore,先仔细说明这两个命令,再记录我的操作方法。
pg_dump --  将一个PostgreSQL数据库抽出到一个脚本文件或者其它归档文件中
pg_dump [option...] [dbname]
选项option...
下面的命令行参数控制输出的内容和格式。

dbname
声明将要转储的数据库名。 如果没有声明这个参数,那么使用环境变量 PGDATABASE。 如果那个环境变量也没声明,那么用发起连接的用户名。

-a
--data-only
只输出数据,不输出模式(数据定义)。

这个选项只是对纯文本格式有意义。对于归档格式,你可以在调用 pg_restore 的时候声明选项。

-b
--blobs
在转储中包含大对象。必须选择一种非文本输出格式。

-c
--clean
输出在创建数据库创建命令之前先清理(删除)该数据库对象的命令。

这个选项只是对纯文本格式有意义。对于归档格式,你可以在调用 pg_restore 的时候声明选项。

-C
--create
以一条创建该数据库本身并且与这个数据库联接等命令开头进行输出。 (如果是这种形式的脚本,那么你在运行脚本之前和哪个数据库联接就不重要了。)

这个选项只对纯文本格式有意义。对于归档格式,你可以在调用 pg_restore 的时候声明该选项。

-d
--inserts
将数据输出为的INSERT命令(而不是 COPY)。 这样会导致恢复非常缓慢。 这个选项主要用于制作那种可以用于其它非 PostgreSQL 数据库的转储。 请注意,如果你重新排列了字段顺序,那么恢复可能会完全失败。 -D 更安全,但是也更慢。

-D
--column-inserts
--attribute-inserts
把数据转储为带有明确字段名的 INSERT 命令。 (INSERT INTO table(column, ...) VALUES ...)。 这样会导致恢复非常缓慢,它主要用于制作那种可以用于其它非 PostgreSQL 数据库的转储。

-f file
--file=file
把输出发往指定的文件。如果忽略这些,则使用标准输出。

-F format
--format=format
选择输出的格式。format可以是下列之一:

p
输出纯文本SQL脚本文件(缺省)

t
输出适合输入到 pg_restore 里的tar归档文件。 使用这个归档允许在恢复数据库时重新排序和/或把数据库对象排除在外。 同时也可能可以在恢复的时候限制对哪些数据进行恢复。

c
输出适于给 pg_restore 用的客户化归档。 这是最灵活的格式,它允许对装载的数据和对象定义进行重新排列。 这个格式缺省的时候是压缩的。

-i
--ignore-version
忽略在 pg_dump 和数据库服务器之间的版本差别。

pg_dump 可以处理来自以前版本的PostgreSQL 的数据库,但是太老的版本则不被支持了(目前是支持到 7.0)。 如果你需要跨越版本检查时才使用这个选项( 而且如 pg_dump 失效,别说我没警告你)。

-n namespace
--schema=schema
只转储 schema 的内容。 如果没有声明这个选项,所有目标数据库中的非系统模式都会被转储出来。

注意: 在这个模式里,pg_dump 并不试图转储任何其它选定模式可能依赖的数据库对象。 因此,系统不保证单一的一个模式的转储就可以成功地恢复到一个干净的数据库中去。

-o
--oids
作为数据的一部分,为每个表都输出对象标识(OID)。 如果你的应用在某种程度上引用了OID字段的话,(比如,在外键约束中用到)。 那么使用这个选项。否则,不应该使用这个选项。

-O
--no-owner
不 把对象的所有权设置为对应源数据库。 通常, pg_dump 发出(psql特有的) ALTER OWNER 或者 SET SESSION AUTHORIZATION 语句以设置创建的数据库对象的所有权。 又见 -R 和 -X use-set-session-authorization 选项。 请注意 -O 并不防止所有对数据库的重新联接, 只是防止那些为调整权限进行的排它联接。

这个选项只是对纯文本格式有意义。对于归档格式,在你调用 pg_restore 的时候你可以声明该选项。

-R
--no-reconnect
这个选项已经过时,但是出于向下兼容的考虑,仍然接受这个选项。

-s
--schema-only
只输出对象定义(模式),不输出数据。

-S username
--superuser=username
声明关闭触发器时需要用到的超级用户名。 它只有使用了 --disable-triggers 的时候才有关系。 (通常,我们最好不要输入这个参数,而是用超级用户启动生成的脚本。)

-t table
--table=table
只输出表 table的数据。 很可能是在不同模式里面有多个同名表;如果这样,那么所有匹配的表都将被转储出来。 同时声明 --schema 和 --table 则只选择一个表。

注意: 在这个模式里,pg_dump 并不试图转储任何其它选定表可能依赖的数据库对象。 因此,系统不保证单一的一个表的转储就可以成功地恢复到一个干净的数据库中去。

-v
--verbose
声明冗余模式。 这样将令 pg_dump 输出详细的对象评注以及转储文件的启停时间和进度信息到标准输出上。

-x
--no-privileges
--no-acl
避免输出 ACL(赋予/撤消 命令)和表的所有者关系信息。

-X disable-dollar-quoting
--disable-dollar-quoting
这个选项关闭使用美元符包围函数体。强制它们用 SQL 标准的字串语法的引号包围。

-X disable-triggers
--disable-triggers
这个选项只是和创建仅有数据的转储相关。它告诉 pg_dump 包含在恢复数据时,临时关闭目标表上面的触发器的命令。 如果你在表上有参考完整性检查或者其它触发器,而恢复数据的时候你不想重载他们,那么你就应该使用这个选项。

目前,为 --disable-triggers 发出的命令必须用超级用户来做。 因此,你应该同时用 -S 声明一个超级用户名,或者最好是用一个超级用户的身份来启动这个生成的脚本。

这个选项只对纯文本格式有意义。对于归档格式,你可以在调用 pg_restore 的时候声明这个选项。

-X use-set-session-authorization
--use-set-session-authorization
输出 SQL 标准 SET SESSION AUTHORIZATION 命令而不是 OWNER TO 命令。 这样的转储结果更加复合标准,但是依赖转储中的对象的历史,可能不能正确恢复。

-Z 0..9
--compress=0..9
声明在那些支持压缩的格式中使用的压缩级别。 (目前只有客户化格式支持压缩)。

下面的命令行参数控制数据库为联接参数。
-h host
--host=host
声明运行服务器的机器的主机名。 如果数值以斜杠开头,则它被用做到 Unix 域套接字的路径。 缺省是从 PGHOST 环境变量中取得的,如果设置了这个环境变量的话,否则,尝试一个 Unix 域套接字连接。

-p port
--port=port
声明服务器正在侦听并等待联接的 TCP 端口或本地 Unix 主控套接字文件句柄。 缺省时使用环境变量 PGPORT 的值(如果存在),或者是编译时的缺省值。

-U username
以给出用户身分联接。

-W
强制口令提示。如果服务器需要口令认证,那么这个动作应该自动发生。

pg_restore --  从一个由 pg_dump 创建的备份文件中恢复 PostgreSQL 数据库。
pg_restore 接受下列命令行参数。

filename
声明要恢复的备份文件的位置。如果没有声明,则使用标准输入。

-a
--data-only
只恢复数据,而不恢复表模式(数据定义)。

-c
--clean
创建数据库对象前先清理(删除)它们。

-C
--create
在恢复数据库之前先创建它。(如果出现了这个选项,和 -d 在一起的数据库名只是用于发出最初的CREATE DATABASE命令。 所有数据都恢复到名字出现在归档中的数据库中去。)

-d dbname
--dbname=dbname
与数据库 dbname 联接并且直接恢复到该数据库中。

-e
--exit-on-error
如果在向数据库发送 SQL 命令的时候碰到错误,则退出。 缺省是继续执行并且在恢复结束时显示一个错误计数。

-f filename
--file=filename
声明生成的脚本的输出文件,或者出现-l 选项时用于列表的文件,缺省是标准输出。

-F format
--format=format
声明备份文件的格式。因为pg_restore 会自动判断格式,所以如果声明了,它可以是下面之一:

t
备份是一个 tar 归档。 使用这个格式允许在恢复数据库的时候重新排序和/或把表模式元素排除出去。 同时还可能在恢复的时候限制装载的数据。

c
备份的格式是来自pg_dump的客户化格式。 这是最灵活的格式,因为它允许重新对数据排序,也允许重载表模式元素。 缺省时这个格式是压缩的。


-i
--ignore-version
忽略数据库版本检查。

-I index
--index=index
只恢复命名的索引。

-l
--list
列出备份的内容。这个操作的输出可以用 -L 选项限制和重排所恢复的项目。

-L list-file
--use-list=list-file
只恢复在 list-file 里面的元素,以它们在文件中出现的顺序。 你可以移动各个行并且也可以通过在行开头放 ';' 的方式注释。(见下文获取例子。)

-O
--no-owner
不 要输出设置对象的权限,以便与最初的数据库匹配的命令。 缺省时,pg_restore 发出 ALTER OWNER 或 SET SESSION AUTHORIZATION 语句设置创建出来的模式元素的所有者权限。 如果最初的数据库连接不是由超级用户(或者是拥有所有创建出来的对象的同一个用户)发起的,那么这些语句将失败。 使用 -O,那么任何用户都可以用于初始的连接,并且这个用户将拥有所有创建出来的对象。

-P function-name(argtype [, ...])
--function=function-name(argtype [, ...])
只恢复指定的命名函数。请注意仔细拼写函数名及其参数,应该和转储的内容列表中的完全一样。

-R
--no-reconnect
这个选项已经废弃了,但是为了保持向下兼容仍然接受。

-s
--schema-only
只恢复表结构(数据定义)。不恢复数据,序列值将重置。

-S username
--superuser=username
设置关闭触发器时声明超级用户的用户名。 只有在设置了 --disable-triggers 的时候才有用。

-t table
--table=table
只恢复表指定的表的定义和/或数据。

-T trigger
--trigger=trigger
只恢复指定的触发器。

-v
--verbose
声明冗余模式。

-x
--no-privileges
--no-acl
避免 ACL 的恢复(grant/revoke 命令)。

-X use-set-session-authorization
--use-set-session-authorization
输出 SQL 标准的 SET SESSION AUTHORIZATION 命令,而不是 OWNER TO 命令。 这样令转储与标准兼容的更好,但是根据转储中对象的历史,这个转储可能不能恰当地恢复。

-X disable-triggers
--disable-triggers
这个选项只有在执行仅恢复数据的时候才相关。它告诉 pg_restore 在装载数据的时候执行一些命令临时关闭在目标表上的触发器。 如果你在表上有完整性检查或者其它触发器, 而你又不希望在装载数据的时候激活它们,那么可以使用这个选项。

目 前,为 --disable-triggers 发出的命令必须以超级用户发出。 因此,你应该也要用 -S 声明一个超级用户名,或者更好是设置 --use-set-session-authorization 并且以 PostgreSQL 超级用户身份运行 pg_restore。

pg_restore 还接受下面的命令行参数做为联接参数:

-h host
--host=host
声明服务器运行的机器的主机名。 如果数值以斜杠开头,那么它被用做 Unix 域套接字的目录。 缺省是从 PGHOST 环境变量中获取的(如果设置了), 否则将尝试进行 Unix 域套接字。

-p port
--port=port
声明服务器侦听的 TCP 端口或者本地的 Unix 域套接字文件扩展。 缺省是环境变量 PGPORT 的值(如果设置了的话), 否则就说编译的缺省。

-U username
以给出用户身分联接。

-W
强制给出口令提示。如果服务器要求口令认证,那么这个应该自动发生。

理论说完了,有了上面的知识下面进行实战变得容易:

DBコッピ
/usr/local/pgsql/bin/pg_dump -Ft -b zhoz > /home/zhoz/db_zhoz_081121.tar

移動
scp -v /home/zhoz/db_zhoz_081121.tar [email protected]:/home/zhoz/

SCP也是新学到的,很强大!参数也收集了一下:
-v 和大多数linux命令中的-v意思一样,用来显示进度.可以用来查看连接,认证,或是配置错误.
-C 使能压缩选项.
-r 复制文件夹
-P 选择端口.注意-p已经被rcp使用.
-4 强行使用IPV4地址.
-6 强行使用IPV6地址.

エクスポート
/usr/local/pgsql/bin/pg_restore -d zhoz -U zhoz -W /home/zhoz/logs/db_zhoz_081121.tar
这里如果不指定-U会提示数据库不存在或导入非指定的库中,有危险性。

至此,打完收工!又掌握了一种实战技术。

「2009/06/23补充:」
pg_dumpall > outfile
生成的转储可以用 psql 恢复:

psql template1 < infile
(实际上,你可以声明任意现有的数据库进行连接,但是如果你是向一个空的数据库装载,那么 template1 是你唯一的选择。) 恢复pg_dumpall的转储的时候通常需要数据库超级用户权限,因为我们需要它来恢复用户和组信息。

   处理大数据库

     因为 PostgreSQL 允许表的大小大于你的系统允许的最大文件大小, 可能把表转储到一个文件会有问题,因为生成的文件很可能比你的系统允许的最大文件大。 因为 pg_dump 输出到标准输出,你可以用标准的 Unix 工具绕开这个问题:

使用压缩的转储. 使用你熟悉的压缩程序,比如说 gzip。


pg_dump dbname | gzip > filename.gz
用下面命令恢复:

createdb dbname
gunzip -c filename.gz | psql dbname
或者

cat filename.gz | gunzip | psql dbname



split 命令允许你 你用下面的方法把输出分解成操作系统可以接受的大小。 比如,让每个块大小为 1 兆字节:

pg_dump dbname | split -b 1m - filename
用下面命令恢复:

createdb dbname
cat filename* | psql dbname

    使 用客户化转储格式. 如果PostgreSQL是在一个安装了zlib 压缩库的系统上制作的,那么客户化转储格式将在写入输出文件的时候压缩数据。 它会生成和使用 gzip 类似大小的转储文件,但是还附加了一个优点:你可以有选择地恢复库中的表。 下面的命令用客户化转储格式转储一个数据库:

pg_dump -Fc dbname > filename
客户化格式的转储不是脚本,不能用于 psql, 而是需要使用 pg_restore 转储。 请参考 pg_dump 和 pg_restore 的手册获取细节。

 

 

备份:pg_dump -h localhost -p 5432 -U tradesns -W -F c -b -v -f "/home/tradeworkwangbin/us2010.backup" us2010
恢复:pg_restore -h 192.168.0.100 -p 5432 -U postgres -W -d us2011 -v "/root/us2010.backup"


注意
处于向下兼容的考虑,缺省的时候 pg_dump 并不转储大对象。 要转储大对象,你必须使用客户化或者 tar输出格式, 并且在 pg_dump 中使用-b选项。

作者:zhoz@Everyday NetLog
地址:http://log.zhoz.com/read.php?469

转载于:https://www.cnblogs.com/wangbin/archive/2009/08/14/1546009.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30855761/article/details/99194635

智能推荐

从本地或者网络读取图片,并转换为Bitmap图片_java 读取网页图像到bitmap-程序员宅基地

文章浏览阅读6.6k次。在做android项目时,我们经常需要从本地或者网络读取图片,并转换为Bitmap图片,以便使用,下面是读取本地图片并转换的方法:Java代码 /** * 得到本地或者网络上的bitmap url - 网络或者本地图片的绝对路径,比如: * * A.网络路径: url="http://blog.foreverlov_java 读取网页图像到bitmap

计算机组成原理|多功能ALU设计实验_设计一个具有8种运算功能的32位alu实验总结-程序员宅基地

文章浏览阅读9.8k次,点赞7次,收藏118次。多功能ALU设计实验一、实验目的与要求实验目的:(1)学习多功能ALU的工作原理,掌握运算器的设计方法(2)掌握运用Verilog HDL 进行行为描述与建模的技巧和方法实验要求:本实验要求设计一个具有8种运算功能的32位ALU,并能够产生运算结果的标志:结果为零标志ZF(Zero Flag)、溢出标志OF(Overflow Flag)。ALU通过3根控制线ALU_OP[2:0]..._设计一个具有8种运算功能的32位alu实验总结

iOS开发进阶之列表加载图片-程序员宅基地

文章浏览阅读484次,点赞10次,收藏5次。列表加载图片通常使用UITableView或UICollectionView,由于列表中内容数量不确定并且对于图片质量要求也不确定,所以对于图片加载的优化是很有必要的。

29、基于51单片机智能消防灭火小车 寻光自动红外壁障车设计_灭火小车设计方案-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏16次。智能作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。智能小车就是其中的一个体现,本次设计的多功能智能灭火避障小车,以STC89C52单片机作为微控制器,设计出一种可以寻找火源(火源以蜡烛模拟)和自动避开障碍物的小车。通过光敏晶体管传感器检测火源信号当检测到火源,小车自动调整姿态,对准火源。灭火电机启动将蜡烛吹灭实现模拟灭火。通过红外光电开关感应控制小车避障行驶。工作状态实时显示在1602液晶上。_灭火小车设计方案

Ubuntu虚拟机总是死机,然后重启就进不去打不开了怎么办_ubuntu卡死之后重启,打不开了-程序员宅基地

文章浏览阅读4.6k次。从网上搜到的方法都解决不了我的问题,分享一点我自己的实在的解决经验:养成保存快照的习惯,比什么方法都靠谱。 即打开VMWare->虚拟机->快照->拍摄快照,简单填写一下你现在做到的程度,然后点击拍摄快照,存一下,养成习惯,每做出些什么东西了,就存一个快照,哪天莫名其妙又死机了,开机又黑屏进不去了,直接用快照恢复到最近的进度继续做就好。..._ubuntu卡死之后重启,打不开了

随便推点

在Qt中使用CreateProcess打开命令行并执行命令_qt.createqprocess()-程序员宅基地

文章浏览阅读351次。在Qt应用程序中,执行命令行命令并获取输出结果可以使用QProcess类。现在,我们可以在Qt应用程序中调用这个函数来执行命令行命令并获取输出结果。现在,我们可以在Qt应用程序中调用这个函数来执行命令行命令并获取输出结果。在上面的示例中,我们将命令设置为"dir",这将列出当前目录的内容。在上面的示例中,我们将命令设置为"dir",这将列出当前目录的内容。这样,当我们点击按钮时,程序将执行命令并将输出结果显示在文本编辑器中。这样,当我们点击按钮时,程序将执行命令并将输出结果显示在文本编辑器中。_qt.createqprocess()

java logutil_Java日志组件1---Jdk自带Logger(java.util.logging.Logger)-程序员宅基地

文章浏览阅读216次。最近在看日志的一些东西,发现利用JDK自带的log也可以简单的实现日志的输出,将日志写入文件的过程记录如下:1、新建LogUtil.Java(里面写了几个静态方法,为log设置等级、添加log控制台handler、添加log文件输出handler)packagecn.darkranger.log.logger;importjava.io.IOException;importjava.text.S..._logutil.java

此时不应有 \scala\bin\..\lib\jline-2.14.5.jar_c:\users\dell>scala 此时不应有 \scala\bin\..\lib\jline--程序员宅基地

文章浏览阅读221次。scala安装时,此时不应有 \scala\bin…\lib\jline-2.14.5.jar那是因为安装Scala时,默认安装到Program Files (x86)或者Program Files下,但是这俩个文件夹命名存在空格,这是从新安装,选择没有空格存在的文件夹下面即可。谢谢..._c:\users\dell>scala 此时不应有 \scala\bin\..\lib\jline-2.14.5.jar

本地搭建docker仓库的详细步骤_本地安装docker-程序员宅基地

文章浏览阅读1.7k次。在本地创建一个用于存储Docker镜像的目录,比如 /data/docker-registry。如果需要加速拉取公共镜像,可以配置阿里云或DaoCloud等国内提供的Docker镜像加速器。如果需要在其他机器上访问该私有仓库,则需要配置证书。使用docker tag将本地构建好的镜像打标签,并推送到私有仓库中。在官网下载Docker安装包进行安装,具体操作方式可以参考官方文档。至此,本地Docker仓库搭建完成。配置客户端访问证书(可选)拉取Registry镜像。启动Registry容器。_本地安装docker

Docker 停止容器_docker停止运行中的容器-程序员宅基地

文章浏览阅读2w次。使用docker stop停止一个容器docker stop可以用来终止一个正在运行的容器。它的命令格式如下:docker stop [OPTIONS] Container [Container …]其中:docker stop: Docker停止容器的命令关键词;OPTIONS:命令选项,其中-t指定等待多少秒后如果容器还没终止,就强行停止,默认等待10秒;Container:需要启动的容器,该容器用“容器ID”或“容器名”表示,如果指定了多个容器,那么就将这些容器都启动。例如想要停止一个名_docker停止运行中的容器

3DMax主要应用在游戏公司,和建筑动画方面有很多优点如下_游戏建模中哪些东西可以用到公司-程序员宅基地

文章浏览阅读488次。ZBrush、Maya和3dmax的区别?我们知道,做三维设计、建模的软件有很多,最常见的有3DMAX、Maya和ZBrush, 那这几款软件之间有什么区别呢?ZBrush、Maya和3dmax的区别。zbrush首先,我们先来说3DMax和Maya这两款软件。 3DMax和Maya都属于三维制作软件,两者的很多功能基本相同,但是操作上的差异很大。功能上来说,两款软件都可以制作出3D模型,效果图,动画,影视。但是效果,制作方便程度上确实有差别。也不能做那个好那个不好,因为两款软件的定位目标不一样_游戏建模中哪些东西可以用到公司