资讯专栏INFORMATION COLUMN

PostgreSQL逻辑备份与恢复

IT那活儿 / 2499人阅读
PostgreSQL逻辑备份与恢复

点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!!

逻辑备份和恢复介绍


pg_dump是一个用来对PostgreSQL数据库进行逻辑备份的工具。即使数据库正在被并发使用,它也能创建一致的备份。

由pg_dump创建的备份在内部是一致的,也就是说,这个备份是pg_dump开始运行时刻的数据库快照,且在pg_dump运行过程中发生的更新将不会被备份。

pg_dump的全库一致性备份指的是实例中的单个数据库的一致性备份,因为备份不同的数据库需要切换连接,无法在不同的数据库之间共享snapshot,因此只能单库一致.这意味着每个数据库自身是一致的,但是不同数据库的快照并不同步。

pg_dump工作的时候并不阻塞其他的对数据库的操作。(但是会阻塞那些需要排它锁的操作,比如大部分形式的ALTER TABLE)。

pg_dump相对于其他备份方法的一个重要优势是,pg_dump的输出可以很容易地在新版本的PostgreSQL中载入,而文件级备份和连续归档都对服务器版本有限定。

pg_dump也是唯一可以将一个数据库传送到一个不同机器架构上的方法,例如从一个32位服务器到一个64位服务器。

pg_dump只转储单个数据库。要备份一个实例中对于所有数据库公共的全局对象(例如角色和表空间),则需要使用pg_dumpall。

pg_restore是一个用来从pg_dump创建的非文本格式归档恢复PostgreSQL数据库的工具。它将数据库重建成它备份时的状态。这些归档文件还允许pg_restore选择恢复哪些内容或者在恢复前对恢复项重排序。

pg_dump常用的备份选项:

-f,--file 备份脚本输出文件名;

-F,--format=c|d|t|p  #c自定义格式,d目录,t 输出为tar包,p 纯文本SQL;

-j,--jobs=num 当使用目录格式时,可以同时对多个表进行dump;

-a,--data-only 只dump表中的数据;

-c,--clean 在重建之前,先DROP到重建的对象;

-C,--create 包含创建database的命令;

-n,--schema;

-N,--exclude-scheam;

-s,--schema-only 只备份表结构;

-t,--table 只备份指定的表;

-T,--exclude-table;

--inserts #使用insert语句替换copy;

--column-inserts #insert语句包含完整的列名。


备份与恢复实验


1. 生成测试数据

创建一个测试数据库sncdb。

$ createdb sncdb

$
 pgsql sncdb

在这个测试数据库中创建测试表并生成测试数据。

记录一下各个表的hash值,用于恢复数据后校验。

sncdb=# select sum(hashtext(t1.*::text)) from t1;

sum

-------------

-2510573620

(1 row)



sncdb=# select sum(hashtext(t2.*::text)) from t2;

sum

-----------

197834427

(1 row)



sncdb=# select sum(hashtext(t3.*::text)) from t3;

sum

-----------

395668854

(1 row)



sncdb=# select sum(hashtext(t4.*::text)) from t4;

sum

------------

2840903814

(1 row)

2. 使用pg_dump备份数据库到文本文件并使用psql恢复数据

使用pg_dump将数据库sncdb备份到一个sql文本文件db_sncdb.sql。

$ pg_dump sncdb > db_sncdb.sql

备份完成后,删除这个数据库sncdb。

新创建一个数据库newdb。

检查数据库没有任何表存在。

使用psql将sql文本db_sncdb.sql恢复到刚才新创建的数据库newdb。

psql -d newdb -f db_sncdb.sql

数据恢复完成后,我们可以在newdb查看到这些表了。

检查表的hash值,与前面记录的hash值一致,数据恢复成功。

3. 使用pg_dump备份指定表到文本文件并使用psql恢复数据

使用pg_dump将表t4备份到一个sql文本文件t4.sql。

$ pg_dump -t t4 newdb > t4.sql

新创建一个数据库newdb2。

$ createdb newdb2

使用psql将sql文本t4.sql恢复到刚才新创建的数据库newdb2。

$ psql -d newdb2 -f t4.sql

