Копіювання та відновлення даних
Копіювання та відновлення даних займають важливе місце в роботі будь-якого адміністратора бази даних. Жодна система не застрахована від збоїв жорсткого диска, необережності користувачів або інших потенційних нещасть, що призводять до псування даних PostgreSQL.
У цьому розділі описані два загальних способу архівації даних. У першому варіанті додаток pg_dump, що входить в комплект поставки PostgreSQL, генерує набір команд SQL для повної архівації бази даних. Другий варіант заснований на архівації файлової системи сервера.
Додаток pg_dump запускається в режимі командного рядка і будує серію команд SQL. Виконання цих команд в зазначеному порядку дозволяє повністю відтворити базу даних.
Синтаксис додатки pg_dump:
pg_dump [параметри] база_данних
Параметр база_данних визначає ім'я бази даних, для якої генеруються команди SQL. Рядок параметрів має такий же формат, як у інших утиліт управління базами даних (наприклад, createdb). У ній найчастіше передається ключ - f для визначення файлу, в якому зберігаються згенеровані команди.
Якщо прапор -f не вказано, згенеровані команди SQL замість запису в файл виводяться в потік stdout.
Нижче наведено повний список ключів додатки pg_dump.
За замовчуванням додаток pg_dump може запускатися будь-яким системним користувачем, але користувач, що підключається до PostgreSQL, повинен мати право вибірки для всіх об'єктів в архівується базі даних. У лістингу 9.20 наведено приклад використання програми pg_dump користувачем manager для бази даних booktown. Ключ-С включає в архів команду CREATE DATABASE. Ця команда включається не завжди, оскільки в деяких випадках база даних створюється заздалегідь в нестандартної конфігурації.
Лістинг 9.20. Користування програмою pg_dump
[Jworsley @ booktown -] $ pg_dump -u -C -f booktown.sql booktown
Username: manager Password:
[Jworsley @ booktown -] $ Is -1 booktown.sql
-rw-rw-r-- 1 jworsley jworsley 46542 Sep 13 16:42 booktown.sql
Додаток pg_dump підтримує стандартні параметри хостових з'єднань (ключі -h, -u і -р), що дозволяє виконувати віддалену архівацію з будь-якого хоста, якому дозволено віддалене підключення відповідно до вмісту файлу pgjiba.conf (більш детальна інформація наведена в розділі 8).
У лістингу 9.21 проводиться підключення з віддаленого сервера до сервера booktown.commandprompt.com для створення архівного файлу в форматі gzip (ключ -F с) з ім'ям booktown.sql.tar.gz.
Лістинг 9.21. Віддалений запуск pg_dump
] $ Pg_dump -u -h booktown.commandprompt.com \
-F з -f booktown.sql.tar.gz booktown
[Jworsley @ cmd -] $ Is -1 booktown.sql.tar.gz
-rw-rw-r-th1nsp: - 1 jworsley jworsley 45909 Sep 13 17:12 booktown.sql.tar.gz
Якщо архівний файл повинен містити великі двійкові об'єкти, скористайтеся форматом tar (t) або gzip (с), тому що текстовий формат не дає такої можливості. В інших випадках звичайних текстових архівів буває цілком достатньо.
Архіви в форматі tar нерідко більш ніж в два рази перевищують за обсягом свої текстові прототипи, навіть якщо вони не містять довічних об'єктів. Справа в тому, що в формат tar включається ієрархічне зміст файлів .dat. У цьому змісті зберігається інформація, необхідна для розпакування формату tar відповідної командою pg_restore; додаткові інструкції займають зайве місце на диску. Оскільки tar архівує файли без стиснення, був передбачений формат с, що забезпечує автоматичне стиснення tar-файлів в формат gzip.
У PostgreSQL також існує додаток pg_dumpall, яке є свого роду «оболонкою» для виклику програми pg_dump. Основна функція цього додатка полягає в одночасній архівації всього кластера баз даних PostgreSQL в системі без виклику pg_dump для всіх баз даних по черзі. Синтаксис команди pg_dumpaTl, виведений з прапором - -help:
pg_dumpall [-з] [-h хост] [-р порт] [-д]
Додаток pg_dumpall отримує такі самі установки, що і додаток pg_dump. Нижче перераховані ключі pg_dumpall.
- -с. Командам SQL, що створює глобальні об'єкти, повинні передувати команди видалення цих об'єктів.
- -h хост, - -host = .roaw. Хост, з яким встановлюється зв'язок замість хоста local host або хоста, що визначається змінного середовища PGHOST. Використовується в тих випадках, коли архівіруемих база даних знаходиться на іншому сервері.
- -р порт, --port = nopm. Порт, за яким має здійснюватися підключення до сервера, замість порту за замовчуванням (зазвичай 5432).
- -g, --globals-only. Архівуються тільки глобальні об'єкти. Зазвичай цей режим використовується при відтворенні користувачів і груп, а також їх дублювання на іншому комп'ютері (архів переноситься на інший комп'ютер і відновлюється). При установці ключа-д перед виконанням команд CREATE з таблиці pg_shadow автоматично видаляються всі користувачі. Будьте уважні!
Не об'єднуйте свій пристрій команду pg_dumpall з ключем -. Це призведе до того, що ключ буде переданий додатком pg_dump для кожної бази і вихідні дані займуть набагато більше місця, ніж можна припустити. Для отримання довідки про команду pg_dumpall використовується ключ --help.
Зверніть увагу: в PostgreSQL 7.1.x можливості сценарію pg_dumpall дещо обмежені в порівнянні зі звичайним сценарієм pg_dump. Наприклад, ключ-і не дозволяє передати інше ім'я користувача і пароль, а ключ -F не може задати інший формат, крім простого тексту (архіви створюються в текстовому вигляді незалежно від обраного формату). Звідси випливає, що ключ -Ь теж не може передаватися програмі pg_dumpall, оскільки для нього необхідні інші формати, крім текстового.
Хоча з додатком pg_dump можна передати ім'я файлу за допомогою ключа -f, отриманий архів буде неповним, оскільки глобальні дані pg_dumpall все
одно направляються в потік stdout. Проблеми з ключем ^ вирішуються перенаправленням виводу pg_dumpall в файл засобами командного інтерпретатора (>).
Відсутність ключа -і компенсується простим привласненням змінної середовища PGUSER. А якщо ви підключаєтеся до системи, що вимагає аутентифікації з використанням пароля, і не хочете окремо передавати пароль для кожної архівується бази даних, надайте значення змінної PGPASSWORD.
У лістингу 9.22 приведена проста команда bash для визначення тимчасової змінної середовища PGUSER при виклику клієнта PostgreSQL Хоча необхідність в таких змінних виникає рідко, це корисний прийом, про який слід пам'ятати в деяких специфічних випадках - наприклад, при роботі зі сценарієм pg_dumpall. У лістингу 9.22 змінна PGUSER забезпечує створення одного архівного файлу для всіх баз даних.
Лістинг 9.22. Використання команди pg_dumpall
[Jworsley @ booktown -] $ PGUSER = postgres pg_dumpall> all.sql
Перша частина команди, наведеної в лістингу 9.22, привласнює тимчасової змінної PGUSER значення postgres. Мінлива створюється на час роботи pg_dumpall і припиняє своє існування при завершенні програми.
У загальному випадку додаток pg_dumpall має виконуватися суперкористувачем PostgreSQL. Це пов'язано з тим, що команда pg_dumpall звертається до системних каталогах PostgreSQL, оскільки поряд з об'єктами баз даних вона архівує глобальні об'єкти.
Команду pg_dumpal 1 також можна виконувати в віддаленому режимі, хоча для цього слід задати значення всіх необхідних змінних середовища. Процедура сильна залежить від настройки віддаленого хоста у файлі pg_hba.conf.
Команда pg_dumpa11 використовується в ситуаціях, коли бази даних особливо не зручно архівувати окремо або при наявності складної системи корис ному і груп. Якщо вам заважають обмеження pg_dumpall в області виведення дан них (особливо якщо ваша база даних використовує великі об'єкти), простіше всеп виконати команду pg_dumpal1 з ключем-д, щоб заархівувати всі дані користувачів і груп, і потім по черзі викликати програму pg_dump для все) баз даних , які необхідно заархівувати.