Задать вопрос
  • Как определить причины низкой производительности postgres?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Вы смотрите на совершенно бесполезный график. Смотрите на полезные.

    Если у вас табличка с 10 индексами и к ней select * from foo where id = ? - то это минимум 11 AccessShareLock. Совершенно логично, что чем больше параллельно нагрузки - тем больше вы увидите AccessShareLock. И дальше куда с этим? Вот и получается совершенно бесполезный график. А задирание max_connections сделает только хуже.

    Посмотрите график CPU, есть ли в принципе CPU свободный (помним что у вас наверняка есть HT, значит 100% утилизации недостижимы, реальный потолок окажется где-то в районе 70-90%)
    Посмотрите графики латентности IO. Если проседает латентность чтения или записи под нагрузкой - то это будет причина замедления. СУБД очень чувствительны к латентности.
    Дальше графики pg_stat_activity с разбивкой по state. Если растут idle in transaction - проверять как дела на приложении, а так же сеть.
    Конечно, графики по pg_stat_statements. top5 запросов по времени выполнения, для начала.
    И проверить наличие корреляции с графиком длительности самой старой транзакции.
    Ответ написан
    4 комментария
  • Отличие md5 от scram-sha-256 в pg_hba.conf postgresql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Аутентификация через метод md5 выполнит парольную проверку как для пароля сохранённого с password_encryption = md5 (ныне уже deprecated, но встречается в большинстве баз, созданных не недавно), так и пароли сохранённые в scram-sha-256. Реализацию pg_hba md5 специально расширили при появлении scram-sha-256 таким образом, для облегчения миграции.

    Указание scram-sha-256 в pg_hba будет требовать именно пароль согласно scram-sha-256 и не будет принимать пароли старых учётных записей, созданных с md5 encryption.

    Вполне вероятно, что у вашей базы password_encryption сконфигурирован в scram-sha-256, все пользователи кто имеет пароли, так же в scram-sha-256 и нужды в md5 аутентификации в pg_hba нет.
    Ответ написан
    Комментировать
  • Как работают явные блокировки в PostgreSQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Блокировки строк и блокировки таблиц (и прочих объектов) - два разных механизма. (а serializable изоляция и вовсе частично третий)

    Блокировки строк отмечают информацию о себе специальными флагами в заголовке самой заблокированной строки. Запросы, которым нужна блокировка строки сначала проверяют, не отмечена ли эта строка блокировкой, затем проверяют что сейчас с той транзакцией, идентификатор transaction ID которой указан в информации о блокировке. Если транзакция ещё в работе - то начинаем ждать её завершение (или пропускаем строку для skip locked или кидает ошибку если nowait)
    Блокировки строк, будь то select for share/for update или пишущие запросы, всегда работают с самой актуальной версией строки.

    В то же самое время, любой запрос, трогающий таблицу (даже select) берёт блокировку на эту таблицу соответствующего своим потребностям уровня. Пока не возьмёт блокировку на таблицу - вообще не начнёт выполняться. Информация об этих блокировках размещается в сегменте shared memory памяти, потому доступны всем процессам базы. Если другие бекенды не держат блокировку таблицы конфликтующую с желаемым нашей транзакцией (или ещё только ждут блокировку более высокого уровня), то запрос блокировки удовлетворяется и работа продолжается.
    Ответ написан
    Комментировать
  • Почему с фильтром PostgreSQL выдаёт больше записей?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Смотрите свои данные. Совершенно логично, что если у вас есть клиент №5 с такими данными:
    insert into appointments (customer_id, in_trash, status, filial_id, invoice_id, time_start) values 
    (5, false, 4, 1, null, '2023-12-23'),
    (5, false, 4, 1, 123, '2024-01-13')

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

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    должно быть
    postgres=# create database mydb;


    нет такого сокращение у парсера как create db, но, что важнее, SQL запрос должен завершаться символом ;

    Приглашение командной строки потому и меняется с postgres=# на postgres-# как индикатор того, что psql ожидает дальнейший ввод многострочного SQL, пока не встретится ;
    Метакоманды psql, в то же время, действительно продолжают обрабатываться во время многострочного ввода.
    Ответ написан
    Комментировать
  • Можно ли создать пользователя во время миграции?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Можно, это даже транзакционная команда. Разумеется, до окончания транзакции авторизоваться с именем этого пользователя не получится.

    PS: больше одного супера - большой вопрос к организации работы базы
    Ответ написан
    Комментировать
  • CREATE USER не учитывает регистр?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    https://www.postgresql.org/docs/current/sql-syntax...
    соответствовать синтаксису идентификаторов.
    Ответ написан
    Комментировать
  • Как выбрать записи из таблицы с макимальным значением за каждый день в PostgreSQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    select distinct on (created_at::date) created_at, value from tablename order by created_at::date, value desc;
    Ответ написан
    Комментировать
  • Почему real может хранить числа от 1E-37 до 1E+37, но выводимое значение не больше 9 цифр?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    См. IEEE 754 потому что это именно он. И на всё наблюдаемое "странное" поведение типов с плавающей запятой ответ един - потому что IEEE 754.
    Ответ написан
    Комментировать
  • Почему postgresql выбирает неоптимальный план выполнения для простого JOIN?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Я выполняю 2 одинаковых запроса

    "WHERE friends_info.user_id = 1" vs "WHERE friends_info.friend_id= 1"

    о да, одинаковые, да как бы не так. Полностью разные запросы, естественно, могут иметь различные оптимальные планы выполнения.

    Bitmap Index Scan on ix_friends_user_id (cost=0.00..61.56 rows=5465 width=0) (actual time=0.742..0.743 rows=88 loops=1)

    Суть ошибки выбора плана. Какое распределение данных в таблице? Каков размер самой таблицы? Вероятно несколько пользователей занимают значительную часть таблицы и это сбивает оценку селективности.
    Простое чуть приподнять SET STATISTICS по полю, собрать новый analyze и посмотреть на оценку числа строк.

    PS: индекс ix_friends_user_id должен быть удалён как бесполезный при наличии friends_info_user_id_friend_id_key
    Ответ написан
    3 комментария
  • Подойдет ли мне PCI-E адаптер для NVME?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Будут ли работать на такой достаточно старой материнской плате NVME диски, подключенные через адаптер PCI-E?

    Да. Ограничение только что не сможет быть загрузочным диском. Когда nvme только появлялись, даже в штатном комплекте имели адаптер на PCI-E слот с отдельными пометками, мол, в зависимости от материнки устройство может не работать как загрузочное устройство. Под данные работает, лишь бы ОС знала что такое NVME, а материнке уже без разницы.
    (собственно даже я сейчас набираю это сообщение с несильно более новой материнки чем ваша, Z77 чипсет, имея nvme в адаптере)

    Рассматриваю покупку PCI-E x16 платы на 4 NVME диска, но вот в отзывах на эту плату пишут такое:

    Такие адаптеры полагаются и соответственно требуют использования технологии под названием PCI-E Bifurcation. Ваша материнка наверняка слишком старая для этого. Соответственно, материнка считает что в одном слоте PCI-E x16 может быть только одно устройство (потому что это шина точка-точка) и из 4 слотов под NVME диски работать будет только один.
    PCI-E Bifurcation позволяет сконфигурировать и объяснить материнке, что да, это слот х16, но будь добра считать его за х4+х4+х4+х4 разные слоты, соответственно на 4 устройства меньшей пропускной способности.
    Ответ написан
    1 комментарий
  • Как задать пароль пользователю postgres, если авторизация по ssh-ключу?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    А как между собой связаны postgres, пароль пользователя unix и способ авторизации ssh? Да никак.

    ssh аутентификация по ключу не исключает наличия пароля пользователя, sudo может быть настроен без пароля, авторизация postgresql может быть настроена без sudo раз вы как-то собрали и запустили СУБД без использования запароленного sudo этого пользователя.

    Проблема-то где?
    Ответ написан
  • Как pgcompacttable работает с HOT-updates?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    maintainer here.

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

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Буквально так и пишется дай messages для который нет вот таких
    select ... from messages where not exists (select from comments where comments.message_id = messages.id and comments.author_id = 100);
    Ответ написан
    Комментировать
  • Что не так в LIKE?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    tldr: WHERE a LIKE concat('%',$1,'%') либо конкатенировать к параметру на стороне приложения.

    '%$1%' - это строковой литерал, константа из 4 символов. Внутри литерала никто параметры искать и подставлять не будет. Поэтому в запросе не найдено ни одного места для параметров, а вы передаёте один параметр - что явная ошибка логики программы, об этом и выводится ошибка.
    Ответ написан
    1 комментарий
  • Как правильно принять файл с другого серверва отправленного через CURL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Для отправки файла Content-Type должен быть multipart/form-data с соответствующим стандарту оформлением. Но вы переопределяете Content-Type на кастомный и нарушаете стандарт запроса.
    Уберите свой CURLOPT_HTTPHEADER и получите файл в $_FILES как обычно.

    Либо отправляйте свой файл как-то иначе, не через curl_file_create. Договоритесь на отправителе и получателе использовать один и тот формат запроса.
    Ответ написан
    Комментировать
  • Как часто должен создаваться бэкап баз данных?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    А вы как думаете?

    Бекапы делаются так, насколько это необходимо. От "никогда" (действительно существуют базы, потеря которых неважна или данные могут быть восстановлены за удовлетворительное время из других источников) до "непрерывный PitR с синхронным подтверждением архивации WAL" (когда приложение получит ответ на запись транзакции данных только когда этот WAL окажется уже в бекапе)

    Может быть допустимо в случае чего потерять данные до двух месяцев, может быть вам критично потерять данные уже за час - это вопрос именно к потребностям и оценки рисков конкретного сервиса.

    Аналогично с вопросом "за какой срок хранить бекапы" - за тот, который нужен и согласны оплачивать (сотня террабайт под бекап как-то не очень бесплатные).
    Ответ написан
    Комментировать
  • В чем нарушение синтаксиса в данном запросе? Как его исправить?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    https://dev.mysql.com/doc/refman/8.4/en/with.html
    В mysql нет синтаксиса with ... insert ...
    insert ... select допустим в виде INSERT ... WITH ... SELECT ...

    мне понравилась идея делать обширные подзапросы отдельно

    Аккуратнее, оно к очень большим приключениям.
    Ответ написан
    Комментировать
  • Можно ли гарантировать надежность снапшота?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Когда появляются требования ко времени восстановления из бекапа - то почти наверняка уже доросли до полноценного PiTR и лучше рассматривать именно полновесный бекап postgresql, чем сооружать снэпшоты.
    Берёте pgbackrest, настраиваете архив WAL, желаемую периодичность снятия basebackup и сроки удержания. Ну либо barman или wal-g, тут по вкусу, смысл тот же.

    Получаете полностью корректный с точки зрения самой базы снэпшот (ака basebackup), а так же возможность восстановиться на произвольную точку времени, а не только на момент снятия слепка. Без штрафа производительности записи от снэпшота LVM, без CoW файловых систем.

    Реплика - не бекап, решают разные задачи. Реплика ответит на вопрос "как быстро мы можем восстановить базу при полном отказе основного сервера", но не ответит на вопрос "как быстро можем восстановить удалённую табличку". Если у вас важная база и всё ещё нет реплики - ну, это странно =)
    Ответ написан
    Комментировать
  • Как правильно организовать выборку зашифрованных данных PostgreSQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Никак.

    Ловите своих DBA, архитектора, безопасников, начальство и совместно вникаете, существует ли вообще вектор атаки, от которого вы так пытаетесь защититься.
    Один постоянный универсальный ключ шифрования зашитый в приложении и открыто передающийся по сети - это больше профанация чем безопасность. И хорошо ещё, если ключ не сохраняется в логах базы вовсе в открытом виде.

    Если начальство решает, что да, такое шифрование необходимо и от чего-то защищает - то это будет прямым ответом на задачу: поскольку необходимо шифрование parent_iin, то быстрый поиск по этому полю невозможен.

    Единственное возможное исключение: если ваша функция шифрования обязуется быть immutable в терминах postgresql, т.е. на один и тот же ключ и исходные данные генерировать всегда один и тот же бинарно идентичный результат. Тогда делаете индекс по parent_iin и ищете по условию where parent_iin = функция_шифрования(данные, ключ) то есть по зашифрованному представлению данных.
    Ответ написан
    Комментировать