Задать вопрос
Ответы пользователя по тегу PostgreSQL
  • Копировать данные между двумя базами данных?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    FDW, dblink, pg_dump, copy to/copy from, написание отдельного скрипта на любом прикладном языке - что вам проще и какая возможность доступна - так и делается.
    Лишь только не перепутать местами источник и целевую базу.

    Например, на восстановленной базе переименовать табличку, pg_dump -t имя_таблички, импортировать в боевую базу
    Или взять pg_dump -s -t проблемная табличка, \copy в локальный файл данных, \copy из файла в пустую временную табличку
    А имея под рукой рядом оригинальную и восстановленную табличку уже править данные в ней
    Ответ написан
    Комментировать
  • Что лучше использовать для нахождения количества активных соединений с базой?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Без разницы. У них один и тот же источник данных. Можно и напрямую pg_stat_get_db_numbackends(oid) вызвать.

    В production для мониторинга обычно используется pg_stat_activity чтобы сразу забрать группировку по статусам backend'ов, длительность активных транзакций. Ну и скорее всего только client backend будут интересны на этом графике (ну возможно ещё с parallel worker'ами). Для процессов autovacuum удобнее отдельный график иметь.
    Ответ написан
    Комментировать
  • Как отловить плавающий по времени запрос?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    После, с параметрами которые отрабатывали 3-6 секунд, запрос выполняется с нормальной скоростью в ms

    Симптоматика медленного чтения с дисков.
    Поставьте pg_stat_statements, включите track_io_timing и посмотрите в blk_read_time, blk_write_time этого запроса относительно числа вызовов и общего времени их выполнения.

    PS: обратите внимание, что для СУБД критична латентность дисковой системы. Есть графики латентности io на чтение и запись?
    Ответ написан
  • Как происходит разрешение коллизий в хэшах PostgreSQL?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    При записи данных tuple id просто сохраняются как есть в индексе. Неважно, это другая версия строки или неудачно попали на коллизию хеш-функции с другими данными
    При чтении hash индекс сообщает executor'у, что возвращаемые tuple id необходимо перепроверить по реальным данным (проставляет xs_recheck для indexscan либо выбирается bitmap scan с recheck condition) - механизм lossy поиска.
    Ответ написан
    Комментировать
  • На сколько быстро происходит пересчет hash индекса?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    hash индекс строится в один поток, для них многопоточный create index не делали. Потому загрузка 100% одного ядра - ситуация нормальная.
    Нет, create index не зависает.
    Если у вас селективность поля хреновая - то hash индекс будет строиться медленно, т.к. много строк попадает в одно и то же значение хеширования. Не помню точно, как именно хранится список TID при коллизиях хеш-функции, но точно работает хреново при большом числе дублей значений.

    Если версия postgresql достаточно свежая - то смотрите pg_stat_progress_create_index системное представление. Там будут некоторый progress reporting.
    Ответ написан
    4 комментария
  • Как корректно запустить базу postgresql после полного удаления каталога wal?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Корректно - абсолютно никак. WAL критичная часть базы.

    Некорректно, без всяких гарантий, но на clean shutdown базе можно надеяться без потери данных - pg_resetwal. Перед использованием сделайте бекап всего PGDATA ( /var/lib/postgresql/10/ut/ в вашем случае судя по пути до pg_wal). После старта базы - pg_dumpall и initdb всего кластера заново, как прямым текстом указано в документации к pg_resetwal.

    как нужно было сделать по уму если валы от слота не удаляются при удалении слота.

    Дождаться или сделать руками чекпойнт.
    Ответ написан
    Комментировать
  • Как правильно составить запрос в базу?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    В принципе не надо так делать фильтр по месяцу через date_trunc.
    Напишите обычный
    and date >= '2021-04-01' and date < '2021-05-01'
    Индекс по btree( user_id, date ) вам наверняка ещё не раз пригодится. А вот городить отдельный btree(user_id, date_trunc('month', date)) под конкретный запрос - зачем, если можно сразу нормально написать сам запрос?

    Если лениво считать в коде первый день следующего месяца - попросите это сделать саму базу date '2021-04-01' + interval '1 month'
    Ответ написан
    Комментировать
  • Как восстановить базу POSTRGESQL в данном случае?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Забыть.
    В pg_dump нет информации о физическом расположении данных. В WAL нет информации о логическом расположении данных - даже на wal_level=logical потребуется обращение к системным каталогам. В WAL грубо говоря записано "записать такие байты по такому смещению в файл"
    Ответ написан
    1 комментарий
  • Почему Barman не находит pg_receivexlog?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    https://www.pgbarman.org/barman-2-3-released/
    5 September 2017: 2ndQuadrant is proud to announce the release of Barman version 2.3, a Backup and Recovery Manager for PostgreSQL.

    This minor release introduces support for PostgreSQL 10.
    Ответ написан
  • Как вернуть строки, полученные из SELECT в процедуре?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Может, вы всё-таки будете читать документацию к postgresql, а не к mssql? Или тогда уж оставайтесь с mssql.

    https://www.postgresql.org/docs/current/xproc.html
    A procedure is a database object similar to a function. The difference is that a procedure does not return a value, so there is no return type declaration.


    Если вам не нужен transaction control изнутри процедуры - то вам вообще не нужны процедуры, а нужны обычные функции.
    Ответ написан
    4 комментария
  • Почему не работает ограничение?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Написали, что last_name должно начинаться со строки [А-я] - так и проверяется.
    melkij=> select '[A]ds' like '[A]%';
    ?column?
    ----------
    t
    (1 строка)


    Куда вам query rewrite system, если вы регулярки от like не отличаете?
    Зачем not valid лучше даже не буду спрашивать.
    Ответ написан
    4 комментария
  • Почему не создается правило с IF?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Почему вы решили, что такой синтаксис существует?
    Почему вы решили, что вам нужны rule?

    Вам нужен check constraint.
    Для локализованного сообщения пользователю - проверка на backend'е вашего приложения. Ну или, если оочень хочется, запретить прямые изменения таблиц и общаться с пользователем базы только через хранимки.
    Ответ написан
  • Какой индекс сделать на запрос с offsetОМ в Postgres?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Не делать большие offset.

    Если очень уж хочется, а профиль нагрузки и запросы позволяют - то увести в index-only scan получение уникального идентификатора строк с последующей вычиткой остальных полей.
    Например, https://pgday.ru/ru/2017/papers/232 с 14 слайда
    Ответ написан
    Комментировать
  • Checkpoints are occurring too frequently?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Предупреждение выводит настройка checkpoint_warning. Говорит о том, что вы создаёте так много wal, что срабатывают чекпойнты чаще величины этого варнинга. Это именно совет базы посмотреть внимательнее на конфигурацию и workload.

    Выяснить, чем именно вы генерируете wal и, возможно, переосмыслить этот процесс. Смотрите, что у вас обычно работает в то время, когда срабатывают эти предупреждения. Какие-то массовые импорты данных, ещё что, пишущее много данных.
    Возможно, вам нужно увеличить свой max_wal_size ещё дальше. Но учитывайте, что чем больше wal между чекпойнтами - тем дольше будет стартовать база после аварийного выключения, т.к. должна накатить все wal от последнего чекпойнта.
    Это tradeoff между временем старта база при аварии и количеством IO при нормальной работе. Чекпойнт - это довольно много IO.

    PS: спросите у базы "show max_wal_size;" точно ли настройка применена.
    Ответ написан
    3 комментария
  • Сколько записей загружает View?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Выполните explain и узнаете. Будет видно и как глубоко ушли условия, и замену left join на inner join, и, вероятно, обратный порядок объединения таблиц.
    view для планировщика прозрачен и планируется заново всё дерево запроса.
    Ответ написан
    Комментировать
  • Чем автоматизировать бэкап 1000 БД на нескольких серверах?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    и инкрементный каждый час.

    Такого нет.

    Полновесный PitR (возможно с diff копиями для ускорения recovery, но только если уверены в этом стороннем механизме - нативно postgresql не поддерживает такую операцию) - снимается целиком с кластера, со всеми базами сразу. Соответственно пересматривайте требование к "На каждую БД нужен отдельный, независимый бэкап".

    Под требование "На каждую БД нужен отдельный, независимый бэкап" - только pg_dump, что, соответственно, даст возможность восстанавливаться только на эту самую точку времени старта транзакции дампа.
    Ответ написан
    Комментировать
  • Как задать в какой БД создать таблицу?

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

    \connect dbname
    если файл проходит через psql.
    Ответ написан
    1 комментарий
  • PostgreSQL: вставка нескольких (миллионов) строк, как увидеть все строки которые нарушают constrants?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Добавить в insert ... select проверку данных самостоятельно.
    where exists(select from t_dict where t_dict.id = t_source.ref)

    Затем взять, соответственно, not exists список и пойти с этим списком пинать "хде данные"

    Проигнорировать ошибку хотя бы одной строки будет дико дорого по ресурсам.
    Ответ написан
  • Как оптимизировать запрос на создание материализованных представлений?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Выставить max_parallel_workers_per_gather в 0.
    Тем самым запретить параллельное выполнение запросов, т.к. ошибка именно из недр dynamic shared memory инфраструктуры параллельного выполнения запросов.
    Ответ написан
    Комментировать
  • Как сохранить эмоджи?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    melkij=> select jsonb '"\ud83d\ude00"';
     jsonb 
    -------
     ""
    (1 строка)
    
    melkij=> select json_build_object('emoji','');
     json_build_object 
    -------------------
     {"emoji" : ""}

    никаких проблем. Проверьте что именно вы отправляете. Может быть база права и ваш escape sequence is invalid?
    Ответ написан
    1 комментарий