Запуск postgresql из командной строки. Основные команды PostgreSQL. Настройка типов данных

Все привет сегодня хочу сделать небольшую памятку про основные команды PostgreSQL . Работать с PosgreSQL можно как в интерактивном режиме, так и из командной строки. Программа – psql. Я уверен, что данный список окажется очень вам полезен и сэкономит время на поиск по разным ресурсам. Напоминаю, что это open-source проект, на основе СУБД Postgres, вышла в 1986 году, она разрабатывается всемирной группой разработчиков PGDG, по суте это 5-8 человек, но несмотря на это она, очень интенсивно развивается, вводя все новые функции и испраляя старые баги и ошибки.

Основные команды PostgreSQL в интерактивном режиме:

  • \connect db_name – подключиться к базе с именем db_name
  • \du – список пользователей
  • \dp (или \z) – список таблиц, представлений, последовательностей, прав доступа к ним
  • \di – индексы
  • \ds – последовательности
  • \dt – список таблиц
  • \dt+ - список всех таблиц с описанием
  • \dt *s* - список всех таблиц, содержащих s в имени
  • \dv – представления
  • \dS – системные таблицы
  • \d+ – описание таблицы
  • \o – пересылка результатов запроса в файл
  • \l – список баз данных
  • \i – читать входящие данные из файла
  • \e – открывает текущее содержимое буфера запроса в редакторе (если иное не указано в окружении переменной EDITOR, то будет использоваться по умолчанию vi)
  • \d “table_name” – описание таблицы
  • \i запуск команды из внешнего файла, например \i /my/directory/my.sql
  • \pset – команда настройки параметров форматирования
  • \echo – выводит сообщение
  • \set – устанавливает значение переменной среды. Без параметров выводит список текущих переменных (\unset – удаляет).
  • \? – справочник psql
  • \help – справочник SQL
  • \q (или Ctrl+D) – выход с программы

Работа с PostgreSQL из командной строки:

  • -c (или –command) – запуск команды SQL без выхода в интерактивный режим
  • -f file.sql - выполнение команд из файла file.sql
  • -l (или –list) – выводит список доступных баз данных
  • -U (или –username) – указываем имя пользователя (например postgres)
  • -W (или –password) – приглашение на ввод пароля
  • -d dbname - подключение к БД dbname
  • -h – имя хоста (сервера)
  • -s – пошаговый режим, то есть, нужно будет подтверждать все команды
  • –S – однострочный режим, то есть, переход на новую строку будет выполнять запрос (избавляет от; в конце конструкции SQL)
  • -V – версия PostgreSQL без входа в интерактивный режим

Примеры:

psql -U postgres -d dbname -c “CREATE TABLE my(some_id serial PRIMARY KEY, some_text text);” - выполнение команды в базе dbname.

psql -d dbname -H -c «SELECT * FROM my» -o my.html - вывод результата запроса в html-файл.

Утилиты (программы) PosgreSQL:

  • createdb и dropdb – создание и удаление базы данных (соответственно)
  • createuser и dropuser – создание и пользователя (соответственно)
  • pg_ctl – программа предназначенная для решения общих задач управления (запуск, останов, настройка параметров и т.д.)
  • postmaster – многопользовательский серверный модуль PostgreSQL (настройка уровней отладки, портов, каталогов данных)
  • initdb – создание новых кластеров PostgreSQL
  • initlocation – программа для создания каталогов для вторичного хранения баз данных
  • vacuumdb – физическое и аналитическое сопровождение БД
  • pg_dump – архивация и восстановление данных
  • pg_dumpall – резервное копирование всего кластера PostgreSQL
  • pg_restore – восстановление БД из архивов (.tar, .tar.gz)

Примеры создания резервных копий:

Создание бекапа базы mydb, в сжатом виде

Pg_dump -h localhost -p 5440 -U someuser -F c -b -v -f mydb.backup mydb

