Вышел PostgreSQL 10 / Habr
На самом деле прошло уже два дня, но статью на Хабр никто до сих пор не написал, так что придется мне устранять это упущение, что и делаю с удовольствием.
Итак, что же нового в этой версии PostgreSQL?
Во-первых, изменилось само версионирование. До «десятки» мы наблюдали множество минорных версий 9.x, которые выходили примерно раз в год и при этом вносили серьезные, далеко не минорные изменения. Поэтому с версии 10 было принято решение сделать нумерацию 10, 11, 12 и т.д. Кстати, MySQL, похоже пошел по тому же пути, прыгнул с 5.7 на 8.0
Ладно, это всё мелочи, перейдем к существу вопроса
Логическая репликация
Это то, чего все ждали давным-давно. Замена различным расширениям а ля slony (репликация на триггерах) и другим костылям.
Теперь вы можете из коробки делать репликацию отдельных таблиц на другие базы.
Репликация делается с помощью команд CREATE PUBLICATION и CREATE SUBSCRIPTION. Всё достаточно просто.
Понятно, что фича достаточно новая, поэтому на данный момент в логической репликации отсутствуют некоторые фичи.
- нет репликации схемы/DDL
- нет репликации сиквенсов
- не реплицируется команда TRUNCATE
Тем не менее это все равно огромный шаг вперед, в каких-то случаях можно выкинуть slony!
Партиционирование
Если раньше партиции можно было накостылять через наследование таблиц, то в десятке появилось для этого встроенное средство, которое называется declarative partitioning.
Для этого у главной таблицы добавляется ключевое слово PARTITON BY RANGE
(или LIST
), которое говорит, что эта таблица партициирована (или как это правильно сказать по-русски?).
У конкретных партиций с помощью выражения PARTITION OF ... FOR VALUES FROM (...) TO (...)
задается диапазон их данных.
У партиций есть ряд ограничений, которые стоит иметь в виду, прежде чем использовать на продакшене: Limitations of declarative partitioning in PostgreSQL 10
Identity columns
Если вкратце, то появилась возможность писать
id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
вместо
id serial PRIMARY KEY
Что это дает?
Дело в том, что слово serial — это грубо говоря алиас к конструкции DEFAULT nextval(‘имя сиквенса’). Т.е. по сути таблица отдельно, сиквенс отдельно. Это бывает удобно, а бывает нет. Например, это приводит к тому, что если вы даете права на вставку в таблицу (GRANT INSERT), вам приходится еще отдельно давать гранты на сиквенс.
Кстати, новая запись соответствует стандарту SQL.
Прочее
- Улучшился паралеллизм, в частности Parallel Bitmap Heap Scan, Parallel Index Scan, Parallel Merge Join и т.д. Подробно можно прочесть в блоге Роберта Хааса
- Улучшена производительность физической репликации
- Hash-индексы стали реплицируемы
- Поддержка полнотекстового поиска на jsonb колонках
- SCRAM-аутентификация
- улучшенная поддержка работы с xml
- улучшен планировщик запросов при использовании join: если планировщик поймет, что объединенные строки не могут произвести в джойне больше одной строки, то можно не тратить лишнее время на поиск других строк. Примеры запросов можно посмотреть в тестах этого комита
Полный список изменений можно посмотреть здесь.
Если кто-то уже успел попробовать v10 в бою, поделитесь, плиз, своими впечатлениями в комментариях.
UPDATE. Есть мнение, что система версий не очень. Надо было называть PostgreSQL X, чтобы быть в тренде 🙂
habr.com
PostgreSQL : Документация: 10: E.10. Выпуск 10 : Компания Postgres Professional
После обновления с помощью pg_upgrade с любой предыдущей основной версии PostgreSQL необходимо перестроить хеш-индексы (Митхун Сай, Роберт Хаас, Амит Капила)
Необходимость данного требования продиктована значительным усовершенствованием механизма хеш-индексов. Для облегчения задачи переиндексации pg_upgrade создаст вспомогательный скрипт.
Переименование каталога с журналом предзаписи из pg_xlog
в pg_wal
, а также переименование каталога с информацией о состоянии транзакций из pg_clog
в pg_xact
(Микаэль Пакье)
Старые имена неоднократно вводили пользователей в заблуждение — пользователи думали, что эти каталоги содержат только несущественные файлы журналов, и вручную удаляли файлы журналов предзаписи или состояния транзакций, что приводило к необратимой потере данных. Эти переименования призваны предотвратить такие ошибки в будущем.
Замена в именах функций SQL, утилит и параметров всех упоминаний «xlog» на «wal» (Роберт Хаас)
Например, имя pg_switch_xlog()
поменялось на pg_switch_wal()
, pg_receivexlog — на pg_receivewal, а --xlogdir
— на --waldir
. Это было сделано вместе с переименованием каталога pg_xlog
для согласованности; и вообще термин «xlog» теперь нигде не может встретиться пользователю.
Замена в связанных с WAL функциях и представлениях location
на lsn
(Дэвид Роули)
Ранее имело место несогласованное употребление обоих терминов.
Изменение реализации функций, возвращающих множества, в списке SELECT
(Андрес Фройнд)
Функции, возвращающие множества, теперь вычисляются до вычисления скалярных выражений в списке SELECT
, практически так же, как если бы они были помещены в предложение LATERAL FROM
. Это даёт более понятное поведение в случаях, когда присутствуют несколько таких функций. Если они возвращают разное количество строк, все результаты дополняются до наибольшего количества строк значениями NULL. Ранее результаты обрабатывались в цикле, пока все функции не завершались, и в результате получалось количество строк, равное наименьшему общему кратному периодов функций. Кроме того, функции, возвращающие множества, теперь нельзя использовать в конструкциях CASE
и COALESCE
. За дополнительными сведениями обратитесь к Подразделу 37.4.8.
Использование стандартного синтаксиса конструктора строки в UPDATE ... SET (
(Том Лейн)список_столбцов
) = конструктор_строки
Теперь конструктор_строки
может начинаться со слова ROW
; ранее его надо было опускать. Если в списке_столбцов
фигурирует имя только одного столбца, конструктор_строки
должен использовать ключевое слово ROW
, так как иначе он не будет корректным конструктором строки, а будет восприниматься как выражение в скобках. Также запись
в имя_таблицы
.*конструкторе_строки
теперь разворачивается в набор столбцов, как и в других случаях использования конструктора_строки
.
Когда ALTER TABLE ... ADD PRIMARY KEY
помечает столбцы как NOT NULL
, это изменение теперь распространяется также на дочерние таблицы в иерархии наследования (Микаэль Пакье)
Предотвращение срабатывания триггеров уровня оператора более одного раза для одного оператора (Том Лейн)
В случаях, когда пишущие CTE изменяли одну таблицу, изменяемую внешним оператором либо другими пишущими CTE, триггеры BEFORE STATEMENT
и AFTER STATEMENT
вызывались неоднократно. Также, если в таблице были определены триггеры уровня оператора, в результате действий для обеспечения целостности внешнего ключа (например, ON DELETE CASCADE
), они могли вызываться несколько раз для одного внешнего SQL-оператора. Это поведение противоречит стандарту SQL и было исправлено.
Перемещение полей метаданных последовательностей в новый системный каталог pg_sequence
(Питер Эйзентраут)
Отношение последовательности содержит теперь только поля, которые могут быть изменены функцией nextval()
, то есть last_value
, log_cnt
и is_called
. Другие свойства последовательности, такие как начальное значение и шаг увеличения, сохраняются в соответствующей строке в каталоге pg_sequence
. Действие ALTER SEQUENCE
теперь полностью транзакционное и, как следствие, блокирует последовательность до фиксации транзакции. Функции nextval()
и setval()
остаются нетранзакционными.
Основная несовместимость, привнесённая этим изменением, состоит в том, что из отношения последовательности теперь можно прочитать только три поля, перечисленные выше. Чтобы получить другие свойства последовательности, приложения должны обратиться к pg_sequence
. Также для этого можно использовать новое системное представление pg_sequences
; оно выдаёт столбцы с именами, более подходящими для существующего кода.
Кроме того, последовательности, созданные для столбцов SERIAL
, теперь генерируют 32-битные значения, тогда как предыдущие версии генерировали 64-битные. Это отличие никак не проявляется, если значения просто сохраняются в столбце.
Переработан и вывод команды psql \d
для последовательностей.
Передача по умолчанию программой pg_basebackup данных WAL, необходимых для восстановления резервной копии (Магнус Хагандер)
При этом в pg_basebackup подразумеваемое значение -X
/--wal-method
меняется на stream
. Для воспроизведения старого поведения был добавлен вариант значения none
. Параметр pg_basebackup -x
был удалён (используйте вместо него -X fetch
).
Изменение записей логической репликации в pg_hba.conf
(Питер Эйзентраут)
В предыдущих версиях для соединения логической репликации требовалось указать replication
в столбце базы данных. С этого выпуска логической репликации соответствует обычная запись с именем базы данных или ключевым словом, например, all
. Для физической репликации по-прежнему используется ключевое слово replication
. Так как встроенная логическая репликация появилась только в этом выпуске, это изменение может затронуть только пользователей сторонних средств логической репликации.
Все действия в pg_ctl по умолчанию должны ожидать завершения операции (Питер Эйзентраут)
Ранее некоторые действия pg_ctl не ждали завершения и для ожидания требовалось использовать ключ -w
.
Изменение значения по умолчанию серверного параметра log_directory с pg_log
на log
(Андреас Карлссон)
Добавление параметра конфигурации ssl_dh_params_file для указания имени файла с нестандартными параметрами OpenSSL DH (Хейкки Линнакангас)
Тем самым заменяется жёстко заданное и недокументированное имя файла dh2024.pem
. Заметьте, что файл dh2024.pem
по умолчанию больше не обрабатывается; вы должны задать этот параметр, если хотите использовать свои параметры DH.
Увеличение размера стандартных параметров DH, используемых для эфемерных DH-шифров OpenSSL, до 2048 бит (Хейкки Линнакангас)
Размер предопределённых в коде параметров DH был увеличен с 1024 до 2048 бит, так что обмен ключами DH стал более устойчивым к подбору шифра. Однако некоторые старые реализации SSL, в частности некоторые ревизии Java Runtime Environment версии 6, не принимают параметры DH длиннее 1024 бит и, таким образом, не смогут подключиться через SSL. Если вам необходимо поддерживать такие старые клиенты, вы можете использовать нестандартные параметры DH размером 1024 бита вместо предопределённых параметров по умолчанию. См. ssl_dh_params_file.
Ликвидация возможности хранения незашифрованных паролей на сервере (Хейкки Линнакангас)
Серверный параметр password_encryption больше не поддерживает значения off
и plain
. Вариант UNENCRYPTED
также теперь не поддерживается в командах CREATE/ALTER USER ... PASSWORD
. Аналогично был удалён ключ --unencrypted
команды createuser. Незашифрованные пароли, перенесённые из старых версий, в этой версии будут храниться в зашифрованном виде. Значением по умолчанию параметра password_encryption
остаётся md5
.
Добавление серверных параметров min_parallel_table_scan_size и min_parallel_index_scan_size для управления параллельными запросами (Амит Капила, Роберт Хаас)
Они заменяют переменную min_parallel_relation_size
, которая была слишком общей.
Не заключённый в кавычки текст в shared_preload_libraries и связанных серверных параметрах не должен переводиться в нижний регистр (Куэль Чжо)
Эти параметры на самом деле представляют собой списки имён файлов, но ранее они воспринимались как списки SQL-идентификаторов и обрабатывались по другим правилам.
Удаление серверного параметра sql_inheritance
(Роберт Хаас)
При выключенном значении этого параметра запросы, обращающиеся к родительским таблицам, перестают учитывать дочерние. Однако стандарт SQL требует, чтобы они учитывались, и это поведение было принято по умолчанию в PostgreSQL 7.1.
Реализация возможности передавать многомерные массивы в функции на PL/Python и возвращать вложенные списки Python (Алексей Грищенко, Дэйв Крамер, Хейкки Линнакангас)
Это изменение потребовало нарушить обратную совместимость в части обработки массивов составных типов в PL/Python. Раньше можно было вернуть массив составных типов как [[col1, col2], [col1, col2]]
; но теперь это будет интерпретироваться как двухмерный массив. Составные типы в массивах для однозначности должны возвращаться теперь в виде кортежей Python, а не в виде списков. То есть предыдущую запись нужно заменить на [(col1, col2), (col1, col2)]
.
Удаление механизма автозагрузки «модулей» PL/Tcl (Том Лейн)
На замену этой функциональности пришли новые серверные параметры pltcl.start_proc и pltclu.start_proc, которые проще в использовании и дают возможности, подобные имеющимся в других языках программирования.
Ликвидация поддержки выгрузки данных с серверов до 8.0 утилитами pg_dump/pg_dumpall (Том Лейн)
Пользователям, которым нужно выгрузить данные с серверов до 8.0, остаётся использовать dump из PostgreSQL версии 9.6 или старее. Выгруженные этими версиями данные должны успешно загружаться на новых серверах.
Ликвидация поддержки хранения даты/времени и интервалов в виде чисел с плавающей точкой (Том Лейн)
Параметр configure --disable-integer-datetimes
был удалён. Использование для таких значений чисел с плавающей точкой не давало значимых преимуществ и не было вариантом по умолчанию, начиная с PostgreSQL 8.3.
Ликвидация поддержки сервером клиент-серверного протокола версии 1.0 (Том Лейн)
Этот протокол не поддерживался клиентами со времён PostgreSQL 6.3.
Удаление модуля contrib/tsearch3
(Роберт Хаас)
Этот модуль обеспечивал совместимость с версией полнотекстового поиска, которая поставлялась с серверами PostgreSQL до версии 8.3.
Ликвидация приложений командной строки createlang и droplang (Питер Эйзентраут)
Они перешли в разряд устаревших в PostgreSQL 9.1. Вместо них можно непосредственно использовать команды CREATE EXTENSION
и DROP EXTENSION
.
Ликвидация поддержки вызовов функций версии 0 (Андрес Фройнд)
Расширения, предоставляющие функции, реализованные на C, теперь должны использовать соглашение о вызовах версии 1. Версия 0 считалась устаревшей с 2001 года.
postgrespro.ru
PostgreSQL : Документация: 10: pg_upgrade : Компания Postgres Professional
Переместить старый кластер (необязательно)
Если ваш каталог инсталляции привязан к версии, например, /opt/PostgreSQL/10
, перемещать его не требуется. Все графические инсталляторы выбирают при установке каталоги, привязанные к версии.
Если ваш каталог инсталляции не привязан к версии, например /usr/local/pgsql
, необходимо переместить каталог текущей инсталляции PostgreSQL, чтобы он не конфликтовал с новой инсталляцией PostgreSQL. Когда текущий сервер PostgreSQL отключён, каталог этой инсталляции PostgreSQL можно безопасно переместить; если старый каталог
, его можно переименовать, выполнив:
mv /usr/local/pgsql /usr/local/pgsql.old
Собрать новую версию при установке из исходного кода
Соберите из исходного кода новую версию PostgreSQL с флагами configure
, совместимыми с флагами старого кластера. Программа pg_upgrade проверит результаты pg_controldata
, чтобы убедиться, что все параметры совместимы, прежде чем начинать обновление.
Установить новые исполняемые файлы PostgreSQL
Установите новые исполняемые файлы сервера и вспомогательные файлы. Программа pg_upgrade включена в инсталляцию по умолчанию.
При установке из исходного кода, если вы хотите разместить сервер в нестандартном каталоге, воспользуйтесь переменной prefix
:
make prefix=/usr/local/pgsql.new install
Инициализировать новый кластер PostgreSQL
Инициализируйте новый кластер, используя initdb
. При этом так же необходимо указать флаги initdb
, совместимые с флагами в старом кластере. Многие готовые инсталляторы выполняют это действие автоматически. Запускать новый кластер не требуется.
Установить дополнительные разделяемые объектные файлы
Установите в новый кластер все нестандартные разделяемые объектные файлы (или DLL), которые использовались в старом кластере, например, pgcrypto.so
, где бы они ни находились — в contrib
или в другом месте. Устанавливать определения схемы (например, CREATE EXTENSION pgcrypto
) не требуется, так как они будут перенесены из старого кластера. Кроме того, в новый кластер нужно скопировать и все нестандартные файлы поддержки полнотекстового поиска (словари, тезаурусы, списки синонимов и стоп-слов).
Настроить аутентификацию
Программа pg_upgrade
будет подключаться к новому и старому серверу несколько раз, так что имеет смысл установить режим аутентификации
в pg_hba.conf
или использовать файл ~/.pgpass
(см. Раздел 33.15).
Остановить оба сервера
Убедитесь в том, что оба сервера баз данных остановлены. Для этого в Unix можно выполнить:
pg_ctl -D /opt/PostgreSQL/9.6 stop pg_ctl -D /opt/PostgreSQL/10 stop
А в Windows, с соответствующими именами служб:
NET STOP postgresql-9.6 NET STOP postgresql-10
Ведомые серверы с потоковой репликацией и трансляцией журнала могут продолжать работать до последнего шага.
Подготовиться к обновлению ведомых серверов
Если вы производите обновление ведомых серверов (как описано в разделе Шаг 10), удостоверьтесь, что эти серверы находятся в актуальном состоянии, запустив pg_controldata в старых ведущем и ведомых кластерах. Убедитесь в том, что «Положение последней контрольной точки» во всех кластерах одинаковое. (Несовпадение будет иметь место, если старые ведомые серверы будут отключены раньше, чем старый ведущий, или если старые сервера продолжают работать.) Также смените wal_level
на replica
в файле postgresql.conf
нового ведущего кластера.
Запустить pg_upgrade
Всегда запускайте программу pg_upgrade от нового сервера, а не от старого. pg_upgrade требует указания каталогов данных старого и нового кластера, а также каталогов исполняемых файлов (bin
). Вы можете также определить имя пользователя и номера портов, и нужно ли копировать файлы данных (по умолчанию) или создавать ссылки на них.
Если выбрать вариант со ссылкой на данные, обновление выполнится гораздо быстрее (так как файлы не копируются) и потребует меньше места на диске, но вы лишитесь возможности обращаться к вашему старому кластеру, запустив новый после обновления. Этот вариант также требует, чтобы каталоги данных старого и нового кластера располагались в одной файловой системе. (Табличные пространства и
могут находиться в других файловых системах.) Полный список параметров вы можете получить, выполнив pg_upgrade --help
.
Параметр --jobs
позволяет задействовать для копирования/связывания файлов и для выгрузки/перезагрузки схем баз данных несколько процессорных ядер. В качестве начального значения параметра стоит выбрать максимум из числа процессорных ядер и числа табличных пространств. Этот параметр может радикально сократить время обновления сервера со множеством баз данных, работающего в многопроцессорной системе.
В Windows вы должны войти в систему с административными полномочиями, затем запустить командную строку от имени пользователя postgres
, задать подходящий путь:
RUNAS /USER:postgres "CMD.EXE" SET PATH=%PATH%;C:\Program Files\PostgreSQL\10\bin;
Наконец, запустить pg_upgrade с путями каталогов в кавычках, например, так:
pg_upgrade.exe --old-datadir "C:/Program Files/PostgreSQL/9.6/data" --new-datadir "C:/Program Files/PostgreSQL/10/data" --old-bindir "C:/Program Files/PostgreSQL/9.6/bin" --new-bindir "C:/Program Files/PostgreSQL/10/bin"
При запуске pg_upgrade
проверит два кластера на совместимость и, если всё в порядке, выполнит обновление. Также возможно запустить pg_upgrade --check
, чтобы ограничиться только проверками (при этом старый сервер может продолжать работать). Команда pg_upgrade --check
также сообщит, какие коррективы вам нужно будет внести вручную после обновления. Если вы планируете использовать режим ссылок на данные, укажите вместе с --check
параметр --link
, чтобы были проведены специальные проверки для этого режима. Программе pg_upgrade
требуются права на запись в текущий каталог.
Очевидно, никто не должен обращаться к кластерам в процессе обновления. Программа pg_upgrade по умолчанию запускает серверы с портом 50432, чтобы не допустить нежелательных клиентских подключений. В процессе обновления оба кластера могут использовать один номер порта, так как они не будут работать одновременно. Однако для проверки старого работающего сервера новый порт должен отличаться от старого.
Если при восстановлении схемы базы данных происходит ошибка, pg_upgrade
завершает свою работу и вы должны вернуться к старому кластеру, как описывается ниже в Шаг 16. Чтобы попробовать pg_upgrade
ещё раз, вы должны внести коррективы в старом кластере, чтобы pg_upgrade могла успешно восстановить схему. Если проблема возникла в модуле contrib
, может потребоваться удалить этот модуль contrib
в старом кластере, а затем установить его в новом после обновления (предполагается, что этот модуль не хранит пользовательские данные).
Обновить ведомые серверы с потоковой репликацией и трансляцией журнала
Если вы используете режим ссылок и у вас реализована потоковая репликация (см. Подраздел 26.2.5) или трансляция журнала (см. Раздел 26.2) для ведомых серверов, вы можете быстро обновить эти серверы следующим образом. Вам не нужно будет запускать на них pg_upgrade, вместо этого вы выполните rsync на ведущем. Не запускайте никакие серверы на этом этапе.
Если вы не используете режим ссылок, либо у вас нет rsync или вы не хотите его использовать, либо если вам нужен более простой вариант, пропустите инструкции в этом разделе и просто пересоздайте ведомые серверы сразу после завершения pg_upgrade и запуска нового ведущего сервера.
Установите новые исполняемые файлы PostgreSQL на ведомых серверах
Убедитесь в том, что на всех ведомых серверах установлены новые исполняемые и вспомогательные файлы.
Убедитесь в том, что новые каталоги данных на ведомых серверах
Новые каталоги данных ведомых серверов должны отсутствовать либо быть пустыми. Если запускалась программа initdb, удалите новые каталоги данных на ведомых.
Установить дополнительные разделяемые объектные файлы
Установите на новых ведомых серверах те же дополнительные разделяемые объектные файлы, что вы установили в новом ведущем кластере.
Остановите ведомые серверы
Если ведомые серверы продолжают работу, остановите их, следуя приведённым выше инструкциям.
Сохраните файлы конфигурации
Сохраните все нужные вам файлы конфигурации из старых каталогов конфигурации ведомых серверов, в частности
postgresql.conf
иrecovery.conf
, так как они будут перезаписаны или удалены на следующем этапе.Запустите rsync
Когда используется режим ссылок, ведомые серверы можно быстро обновить, применив rsync. Для этого в каталоге, внутри которого находятся каталоги старого и нового кластера, для каждого ведомого сервера выполните на ведущем:
rsync --archive --delete --hard-links --size-only --no-inc-recursive old_cluster new_cluster remote_dir
Здесь каталоги
old_cluster
иnew_cluster
задаются относительно текущего каталога на ведущем, аremote_dir
находится над каталогами старого и нового кластера на ведомом. Структура подкаталогов в заданных каталогах на ведущем и ведомых серверах должна быть одинаковой. Обратитесь к странице руководства rsync, где подробно описано, как указать удалённый каталог, например так:rsync --archive --delete --hard-links --size-only --no-inc-recursive /opt/PostgreSQL/9.5 \ /opt/PostgreSQL/9.6 standby.example.com:/opt/PostgreSQL
Проверить, что будет делать команда, можно, воспользовавшись параметром rsync
--dry-run
. Выполнить rsync на ведущем необходимо как минимум с одним ведомым, но затем, пока обновлённый ведомый остаётся остановленным, можно запускать rsync на нём для обновления других ведомых.В ходе этой операции записываются ссылки, созданные режимом ссылок pg_upgrade, связывающие файлы нового и старого кластера на ведущем сервере. Затем в старом кластере ведомого находятся соответствующие файлы и в новом кластере ведомого создаются ссылки на них. Файлы, не связанные ссылками на ведущем, копируются с него на ведомый. (Обычно их объём невелик.) Это позволяет произвести обновление ведомого быстро. К сожалению, при этом rsync будет напрасно копировать файлы, связанные с временными и нежурналируемыми таблицами, так как они обычно не будут существовать на ведомых серверах.
Если у вас есть табличные пространства, вам потребуется выполнить подобную команду rsync для каталогов всех табличных пространств, например:
rsync --archive --delete --hard-links --size-only --no-inc-recursive /vol1/pg_tblsp/PG_9.5_201510051 \ /vol1/pg_tblsp/PG_9.6_201608131 standby.example.com:/vol1/pg_tblsp
Если вы вынесли
pg_wal
за пределы каталогов данных, нужно будет запустить rsync и для этих каталогов.Настройте ведомые серверы с потоковой репликацией и трансляцией журнала
Настройте серверы для трансляции журнала. (Запускать
pg_start_backup()
иpg_stop_backup()
или делать копию файловой системы не нужно, так как ведомые серверы остаются синхронизированными с ведущим.)
Восстановить pg_hba.conf
Если вы изменяли pg_hba.conf
, восстановите его исходное состояние. Также может потребоваться скорректировать другие файлы конфигурации в новом кластере, чтобы они соответствовали старому, например postgresql.conf
.
Запустить новый сервер
postgrespro.ru
Вышел PostgreSQL 10 : Компания Postgres Professional
Сегодня состоялся долгожданный релиз PostgreSQL 10.
С каждой очередной версией, выходящей раз в год, PostrgeSQL получает новые возможности, расширяющие область эффективного применения этой СУБД. Среди новинок версии, пришедшей на смену 9.6, можно особо отметить:
- Логическая репликация. Отдельные части этого механизма были добавлены в PostgreSQL уже довольно давно, а в этой версии логическая репликация стала полностью доступна для пользователей. С ее помощью можно выборочно реплицировать отдельные таблицы на другой сервер, который при этом может выполнять как читающие, так и пишущие запросы. Серверы, участвующие в репликации, могут работать под управлением разных версий PostgreSQL, что позволяет проводить обновление кластера с минимальным временем простоя.
- Декларативное секционирование избавляет администратора от необходимости вручную определять иерархию таблиц, создавать триггеры и ограничения целостности.
- Параллельное выполнение запросов стало возможным для сканирования битовых карт и индексов, для соединения слиянием и подзапросов, в дополнение к тем возможностям, которые появились в предыдущей версии.
- Синхронная репликация с учетом кворума позволяет фиксировать изменения, если их подтвердило необходимое число произвольных реплик.
- SCRAM-аутентификация является более криптостойким вариантом используемой ранее MD5-аутентификации.
Всего в новую версию вошло более ста изменений и улучшений, часть из которых выполнена и в нашей компании.
Сегодня в 18:30 состоится встреча, посвященная выходу PostgreSQL 10. На ней Олег Бартунов подробно расскажет о самых важных и интересных новинках (презентация доклада).
postgrespro.ru
PostgreSQL 10 — материалы для прессы
Содержание
Официальный пресс-релиз
5 ОКТЯБРЯ 2017 — Всемирная группа разработки PostgreSQL объявила сегодня о выпуске PostgreSQL 10, новой версии лидирующей реляционной системы управления базами данных с открытым исходным кодом.
Критически важная особенность современных высоконагруженных систем — способность распределять данные на несколько узлов для обеспечения более быстрого доступа, управления и анализа, что известно как стратегия «разделяй и властвуй». PostgreSQL 10 содержит ряд существенных улучшений, позволяющих эффективно применять данную стратегию: нативная логическая репликация, декларативное партиционирование таблиц и улучшеное параллельное исполнение запросов.
«Наше сообщество разработчиков сфокусировано на развитии таких свойств системы, которые позволяют наиболее полно использовать возможности современных инфраструктур с распределённым характером нагрузки», — говорит Магнус Хагандер (Magnus Hagander), член основной команды Всемирной группы разработки PostgreSQL. — «Такие функции как логическая репликация и улучшенный параллелизм исполнения запросов отражают годы работы и демонстрируют постоянный фокус сообщества на обеспечении лидирующей роли PostgreSQL в условиях растущих технологических требований».
С появлением данного релиза меняется схема версий PostgreSQL, новый формат — «x.y». Это означает, что следующее минорная версия будет 10.1, а следующий мажорный релиз — 11.
Логическая репликация — фреймворк для распространения данных по модели «публикация/подписка»Логическая репликация расширяет дополняет существующий набор видов репликации в PostgreSQL за счёт возможности передавать данные о модификации данных на уровне конкретной базы данных или на уровне таблиц в другие базы данных PostgreSQL. Пользователи теперь могут определять, какие именно данные нужно реплицировать. Кроме этого, появляется возможность выполнять переход на новые мажорные версии PostgreSQL без простоя и за счёт встроенных в ядро СУБД средств.
«Мы активно используем PostgreSQL, начиная с версии 9.3, и очень рады появлению версии 10, так как она содержит долгожданные возможности партиционирования и встроенной логической репликации. Это позволит нам использовать PostgreSQL в ещё большем количестве сервисов», — заявил Владимир Бородин, компания «Яндекс».
Декларативное партиционирование таблиц: разделяйте ваши данные с лёгкостьюВозможность партиционирования таблиц долгие годы присутствовала в PostgreSQL, но при этом требовала от пользователя значительных усилий по поддержке нетривиального множества правил и триггеров. В PostgreSQL 10 представлен синтаксис для партиционирования, позволяющий пользователям с лёгкостью создавать и поддерживать таблицы с интервальной или списочной схемой партиционирования. Добавление синтаксиса партиционирования — первый шаг из запланированной серии изменений, ведуших к высокопроизводительному фреймворку партиционирования в PostgreSQL.
Улучшенный параллелизм выполнения запросов: захватите власть над даннымиPostgreSQL 10 содержит улучшенную поддержку параллелизации выполнения запросов — ещё больше частей плана выполнения запроса теперь могут исполняться параллельно. Улучшения заключаются в том, что ещё больше типов операций сканирования данных поддаются параллелизации, а также в том, что в некоторых случаях (например, когда данные уже отсортированы) проводится дополнительная оптимизация. В итоге, пользователь получает данные намного быстрее.
Кворум-коммит для синхронной репликации: распределяйте данные надёжноВ PostgreSQL 10 появляется кворум-коммит для синхронной репликации, что обеспечивает гибкость процесса оповещения основной БД о том, изменения успешно записаны на удалённые реплики. Администратор может теперь указывать, что если определённое число реплик получило информацию об изменении, данное изменение можно рассматривать как надёжно зафиксированное.
«Кворум-коммит для синхронной репликации в PostgreSQL 10 даёт нам больше вариантов расширять нашу инфраструктуру баз данных с временем простоя работы приложений, стремящимся к нулю. Это позволяет нам непрерывно выкатывать изменения и обновлять нашу инфраструктуру без необходимости объявления длительных периодов обслуживания», — сказал Курт Микол (Curt Micol), инженер инфраструктуры в компании Simple Finance.
. Аутентификация SCRAM-SHA-256: обезопасьте доступ к вашим даннымSCRAM (The Salted Challenge Response Authentication Mechanism), описанный в RFC5802, определяет протокол безопасного хранения и передачи паролей за счёт использования специального фреймворка для более строгого сопоставления паролей. В PostgreSQL 10 представлена поддержка метода SCRAM-SHA-256, описанного в RFC7677. Данный подход является намного более безопасным, чем существующий метод аутентификации с использованием MD5.
Подробнее о новинках
Более подробную информацию о новых возможностях можно найти по следующим ссылкам (данные материалы предоставлены на английском языке):
Где скачать
Документация
Документация в формате HTML и страницы с руководством устанавливаются вместе с PostgreSQL, но вы можете без каких-либо ограничений просматривать, пользоваться поиском и комментировать нашу подробную, интерактивную онлайн-документацию.
Лицензия
PostgreSQL использует собственную, BSD-подобную лицензию, которая требует только сохранения в лицензируемом исходном коде информации об авторских правах и текста самой лицензии. Эта сертифицированная организацией OSI лицензия широко известна своей гибкостью и удобством для бизнеса, поскольку она не запрещает использовать PostgreSQL в составе коммерческих и закрытых приложений. Наряду с поддержкой множеством компаний и совместным владением исходного кода, наша лицензия делает PostgreSQL очень популярной среди производителей, желающих внедрить СУБД в свой продукт без каких-либо отчислений, привязки к производителю или риска изменений в лицензировании.
Контакты
Web-страницы
Контакты для прессы
Для запросов на русском языке
Николай Самохвалов
[email protected]
Телефон/Telegram/WhatsApp: +7-905-783-9804
Графика и логотипы
Модификация и распространение всех приведенных логотипов разрешена в соответствии с лицензией PostgreSQL. Имя и логотип PostgreSQL являются торговыми марками ассоциации сообщества PostgreSQL Канады (The PostgreSQL Community Association of Canada).
О проекте PostgreSQL
PostgreSQL является ведущей СУБД с открытыми исходными текстами, с глобальным сообществом из тысяч пользователей и разработчиков, объединяющим множество компаний и организаций. Проект PostgreSQL создаётся на основе более чем 25-летнего опыта проектирования и разработки, начавшейся в Калифорнийском университете Беркли, и в настоящее время разрабатывается беспрецедентными темпами. Продуманный набор возможностей PostgreSQL не только не уступает ведущим коммерческим СУБД, но и превосходит их развитой функциональностью, расширяемостью, безопасностью и стабильностью. Вы можете получить дополнительную информацию о PostgreSQL и присоединиться к нашему сообществу по адресу PostgreSQL.org.
Информация о компаниях, упомянутых в цитатах, и полные тексты цитат
«Наше сообщество разработчиков сфокусировано на развитии таких свойств системы, которые позволяют наиболее полно использовать возможности современных инфраструктур с распределённым характером нагрузки», — говорит Магнус Хагандер (Magnus Hagander), член основной команды Всемирной группы разработки PostgreSQL. — «Такие функции как логическая репликация и улучшенный параллелизм исполнения запросов отражают годы работы и демонстрируют постоянный фокус сообщества на обеспечении лидирующей роли PostgreSQL в условиях растущих технологических требований».
PostgreSQL является ведущей СУБД с открытыми исходными текстами, с глобальным сообществом из тысяч пользователей и разработчиков, объединяющим множество компаний и организаций. Проект PostgreSQL создаётся на основе более чем 25-летнего опыта проектирования и разработки, начавшейся в Калифорнийском университете Беркли, и в настоящее время разрабатывается беспрецедентными темпами. Продуманный набор возможностей PostgreSQL не только не уступает ведущим коммерческим СУБД, но и превосходит их развитой функциональностью, расширяемостью, безопасностью и стабильностью. Вы можете получить дополнительную информацию о PostgreSQL и присоединиться к нашему сообществу по адресу PostgreSQL.org.
«Мы активно используем PostgreSQL, начиная с версии 9.3, и очень рады появлению версии 10, так как она содержит долгожданные возможности партиционирования и встроенной логической репликации. Это позволит нам использовать PostgreSQL в ещё большем количестве сервисов», — заявил Владимир Бородин, компания «Яндекс».
«Кворум-коммит для синхронной репликации в PostgreSQL 10 даёт нам больше вариантов расширять нашу инфраструктуру баз данных с временем простоя работы приложений, стремящимся к нулю. Это позволяет нам непрерывно выкатывать изменения и обновлять нашу инфраструктуру без необходимости объявления длительных периодов обслуживания», — сказал Курт Микол (Curt Micol), инженер инфраструктуры в компании Simple Finance.
Основанная в 2009, Simple является технологической компанией, которая меняет то, как люди используют банковские услуги и относятся к своим деньгам. Продукты компании Simple вписывают банковские услуги и бюджетирование в одно элегантное приложение — инструмент, помогающий людям копить деньги на свои нужды и тратить более разумно. Связаться с представителями Simple можно по email: [email protected]
Корпоративная поддержка
Проекту PostgreSQL помогают многочисленные компании, спонсирующие разработчиков, предоставляющие ресурсы для хостинга и финансовую поддержку. Некоторые из них представлены на странице компаний-спонсоров.
Помимо этого, множество компаний занимается поддержкой СУБД PostgreSQL, от индивидуальных консультантов до многонациональных корпораций.
Пожертвования также тепло приветствуются.
А ещё вы можете купить сувенирную продукцию нашего
www.postgresql.org
Что нового. PostgreSQL. 10-й версии. Иван Панченко. Postgres Professional. postgrespro.ru
Postgresql и отказоустойчивость
Postgresql и отказоустойчивость postgrespro.ru Кулагин Михаил Postgres Pro Обо мне Кулагин Михаил, DBA, Postgres Professional Занимаюсь внедрением отказоустойчивых решений на основе PostgreSQL 2 О чём?
ПодробнееОлег Бартунов
Олег Бартунов [email protected] Олег Бартунов [email protected] Импортозамещение Миссия компании Возрождение российской отрасли СУБД Создание и внедрение конкурентоспособной российской СУБД
ПодробнееНовые возможности Btree
Новые возможности Btree Лубенникова А.В. Фролков И.А. www.postgrespro.ru Общий принцип Чем меньше данных тем лучше Вырожденный случай одна строка в одной таблице с одной колонкой Так не бывает 🙂 Почему?
ПодробнееИнформационная безопасность в PostgreSQL
www.postgrespro.ru Информационная безопасность в PostgreSQL Валерий Попов Стек приложений ИС Введение Меры по обеспечению ИБ: Технологические Административноорганизационные мероприятия Физическая защита
ПодробнееПредварительный обзор Firebird 4.0
Предварительный обзор Дмитрий Еманов [email protected] Firebird Project www.firebirdsql.org 2 Поддержка текущих версий Версия 2.5 Багфиксинг, мелкие улучшения 2.5.7 в начале 2017 года EOL предполагается
ПодробнееЗапускаем параллельный SQL
Запускаем параллельный SQL Владимир Прушковский CacheConf Введение в SQL Введение в SQL Основные компоненты The Unified Data Dictionary Репозиторий мета-данных (Class Definition) Все хранимые классы автоматически
ПодробнееPGConf 2015 Синие против красных
PGConf 2015 Синие против красных Сергей Мелехин Менеджер проекта emply.ru [email protected] Содержание доклада Различия SQL Различия PL/*SQL Репликация и высокая доступность Способы обхода различий Различия
ПодробнееСтратегия компании Прогресс
Стратегия компании Прогресс Большие таблицы в PostgreSQL или как превратить 60+ Tb в 10+ Tb Вадим Яценко март, 2017 1 «Прогресс Софт» российский разработчик информационных систем на базе открытых технологий.
ПодробнееПростейшие конструкции языка SQL
Простейшие конструкции языка SQL Дмитрий Барашев 13 сентября 2016 г. Computer Science Center Этот материал распространяется под лицензией Creative Commons Attribution — Share Alike 3.0 http://creativecommons.org/licenses/by-sa/3.0/us/deed.ru
ПодробнееЖурналирование Настройка журнала
Журналирование Настройка журнала 10 Авторские права Postgres Professional, 2019 год. Авторы: Егор Рогов, Павел Лузанов Использование материалов курса Некоммерческое использование материалов курса (презентации,
ПодробнееРепликация Физическая репликация
Репликация Физическая репликация 10 Авторские права Postgres Professional, 2018 год. Авторы: Егор Рогов, Павел Лузанов Использование материалов курса Некоммерческое использование материалов курса (презентации,
ПодробнееЛогическое резервирование
Логическое резервирование Темы Логическое и физическое резервирование Копирование отдельных таблиц Резервирование и восстановление баз данных и кластера 2 Виды резервирования Логическое резервирование
ПодробнееУправление расширениями
Управление расширениями Темы Расширения в PostgreSQL Создание расширений Обновление на новую версию 2 Расширяемость PostgreSQL Заложена в архитектуре системы Возможности функции и языки программирования
ПодробнееОптимизация запросов Статистика
Оптимизация запросов Статистика 10 Авторские права Postgres Professional, 2019 год. Авторы: Егор Рогов, Павел Лузанов Использование материалов курса Некоммерческое использование материалов курса (презентации,
ПодробнееMS SQL 2011 (Denali) Offset
1 Violet Tape MS SQL 2011 Offset MS SQL 2011 Denali Offset Offset и Fetch First\Next выражения расширения команды Order By NEW В новом SQL Server 2011 Denali расширяются возможности команды Order By с
ПодробнееЯзык SQL. Лекция 6 Индексы
Язык SQL Лекция 6 Индексы Е. П. Моргунов Сибирский государственный университет науки и технологий имени академика М. Ф. Решетнева г. Красноярск Институт информатики и телекоммуникаций [email protected]
ПодробнееЯзык SQL. Лекция 5 Изменение данных
Язык SQL Лекция 5 Изменение данных Е. П. Моргунов Сибирский государственный университет науки и технологий имени академика М. Ф. Решетнева г. Красноярск Институт информатики и телекоммуникаций [email protected]
ПодробнееКомпьютерные базы данных
Компьютерные базы данных В. Р. Марковнин «Лучше иголка в руках, чем в стоге сена» — думал Иван-царевич, бегая кругами от Кощея Бессмертного Определяемся База данных представленная в объективной форме совокупность
ПодробнееACID-свойства транзакций
Транзакции в СУБД Транзакция — неделимая последовательность операторов манипулирования данными (чтения, удаления, вставки, модификации), приводящая к одному из двух возможных результатов: либо последовательность
ПодробнееКорпоративные базы данных 2009
Корпоративные базы данных 2009 Новости в мире PostgreSQL Федор Сигаев, ГАИШ Новости в мире PostgreSQL 8.4 что нового? Коммерческие версии Специальные версии Расширения и связанные проекты Windowing functions
ПодробнееАрхитектура PostgreSQL
Архитектура PostgreSQL Темы Структура памяти, буферный кэш Серверные процессы Организация данных в файловой системе Журнал упреждающей записи Транзакции и многоверсионность Схема обработки запросов Расширяемость
ПодробнееНастройте ODBC на ISE 2.3 с базой данных Oracle
Настройте ODBC на ISE 2.3 с базой данных Oracle Содержание Введение Предварительные условия Требования Используемые компоненты Настройка Шаг 1. Базовая конфигурация Oracle Шаг 2. Базовая конфигурация ISE
ПодробнееРезервное копирование Обзор
Резервное копирование Обзор 10 Авторские права Postgres Professional, 2017 год. Авторы: Егор Рогов, Павел Лузанов Использование материалов курса Некоммерческое использование материалов курса (презентации,
ПодробнееОСНОВНЫЕ ПОНЯТИЯ БАЗ ДАННЫХ
ОСНОВНЫЕ ПОНЯТИЯ БАЗ ДАННЫХ 1. Выберите правильный порядок действий при проектировании БД а) Решение проблемы передачи данных б) Анализ предметной области, с учетом требования конечных пользователей в)
ПодробнееРепликация: варианты
Репликация: варианты Темы Подключение нескольких реплик Синхронная репликация Каскадная репликация Отложенная репликация 2 Несколько реплик Задача повысить доступность и распределить нагрузку Механизм
ПодробнееЯзык SQL. Лекция 10 Полнотекстовый поиск
Язык SQL Лекция 10 Полнотекстовый поиск Е. П. Моргунов Сибирский государственный университет науки и технологий имени академика М. Ф. Решетнева г. Красноярск Институт информатики и телекоммуникаций [email protected]
ПодробнееСопровождение PostgreSQL
Сопровождение PostgreSQL Темы Процедура очистки и задачи, которые она решает Мониторинг индексов и их перестроение 2 Задачи сопровождения Обязательные периодические задачи очистка страниц от старых версий
ПодробнееМиграция больших БД без остановки
Миграция больших БД без остановки Как перевести БД с DB2 for z/os на PostgreSQL с минимальным временем простоя Дмитрий Погибенко Требования к процессу миграции Преобразование данных Перенос данных без
ПодробнееСОЗДАНИЕ И ИСПОЛЬЗОВАНИЕ ПРЕДСТАВЛЕНИЙ
СОЗДАНИЕ И ИСПОЛЬЗОВАНИЕ ПРЕДСТАВЛЕНИЙ Представление это виртуальная таблица, определяемая запросом, содержащим оператор SELECT. Эта виртуальная таблица состоит из данных одной или нескольких реальных
ПодробнееХраним сложные объекты просто
Храним сложные объекты просто Банальности, проверенные опытом (С) Дельгядо Филипп, 2017, 1cupis.ru О себе Когда-то MS SQL Dev Сейчас Java архитектор платежные системы, букмекерские системы, b2b, вот это
Подробнеепо работе с Tortoise SVN на проектах
по работе с Tortoise SVN на проектах Содержание 1 Установка и настройка SVN 2 Получение рабочей копии 3 Структура репозитория и работа с SVN 3.1 Порядок работы с SVN для Клиента 3.2 Порядок работы с SVN
ПодробнееУдаление ключа (Delete)
Удаление ключа (Delete) Находим узел, содержащий искомый ключ key Если ключ key находится в листе, то удаляем ключ из него Если количество ключей стало меньше t 1, выполняем восстановление свойств B-дерева
ПодробнееOracle 12c: введение в SQL 1:
Введение в базу данных Oracle 12c Oracle 12c: введение в SQL 1: Обзор основных возможностей БД Oracle 12c Обсуждение основных концепций, а также теоретических и физических аспектов реляционной базы данных
ПодробнееStructured Query Language
Structured Query Language Курс «Базы данных» Вадим Цесько Санкт-Петербургский государственный политехнический университет 15 марта 2012 г. Вадим Цесько (СПбГПУ) Structured Query Language 15 марта 2012
ПодробнееУправление доступом Привилегии
Управление доступом Привилегии 10 Авторские права Курс «Администрирование PostgreSQL 9.6. Базовый курс» Postgres Professional, 2017 год. Авторы: Егор Рогов, Павел Лузанов Использование материалов курса
Подробнееdocplayer.ru
Митап в ВШЭ: встречаем PostgreSQL 10.0 : Компания Postgres Professional
5 октября в ВШЭ прошел митап, посвященный выходу версии PostgreSQL 10.0. Мероприятие было организовано Postgres Professional совместно с факультетом компьютерных наук НИУ ВШЭ. Дата митапа точно совпала с выходом официальной версии «десятки», которая не была известна заранее. В Postgres Professional задолго до ее выхода следили за версиями-кандидатами, так что такое совпадение не случайно.
На митапе, который проходил более 3 часов в переполненном зале с почти сотней зрителей, прозвучали три аналитических доклада, в которых эксперты не только рассказывали о новых функциональных возможностях PostgreSQL 10.0, но и сравнивали различные варианты решения проблем, ради которых вносились изменения в ванильную версию. Докладчики также представили соответствующие средства Postgres Pro с их плюсами и минусами. Большой интерес проявили присутствовавшие и к обнародованным дорожным картам нашей компании на фоне планов сообщества — вплоть до будущей версии PostgreSQL 11.0.
Олег Бартунов: PostgreSQL как универсальная СУБД
Первый, концептуальный доклад сделал генеральный директор компании Postgres Professional Олег Бартунов. Название подчеркивало, что в своем современном состоянии СУБД PostgreSQL может все, покрывая большой диапазон типов данных и разнообразных типов нагрузок.
За время существования СУБД PostgreSQL у нее появилось более 70-ти коммерческих и открытых форков. Самая последняя новость — выход 2ndQPostgres, коммерческой версии от компании 2-nd Quadrant.
Говоря о непосредственном поводе митапа — выходе версии PostgreSQL 10.0 — Олег пояснил значение и перспективы новшеств, которые можно поделить на 5 групп:
- для администраторов баз данных — отказ от открытого хранения паролей, от аутентификации на MD5 в пользу SCRAM-SHA-256, переименование каталогов WAL и др.;
- появление логической репликации — гигантский шаг в направлении мультимастера, развиваемого в Postgres Professional;
- повышение производительности за счет дальнейшего распараллеливания работы СУБД, в том числе, параллельного сканирования индексов;
- декларативный синтаксис секционирования таблиц (эту тему подробно разобрал Дмитрий Иванов в своем докладе).
Видео доклада:
Слайды доклада:
Дмитрий Иванов: есть новые бенчмарки PostgreSQL и pg_pathman
Один из разработчиков pg_pathman Дмитрий Иванов разобрал проблемы, которые возникали при секционировании через наследование в предыдущих ванильных версиях и были отчасти решены в PostgreSQL 10.0, а также о том, что все еще мешает создать полноценное секционирование. Расширение pg_pathman, которое будет работать и с PostgreSQL 10.0, не только удобно, но и резко убыстряет обработку запросов при большом количестве секций (речь шла о 500 и больше). В ситуациях, когда даже 10-й PostgreSQL перебирает все секции подряд, pg_pathman пропускает заведомо неподходящие и избегает ненужные блокировки.
Впервые были показаны результаты тестов — на этот раз YCSB — где pg_pathman повышает производительность PostgreSQL в сотни раз. Дмитрий упомянул и о проблемах, таких как глобальные индексы, над которыми работают наши разработчики.
Видео доклада:
Слайды доклада:
Иван Картышов: непроверенная копия не поможет
Доклад Ивана Картышова был посвящен анализу существующих решений резервного копирования и валидации копий. Речь шла и о полных, об инкрементальных, и о дифференциальных типах копирования. Сравнивались:
- pgbackrest от Crunchy,
- pgbarman от 2ndQuadrant и
- pg_probackup — наша разработка.
Иван разъяснял особенности, различия в функциональности этих решений, их связи с использованием механизмов ptrack, page level и rsync.
Копия не поможет восстановить базу — напоминал докладчик — если за время между снятием копии и началом восстановления она была повреждена. Поэтому средства валидации, которые доступны в Postgres Pro Enterprise, куда входит pg_probackup, радикально улучшат надежность хранения данных.
Видео доклада:
Слайды доклада:
Фотогалерея:
postgrespro.ru