Глава 18. Резервное копирование

Наши манипуляции с базой данных test54 становятся всё активнее и опаснее. Случайная опечатка в запросе может испортить или уничтожить ценную информацию. Порча или уничтожение большой базы данных влечёт очень серьёзные последствия: увольнение с позором оператора или программиста, крах бизнеса. Поэтому всю информацию, представляющую ценность, нужно копировать! В том числе и содержимое БД.

В PostgreSQL имеется специализированная клиентская программа pg_dump, которая позволяет в различных форматах (в зависимости от ключей командной строки) вывести содержимое базы данных. Если нет особых указаний, программа pg_dump выводит содержимое БД в виде SQL-запроса, который может быть потом использован для восстановления базы данных.

[tz@coneforest ~/work/54/doc/inf/databases]% pg_dump test54

--
-- PostgreSQL database dump
--

SET client_encoding = 'UTF8';
SET standard_conforming_strings = off;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET escape_string_warning = off;

--
-- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: postgres
--

COMMENT ON SCHEMA public IS 'Standard public schema';


SET search_path = public, pg_catalog;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: planet_data; Type: TABLE; Schema: public; Owner: tz; Tablespace: 
--

CREATE TABLE planet_data (
    name text,
    token character(1),
    diameter real,
    mass real,
    orbit real
);


ALTER TABLE public.planet_data OWNER TO tz;

--
-- Name: planet; Type: VIEW; Schema: public; Owner: tz
--

CREATE VIEW planet AS
    SELECT planet.name, planet.token, planet.diameter, planet.mass, planet.orbit, (((((0.000000001 * (6)::numeric))::double precision * planet.mass) / (3.1415926)::double precision) / ((planet.diameter)::double precision ^ (3)::double precision)) AS density FROM planet_data planet ORDER BY planet.orbit;


ALTER TABLE public.planet OWNER TO tz;

--
-- Data for Name: planet_data; Type: TABLE DATA; Schema: public; Owner: tz
--

COPY planet_data (name, token, diameter, mass, orbit) FROM stdin;
Меркурий	☿	4880	3.3e+23	0.38
Венера	♀	12103.6	4.8690002e+24	0.72000003
Земля	♁	12756.3	5.9735999e+24	1
Марс	♂	6794	6.4219003e+23	1.52
Юпитер	♃	142984	1.9e+27	5.1999998
Сатурн	♄	120536	5.6800001e+26	9.54
Уран	♅	51118	8.6829996e+25	19.218
Нептун	♆	49532	1.0247e+26	30.059999
\.


--
-- 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
--

Вывод программы pg_dump удобно перенаправить по конвейеру на вход программе-компрессору, сжимающему файлы и потоки, а сжатый вывод компрессора — в файл. В нижеследующем примере в качестве компрессора будет использоваться программа lzma, а её вывод будет перенаправлен в файл test54.sql.lzma:

[tz@coneforest ~/work/54/doc/inf/databases]% pg_dump test54 |lzma >test54.sql.lzma

Покажем, как восстановить базу данных из сохранённого файла. Для этого удалим её с помощью специально предназначенной для удаления баз данных программы dropdb:

[tz@coneforest ~/work/54/doc/inf/databases]% dropdb test54
DROP DATABASE

Теперь создадим новую и пустую БД test54:

[tz@coneforest ~/work/54/doc/inf/databases]% createdb test54
CREATE DATABASE

Затем программа-декомпрессор lzcat разожмёт файл test54.sql.lzma, а её вывод перенаправим программе psql (она умеет читать SQL-запросы не только из своей командной строки, но и из файлов, а также из стандартного ввода):

[tz@coneforest ~/work/54/doc/inf/databases]% lzcat test54.sql.lzma |psql test54 -f -
SET
SET
SET
SET
SET
COMMENT
SET
SET
SET
CREATE TABLE
ALTER TABLE
CREATE VIEW
ALTER TABLE
REVOKE
REVOKE
GRANT
GRANT

Ключ -f в программе psql заставляет её читать запросы из файла, чьё имя указано сразу после этого ключа. Если указанное имя файла — знак минуса, чтение происходит из стандартного ввода, на который по конвейеру подаётся вывод lzcat.

Информатика-54