数据恢复完成后,我们可以在newdb2查看到表t4了。

4. 备份数据库到归档文件并使用pg_restore恢复数据

创建一个新的数据库sncdb2,并把数据导入。

使用pg_dump将数据库sncdb2备份到一个归档文件sncdb2.dump。

$ pg_dump -Fc sncdb2 > sncdb2.dump

删除数据库sncdb2并使用pg_restore从归档文件sncdb2.dump中恢复它。

$ dropdb sncdb2

$ pg_restore -C -d postgres sncdb2.dump

数据恢复完成后,我们可以在恢复出来的数据库sncdb查看到这些表了。

我们也可以将归档文件恢复到一个名为sncdb3的新创建的数据库中。

新创建一个数据库sncdb3。

$ createdb -T template0 sncdb3

将归档文件sncdb2.dump恢复到新创建的数据库sncdb3中。

$ pg_restore -d sncdb3 sncdb2.dump

数据恢复完成后,我们可以在数据库sncdb_new查看到这些表了。

5. 更多pg_dump的示例

1)pg_dump仅导出数据库结构:

pg_dump -U TestRole1 -s -f TestDb1.sql TestDb1

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

pg_dump -h localhost -p 5432 -U someuser -F c -b -v -f mydb.backup mydb

3)备份某个database,备份结果以SQL文本方式输出,输出结果中需包括CREATE DATABASE语句:

pg_dump -h localhost -p 5432 -U someuser -C -F p -b -v -f mydb.backup mydb

4)备份某个database中所有名称以“pay”开头的表,备份结果以自定义压缩个数输出:

pg_dump -h localhost -p 5432 -U someuser -F c -b -v -t *.pay* -f pay.backup mydb

5)备份某个database中hr和payroll这两个schema中的所有数据,备份结果以自定义压缩格式输出:

pg_dump -h localhost -p 5432 -U someuser -F c -b -v -n hr -n payroll -f hr_payroll.backup mydb

6)备份某个database中除了public schema中的数据以外的所有数据,备份结果以自定义压缩格式输出:

pg_dump -h localhost -p 5432 -U someuser -F c -b -v -N public -f all_sch_except_pub.backup mydb

6. pg_dumpall实例级别逻辑备份

pg_dumpall常用的备份选项:

-f,--file 备份输出文件名;

-a,--data-only 只备份数据;

-c,--clean在重建之前,先DROP到重建的对象;

-E,--endcoding 备份文件字符集;

-s,--schema-only 只备份表结构;

建议每天对角色和表空间定义等全局对象进行备份,但不建议每天使用pg_dumpall来备份全库数据,因为pg_dumpall仅支持导出为SQL文本格式,而使用这种庞大的SQL文本备份来进行全库级别的数据库恢复时及其耗时的,所以一般只建议使用pg_dumpall来备份全局对象而非全库数据。




本文作者:汤 杰

本文来源:IT那活儿(上海新炬王翦团队)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129588.html

相关文章

  • 新书推荐 |《PostgreSQL实战》出版(提供样章下载)

    摘要:作者谭峰张文升出版日期年月页数页定价元本书特色中国开源软件推进联盟分会特聘专家撰写,国内多位开源数据库专家鼎力推荐。张文升中国开源软件推进联盟分会核心成员之一。 很高兴《PostgreSQL实战》一书终于出版,本书大体上系统总结了笔者 PostgreSQL DBA 职业生涯的经验总结,本书的另一位作者张文升拥有丰富的PostgreSQL运维经验,目前就职于探探科技任首席PostgreS...

    Martin91 评论0 收藏0
  • Postgresql 备份恢复

    摘要:指定要用于查找的口令文件的名称。前四个字段可以是确定的字面值,也可以使用通配符匹配所有。利用环境变量引用的文件权限也要满足这个要求,否则同样会被忽略。在上,该文件被假定存储在一个安全的目录中,因此不会进行特别的权限检查。 pg_dump pg_dump 把一个数据库转储为纯文本文件或者是其它格式. 用法: pg_dump [选项]... [数据库名字] 一般选项: -f, --fi...

    阿罗 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<