• Можно ли создать пользователя во время миграции?

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

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

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    Я выполняю 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
    PostgreSQL DBA
    Будут ли работать на такой достаточно старой материнской плате 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
    PostgreSQL DBA
    А как между собой связаны postgres, пароль пользователя unix и способ авторизации ssh? Да никак.

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    maintainer here.

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

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

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

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

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    А вы как думаете?

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

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

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

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

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

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

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

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    Никак.

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

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    Не имеет отношения к postgresql. Чисто bash

    DB_NAME = foo - это команда
    DB_NAME=foo - это переменная
    Ответ написан
    Комментировать
  • Как решить проблему PDOStatement::execute(): SQLSTATE[HY093]?

    Melkij
    @Melkij
    PostgreSQL DBA
    Если внимательно посмотреть на то что действительно написано, то это будет
    $products_data = [];
    if ($query) {
        $sql = "SELECT * FROM `products`";
        $products_data = $db->query($sql)->fetchAll(\PDO::FETCH_ASSOC);
    }


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

    Потому что where строковой_литерал это или заведомо невыполнимый запрос, 0 строк (если строковой литерал пустая строка) или истина для всех строк таблицы. Почему это строковой литерал? Ну, потому что таков синтаксис SQL, строка в одинарных кавычках - литерал.

    А вот что вы подразумевали дальше, мне догадаться сложнее. Если в $query записано то что в вопросе, то что тогда такое должно быть :product_Id1?
    Ответ написан
  • Как усановить php-curl?

    Melkij
    @Melkij
    PostgreSQL DBA
    Don't ask for end-of-life PHP versions or Ubuntu release, they won't be provided.

    собственно
    18.04 EOL уже с год как
    Ответ написан
    Комментировать
  • Как установить plrust под windows для создания функций в pgAdmin?

    Melkij
    @Melkij
    PostgreSQL DBA
    Ни документация ни гитхаб не упоминает поддержку экзотических платформ вроде windows. Только обычный linux.

    Попробуйте творчески адаптировать процедуру установки plrust из исходников под вашу платформу (возможно что не получится). Ну или просто поставить обычный linux, например в виртуалке.
    Ответ написан
    Комментировать
  • Как распарсить вывод ifconfig/ip, чтобы показывало имя интерфейса, отвечающее за беспроводную сеть?

    Melkij
    @Melkij
    PostgreSQL DBA
    Это должны быть те /sys/class/net/*, у которых существует /sys/class/net/$iface/wireless
    Ответ написан
    Комментировать