Ответы пользователя по тегу PostgreSQL
  • Почему данные с checkbox-а не сохраняются в базе?

    Melkij
    @Melkij
    PostgreSQL DBA
    TLDR
    input без name браузером не передаётся как элемент формы. Потому что у него нет name.
    Ответ написан
    Комментировать
  • Как исправить кривое отображение столбцов в Postrgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    У вас просто терминал узкий для вашей выборки.
    Широкие результаты часто удобнее читать в широком виде, который переключается с помощью команды \x в psql:

    melkij=> select generate_series(1,3);
     generate_series 
    -----------------
                   1
                   2
                   3
    (3 строки)
    
    melkij=> \x
    Расширенный вывод включён.
    melkij=> select generate_series(1,3);
    -[ RECORD 1 ]---+--
    generate_series | 1
    -[ RECORD 2 ]---+--
    generate_series | 2
    -[ RECORD 3 ]---+--
    generate_series | 3
    Ответ написан
    1 комментарий
  • Как делать бэкапы/дампы в Postgresql? Какое есть бесплатное и простое решение, которым пользуются многие?

    Melkij
    @Melkij
    PostgreSQL DBA
    Зависит от требований к бекапам.
    Если нужен point in time recovery, т.е. возможность восстановить состояние кластера на какую-то произвольную транзакцию - то это pg_basebackup + архив WAL.
    Чтобы не собирать конструктор вручную - есть barman. Если бекапить хотите куда-то в s3 - то проще будут wal-e или wal-g
    Одну базу в отдельности так бекапить и восстанавливать не выйдет, только весь инстанс целиком. Объём бекапа = объём всего инстанса + объём всех WAL от начала basebackup до нужного момента восстановления, количество wal зависит от вашей пишущей нагрузки.

    Если достаточно логических слепков данных, например, ежесуточных - тогда да, pg_dump. Восстановление соответственно только на момент начала снятия дампа.
    Типично делается pg_dumpall -g для сохранения глобальных данных кластера - пользователей, tablespace, имён баз и отдельные pg_dump для тех баз которые надо бекапить.
    Формат часто custom делается, т.к. он штатно сжимается и позволяет через pg_restore восстанавливать определённые объекты из дампа, а не только всё целиком как текст через psql. Для гигабайтной базы смысла нет, а для баз побольше имеет смысл делать формат directory в несколько потоков.
    Ответ написан
    4 комментария
  • Автоматическая запись в две базы Postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Для цели резервного копирования вам нужна не вторая база, а само резервное копирование. То есть pg_basebackup и архив WAL с момента старта basebackup до момента на который вы хотите восстановить состояние базы. Посмотрите barman как более готовую штуку для этого. Или wal-e/wal-g, которые проще в настройке сами по себе - если вы бекапитесь куда-нибудь в совместимое с ними место.

    Если вам нужно не резервное копирование, а запасная машинка на случай проблем с первой - то вам нужна репликация. Штатная потоковая репликация отличная стабильная штука. Надо пояснять чем отличается резервирование от бекапов?

    Писать кодом в две разные базы - как раз идея плохая как для резервирования, так и для бекапов. Записали изменение в одну базу, во вторую не смогли с какой-нибудь мелкой ошибкой вроде сети моргнувшей. Что делать будете? А ничего хорошего. Корректно писать в несколько мест - задача не слишком тривиальная и нужно что-то сочинять, например протокол двухфазного коммита.
    Ответ написан
  • Перенос базы postgres без pg_dump?

    Melkij
    @Melkij
    PostgreSQL DBA
    Вариант подмены каталога /base не работает.
    Вариант создать базу с этим же именем и заменить файлы старой базой, не работает.

    И не будет работать, конечно.

    Сделайте реплику через pg_basebackup. Когда нагонит мастер - рестартуйте в новый мастер.
    На коммерческой основе - напишите в dataegret, ссылка у меня в профиле.
    Ответ написан
    2 комментария
  • Как сделать отказоустойчивый кластер PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Мультимастер СУБД - это такая замечательная штука, которую все хотят и ни у кого пока не получилось.
    Потому что есть такая штука как CAP теорема, весьма мешающая сделать серебряную пулю.

    Ладно, ближе к делу.
    Самая большая проблема с автоматическим failover СУБД - решить, что уже пора переключаться. Для чего необходимо выяснить, а что вообще происходит, не развалилась ли сеть, не вернётся ли через пару секунд мастер обратно - если в сети в результате окажется два мастера, то нет никакого разумного способа определить, где данные актуальны. Худшее что можно представить - это split brain: когда часть приложений ходит в один мастер, часть в другой и данные стремительно расходятся в разные стороны. Есть такая байка про гуглдиск "у нас всё отказоустойчиво, все данные хранятся в 4 экземплярах. Правда, у нас была авария и мы теперь понятий не имеем, какая из копий актуальная"
    Переключение мастера на 90% - решение административное и человеческое. Автоматика же добавляет головной боли. Зачастую - больше головной боли, чем без неё. Особенно если железо адекватное серверное, которое "вдруг" выпадает очень редко.

    Обычно автоматики нет, и есть детальная инструкция по переключению мастера БД, по которой и в ночи можно переключиться.

    Если всё ещё хочется походить по граблям - посмотрите patroni. Есть пара кластеров с ним на поддержке, при наличии мониторинга особых проблем не припоминаю. До split brain по крайней мере не придумал как довести, вроде все варианты прикрыты. В худшем случае в readonly уходит.
    Ответ написан
    7 комментариев
  • Py-postgres postgresql10 ошибка?

    Melkij
    @Melkij
    PostgreSQL DBA
    Ошибка в используемой библиотеке. Так запрашивать версию базы нельзя.

    Ломается именно на 10 очевидно из-за смены политики нумерации, до 10 было x.y.z, где x.y - major версия, начиная с десятки релизы нумеруются x.y, где major версия только первая цифра. Глупый код пытающийся распарсить номер находит не то что ожидает.

    Вероятно, полтора года спустя с релиза postgresql 10.0, библиотеку уже исправили. Хотелось бы надеяться что на использование специально для этого предназначенной current_setting('server_version_num'), а не опять костылём вокруг не предназначенной для того version()
    Копать соответственно в сторону обновления версии библиотеки. Если никак - откатываться на postgresql 9.6.
    Ответ написан
    1 комментарий
  • Как ускорить запрос Postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Нужен 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
    PostgreSQL DBA
    Здесь по инструкции только под 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
    PostgreSQL DBA
    Всё ему нравится,
    согласованное состояние восстановления достигнуто

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

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    Смотрите в оконные функции. lag и lead, в postgresql давно, в mysql в 8.0 наконец появились. Для более старых mysql - извращаться.
    Ответ написан
  • Как настроить 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) если я верно понял по какому признаку вы хотите определять "последнее" значение.
    Ответ написан
    Комментировать