博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
postgresql备份恢复之pg_dump大数据处理
阅读量:6670 次
发布时间:2019-06-25

本文共 4806 字,大约阅读时间需要 16 分钟。

hot3.png

#介绍

官方文档介绍的主要有三种方式:

  1. 通过unix管道,直接读取pg_dump的输出来压缩.
  2. 使用pg_dump的custom-format
  3. 使用pg_dump的directory-format

#使用管道压缩和解压

由于pg_dump工具可以输出到标准输出,可以使用unix管道来直接压缩

1.压缩方法

[postgres@fnddb ~]$ pg_dump database1 | gzip > database1.sql.gz

还原

[postgres@fnddb ~]$ createdb -T template0 testdb1[postgres@fnddb ~]$ gunzip -c database1.sql.gz | psql testdb1......

2.切分

切分文件

[postgres@fnddb ~]$ pg_dump database1 | split -b 1k - database1.sql    [postgres@fnddb ~]$ ll    total 16    -rw-rw-r--. 1 postgres postgres 1024 Feb 10 21:46 database1.sqlaa    -rw-rw-r--. 1 postgres postgres 1024 Feb 10 21:46 database1.sqlab    -rw-rw-r--. 1 postgres postgres   35 Feb 10 21:46 database1.sqlac

还原

[postgres@fnddb ~]$ cat database1.sql* | psql testdb1......

#custom-format

记得编译安装时提示zlib库没有安装,custom-dump format会使用zlib库压缩输出文件

当然这不是文本文件,恢复需要使用pg_restore命来来恢复.

[postgres@fnddb ~]$ pg_dump -Fc database1 -f database1.c.dump[postgres@fnddb ~]$ file database1.c.dump database1.c.dump: PostgreSQL custom database dump - v1.12-0

还原

[postgres@fnddb ~]$ createdb -T template0 testdb1[postgres@fnddb ~]$ pg_restore -d testdb1 database1.c.dump

可以只恢复自己赶兴趣的对象

[postgres@fnddb ~]$ pg_restore -l database1.c.dump > database1.c.dump.list[postgres@fnddb ~]$ vi database1.c.dump.list ;; Archive created at Tue Feb 10 22:02:23 2015;     dbname: database1;     TOC Entries: 16;     Compression: -1;     Dump Version: 1.12-0;     Format: CUSTOM;     Integer: 4 bytes;     Offset: 8 bytes;     Dumped from database version: 9.4.1;     Dumped by pg_dump version: 9.4.1;;; Selected TOC Entries:;;2872; 1262 16411 DATABASE - database1 hippo;6; 2615 2200 SCHEMA - public postgres;2873; 0 0 COMMENT - SCHEMA public postgres;2874; 0 0 ACL - public postgres;175; 3079 12723 EXTENSION - plpgsql;2875; 0 0 COMMENT - EXTENSION plpgsql174; 1259 16544 TABLE public t3 hippo;172; 1259 16512 TABLE public tab2 postgres;2876; 0 0 ACL public tab2 postgres;173; 1259 16524 TABLE public tab3 postgres;2877; 0 0 ACL public tab3 postgres2867; 0 16544 TABLE DATA public t3 hippo;2865; 0 16512 TABLE DATA public tab2 postgres;2866; 0 16524 TABLE DATA public tab3 postgres

只需要将不需要恢复的对象使用;注释掉就可以了,然后还原带上此列表

[postgres@fnddb ~]$ createdb -T template0 testdb2[postgres@fnddb ~]$ pg_restore -L database1.c.dump.list -d testdb2 database1.c.dump[postgres@fnddb ~]$ psql testdb2psql (9.4.1)Type "help" for help.testdb2=# \dt       List of relations Schema | Name | Type  | Owner --------+------+-------+------- public | t3   | table | hippo(1 row)testdb2=# select * from t3;  id   ------- t3 user3(2 rows)

#directory-format

这种模式可以使用pg的多个工作进程.可以极大增强导出大数据库的效率.

这种模式同一时间导出多个表.也就是并行导出,当然对服务器资源消耗也比较高,不要在高峰时刻进行. 它输出不是一个文件,需要首先创建一个目录

