加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql备份恢复之pg_dump大数据处理

发布时间:2020-12-13 17:13:25 所属栏目:百科 来源:网络整理
导读:目录[-] 介绍 使用管道压缩和解压 custom-format directory-format 其他一些参数简单说明 介绍 官方文档介绍的主要有三种方式: 通过unix管道,直接读取pg_dump的输出来压缩. 使用pg_dump的custom-format 使用pg_dump的directory-format 使用管道压缩和解压 由

目录[-]

  • 介绍
  • 使用管道压缩和解压
  • custom-format
  • directory-format
  • 其他一些参数简单说明
  • 介绍

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

    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

    还原

    $ createdb -T template0 testdb1
    [postgres$ 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--. 46 database1.sqlab     -rw-rw-r--. 35 Feb 46 database1.sqlac 

    还原

    $ 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

    还原

    $ 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 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 9.4.1
    ;
    ;
    ; Selected TOC Entries:
    ;
    ;2872; 1262 16411 DATABASE - database1 hippo
    ;6; 2615 2200 SCHEMA - public postgres
    ;2873; 0 0 COMMENT - SCHEMA 2874; 0 ACL - 175; 3079 12723 EXTENSION - plpgsql
    ;2875; 0 COMMENT - EXTENSION plpgsql
    174; 1259 16544 TABLE public t3 hippo
    ;172; 16512 TABLE public tab2 postgres
    ;2876; 0 ACL 173; 16524 TABLE public tab3 postgres
    ;2877; public tab3 postgres
    2867; 16544 TABLE DATA 2865; 16512 TABLE DATA 2866; 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 testdb2 psql (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 dir database1
    [postgres@fnddb ~]$ ls dir
    2865.dat.gz  2866.dat.gz  2867.dat.gz  toc.dat
    [postgres@fnddb ~]$ cd dir
    [postgres@fnddb dir]$ cat 2866.dat.gz |gunzip 
    .
    
    
    [postgres@fnddb cat 2867.dat.gz |gunzip 
    t3
    user3
    t3
    user3
    t3
    user3
    .
    
    
    [postgres@fnddb file toc.dat
    toc.dat: PostgreSQL custom database dump - v1.12-0

    看结果因该是pg_dump导出了一个custom-format格式的数据库结构信息.
    同时将每一个表的数据分别导出到一个压缩文件.恢复使用copy命令可读取的格式
    -j参数指定同时几个进程来同时执行..每个进程同时只处理一个表的数据.

    恢复

    0 testdb3
    [postgres$ 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 –导出(恢复)某个表|排除某个表

    $ pg_dump -t t3 database1 | grep -i "create table"
    CREATE TABLE t3 (
    [postgres$ 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;
    t3
    user3
    t3
    ......
    [postgres@fnddb ~]$ pg_dump --inserts database1 | grep -i "insert"
    INSERT INTO t3 VALUES ('t3');
    'user3');
    ......

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

    $ pg_dump database1 | grep -i "create table"
    CREATE TABLE t3 (
    CREATE TABLE tab2 (
    CREATE TABLE tab3 (
    [postgres$ 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;
    public.tab2;
    public.t3;
    DROP EXTENSION plpgsql;
    SCHEMA public;

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

    "create database"
    [postgres$ 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来查看

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读