= PostgreSQL =
<<TableOfContents()>>
== Полезные ссылки ==
[[https://www.youtube.com/watch?v=SNzOZKvFZ68|Postgres vs Mongo / Олег Бартунов (Postgres Professional)|class=" moin-https"]]
== Установка ==
[[https://linuxize.com/post/how-to-install-postgresql-on-ubuntu-20-04/||class=" moin-https"]]
Установка сервера и клиента
{{{#!highlight bash
sudo apt update
sudo apt install postgresql postgresql-contrib
}}}
Устанока только psql
{{{#!highlight bash
sudo apt install postgresql-client
}}}
{{{#!wiki note
Для установки ruby-гема `pq` достаточно установить пакет `libpq-dev`
}}}
Проверка версии
{{{#!highlight bash
sudo su postgres
psql -c "SELECT version();"
}}}
Создание роли
{{{
sudo su - postgres -c "createuser dbuser"
}}}
== Создание БД ==
https://tableplus.com/blog/2018/04/postgresql-how-to-grant-access-to-users.html
{{{#!highlight bash
sudo su - postgres
createuser dbuser --pwprompt
psql
postgres# create database database_name with owner = dbuser;
postgres# \q
# или
psql --user admin --host localhost --password
create user dbuser with password 'dbpassword'
create database database_name with owner = dbuser;
\q
# --- обновление пароля
postgres# ALTER ROLE dbuser WITH PASSWORD 'dbpassword';
# заходим под новым пользователем
psql --user dbuser --host localhost --password database_name
# получаем приглашение БД
database_name=#
# запускаем клиент
docker exec -it postgres psql --user=postgres --password
# создаем базу данных
postgres# create database zakupka_dev with owner = postgres;
CREATE DATABASE
postgres=# \q
# Копирование БД
CREATE DATABASE targetdb
WITH TEMPLATE sourcedb;
# --- add createdb privelege for user
ALTER USER dbuser CREATEDB;
}}}
== Backup / Restore ==
=== sql ===
{{{#!highlight bash
# --- создание резервной копии
pg_dump --user={user-name} {source_db} -f {dumpfilename.sql}
# --- восстановление из резервной копии
psql --user={user-name} -d {desintation_db} -f {dumpfilename.sql}
}}}
=== tar.gz ===
{{{#!highlight bash
# --- создание резервной копии
pg_dump -U {user-name} {source_db} -F tar -f {dumpfilename.tar.gz}
# --- восстановление из резервной копии
psql -U {user-name} -d {desintation_db}-f {dumpfilename.tar.gz}
}}}
=== bz2 ===
{{{#!highlight bash
# Создание резервной копии
pg_dump --host=localhost --user=misuz -C misuz | bzip2 > pcs_production_20170410.sql.bz2
# Восстановление из резервной копии
bzcat dump.sql.bz2 | psql --host=host --user=username --password database
}}}
=== dmp ===
{{{#!highlight bash
Восстановление БД из дампа *dmp*
psql --host host --user username --password database < dump.dmp
}}}
== CLI ==
Подключение к БД
{{{#!highlight bash
psql --user username --password dbname
psql -U username -d databasename
psql -U username -c "SELECT * ... "
}}}
== Postgres CLI ==
||Команда||Описание||
=====
||`\l`||Список баз данных||
||`\c`||Подключиться к базе данных||
||`\dt`||Список таблиц||
||`\dn`||Список схем||
||`\dt schema_name.*`||Список таблицы в схеме||
||`\d` tablename||Структура таблицы||
||`\password USERNAME`||Задать пароль||
||`SHOW ALL;`||Отобразить текущие настройки||
== Query ==
Размер БД
{{{
SELECT pg_size_pretty( pg_database_size( 'pcs_production' ) );
}}}
Определение размера массива поля ''jsonb''[[https://stackoverflow.com/questions/33041184/calculate-jsonb-array-length-using-postgresql-9-4|ссылка|class=" moin-https"]]
{{{
SELECT JSONB_ARRAY_LENGTH('["question","solved"]') AS length
}}}
== Postgres service ==
=== Отключение автостарта ===
[[https://dba.stackexchange.com/questions/31210/preventing-postgresql-from-starting-on-boot-in-ubuntu|источник|class=" moin-https"]]
Открываем файл конфигурации
{{{#!highlight bash
sudo vim /etc/postgresql/9.2/main/start.conf
}}}
Меняем ''auto'' на ''manual''
Управляем состоянием:
{{{#!highlight bash
sudo pg_ctlcluster 9.2 main start/stop/status
}}}
{{{#!wiki important
'''ВНИМАНИЕ'''
При остановке кластера командой pg_ctlcluster команда sudo service postgresql status отображает зеленый статус ''active (exited)''. При этом порт сама БД остановлена и порт свободен.
}}}
=== Remote Connection ===
https://www.bigbinary.com/blog/configure-postgresql-to-allow-remote-connection
== docker ==
[[https://hub.docker.com/r/_/postgres/|image|class=" moin-https"]]
[[https://ryaneschinger.com/blog/dockerized-postgresql-development-environment/|Dockerized Postgresql Development Environment|class=" moin-https"]]
{{{#!highlight bash
# создаем том для хранения данных
docker volume create pgdata
# запускаем контейнер PostgreSQL с подключением тома my-vol
# пользователь БД по умолчанию postgres
# Вместо -e POSTGRES_PASSWORD=dbpassword можно использовать
# --env-file ./postgre.env
# #postgre.env
# POSTGRES_PASSWORD=secret
docker run --name postgres -e POSTGRES_PASSWORD=dbpassword \
-v pgdata:/var/lib/postgresql/data \
-p 5432:5432 \
--restart always \
-d postgres:12
# запускаем клиент СУБД
docker exec -it postgres psql --user=postgres --host localhost --password
postgres# create database database_name with owner = postgres;
postgres# \l
postgres# \q
}}}
== pgAdmin ==
https://www.pgadmin.org/
{{{#!highlight bash
docker volume create pgadmin4
# --- host network need for databases on localhost
# custom port 5050
docker run -d \
--name pgadmin4 \
--restart unless-stopped \
--network host \
-v pgadmin4:/var/lib/pgadmin \
-e "PGADMIN_DEFAULT_EMAIL=admin@example.com" \
-e "PGADMIN_DEFAULT_PASSWORD=secret" \
-e "PGADMIN_LISTEN_PORT=5050" \
dpage/pgadmin4
}}}
== Troubleshooting ==
=== PG::UndefinedObject: gin ===
При создании миграции получаем ошибку
{{{
PG::UndefinedObject: ERROR: data type character varying has no default operator class for access method "gin"
}}}
Необходимо активировать соответствующее расширение
{{{
create extension btree_gin;
}}}
=== libpq-dev не устанавливается ===
{{{
sudo apt install libpq-dev
...
Следующие пакеты имеют неудовлетворённые зависимости:
libpq-dev : Зависит: libpq5 (= 12.6-0ubuntu0.20.04.1) но 13.3-1.pgdg20.04+1 должен быть установлен
E: Невозможно исправить ошибки: у вас зафиксированы сломанные пакеты.
}}}
Решение
{{{
sudo apt-get install libpq5=12.6-0ubuntu0.20.04.1
sudo apt install libpq-dev
}}}
=== gen_random_uuid() does not exist ===
Полный текст ошибки
{{{
PG::UndefinedFunction: ERROR: function gen_random_uuid() does not exist
}}}
Решение
{{{
# подключаемся к БД
psql --user=USERNAME ...
# (пере)устанавливаем расширение
database=# drop extension pgcrypto;
database=# CREATE EXTENSION pgcrypto;
}}}