[postgres@fnddb ~]$ mkdir db.dir[postgres@fnddb ~]$ pg_dump -Fd -j4 -f db.dir database1[postgres@fnddb ~]$ ls db.dir2865.dat.gz  2866.dat.gz  2867.dat.gz  toc.dat[postgres@fnddb ~]$ cd db.dir[postgres@fnddb db.dir]$ cat 2866.dat.gz |gunzip \.[postgres@fnddb db.dir]$ cat 2867.dat.gz |gunzip t3user3t3user3t3user3\.[postgres@fnddb db.dir]$ file toc.dattoc.dat: PostgreSQL custom database dump - v1.12-0

看结果因该是pg_dump导出了一个custom-format格式的数据库结构信息.

同时将每一个表的数据分别导出到一个压缩文件.恢复使用copy命令可读取的格式 -j参数指定同时几个进程来同时执行..每个进程同时只处理一个表的数据.

恢复

[postgres@fnddb ~]$ createdb -T template0 testdb3[postgres@fnddb ~]$ pg_restore -d testdb3 -j4 db.dir

-j参数指定并发的数量(job),pg_restore恢复custom-format格式也可以使用此参数,并非只适用directory-format

#其他一些参数简单说明

pg_dump和pg_restore很多参数都很类似.

-n schema |-N schema --只导出(恢复)某个schema|排除某个schema,例子见-t table

-t table | -T table --导出(恢复)某个表|排除某个表

[postgres@fnddb ~]$ pg_dump -t t3 database1 | grep -i "create table"CREATE TABLE t3 ([postgres@fnddb ~]$ pg_dump -T t3 database1 | grep -i "create table"CREATE TABLE tab2 (CREATE TABLE tab3 (

--inserts --导出成insert 语句,导入时性能很差,主要为了迁移到其他数据库使用

[postgres@fnddb ~]$ pg_dump database1 | grep -A3 -i "copy"COPY t3 (id) FROM stdin;t3user3t3......[postgres@fnddb ~]$ pg_dump --inserts database1 | grep -i "insert"INSERT INTO t3 VALUES ('t3');INSERT INTO t3 VALUES ('user3');......

-a --只导出数据,不导结构

[postgres@fnddb ~]$ pg_dump database1 | grep -i "create table"CREATE TABLE t3 (CREATE TABLE tab2 (CREATE TABLE tab3 ([postgres@fnddb ~]$ pg_dump -a database1 | grep -i "create table"

-c --包括drop 对象的语句进去,最好附带--if-exists参数,否则导入时会报一些对象不存在的错误,虽然无关紧要

[postgres@fnddb ~]$ pg_dump database1 | grep -i drop [postgres@fnddb ~]$ pg_dump -c database1 | grep -i drop DROP TABLE public.tab3;DROP TABLE public.tab2;DROP TABLE public.t3;DROP EXTENSION plpgsql;DROP SCHEMA public;

-C --包含创建数据库的语句

[postgres@fnddb ~]$ pg_dump database1 | grep -i "create database"[postgres@fnddb ~]$ pg_dump -C database1 | grep -i "create database"CREATE DATABASE database1 WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' TABLESPACE = ts01;

其他参数可以通过官方文档或者pg_dump --help来查看

//END

转载于:https://my.oschina.net/hippora/blog/377336

你可能感兴趣的文章
第十周进度条
查看>>
源码安装node8.11.1
查看>>
bootanimation 动画替换调试
查看>>
改变表单元素的外观
查看>>
AutoMapper的简单使用
查看>>
tomcat 服务不支持 chkconfig 以及其他服务不能添加到开机启动时的操作
查看>>
让PowerShell用上Git
查看>>
XXXXX was compiled with optimization - stepping may behave oddly; variables may not be available.
查看>>
Linux0.11内核--几种地址(逻辑地址、线性地址、物理地址)的含义
查看>>
posix多线程有感--自旋锁
查看>>
NOIP2014 提高组 Day2——寻找道路
查看>>
设置Sysctl.conf用以提高Linux的性能(最完整的sysctl.conf优化方案)
查看>>
tp路由+伪静态+去掉index.php
查看>>
R.I.P. PK
查看>>
【转载】使用铁哥SmartFlash快速开发方案:66行代码搞定抽奖程序!
查看>>
Map<key,value>泛型get(key)值为null问题解决
查看>>
ZendFramework学习第一章
查看>>
40种网页小技巧
查看>>
PHP 乱码解决方面
查看>>
在Linux中一个网卡绑定多个IP设定
查看>>