postgresql之pg_dump

pg_dump是一个用于备份PostgreSQL数据库的工具。它甚至可以在数据库正在并发使用时进行完整一致的备份,而不会阻塞其它用户对数据库的访问。该工具生成的转储格式可以分为两种,脚本和归档文件。其中脚本格式是包含许多SQL命令的纯文本格式,这些SQL命令可以用于重建该数据库并将之恢复到生成此脚本时的状态,该操作需要使用psql来完成。至于归档格式,如果需要重建数据库就必须和pg_restore工具一起使用。在重建过程中,可以对恢复的对象进行选择,甚至可以在恢复之前对需要恢复的条目进行重新排序。该命令的使用方式如下:
    
pg_dump [option...] [dbname]
    1. 命令行选项列表:

选项

说明

-a(--data-only)

只输出数据,不输出模式(数据对象的定义)。这个选项只是对纯文本格式有意义。对于归档格式,你可以在调用pg_restore时指定选项。

-b(--blobs)

dump中包含大对象。

-c(--clean)

在输出创建数据库对象的SQL命令之前,先输出删除该数据库对象的SQL命令。这个选项只是对纯文本格式有意义。对于归档格式,你可以在调用 pg_restore时指定选项。

-C(--create)

先输出创建数据库的命令,之后再重新连接新创建的数据库。对于此种格式的脚本,在运行之前是和哪个数据库进行连接就不这么重要了。这个选项只是对纯文本格式有意义。对于归档格式,你可以在调用pg_restore时指定选项。

-Eencoding

以指定的字符集创建该dump文件。

-ffile

输出到指定文件,如果没有该选项,则输出到标准输出。

-Fformat

p(plain): 纯文本格式的SQL脚本文件(缺省)c(custom): 输出适合于pg_restore的自定义归档格式。这是最灵活的格式,它允许对装载的数据和对象定义进行重新排列。这个格式缺省的时候是压缩的。t(tar)输出适合于 pg_restoretar归档文件。使用这个归档允许在恢复数据库时重新排序和/或把数据库对象排除在外。同i时也可能可以在恢复的时候限制对哪些数据进行恢复。

-n  schema

只转储schema的内容。如果没有声明该选项,目标数据库中的所有非系统模式都会被转储。该选项也可以被多次指定,以指定不同pattern的模式。

-Nschema

不转储匹配schema的内容,其他规则和-n一致。

-o(--oids)

作为数据的一部分,为每个表都输出对象标识(OID)

-O(--no-owner)

不输出设置对象所有权的SQL命令。

-s(--schema-only)

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

-Susername

指定关闭触发器时需要用到的超级用户名。它只有在使用--disable-triggers的时候才有关系。

-ttable

只输出表的数据。很可能在不同模式里面有多个同名表,如果这样,那么所有匹配的表都将被转储。通过多次指定该参数,可以一次转储多张表。这里还可以指定和psql一样的pattern,以便匹配更多的表。(关于pattern,基本的使用方式是可以将它视为unix的通配符,即*表示任意字符,?表示任意单个字符,.(dot)表示schemaobject之间的分隔符,如a*.b*,表示以a开头的schema和以b开头的数据库对象。如果没有.(dot),将只是表示数据库对象。这里也可以使用基本的正则表达式,如[0-9]表示数字。)

-Ttable

排除指定的表,其他规则和-t选项一致。

-x(--no-privileges)

不导出访问权限信息(grant/revoke命令)

-Z0..9

声明在那些支持压缩的格式中使用的压缩级别。 (目前只有自定义格式支持压缩)

--column-inserts

导出数据用insert into  table_name(columns_list) values(values_list)命令表示,这样的操作相对其它操作而言是比较慢的,但是在特殊情况下,如数据表字段的位置有可能发生变化或有新的字段插入到原有字段列表的中间等。由于columns_list被明确指定,因此在导入时不会出现数据被导入到错误字段的问题。

--inserts

导出的数据用insert命令表示,而不是copy命令。即便使用insert要比copy慢一些,但是对于今后导入到其他非PostgreSQL的数据库是比较有意义的。

--no-tablespaces

不输出设置表空间的命令,如果带有这个选项,所有的对象都将恢复到执行pg_restore时的缺省表空间中。

--no-unlogged-table-data

对于不计入日志(unlogged)的数据表,不会导出它的数据,至于是否导出其Schema信息,需要依赖其他的选项而定。

-h(--host=host)

指定PostgreSQL服务器的主机名。

-p(--port=port)

指定服务器的侦听端口,如不指定,则为缺省的5432

-U(--username=username)

本次操作的登录用户名,如果-O选项没有指定,此数据库的Owner将为该登录用户。

-w(--no-password)

如果当前登录用户没有密码,可以指定该选项直接登录。

    2. 应用示例:
    # -h: PostgreSQL服务器的主机为192.168.149.137
    # -U: 登录用户为postgres
    # -t: 导出表名以test开头的数据表,如testtable
    # -a: 仅仅导出数据,不导出对象的schema信息。
    # -f: 输出文件是当前目录下的my_dump.sql
    # mydatabase是此次操作的目标数据库。
    /> pg_dump -h 192.168.149.137 -U postgres -t test*-a -f ./my_dump.sql mydatabase
    #-c: 先输出删除数据库对象的SQL命令,在输出创建数据库对象的SQL命令,这对于部署干净的初始系统或是搭建测试环境都非常方便。
    /> pg_dump -h 192.168.220.136 -U postgres -c -f./my_dump.sql mydatabase
    #导出mydatabase数据库的信息。在通过psql命令导入时可以重新指定数据库,如:/> psql -dnewdb -f my_dump.sql
    /> pg_dump -h 192.168.220.136 -U postgres -f./my_dump.sql mydatabase
    #导出模式为my_schema和以test开头的数据库对象名,但是不包括my_schema.employee_log对象。
    /> pg_dump -t 'my_schema.test*' -Tmy_schema.employee_log mydatabase > my_dump.sql
    #导出eastwest模式下的所有数据库对象。下面两个命令是等同的,只是后者使用了正则。
    /> pg_dump -n 'east' -n 'west' mydatabase -fmy_dump.sql
    /> pg_dump -n '(east|west)' mydatabase -fmy_dump.sql

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章