Создание бекапа базы mydb, в виде обычного текстового файла, включая команду для создания БД

Pg_dump -h localhost -p 5432 -U someuser -C -F p -b -v -f mydb.backup mydb

Создание бекапа базы mydb, в сжатом виде, с таблицами которые содержат в имени payments

Pg_dump -h localhost -p 5432 -U someuser -F c -b -v -t *payments* -f payment_tables.backup mydb

Дамп данных только одной, конкретной таблицы. Если нужно создать резервную копию нескольких таблиц, то имена этих таблиц перечисляются с помощью ключа -t для каждой таблицы.

Pg_dump -a -t table_name -f file_name database_name

Создание резервной копии с сжатием в gz

Pg_dump -h localhost -O -F p -c -U postgres mydb | gzip -c > mydb.gz

Список наиболее часто используемых опций:

  • -h host - хост, если не указан то используется localhost или значение из переменной окружения PGHOST.
  • -p port - порт, если не указан то используется 5432 или значение из переменной окружения PGPORT.
  • -u - пользователь, если не указан то используется текущий пользователь, также значение можно указать в переменной окружения PGUSER.
  • -a, -data-only - дамп только данных, по-умолчанию сохраняются данные и схема.
  • -b - включать в дамп большие объекты (blog’и).
  • -s, -schema-only - дамп только схемы.
  • -C, -create - добавляет команду для создания БД.
  • -c - добавляет команды для удаления (drop) объектов (таблиц, видов и т.д.).
  • -O - не добавлять команды для установки владельца объекта (таблиц, видов и т.д.).
  • -F, -format {c|t|p} - выходной формат дампа, custom, tar, или plain text.
  • -t, -table=TABLE - указываем определенную таблицу для дампа.
  • -v, -verbose - вывод подробной информации.
  • -D, -attribute-inserts - дамп используя команду INSERT с списком имен свойств.

Бекап всех баз данных используя команду pg_dumpall.

Pg_dumpall > all.sql

Восстановление таблиц из резервных копий (бэкапов):

psql - восстановление бекапов, которые хранятся в обычном текстовом файле (plain text);
pg_restore - восстановление сжатых бекапов (tar);

Восстановление всего бекапа с игнорированием ошибок

Psql -h localhost -U someuser -d dbname -f mydb.sql

Восстановление всего бекапа с остановкой на первой ошибке

Psql -h localhost -U someuser -set ON_ERROR_STOP=on -f mydb.sql

Для восстановления из tar-арихива нам понадобиться сначала создать базу с помощью CREATE DATABASE mydb; (если при создании бекапа не была указана опция -C) и восстановить

Pg_restore -dbname=mydb -jobs=4 -verbose mydb.backup

Восстановление резервной копии БД, сжатой gz

psql -U postgres -d mydb -f mydb

Я думаю база данных postgresql теперь будет более понятна вам. Надеюсь данный список команд PostgreSQLбыл для вас полезным.

Перед тем, как кто-нибудь сможет получить доступ к БД, Вы должны запустить сервер БД. Программа сервер называется postgres. Эта программа должна знать где найти необходимые ей для работы данные. Для этого используется опция -D. Так что самый простой способ запуска сервера:

$ postgres -D /usr/local/pgsql/data

В этом случае сервер будет запущен как активный процесс (не в фоне). Это должно быть сделано из под аккаунта пользователя PostgreSQL. Без опции -D сервер попытается найти данные в каталоге из переменной окружения PGDATA. Если же и этой переменной нет - то сервер не запустится.

Обычно гораздо удобнее запустить сервер в фоне. Для этого используйте обычный синтаксис оболочки Unix:

$ postgres -D /usr/local/pgsql/data >logfile 2>&1 &

Очень важно где-то хранить вывод сервера и вывод ошибок, как показано выше. Это поможет в диагностике проблем. (См раздел 23.3 где говорится об обработке лог файлов).

