Ответы пользователя по тегу PostgreSQL
  • Как настроить Postgres в Docker?

    Melkij
    @Melkij
    PostgreSQL DBA
    Зачем оно вам? Вот скажите, зачем? Пока ни один из встреченных адептов докера не справился с таким простым вопросом "зачем вам база в докере?", может вы справитесь.

    Для использования базы вы обязаны предоставить нормальную файловую систему, необходимо предоставить сеть хоста. Изоляция? Так у вас система целиком под базу и так. Миграция на другой хост? Да у вас в этом докере только бинарники базы и есть. Точно такие же как в репозиториях, сама база-то снаружи в нормальной ФС. На другую архитектуру вы datadir не перетащите в принципе. Несколько кластеров баз на одной машине? А докер для этого зачем? На ubuntu/debian есть шикарные скрипты pg_ctlcluster. Про извращения с pg_upgrade обновлением базы не буду перепечатывать ответ с ruSO.

    На взгляд postgresql dba вы не передали никаких настроек вообще, а work_mem и вовсе уменьшили, 4мб у него дефолт. Соответственно база будет работать по-умолчанию, т.е. из расчёта запуститься на любом калькуляторе, а не внятно работать. Не хватает, соответственно, всего. Настройки более агрессивных checkpointer, bgwriter и autovacuum в первую очередь.
    По запросам смотрите pg_stat_statements
    Ответ написан
    3 комментария
  • Как правильно указать имя таблицы в функции pg_relation_size?

    Melkij
    @Melkij
    PostgreSQL DBA
    Передайте pg_class.oid и всё.
    pg_size_pretty(pg_table_size(с.oid)) AS size,
    pg_size_pretty(pg_indexes_size(с.oid)) AS idxsize,
    pg_size_pretty(pg_total_relation_size(с.oid)) as "total"


    Если загляните в определение pg_tables - то увидите, что это view от pg_class с фильтром relkind = 'r'. То есть объединение с pg_tables довольно лишнее.
    Ответ написан
    Комментировать
  • Как проверить используется ли модуль passwordcheck без попытки создания пользователя?

    Melkij
    @Melkij
    PostgreSQL DBA
    Настроек у него никаких, поэтому достаточно проверить, что он загружен, т.е. упомянут в
    show shared_preload_libraries;
    Ответ написан
    Комментировать
  • Как вставить поле id в таблицу базы данных PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    copy можно указать поля таблицы для заполнения, то есть в таблице может быть полей больше, чем в источнике данных. Такие дополнительные поля должны иметь значение по-умолчанию или быть null
    COPY test (field1, field2, ...) FROM 'test.csv' DELIMETR ',' CSV;


    Синтаксиса для пропуска полей не предусмотрено.
    Ответ написан
    1 комментарий
  • Как перенести данные одного кластера postgres в другой?

    Melkij
    @Melkij
    PostgreSQL DBA
    Минорные релизы именно так и ставятся: обновляются выполняемые бинарники и рестартовать базу в том же самом datadir.
    О чём есть замечание в каждых release notes: https://www.postgresql.org/docs/9.6/static/release...
    A dump/restore is not required for those running 9.6.X.

    release notes стоит поглядеть для всех пропущенных апдейтов, могут быть важные замечания для обновления.

    Кстати, обратите внимание, что 9.6.9 уже вышел и обновляться стоит именно на него.
    Ответ написан
    2 комментария
  • Как подключить PostgreSQL к web-приложению?

    Melkij
    @Melkij
    PostgreSQL DBA
    pga_hba.conf можете редактировать как и чем угодно, это не имеет отношения к базе (ну разве вы только руками переопределили hba_file).
    А файл правил авторизации pg_hba.conf необходимо редактировать текстовым редактором, желательно каким-то адекватным который не будет заниматься самодеятельностью с правами, именами, владельцами и содержимым файла. После внесения правок в pg_hba необходимо скомандовать reload базе.
    select pg_reload_conf();
    Запросом от суперпользователя предпочтительнее, т.к. не зависит от платформы.

    от клиента запрашивается пароль дважды хешированный алгоритмом MD5

    Единожды хэшированный согласно способу аутентификации md5 протокола libpq.

    Ну и конечно надо понимать, что меняется и где именно. pg_hba обрабатывается по порядке сверху вниз и правило вполне можно указать даже банально не там где нужно.
    Плюс при reload смотрите в лог, сообщения об ошибке формата там будут.
    Ответ написан
    Комментировать
  • Как объединить две таблицы с фильтрацией по дате?

    Melkij
    @Melkij
    PostgreSQL DBA
    Обычный union all.
    select ... from a ...
    union all
    select ... from b ...


    Можно сделать view.
    Ответ написан
  • Ссылки между базами не реализованы postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Ссылки между разными базами действительно не реализованы.
    Следовательно парсер считает, что вы в одном запросе обращаетесь к разным базам. Покажите запрос который вы отправляете в базу, а не как запрос строится.
    Ответ написан
    Комментировать
  • Как сделать быструю уникальную выборку из postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Список нужных radio есть отдельно или надо искать по этой же табличке?
    Если искать по этой же табличке - то вам нужен loose index scan. Глупый планировщик сам так делать не умеет, надо объяснять вручную.
    Если список есть отдельно - то простой lateral join подзапроса будет компактнее.
    Вот тут с 30 по 46 слайды

    Необходим индекс btree(radio, date) если я верно понял по какому признаку вы хотите определять "последнее" значение.
    Ответ написан
    Комментировать
  • Как вывести значения со всеми id из таблицы PostgeSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Вы удалили предыдущий вопрос и у меня нет желания набирать ответ повторно. Поэтому буду краток.
    На одну ошибку указал Rsa97 , вторая ошибка:
    SELECT id FROM Users;
    SELECT id FROM "Users";

    Это обращения к разным таблицам.

    Разберитесь, где вы потеряли сами сообщения об ошибках pg.
    Ответ написан
  • В чем проблема в этом триггере?

    Melkij
    @Melkij
    PostgreSQL DBA
    Вы в after insert триггере на табличке со странным названием lechenie выполняете безусловный insert в эту же самую таблицу. Вопрос к вам: почему вы в результате ожидаете что-то кроме бесконечной рекурсии?
    Ответ написан
    6 комментариев
  • Как переписать данную строку при портировании с MySQL на PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    В postgresql все текстовые типы следуют кодировке базы. case insensitive utf8 в pg не предусмотрено.
    Поэтому если у вас база в utf8 - то "STEM" varchar(50) not null
    Если база не в utf8 - не надо так делать.
    Ответ написан
    Комментировать
  • Почему возникает ошибка, когда передаешь кортеж из 1 элемента в sql запрос?

    Melkij
    @Melkij
    PostgreSQL DBA
    Потому что синтаксически там запятой быть не может.
    Если запятую ставите вы - сделайте так, чтобы её там не было.
    Если запятую ставит ваше ORM или прочий библиотечный код - значит или вы неверное используете библиотеку или это баг этой библиотеки.
    Ответ написан
    Комментировать
  • Как отслеживать изменения в СУБД при конкурентной записи?

    Melkij
    @Melkij
    PostgreSQL DBA
    Возьмите pgq и пишите в очередь перед коммитом как найти нужные данные. Или триггером сразу при записи в таблицы шлите сообщения через pgq.
    При экспорте соответственно читаете сообщения из pgq. Всё.

    Или напишите или возьмите какой-нибудь готовый logical decoding. Сможете читать вообще поток репликации

    В общем случае в общем-то нужна всё равно очередь. Из транзакции в таблички очереди пишете метки какие данные изменились, читатель читает эту метки и получает все изменения независимо от времени коммита.
    Ответ написан
    Комментировать
  • Как сделать ограничение доступа к базе данных в Mysql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Не говорите никому пароль от роли владельца, и никто не сможет подключиться к этой БД.

    Вы таки удивитесь.
    Дефолтно база доступна всем пользователям. И даже есть права на создание объектов. Удалить таблицу сможет суперпользователь или владелец этой таблицы. А вот создать - кто угодно.

    Поэтому в postgresql после создания базы необходимо отзывать дефолтные права:
    create database newdb;
    \c newdb
    GRANT CONNECT ON DATABASE newdb TO newdb_user ;
    REVOKE ALL ON DATABASE newdb FROM public;
    REVOKE ALL ON SCHEMA public FROM public;
    GRANT USAGE ON SCHEMA public TO newdb_user;

    Если при create database указать owner - то выдавать ему права на схему public будет избыточно, но делать revoke таки необходимо.

    Сходная ситуация с mysql.
    Ответ написан
  • Как работает вирус monero распространяемый через postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Всё очевидно:
    суперпользователь базы - лицо доверенное и база доверяет этому пользователю. И суперпользователь множеством хитрых и не очень способов способен сделать с сервером на котором запущена база всё на что хватит прав у пользователя, от которого запущен postgres.
    Например, запустить любую произвольную команду даже простой и очевидной командой copy, не говоря уже о каких-то извращениях.

    Конкретная атака по-видимому уже разобрана и описана вот тут: https://habrahabr.ru/post/351452/

    Никогда не используйте trust, уж тем более в мир. В нормальном состоянии база вообще не должна быть открыта в мир.
    Ответ написан
    3 комментария
  • Как выбрать следующие 100 строк из большой таблицы?

    Melkij
    @Melkij
    PostgreSQL DBA
    2. Нужно ли включать order by в таких огромных таблицах?

    Не зависит от размера базы.
    Или у вас есть order by и поведение ожидаемое или у вас нет order by и СУБД имеет полное право на каждый запрос выдавать любые подходящие под фильтр данные в любом порядке.
    Запрос выдающий неправильные данные обычно никому не нужен, даже если он и быстрый.

    offset для пагинации вообще вещь неуклюжая. https://use-the-index-luke.com/no-offset
    Быстрая пагинация - это передача уникального идентификатора, последнего на просматриваемой странице. Т.е. запрос на выборку следующих 100 записей начиная после такого-то id.
    Бонусом консистентное поведение, если, например, что-то из строк предыдущей страницы удалили. Оффсет тупо потеряет строку из выборки и пользователь может не найти то что искал.

    3. Ну типа берем сначала вытаскиваем данные с одной таблицы, потом по результату смотрим id, по нему вытаскиваем данные связанные со второй таблицы, затем смотрим новый результат и так же вытаскиваем с третьей. Получается в бд не будет строится огромная временная таблица из трех больших таблиц.

    Вы изобрели то что делает джойн. База в общем случае его сделает лучше.
    Будет ли огромная временная таблица - смотрите план.
    Ответ написан
    Комментировать
  • Как перенести дамп базы данных с Ubuntu на Windows?

    Melkij
    @Melkij
    PostgreSQL DBA
    К каким бы то ни было паролям базы источника отношения не имеет.
    Вопрос исключительно к настройке вашей базы в этом экзотическом окружении windows.

    Во-первых неясно пароль какого пользователя запрашивается?

    Того, к которому вы сказали подключиться psql. Поскольку вы не указали соответствующий ключ -U и, скорей всего, не определили переменную окружения - то psql пытается использовать имя пользователя аналогичное имени пользователю открытой консоли.

    Ошибка прямым текстом говорил, что была использована парольная аутентификация, в результате пользователя с таким паролем в базе не оказалось. Разберитесь как авторизоваться в базе в вашей системе, к дампам отношения не имеет никакого.
    Ответ написан
    4 комментария
  • Какую утилиту лучше использовать для реорганизации таблиц PostgreSQL (например: pg_repack vs pgcompactor vs подстройка автовакума)?

    Melkij
    @Melkij
    PostgreSQL DBA
    pg_repack - это community extension, форк более раннего pg_reorg. И не отрицая вклад участников pgpro в разработку postgresql в целом - я не вижу их среди контрибьютеров pg_repack.

    Мы активно используем обе. Основные моменты касательно pg_repack vs pgcompacttable в общем-то именно я и изложил в README компактора. Если говорить на русском:
    - pg_repack делает копию таблицы, т.е. требуется двукратный запас диска. Компактор работает в рамках одной таблицы и требует место только под копию наиболее толстого индекса и то, толстые индексы обрабатываются самыми последними. Т.е. расчёт на работу когда места уже мало.
    - компактор намеренно выполняется медленно чтобы не задевать работающий проект
    - компактор не может обрабатывать toast таблицы. Репак - может.
    - pg_repack характеризуется очень заметными пиками io и wal. Вся таблица едет одной транзакцией и это никак не регулируется. Поэтому может аффектить прод на неважных дисках и в том числе оторвать реплики при недостатке сетевой полосы.
    - pg_repack умеет перемещать между tablespace и может делать команду cluster

    (или лучше подстроить автовакум)?

    Конечно необходимо настроить автовакуум и не мешать ему работать - т.е. исключить долгие транзакции. Но всё равно бывают хитрые моменты, когда репак или компактор бывают нужны.
    Ответ написан
    2 комментария
  • Как вы измеряете профиль нагрузки (соотношение кол-ва чтений/кол-ву записей) в PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Посмотрите в циферки что собирает stats collector, их много разных. https://www.postgresql.org/docs/10/static/monitori...
    например, запись буферов на диски - это buffers_checkpoint, buffers_clean и buffers_backend в pg_stat_bgwriter
    pg_stat_database c blks_read, blks_hit, blk_read_time и blk_write_time

    И разумеется pg_stat_statements с детализацией ресурсов по отдельным запросам.

    Вот кстати, хорошая картинка куда смотреть за детализацией каких подсистем базы
    postgres-observability-9.6.png
    Ответ написан