# sudo -u postgres pg_ctl status -D /var/lib/pgsql/data
PostgreSQL (произносится «Постгре-Эс-Кю-Эль», коротко называется «Постгрес») - свободная объектно-реляционная система управления базами данных (12 правил Кодда: что такое система управления базами данных). Использует порт 5432/tcp/udp. PostgreSQL использует только один механизм хранения данных под названием Postgres storage system (система хранения Postgres), в котором транзакции и внешние ключи полностью функциональны, в отличии от Движок БД MySQL, в котором InnoDB и BDB являются единственными типами таблиц, которые поддерживают транзакции.
По умолчанию PostgreSQL настроен так, что каждый локальный пользователь может подсоединиться к базе совпадающей по названию с регистрационным именем клиента, при условии что такая база данных уже создана.
MVCC - одна из ключевых технологий доступа к данным, которая используется в PostgreSQL. Она позволяет осуществлять параллельное чтение и изменение записей (tuples) одних и тех же таблиц без блокировки этих таблиц. Чтобы иметь такую возможность, данные из таблицы сразу не удаляются, а лишь помечаются как удаленные. Изменение записей осуществляется путем маркировки этих записей как удаленных, и созданием новых записей с измененными полями. Таким образом, история изменений одной записи сохраняется в базе данных и доступна для чтения другими транзакциями. Этот способ хранения записей позволяет параллельным процессам иметь неблокирующий доступ к записям, которые были удалены или изменены в параллельных незакрытых транзакциях. Техника, используемая в этом подходе, относительно простая. У каждой записи в таблицы есть системные скрытые поля xmin, xmax.
Перед началом выборки данных PostgreSQL сохраняет снапшот текущего состояния БД. На основании данных снапшота, полей xmin, xmax осуществляется фильтрация записей.
BitNami предлагает удобный стек LAPP, MAPP и WAPP (Linux/Mac/Windows + Apache + PHP + PostgreSQL) для разработчиков. Bitnami значительно упрощает разработку и развертывание популярных веб-приложений и языковых сред выполнения. Каждое приложение Bitnami включает в себя все зависимости, необходимые для его запуска, включая PostgreSQL для тех приложений и сред выполнения, которые этого требуют. Приложения полностью бесплатны и могут быть развернуты как универсальные бесплатные собственные установщики, виртуальные машины и облачные образы.
Список всех версий PostgreSQL, с датами их выпуска и примечаниями к релизам, можно найти на официальном сайте. Текущая главная версия: PostgreSQL 16.2 (выпущена 2024-03-28). Выбор версии PostgreSQL зависит от ваших конкретных потребностей и требований. Рекомендую использовать последнюю стабильную главную версию для новых проектов.
pg_hba.conf - настройка политики доступа к базам данных и идентификации пользователей сервера Использование и настройка PostgreSQL.
В этом файле описываются клиентские компьютеры сети, с которых разрешен доступ к SQL серверу Использование и настройка PostgreSQL, а также методы идентификации клиентов. Этот файл может содержать два вида записей:
Параметр <способ авторизации доступа>:
Примеры записей pg_hba.conf:
# TYPE DATABASE USER ADDRESS METHOD host all all all md5
host mother dbuser all md5
PostgreSQL поддерживает только общую для всех баз кластера кодировку, которая должна совпадать с локальной кодировкой (Настройка переменных локализации в Linux), иначе не будут работать строковые функции сортировки, upper/lower и т.п. Локаль общая для всех процессов сервера - соответственно он не может создать две базы в разных кодировках - кодировка всегда одна для всего сервера и всех его БД.
Посмотреть кодировку сервера (show server_encoding) и клиента(show client_encoding):
postgres=# show server_encoding; server_encoding ----------------- UTF8 (1 row)
Т.е. создать базу в другой кодировке можно, но тогда в ней будут неправильно работать функции обработки строк и сортировка строк.
Указывать список кодировок нужно не для createdb (create database), а для подключения клиента к серверу (client_encoding), если кодировка символов которую ожидает программа-клиент не совпадает с её (программы-клиента) текущей системной локалью, с которой она была запущена.
# apt install openoffice.org-sdbc-postgresql
psql - PostgreSQL interactive terminal.
В директории /usr/share/doc/postgresql* можно найти дополнительную информацию по запуску.
$ sudo -u postgres psql psql (8.4.5) Type "help" for help. postgres=#
$ psql -h 192.168.1.20 -U postgres
postgres=# \h drop table Command: DROP TABLE Description: remove a table Syntax: DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
# sudo -u postgres psql -d mybd --command="select * from pg_stat_user_indexes where schemaname='public';"
postgres=# select * from pg_shadow; postgres=# \du
postgres=# select * from pg_database; или postgres=# \l Из командной строки: # psql -U postgres -A -q -t -c "select datname from pg_database" или: # psql -l
SELECT current_database();
SELECT current_user;
postgres=# \dt или select * from pg_tables; # будут выведены все таблицы, в том числе и системные select tablename from pg_tables where schemaname='public';
# sudo -u postgres dropdb testbd777
# sudo -u postgres psql test777 < lost_cdr.sql
SELECT regexp_split_to_table(ipaddr, E';') as ip FROM peers;
postgres=# SELECT version(); PostgreSQL 8.4.8 on x86_64-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.4.5 20101112 (Red Hat 4.4.5-2), 64-bit
$ psql -U postgres -d mydb --command="INSERT INTO countries (english,russian) VALUES ('Ivory Coast', 'Кот-д''Ивуар');"
SELECT pg_postmaster_start_time(); pg_postmaster_start_time ------------------------------- 2013-08-21 14:20:45.451467+00 SELECT current_timestamp - pg_postmaster_start_time() AS uptime;
Если запрос запущен из интерфейса pgsql, то завершение работы сервера не поможет - запрос все равно продолжит свое выполнение, необходимо вызывать функцию pg_cancel_backend.
select * from pg_stat_activity; # посмотреть все запросы select * from pg_stat_activity WHERE current_query like 'SELECT%'; # посмотреть все SELECT запросы select * from pg_stat_activity WHERE current_query like 'INSERT%'; # снять все активные select запросы SELECT pg_cancel_backend(procpid) as x FROM pg_stat_activity WHERE current_query like 'SELECT%'; # снять запрос VACUUM SELECT pg_cancel_backend(procpid) as x FROM pg_stat_activity WHERE current_query like 'VACUUM%';
SELECT запросы можно снимать из ОС командой kill
# ps auxww | grep ^postgres ... postgres 15724 97.7 11.3 2332996 1871476 ? Rs 07:50 1:53 postgres: postgres mybd 127.0.0.1(53624) SELECT ... # kill 15724
select datname,procpid,now()-query_start as duration,current_query from pg_stat_activity order by duration DESC;
В PostgreSQL Транзакция - это список команд SQL, которые находятся внутри блока, начинающегося командой BEGIN и заканчивающегося командой COMMIT.
PostgreSQL фактически считает каждый оператор SQL запущенным в транзакции. Если вы не указываете команду BEGIN, то каждый отдельный оператор имеет неявную команду BEGIN перед оператором и (при успешной отработке оператора) команду COMMIT после оператора. Группа операторов заключаемая в блок между BEGIN и COMMIT иногда называется транзакционным блоком.
Пример запуска транзакции из файла delprices.sql, которая удаляет в БД test777 из таблиц prices и ratesheets строки с id=2
# nano delprices.sql BEGIN; DELETE FROM prices WHERE ratesheet_id=2; DELETE FROM ratesheets WHERE id=2; COMMIT;
Выполним транзакцию для test777:
# sudo -u postgres psql -l # sudo -u postgres psql test777 < delprices.sql
Лог файлы PostgreSQL находятся в директории pg_log, для Fedora полный путь /var/lib/pgsql/data/pg_log. Детализация лог файлов настраивается в postgresql.conf.
Текущую активность базы данных легко оценить с помощью команды ps, для вывода в реальном времени (с задержкой 1 секунда) можно использовать утилиту Команда watch с практическим примерами:
# watch -n 1 'ps auxww | grep ^postgres' postgres 14164 0.0 0.0 188492 5296 ? S Dec13 0:46 /usr/bin/postmaster -p 5432 -D /var/lib/pgsql/data postgres 14166 0.0 0.0 159904 1264 ? Ss Dec13 0:05 postgres: logger process postgres 14168 0.0 0.1 188636 27208 ? Ss Dec13 0:49 postgres: writer process postgres 14169 0.0 0.0 188492 1348 ? Ss Dec13 0:23 postgres: wal writer process postgres 14170 0.0 0.0 188804 1752 ? Ss Dec13 0:17 postgres: autovacuum launcher process postgres 14171 0.0 0.0 160176 1468 ? Ss Dec13 0:45 postgres: stats collector process postgres 21596 0.0 0.1 190228 30476 ? Ss Dec27 0:58 postgres: postgres mbill 127.0.0.1(37047) idle postgres 21597 0.0 0.0 189716 5672 ? Ss Dec27 0:00 postgres: postgres mbill 127.0.0.1(37048) idle
Так как для каждого клиента создаётся своя копия процесса postmaster, то это позволяет подсчитать число активных клиентов. Статусная строка даёт информацию о состоянии клиента. Фразы writer process, stats buffer process и stats collector process соответствуют системным процессам, запущенным самим PostgreSQL при старте. Пользовательские процессы имеют статусную строку вида:
postgres: «пользователь» «база» «хост» «статус»
«пользователь», «база» и «хост» соответствуют имени пользователя «пользователь» подсоединявшегося к базе «база» с компьютера «хост». «статус» может принимать следующие параметры:
Представления (Views) сборщика статистики.
Если в PostgreSql postgresql.conf разрешён сбор статистики (logging_collector = on), то информация об активности базы данных собирается в специальных системных таблицах.
Информация собранная "статистическим сборником" может оказаться полезной для оценки эффективности базы данных и запросов. Из этих представлений можно узнать, например
select pg_stat_reset();
Стандартные Statistics Views. Вывести все представления каталога
select schemaname,viewname,viewowner from pg_views where schemaname='pg_catalog';
select * from pg_stat_activity; # Вывести запросы отсортированные по длительности выполнения select datname,client_addr,now()-query_start as duration,current_query from pg_stat_activity order by duration DESC;
select * from pg_stat_database;
Вывести соотношение hit/read. При выполнении запроса PostgreSQL сначала смотрит, есть ли нужные в запросе данные в разделяемой памяти (shared buffers). Если они найдены, засчитывается hit, если нет - делается сравнительно медленный системный вызов fread для поднятия данных с диска или из дискового кеша операционной системы и засчитывается read. В среднем, верно правило: чем больше отношение hit/read, тем лучше настроен PostgreSQL, так как он очень мало читает с диска, в основном извлекая данные из разделяемой памяти. Для большинства не очень больших баз это отношение должно лежать в пределах 5000-10000. Не стремитесь, однако, искусственно завысить настройку shared_buffers, которая прямо определяет hit/read: слишком большие размеры разделяемой памяти ведут к потере производительности в базах с интенсивной записью. Также стоит помнить, что fread может быть довольно быстрым, если данные находятся в дисковом кеше ОС.
select datname, case when blks_read = 0 then 0 else blks_hit/blks_read end as ratio from pg_stat_database;
select * from pg_stat_all_tables where schemaname='public'; select relname,last_vacuum,last_autovacuum,last_analyze,last_autoanalyze from pg_stat_all_tables where schemaname='public';
select relname,seq_scan,idx_scan, case when idx_scan = 0 then 100 else seq_scan/idx_scan end as ratio from pg_stat_user_tables order by ratio desc; select relname,seq_scan,idx_scan, case when idx_scan = 0 then 100 else seq_scan/idx_scan end as ratio,n_live_tup,n_dead_tup from pg_stat_user_tables order by ratio desc;
Количество модификаций, произошедших в таблице. Список по таблицам: какое количество записей в них было добавлено, изменено и удалено с момента последнего сброса статистики. Администратор БД должен представлять, какие таблицы являются самыми нагруженными в текущей базе данных, а также каково соотношение между различными типами модифицирующих запросов к ним.
select relname,n_tup_ins,n_tup_upd,n_tup_del from pg_stat_user_tables order by n_tup_ins desc;
select * from pg_stat_all_indexes;
select * from pg_stat_user_indexes where schemaname='public';
Статистика по индексам. Список по индексам: сколько записей из индекса были использованы в запросах по этому индексу; сколько рядов при этом получилось достать из родительской таблицы; разность этих двух чисел. Суть данной статистики проста: если у вас большая разница read-ов и fetch-ей, значит индекс устарел и ссылается на уже несуществующие данные, т.е. не всякий просмотр индекса и чтение из него соответствующего указателя на данные из таблицы (read) вызывает чтение самих данных из таблицы (fetch). В этом случае необходимо перестроить данный индекс, чтобы он соответствовал реальным данным в таблице.
select relname,indexrelname,idx_tup_read,idx_tup_fetch,(idx_tup_read-idx_tup_fetch) as diff, CASE WHEN idx_tup_read=0 THEN 0 ELSE (idx_tup_read::float4-idx_tup_fetch)/idx_tup_read END as r FROM pg_stat_user_indexes ORDER BY r desc;
Команда LOCK TABLE предназначена для блокировки таблиц на время транзакции. Блокировкой называется временное ограничение доступа к таблице (в зависимости от выбранного режима). Сеанс, заблокировавший таблицу, пользуется нормальным доступом; последствия блокировки распространяются только на других пользователей, пытающихся получить доступ к заблокированной таблице.
Некоторые команды SQL автоматически устанавливают блокировку для выполнения своих функций; в таких случаях PostgreSQL всегда выбирает минимально необходимый уровень блокировки. После завершения транзакции блокировка немедленно снимается.
Команда LOCK TABLE без параметра устанавливает максимально жесткий режим блокировки (ACCESS EXCLUSIVE). Чтобы ограничения были менее жесткими, следует явно задать нужный режим.
Ситуация взаимной блокировки (deadlock) возникает в там случае, когда каждая из двух транзакций ожидает снятия блокировки другой транзакцией. Хотя PostgreSQL распознает взаимные блокировки и завершает их командой ROLLBACK, это все равно причиняет определенные неудобства. Приложения не должны сталкиваться с проблемой взаимных блокировок, поэтому проектируйте их так, чтобы объекты всегда блокировались в одинаковом порядке.
Автоматическая сборка мусора (Automatic Vacuuming).
Синтаксис VACUUM:
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table ] VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table [ (column [, ...] ) ] ]
Синтаксис ANALYZE:
ANALYZE [ VERBOSE ] [ table [ ( column [, ...] ) ] ]
Кроме сборки мусора (VACUUM) производится ещё и анализ (ANALYZE). Периодическое выполнение команды ANALYZE необходимо для нормального функционирования планировщика. Собранная с помощью этой команды статистика позволяет значительно ускорить выполнение SQL- запросов. То есть, если не хочется настраивать автоматическую сборку мусора, то в любом случае её придётся делать только теперь в ручную. Процесс обычной сборки мусора в PostgreSQL (VACUUM без приставки FULL) не блокирует таблиц и может выполняться в фоне, не мешая выполнению запросов. Регулярное исполнение команд VACUUM и ANALYZE обязательно. Это необходимо по той причине, что иначе не получится заново использовать дисковое пространство, которое занимают ранее удалённые или изменённые строки и не удастся обновить статистику для планировщика запросов. И то и другое отрицательно сказывается на эффективности использования ресурсов и производительности запросов. Начиная с версии PostgreSQL 8.1 сервер может самостоятельно автоматически запускать ещё один системный процесс, который, соответственно, так и называется autovacuum daemon. Все настройки для этого процесса хранятся в PostgreSql postgresql.conf. К значениям этих параметров следует отнестись крайне внимательно. Если по каким-то причинам демон было решено не запускать, то в любом случае необходимо производить сборку мусора и набор статистики в ручную.
Основным средством физического и аналитического сопровождения баз данных в PostgreSQL является команда SQL VACUUM и ее аналог — сценарий vacuumdb. Оба средства выполняют две общие функции:
Синтаксис VACUUM:
=# \h VACUUM Command: VACUUM Description: garbage-collect and optionally analyze a database Syntax: VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table ] VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table [ (column [, ...] ) ] ]
При наличии необязательного ключевого слова ANALYZE PostgreSQL анализирует структуру данных во всех полях всех таблиц (или только заданной таблицы, если она указана), после чего эта информация используется оптимизатором запросов для более эффективного планирования. Ключевое слово ANALYZE также позволяет ограничить анализ отдельными полями.
# sudo -u postgres psql mybd mybd=# VACUUM ANALYZE VERBOSE;
Практика показала, что без более-менее регулярных запусков vacuum full analyze производительность системы постепенно падает, причем чем дальше, тем больше. Разница между vacuum и vacuum full заключается в том, что full физически переписывает на диске всю таблицу таким образом, чтобы в ней не оставалось "дырок" от удаленных или обновленных записей. Но его недостаток в том, что во время работы таблица полностью блокируется(включая и select запросы), что может привести к проблемам на популярном сервере - начнет скапливаться очередь запросов, ожидающих доступа к базе, каждый запрос требует памяти, память кончается, начинается запись в Как посмотреть информацию о swap? Создание SWAP раздела, из-за отсутствия памяти сам vacuum тоже начинает использовать swap и все начинает работать очень-очень медленно. Простой VACUUM (Без FULL) просто восстанавливает пространство и делает его доступным для повторного использования. Эта форма команды умеет работать параллельно с обычными чтение и запись таблицы, без монопольной блокировки.
Чтобы определить необходимость использования индекса для какой-либо таблицы, PostgreSQL должен иметь статистику по этой таблице. Эта статистика собирается при использовании VACUUM ANALYZE или просто ANALYZE. Используя статистику, оптимизатор узнает о том как много строк в таблице и если он должен использовать индексы, то он может принимать лучшие решения. Статистика также влияет на определение оптимального порядка соединений таблиц и метода соединения. При изменении содержимого таблицы должен периодически выполнятся сбор статистики.
# vacuumdb -U postgres --verbose --analyze --full --dbname=mydb # crontab # Запуск "vacuumdb" каждый день в 22:01 1 22 * * * root vacuumdb -U postgres --quiet --analyze --dbname=mydb &
lcr_id - колонка автоинкрементная (lcr_id | integer | not null default nextval('df_lcr_list_lcr_id_seq'::regclass)). Запрос возвращает значение колонки lcr_id для вставленной записи, в этом случае id записи.
INSERT INTO df_lcr_list (datestart,dateend) VALUES (20120429,20120429) RETURNING lcr_id;
Системные таблицы(System Catalogs) PostgreSQL начинаются с префикса pg_.
№ | Имя таблицы | Назначение таблицы | |||
---|---|---|---|---|---|
1 | pg_aggregate | aggregate functions | |||
2 | pg_am | index access methods | |||
3 | pg_amop | access method operators | |||
4 | pg_amproc | access method support procedures | |||
5 | pg_attrdef | column default values | |||
6 | pg_attribute | table columns ("attributes") | |||
7 | pg_authid | authorization identifiers (roles) | |||
8 | pg_auth_members | authorization identifier membership relationships | |||
9 | pg_cast | casts (data type conversions) | |||
10 | pg_class PostgreSQL System Catalogs | tables, indexes, sequences, views ("relations") | |||
11 | pg_constraint | check constraints, unique constraints, primary key constraints, foreign key constraints | |||
12 | pg_conversion | encoding conversion information | |||
13 | pg_database | databases within this database cluster | Хранятся имена доступных баз данных | ||
14 | pg_depend | dependencies between database objects | |||
15 | pg_description | descriptions or comments on database objects | В таблице хранятся описания объектов, для которых была применена функция COMMENT (расширение PostgreSQL). Например COMMENT ON TABLE mytable IS 'Эта строка будет сохранена в системной таблице pg_description.'; | ||
16 | pg_enum | enum label and value definitions | |||
17 | pg_foreign_data_wrapper | foreign-data wrapper definitions | |||
18 | pg_foreign_server | foreign server definitions | |||
19 | pg_index | additional index information | |||
20 | pg_inherits | table inheritance hierarchy | |||
21 | pg_language | languages for writing functions | |||
22 | pg_largeobject | large objects | |||
23 | PostgreSQL pg_listener | asynchronous notification support | Используется механизмом LISTEN/NOTIFY. pg_listener существует в версиях PostgreSQL меньше 9. | ||
24 | pg_namespace | schemas | |||
25 | pg_opclass | access method operator classes | |||
26 | pg_operator | operators | |||
27 | pg_opfamily | access method operator families | |||
28 | pg_pltemplate | template data for procedural languages | |||
29 | pg_proc | functions and procedures | |||
30 | pg_rewrite | query rewrite rules | |||
31 | pg_shdepend | dependencies on shared objects | |||
32 | pg_shdescription | comments on shared objects | |||
33 | pg_statistic | planner statistics | |||
34 | pg_tablespace | tablespaces within this database cluster | |||
35 | pg_trigger | triggers | Триггеры хранятся в системной таблице pg_trigger, что позволяет получить информацию о существующих триггерах на программном уровне. | ||
36 | pg_ts_config | text search configurations | |||
37 | pg_ts_config_map | text search configurations' token mappings | |||
38 | pg_ts_dict | text search dictionaries | |||
39 | pg_ts_parser | text search parsers | |||
40 | pg_ts_template | text search templates | |||
41 | pg_type | data types | |||
42 | pg_user_mapping | mappings of users to foreign servers | |||
Представления (View) | Назначение | ||||
43 | pg_cursors | open cursors | |||
44 | pg_group | groups of database users | |||
45 | pg_indexes | indexes | |||
46 | pg_locks блокировки в PostgreSQL | currently held locks | Содержит информацию о блокировках. Уровни блокировок таблиц. | ||
47 | pg_prepared_statements | prepared statements | |||
48 | pg_prepared_xacts | prepared transactions | |||
49 | pg_roles | database roles | |||
50 | pg_rules | rules | |||
51 | pg_settings | parameter settings | |||
52 | pg_shadow | database users | Существует для обратной совместимости, она имитирует каталог, который существовал в PostgreSQL до версии 8.1. | ||
53 | pg_stats | planner statistics | |||
54 | pg_tables | tables | |||
55 | pg_timezone_abbrevs | time zone abbreviations | |||
56 | pg_timezone_names | time zone names | |||
57 | pg_user | database users | Информативный характер о пользователях, пароль содержится в таблице pg_shadow | ||
58 | pg_user_mappings | user mappings | |||
59 | pg_views | views |
pgSqlBlocks - это standalone приложение, написанное на языке программирования Java, которое позволяет легко ориентироваться среди процессов и получать информацию о блокировках и ожидающих запросов в СУБД PostgreSQL. Отображается информация о состоянии подключения к БД, а также информация о процессах в БД. Скачать pgSqlBlocks https://pgcodekeeper.org/pgsqlblocks.html.
Для запуска pgSqlBlocks требуется Java JRE версии 1.8 и выше для вашей платформы. Для запуска pgSqlBlocks в Ubuntu установите как описано в этой статье Как установить Java на Ubuntu