POSTGRESQL 备份与恢复几种方法

一、Copy

COPY在 PostgreSQL表和标准文件系统文件之间 移动数据。COPY TO把一个表的内容复制 到一个文件,而COPY FROM 则从一个文件复制数据到一个表(把数据追加到表中原有数据)。COPY TO也能复制一个 SELECT查询的结果。 支持text、 csv(逗号分隔值)或者binary。 默认是text。

(一)语法:

COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }

    TO { 'filename' | PROGRAM 'command' | STDOUT }

[ [ WITH ] ( option [, ...] ) ]

COPY table_name [ ( column_name [, ...] ) ]

    FROM { 'filename' | PROGRAM 'command' | STDIN }

[ [ WITH ] ( option [, ...] ) ]

(二)常用参数

table_name,column_name,query,filename

(三)示例:

导出表

COPY user TO '/tmp/data/test.csv' WITH csv;

导出字段

COPY user(name,password) TO '/tmp/data/test.csv' WITH csv;

COPY (select name,age from user) TO '/tmp/data/test.csv' WITH csv header;

导入表

COPY user from '/tmp/data/test.csv' ;

(四)注意事项:

COPY TO只能被用于纯粹的表,不能用于视图。 不过你可以写COPY (SELECT * FROM viewname) TO ... 拷贝一个视图的当前内容。

COPY FROM可以被用于纯粹的表和具有 INSTEAD OF INSERT触发器的视图。 同时调用目标表上的任何触发器 和检查约束。

COPY命令的用户必须是 PostgreSQL用户(运行服务器的用户 ID)可访问的并且是可读或者可写的。 只允许数据库超级用户COPY一个文件或者命令, 因为它允许读取或者写入服务器有特权访问的任何文件。

COPY默认利用tab作为列的界限,空格作为字符

二、Pg_dump

pg_dupg_dump — 把PostgreSQL数据库抽取为一个脚本文件或其他归档文件

(一)语法

Pg_dump [connection-option...] [option...] [dbname]

样例:pg_dump dbname > outfile

psql dbname < infile

pg_restore -d newdb db.dump

(二)常用参数:

-a  --data-only

-b  --blobs

-B  --no-blobs

-c  --clean

d  directory

-j njobs  --jobs=njobs

-n schema  --schema=schema

-t table  --table=table

参数命令中大小写会造成语义相反。

(三)示例:

要把一个数据库mydb转储到一个 SQL 脚本文件:

$ pg_dump mydb > db.sql

要用 5 个并行的工作者任务转储一个数据库到一个目录格式的归档:

$ pg_dump -Fd mydb -j 5 -f dumpdir

要把一个归档文件重新载入到一个(新创建的)名为newdb的数据库:

$ pg_restore -d newdb db.dump

要转储detroit模式中名称以emp开始的所有表,排除名为employee_log的表:

$ pg_dump -t 'detroit.emp*' -T detroit.employee_log mydb > db.sql

(四)注意事项:

为maintenance_work_mem和max_wal_size设置适当的(即比正常值大的)值。

如果使用 WAL 归档或流复制,在转储时考虑禁用它们。在载入转储之前,可通过将archive_mode设置为off、将wal_level设置为minimal以及将max_wal_senders设置为零(在录入dump前)来实现禁用。 之后,将它们设回正确的值并执行一次新的基础备份。

如果在数据库服务器上有多个 CPU 可用,可以考虑使用pg_restore的--jobs选项。这允许并行数据载入和索引创建。 

恢复后执行统计信息收集

ANALYZE [ VERBOSE ] [ table_name [ ( column_name [, ...] ) ] ]描述

ANALYZE收集一个数据库中的表的内容的统计信息,并且将结果存储在pg_statistic系统目录中。

三、PG_DUMPALL

pg_dumpall备份一个给定集簇中的每一个数据库,并且也保留了集簇范围的数据,如角色和表空间定义。

(一)语法

pg_dumpall > outfile

转储的结果可以使用psql恢复:

psql -f infile postgres

(二)注意事项

PG_DUMPALL的过程中,每个数据库自身是一致的,但是不同数据库的快照并不同步。

建议在每个数据库上运行ANALYZE,这样优化器就可以得到有用的统计信息。你也可以运行vacuumdb -a -z来分析所有数据库。

四、PITR

在任何时间,PostgreSQL在数据集簇目录的pg_wal/子目录下都保持有一个预写式日志(WAL)。这个日志存在的目的是为了保证崩溃后的安全:如果系统崩溃,可以“重放”从最后一次检查点以来的日志项来恢复数据库的一致性。我们可以把一个文件系统级别的备份和WAL文件的备份结合起来。当需要恢复时,我们先恢复文件系统备份,然后从备份的WAL文件中重放来把系统带到一个当前状态。

(一)修改配置文件 postgresql.conf

archive_mode = on

archive_command = 'cp -i %p /home/sure/mywork/archive/%f'

wal_level = replica

重启数据库

./pg_ctl -l logfile start

(二)对数据库进行物理备份

select pg_start_backup('stm');

打包数据库

tar -cvzf data.tar data

结束备份

select pg_stop_backup();

这时会再备份出的data下产生一个backup_label的文件,记录了可以查看内容有checkpoint时间,基础备份的开始和结束时间,以及标签名称等

这里也可以用pg_basebackup工具备份

pg_basebackup  -F t -R -D /home/postgres/bak

(三)更新数据库

copy  weather from '/home/postgres/test.txt';

切换归档产生新归档文件

PostgreSQL手动切换WAL日志的命令: 

在PG10之前:

highgo=# select pg_switch_xlog(); pg_switch_xlog

在PG10之后:

highgo=# select pg_switch_wal(); pg_switch_wal

(四)模拟数据库毁坏并恢复

模拟毁坏  cp -r data data1

解压备份:$ tar xvf data.tar

清理pg_wal    rm -rf  ./*

修改 postgresql.conf  将之前的配置去掉

配置recovery.conf

restore_command = 'cp /home/postgres/archive/%f %p'

archive_cleanup_command='pg_archivecleanup /home/sure/mywork/archivedir %r'

recovery_target_time='2018-07-21 14:35:12'

重启数据库

Pg_ctl start

结束后,recovery.conf会改名变成recovery.done。

验证数据

Select  * from weather;

五、总结:

COPY适合单表或者一个查询的结果,小范围的移动

PG_DUMP适用于数据实时性要求低,单个数据库的备份恢复

PG_DUMPALL适用于数据实时性要求低,整个数据库集簇的备份与恢复

PITR  适用于数据量较大,实时性较高的备份和恢复

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • | | 备份速度|备份范围|恢复范围|操作影响|备份原理|恢复成本|| ------- |:---...
    顶儿响叮当阅读 3,345评论 0 4
  • <<编程基础-语言SQL.Git.Docker>>SQL.PLSQLhttp://docs.pythontab.c...
    燕京博士阅读 419评论 0 0
  • pg_ctl 名称 pg_ctl -- 启动、停止、重启 PostgreSQL语法 pg_ctl start [-...
    老肖阅读 938评论 0 0
  • Standby数据库原理 简单介绍一些基础概念与原理,首先我们做主从同步的目的就是实现db服务的高可用性,通常是一...
    椟夜阅读 3,198评论 0 5
  • 在我的努力下,我终于招到一个还算是比较认可的一个人啦。 每次做完一件事情,总是在反思自己,我这样做对吗?!我为什么...
    SU呐阅读 94评论 0 0