Задать вопрос
Ответы пользователя по тегу PostgreSQL
  • Как ускорить запрос Postgresql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Нужен explain (analyze,buffers), сильно желательно с track_io_timing = on в конфиге.

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

    Оказывает. Если планировщик решит, что work_mem не хватает - не будет hash join. Для сортировки 27кб, очевидно, без разницы.

    Впрочем, зачем вам вообще join подзапроса где одна только группировка подзапроса занимает половину времени ответа? Вам простой exists нужен.
    SELECT "t1".* FROM table_1 as t1
    where exists (select 1 from table_2 as t2 WHERE t1.primarykey=t2.session)
    ORDER BY "starttime" DESC LIMIT 20;

    А дальше know your data. Если по starttime DESC быстро находятся нужные exists - будет хорошо. Если exists мало - стоит подумать, а не денормализовать ли этот признак в table_1 с триггером для консистентности в table_2 и частичным индексом по starttime where t2_exists.

    Поля session и primarykey в формате uuid

    Не очень хорошая идея. Оно и сильно медленнее при сравнении относительно bigint (особенно если речь о varchar, а не uuid типе данных) и из-за случайного распределения несколько сбивает с толку статистику планировщика.
    Ответ написан
    1 комментарий
  • Как правильно тюнить конфиги БД, распределять ресурсы?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Здесь по инструкции только под Postresql выделяется все 100% ОЗУ, такой конфиг подойдет разве что если на сервере будет только постгрес крутится и не более.

    Именно так. Потому что вы читаете про highload. Под СУБД выделяется отдельный физический хост, плюс ещё парочка таких же под реплики. И уж явно не с механическим io. highload СУБД на HDD не бывает уже очень давно.

    Проставьте оба конфига из расчёта 16гб памяти. Всё равно упрётесь в диски. Да и в CPU тоже упрётесь.
    Если вы поставите shared_buffers в 25% ram, и innodb_buffer_pool_size в 80% - то у вас запустится банально только одна из баз. Ну или буфер перманентно в свопе будет, что в общем-то ещё хуже.
    Кстати, надеюсь, вы по крайней мере проверяете смысл изменяемых настроек. Чтобы не было интересных сюрпризов вроде сделали всю базу на myisam, а крутите innodb_buffer_pool_size
    Ответ написан
    Комментировать
  • Почему не запускается postgres 9.6?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Всё ему нравится,
    согласованное состояние восстановления достигнуто

    начало передачи журнала с главного сервера, с позиции 4A4/E000000 на линии времени 2

    База запустилась, репликация запустилась, всё работает.

    А вот вам, наверное, не нравится то что база не принимает read only коннекты? Проверьте настройку hot_standby в postgresql.conf, дефолтно выключено.
    Ответ написан
    1 комментарий
  • Как составить следующий запрос SQL?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Смотрите в оконные функции. lag и lead, в postgresql давно, в mysql в 8.0 наконец появились. Для более старых mysql - извращаться.
    Ответ написан
  • Как настроить Postgres в Docker?

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

    Для использования базы вы обязаны предоставить нормальную файловую систему, необходимо предоставить сеть хоста. Изоляция? Так у вас система целиком под базу и так. Миграция на другой хост? Да у вас в этом докере только бинарники базы и есть. Точно такие же как в репозиториях, сама база-то снаружи в нормальной ФС. На другую архитектуру вы 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
    DBA для вашего PostgreSQL?
    Передайте 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
    DBA для вашего PostgreSQL?
    Настроек у него никаких, поэтому достаточно проверить, что он загружен, т.е. упомянут в
    show shared_preload_libraries;
    Ответ написан
    Комментировать
  • Как вставить поле id в таблицу базы данных PostgreSQL?

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


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

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

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

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

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

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Обычный union all.
    select ... from a ...
    union all
    select ... from b ...


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Поэтому в 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
    DBA для вашего PostgreSQL?
    Всё очевидно:
    суперпользователь базы - лицо доверенное и база доверяет этому пользователю. И суперпользователь множеством хитрых и не очень способов способен сделать с сервером на котором запущена база всё на что хватит прав у пользователя, от которого запущен postgres.
    Например, запустить любую произвольную команду даже простой и очевидной командой copy, не говоря уже о каких-то извращениях.

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

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