Программа postgres так же принимает опции командной строки. Более подробно об этом говорится в странице руководства postgres и в главе 18.

Однако эти команды оболочки могут быстро надоесть. Поэтому есть программа-обёртка pg_ctl, которая позволяет сделать всё то же самое, но гораздо проще. Например

pg_ctl start -l logfile

Обычно Вам нужно запустить сервер БД при загрузке компьютера. Скрипты для автозапуска зависят от системы. Некоторые варианты Вы можете найти в каталоге contrib/start-scripts. Для их установки могут потребоваться права суперпользователя.

Разные системы умеют разные условия для запуска демона при загрузке. Многие системы имеют файл /etc/rc.local или /etc/rc.d/rc.local. Другие системы используют каталоги init.d или rc.d. Как бы то ни было, сервер должен быть запущен от имени пользователя PostgreSQL, а не от имени суперпользователя или другого пользователя. Поэтому, возможно, Вы должны использовать такую форму команды su -c "..." postgres. Например:

su -c "pg_ctl start -D /usr/local/pgsql/data -l serverlog" postgres

Вот несколько предположений для разных ОС (В любом случае будьте уверены, что Вы указываете правильную папку установки и имя пользователя):

  • FreeBSD смотрите на файл /contrib/start-scripts/freebsd в папке с исходниками
  • OpenBSD добавьте следующие строки в /etc/rc.local
