
COPY
~~~~

Создадим базу данных и таблицу в ней.

        => create database db;
        CREATE DATABASE

        => \c db
        You are now connected to database "db" as user "postgres".

        => create table t(id numeric, s text);
        CREATE TABLE

        => insert into t values (1, 'Hi there!');
        INSERT 0 1

        => insert into t values (2, '');
        INSERT 0 1

        => insert into t values (3, null);
        INSERT 0 1

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

        => select * from t;
         id |     s     
        ----+-----------
          1 | Hi there!
          2 | 
          3 | 
        (3 rows)
        

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

Вот как выглядит таблица в выводе команды COPY:

        => copy t to stdout;
        1	Hi there!
        2	
        3	\N

Обратим внимание на то, что пустая строка и null - разные значения,
хотя выполняя select этого и не заметно.

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

Аналогично можно вводить данные:

        => truncate table t;
        TRUNCATE TABLE

        => copy t from stdin;
        => 1	Hi there!
        => 2	
        => 3	\N
        => \.
        COPY 3

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

Проверим:

        => select * from t;
         id |     s     
        ----+-----------
          1 | Hi there!
          2 | 
          3 | 
        (3 rows)
        

        => copy t to stdout;
        1	Hi there!
        2	
        3	\N

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

PG_DUMP
~~~~~~~

Посмотрим на результат работы pg_dump в формате plain.
Обратим внимание на команды установки расширения pg_crypto
(оно было установлено в template1), а также на то,
в каком виде сохранены данные из таблицы.

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

pg_dump -d db 
--
-- PostgreSQL database dump
--

SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;

--
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: 
--

CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;


--
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: 
--

COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';


--
-- Name: pgcrypto; Type: EXTENSION; Schema: -; Owner: 
--

CREATE EXTENSION IF NOT EXISTS pgcrypto WITH SCHEMA public;


--
-- Name: EXTENSION pgcrypto; Type: COMMENT; Schema: -; Owner: 
--

COMMENT ON EXTENSION pgcrypto IS 'cryptographic functions';


SET search_path = public, pg_catalog;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: t; Type: TABLE; Schema: public; Owner: postgres; Tablespace: 
--

CREATE TABLE t (
    id numeric,
    s text
);


ALTER TABLE t OWNER TO postgres;

--
-- Data for Name: t; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY t (id, s) FROM stdin;
1	Hi there!
2	
3	\N
\.


--
-- Name: public; Type: ACL; Schema: -; Owner: postgres
--

REVOKE ALL ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON SCHEMA public FROM postgres;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO PUBLIC;


--
-- PostgreSQL database dump complete
--


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

Посмотрим на то, как выглядит оглавление резервной копии.
Для этого требуется указать формат, отличный от plain.

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

pg_dump --format custom -d db | pg_restore --list
;
; Archive created at Wed Dec 30 15:27:33 2015
;     dbname: db
;     TOC Entries: 12
;     Compression: -1
;     Dump Version: 1.12-0
;     Format: CUSTOM
;     Integer: 4 bytes
;     Offset: 8 bytes
;     Dumped from database version: 9.4.4
;     Dumped by pg_dump version: 9.4.4
;
;
; Selected TOC Entries:
;
2077; 1262 16897 DATABASE - db postgres
5; 2615 2200 SCHEMA - public postgres
2078; 0 0 COMMENT - SCHEMA public postgres
2079; 0 0 ACL - public postgres
173; 3079 11905 EXTENSION - plpgsql 
2080; 0 0 COMMENT - EXTENSION plpgsql 
174; 3079 16692 EXTENSION - pgcrypto 
2081; 0 0 COMMENT - EXTENSION pgcrypto 
172; 1259 16898 TABLE public t postgres
2072; 0 16898 TABLE DATA public t postgres

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

Можно попросить pg_restore сгенерировать команды для восстановления, например,
только определения таблицы t:

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

pg_dump --format custom -d db | pg_restore --table=t --schema-only
--
-- PostgreSQL database dump
--

SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;

SET search_path = public, pg_catalog;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: t; Type: TABLE; Schema: public; Owner: postgres; Tablespace: 
--

CREATE TABLE t (
    id numeric,
    s text
);


ALTER TABLE t OWNER TO postgres;

--
-- PostgreSQL database dump complete
--

Конец демонстрации.

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

        => \q
