美文网首页Postgresql
POSTGRESQL 备份与恢复几种方法

POSTGRESQL 备份与恢复几种方法

作者: forback | 来源:发表于2019-06-18 19:45 被阅读0次

一、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  适用于数据量较大,实时性较高的备份和恢复

相关文章

网友评论

    本文标题:POSTGRESQL 备份与恢复几种方法

    本文链接:https://www.haomeiwen.com/subject/tdiemftx.html