if [ -x /usr/local/pgsql/bin/pg_ctl -a -x /usr/local/pgsql/bin/postgres ]; then su - -c "/usr/local/pgsql/bin/pg_ctl start -l /var/postgresql/log -s" postgres echo -n " postgresql" fi
  • Linux добавьте
  • /usr/local/pgsql/bin/pg_ctl start -l logfile -D /usr/local/pgsql/data
  • NetBSD используйте либо подход FreeBSD либо Linux, в зависимости от предпочтений
  • Solaris создайте файл с названием /etc/init.d/postgresql со следующей строкой
  • su - postgres -c "/usr/local/pgsql/bin/pg_ctl start -l logfile -D /usr/local/pgsql/data"

    Пока сервер запущен его PID хранится в postmaster.pid в каталоге с данными. Это используется для того, чтобы несколько экземпляров сервера не были запущены в одном и том же каталоге с данными. Его же можно использовать для остановки сервера.

    17.3.1 Ошибки запуска сервера

    Есть несколько общих ошибок из-за которых сервер может не запуститься. В поисках сообщения об ошибках обратитесь к логу сервера или запустите его вручную (без перенаправления стандартного вывода и вывода ошибок). Ниже мы объясним некоторые наиболее часто встречающиеся сообщения об ошибках:

    LOG: could not bind IPv4 socket: Address already in use

    HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry.

    FATAL: could not create TCP/IP listen socket

    Обычно это значит именно то, что и написано: Вы пытаетесь запустить другой сервер на том же порту, на котором уже запущен другой сервер. Однако, если порт не используется, то причина может быть в другом. Например, попытка запустить сервер на зарезервированном порту тоже приведёт к похожей ошибке.

    $ postgres -p 666

    LOG: could not bind IPv4 socket: Permission denied

    HINT: Is another postmaster already running on port 666? If not, wait a few seconds and retry.

    FATAL: could not create TCP/IP listen socket

    Сообщение вида

    FATAL: could not create shared memory segment: Invalid argument

    DETAIL: Failed system call was shmget (key=5440001, size=4011376640, 03600).

    обычно означает, что предел разделяемой памяти ядра меньше, чем пытается создать рабочая область PostgreSQL (в нашем примере 4011376640 байт). Или это может значить что ваше ядро не сконфигурировано на поддержку разделяемой памяти в стиле System-V. В качестве "костыля" Вы можете попробовать запустить сервер с меньшим количеством буферов (). В конечном счёте Вы захотите переконфигурировать ядро для увеличения объёма разрешённой разделяемой памяти. Кроме того, Вы можете увидеть это сообщение в том случае, когда Вы пытаетесь запустить несколько экземпляров сервера на одной и той же машине, если их общие потребности в памяти превышают пределы ядра.

    Ошибка вроде

    FATAL: could not create semaphores: No space left on device

    DETAIL: Failed system call was semget(5440126, 17, 03600).

    не означает, что у Вас кончилось место на диске. Это означает, что лимит ядра на число System V семафоров меньше, чем то, сколько хочет создать PostgreSQL. Как и в предыдущем случае, можно воспользоваться "костылём" и запустить сервер с уменьшенным количеством разрешённых подключений (max_connections), но в конце концов Вы всё равно просто переконфигурируете своё ядро.

    Если Вы получили ошибку "illegal system call ", то, скорее всего, разделяемая память и семафоры вообще не поддерживаются вашим ядром. В этом случае Вам остаётся только переконфигурировать ядро для включения поддержки этих возможностей.

    17.3.2 Проблемы с подключением клиента

    Хотя ошибки подключения на стороне клиента имеют разные причины и зависят от конкретного приложения, тем не менее, некоторые из них связаны напрямую с тем, запущен ли сервер. Ошибки, отличные от приведённых ниже, должны решаться с конкретным приложением.

    psql: could not connect to server: Connection refused

    Is the server running on host "server.joe.com" and accepting

    TCP/IP connections on port 5432?

    Это стандартная ошибка "Я не могу найти сервер, с которым я должен говорить". Она похоже на ошибку выше про TCP/IP. Скорее всего сервер забыли настроить на приём TCP/IP соединений.

    Кроме того, Вы можете увидеть такую ошибку при попытке соединиться с локальным сервером через unix сокеты:

    psql: could not connect to server: No such file or directory

    Is the server running locally and accepting

    connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

    По последней строке Вы можете проверить, что клиент пытается подключиться туда, куда надо. Если там и правда нет сервера, то сообщение об ошибке от ядра будет либо Connection refused либо No such file or directory как в нашем примере. (Важно отметить, что Connection refused в данном случае не означает, что сервер получил ваш запрос на подключение и отклонил его. Такая ситуация приведёт к другому сообщению об ошибке, как показано в разделе 19.4). Другие сообщения об ошибках вроде Connection timed out могут означать наличие более серьёзных проблем, таких как задержки в сети.

    В этой статье я покажу 15 наиболее полезных команд для управления postgreSQL .

    1. Как изменить root пароль в PostgreSQL?

    $ /usr/local/pgsql/bin/psql postgres postgres Password: (oldpassword) # ALTER USER postgres WITH PASSWORD ‘tmppassword’; $ /usr/local/pgsql/bin/psql postgres postgres Password: (tmppassword)

    Изменение пароля для обычного пользователя происходит таким же образом. Пользователь root может поменять пароль любому пользователю.

    # ALTER USER username WITH PASSWORD ‘tmppassword’;

    2. Как установить PostgreSQL в автозапуск?

    $ su - root # tar xvfz postgresql-8.3.7.tar.gz # cd postgresql-8.3.7 # cp contrib/start-scripts/linux /etc/rc.d/init.d/postgresql # chmod a+x /etc/rc.d/init.d/postgresql

    3. Проверяем состояние сервера

    $ /etc/init.d/postgresql status Password: pg_ctl: server is running (PID: 6171) /usr/local/pgsql/bin/postgres “-D” “/usr/local/pgsql/data” [Замечание: Это сообщение говорит о том, что сервер запущен и работате нормально] $ /etc/init.d/postgresql status Password: pg_ctl: no server running [Замечание: Это сообщение готоворит о том, что сервер не запущен]

    4. Как запустить, остановить, перезапустить PostgreSQL?

    # service postgresql stop Stopping PostgreSQL: server stopped ok # service postgresql start Starting PostgreSQL: ok # service postgresql restart Restarting PostgreSQL: server stopped ok

    5. Как посмотреть какая версия PostgreSQL запущена?

    $ /usr/local/pgsql/bin/psql test Welcome to psql 8.3.7, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit test=# select version(); version —————————————————————————————————- PostgreSQL 8.3.7 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42) (1 row) test=#

    5. Как создать пользователя в PostgreSQL?

    Для этого существуют два метода..

    Метод 1: Создаем пользователя в через PSQL шелл, командой CREATE USER.

    # CREATE USER ramesh WITH password ‘tmppassword’; CREATE ROLE

    Метод 2: Создаем пользователя в через шелл команду createuser.

    $ /usr/local/pgsql/bin/createuser sathiya Shall the new role be a superuser? (y/n) n Shall the new role be allowed to create databases? (y/n) n Shall the new role be allowed to create more new roles? (y/n) n CREATE ROLE

    6. Как создать базу в PostgreSQL ?

    Для этого существует 2 метода.

    Метод 1: Создаем базу черезе PSQL шелл, с помощью команды CREATE DATABASE.

    # CREATE DATABASE mydb WITH OWNER ramesh; CREATE DATABASE

    Метод 2: Используем команду createdb.

    $ /usr/local/pgsql/bin/createdb mydb -O ramesh CREATE DATABASE

    7. Получаем список всех баз в Postgresql?

    # \l List of databases Name | Owner | Encoding ———-+———-+———- backup | postgres | UTF8 mydb | ramesh | UTF8 postgres | postgres | UTF8 template0 | postgres | UTF8 template1 | postgres | UTF8

    8. Как удалить базу в PostgreSQL?

    # \l List of databases Name | Owner | Encoding ———-+———-+———- backup | postgres | UTF8 mydb | ramesh | UTF8 postgres | postgres | UTF8 template0 | postgres | UTF8 template1 | postgres | UTF8 # DROP DATABASE mydb; DROP DATABASE

    9. Пользуемя встроенным хелпом к командам

    Команда \? отобразит строку помощи для команда PSQL. \h CREATE покажет хелп для всех команд который начинаются с CREATE.

    # \? # \h CREATE # \h CREATE INDEX

    10. Как получить список всех таблиц в базе данный в Postgresql?

    # \d

    Для пустой базы вы получите сообщение “No relations found.”

    11. Как узнать время выполнения запроса?

    # \timing — после выполения данной команды каждый последующий запрос будет показывать время выполнения.

    # \timing Timing is on. # SELECT * from pg_catalog.pg_attribute ; Time: 9.583 ms

    12. Как бэкапить и восстанавливать базы и таблицы в PostgreSQL?

    Этот вопрос довольно велик и я опубликую его позднее отдельной статьей.

    13. Как посмотреть список доступных функций в PostgreSQL ?

    Для того чтобы получить список доступных функций, скажите \df+

    # \df # \df+

    14. Как отредактировать запрос к PostgreSQL в редакторе?

    # \e

    \e откроет редактор, в котором вы можете отредактировать запрос и сохранить его.

    15. Где я могу найти файл истории postgreSQL?

    Подобно файлу ~/.bash_history, postgreSQL хранит все sql команды в файле ~/.psql_history.

    $ cat ~/.psql_history alter user postgres with password ‘tmppassword’; \h alter user select version(); create user ramesh with password ‘tmppassword’; \timing select * from pg_catalog.pg_attribute;

    Описана минимальная настройка PostgreSQL на Windows без необходимости установки БД. Запускается через bat-файл. Может работать с флэшки или переносного жесткого диска.

    Скачиваем бинарники для Windows

    Идем на сайт PosgreSQL в раздел Download/Windows и кликаем по ссылке zip archive в абзаце для Advanced users . Выбираем нужную версию и вперед.

    Файлы из архива извлекаем в желаемую директорию, например:
    D:\psql

    Запуск PostgreSQL без установки

    Bat-скрипт для запуска на Windows без установки:


    @ECHO ON
    @REM Set environment variables for PostgreSQL
    @SET PATH=»%CD%\bin»;%PATH%
    @SET PGDATA=%CD%\data
    @SET PGDATABASE=postgres
    @SET PGUSER=postgres
    @SET PGPORT=5432
    @REM Create new DB with Russian encoding only at first run
    @rem %CD%\bin\initdb -U postgres -A trust -E UTF8 —locale=russian_russia
    @REM Create new DB with English encoding only at first run
    %CD%\bin\initdb -U postgres -A trust -E UTF8 —locale=american_usa
    @%CD%\bin\pg_ctl -D %CD%/data -l logfile start
    @ECHO Press Enter to stop server
    @pause
    @%CD%\bin\pg_ctl -D %CD%/data stop

    Скрипт кладем в корень директории, где лежит PostgreSQL, например:
    D:\psql\pg.bat

    Обновление версии PostgreSQL

    Если необходимо обновить версию PostgreSQL, то надо совершить несколько простых шагов. Скачать архив с новой версией, извлечь его в отдельную директорию и инициализировать БД. Описано выше.

    Подробно перенос данных описан . Если кратко, то необходимо запустить скрипт из директории bin новейшей версии:

    cd D:\psql-new\bin
    pg_upgrade.exe —username=postgres
    —old-datadir «D:\pgsql-old\data»
    —new-datadir «D:\pgsql-new\data»
    —old-bindir «D:\pgsql-old\bin»
    —new-bindir «D:\pgsql-new\bin»

    Меняем локаль у PostgreSQL

    Если не нравятся переведенные сообщения и интерфейс pgAdmin3, то необходимо установить нужную кодировку базы данных при первом запуске.

    Однако в Windows установка кодировки отличной от системной является загадкой, которую придется решить. Стандартные названия кодировок система не понимает, а которые понимает не так просто найти.

    Для установки кодировки «en_US.UTF-8 american_usa » командой:
    initdb -U postgres -A trust -E UTF8 —locale=american_usa

    Для установки кодировки «ru_RU.UTF-8 » необходимо инициализировать бд с локалью «russian_russia » командой:
    initdb -U postgres -A trust -E UTF8 —locale=russian_russia

    Для других кодировок необходимо подбирать сочетания самостоятельно, используя следующие источники на MSDN:

    Полезные команды

    Ниже представлены SQL-запросы, которые необходимо вводить через командную строку PostgreSQL. Запускаем командой:
    D:\pgsql\bin\psql —username=postgres

    Или через графический интерфейс pgAdmin3:
    D:\pgsql\bin\pgAdmin3.exe

    Проверка версии:
    select version();

    Текущие процессы:
    SELECT datname,pid,query FROM pg_stat_activity;

    Создание базы данных:
    CREATE DATABASE test_database;

    Создание и изменение пользователя:
    CREATE USER developer WITH password ‘123456’;
    ALTER USER developer WITH password ‘654321’;

    Сделать суперпользователем:
    ALTER ROLE developer SUPERUSER;

    Права пользователя:
    GRANT ALL privileges ON DATABASE test_database TO developer;

    Импорт из дампа:
    gunzip -c test_database.sql.gz | psql test_database

    Python

    gunzip -c test_database.sql.gz | psql test_database -U user -h localhost

    gunzip - c < em > test_database . sql . gz < / em > | psql < em > test_database < / em > - U < em > user < / em > - h < em > localhost < / em >


    psql test_database test_user < dump_file.sql

    Создание таблицы:

    Python

    CREATE SEQUENCE post_ids; /* счетчик для индекса */ CREATE TABLE posts (id INTEGER PRIMARY KEY DEFAULT NEXTVAL("post_ids"), title CHAR(64), content TEXT);