Наши манипуляции с базой данных 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.