Установка PostgreSQL 9.6 на Ubuntu 16.04
Nov 19, 2013 20:19 · 610 words · 3 minute read
Что-то мне в последнее время честенько приходится ставить postgres. То на новый боевой сервер, то на свою персональную VPS, так что я решил написать заметочку на будущее. Авось и ещё кому-нибудь пригодится :) Процесс установки я буду описывать на голой системе (ubuntu 16.04), и все команды будут от root'а. Так работать, конечно, не принято - все мы знаем, что sudo наше всё, но здесь я ничем не рискую, а пользователя добавлю уже после описанного. Итак, поехали!
Установка PostgreSQL 9.6
Для начала установим сам сервер. Второй пакет опционален, но я предпочитаю ставить сразу и его, т.к. там находятся полезные расширения.
$ apt install postgresql postgresql-contrib
В процессе установки у меня возникла проблема с локалью, а именно ошибка “Error: The locale requested by the environment is invalid.". Связано это с тем, что в системе не определены переменные LANGUAGE и LC_ALL. Для исправления их нужно прописать в /etc/default/locale:
$ echo 'LANGUAGE="en_US.UTF-8"' >> /etc/default/locale
$ echo 'LC_ALL="en_US.UTF-8"' >> /etc/default/locale
После установки для логина доступен всего один пользователь - системный postgres:
$ su postgres -c psql
[sudo] password for tyvik:
psql (9.6.7)
Type "help" for help.
postgres=#
Но всё время заходить через него как-то не очень хорошо, к тому же это единственный способ подключения. Исправим настройки в файле /etc/postgresql/9.6/main/postgresql.conf, указав значения:
listen_addresses = '*'
password_encryption = on
В процессе эксплуатации рекомендуется listen_addresses установить в localhost, т.е. разрешить только локальные подключения. При сканировании nmap'ом порт 5432 уйдёт из списка открытых. Но это ещё не всё :) отдельно надо указать ещё каким пользователям как именно можно подключаться в файле /etc/postgresql/9.1/main/pg_hba.conf. Для начала заветная строчка:
host all all 0.0.0.0/0 md5
Теперь разберём подробнее:
- host - откуда идёт подключение. Бывает локальным (local) или сетевым (host)
- all - список баз, к которым разрешено подключаться
- all - список пользователей, которым разрешено подключаться
- 0.0.0.0/0 - диапазон IP-адресов, с которых принимается подключение. У меня разрешены все IP.
- md5 - метод авторизации. Самый популярный md5 - по хешированному паролю. Ещё также используется trust - без запроса пароля. На самом деле их гораздо больше, ещё есть: reject, password, gss, sspi, krb5, ident, peer, pam, ldap, radius, cert.
Теперь можно проверить подключения из pgAdmin или psql. Следующим шагом будет импорт данных.
Миграция
Проведём миграцию в 2 шага: экспорт уже существующей базы и импорт в новую. Экспорт делается командой pg_dump:
$ pg_dump -U$pg_login --password $pg_dbname > $path_to_archive/db.sql
у pg_dump есть ключ --format=format
:
- plain - генерация обычного SQL-файла (по умолчанию).
- custom - то же, что и plain, но добавляет метки объектов для pg_restore. Можно указывать отдельные объекты.
- directory - то же, что и custom, но каждый объект будет экспортироваться в отдельный файл.
- tar - то же, что и directory, но сжатый tar'ом.
Обычно требуется не только сделать дамп данных, но и сохранить куда-нибудь в надёжное место. Так что почему бы сразу и не заархивировать его?
$ pg_dump -U$pg_login --password $pg_dbname --host=$host | gzip > dump.sql.gz
Теперь у нас есть дамп, подготовим новую базу и зальём туда данные. В консоли psql создадим пользователя и БД:
create user new_user with password 'pass';
create database user_db with owner new_user;
В командной строке выполним импорт:
$ psql -Unew_user -d user_db < db.sql
или
$ pg_restore -d user_db -U new_user db.sql
ну или если дамп сжат, то
$ gunzip -c dump.sql.gz | psql --username=$pg_login --password --host=$host $pg_dbname
Первая команда подходит для экспорта без ключа format
или с его значением plain
, вторая - во всех остальных случаях.
pg_dump
К слову, команда pg_dump имеет множество настроек, вот лишь небольшой список тех, которые мне доводилось применять:
--data-only
- экспортировать только данные без DDL--schema-only
- экспортировать только DDL без данных--schema=<>
- выгрузить сразу несколько схем--table=<>
- выгрузить только отдельную таблицу--disable-triggers
- дописывает в экспорт команды по отключению триггеров и контроля целостности при восстановлении