• Что не так в 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
    Ответ написан
    Комментировать
  • Есть ли разница в дисках для NAS?

    Melkij
    @Melkij
    PostgreSQL DBA
    HDD - это расходники. Нет смысла обсуждать "меньше" или "больше" проживут. Сдохнут гарантированно. Если повезёт, то ещё в гарантийный период - бесплатно поменяете.

    Для SOHO разница между линейками по большей части неважна. Вот что стоит уточнить - SMR или CMR диск и готовы ли с этим мириться. Достаточную ли вам предлагают скидку за террабайт, чтобы вляпываться в SMR. В одной и той же линейке дисков могут быть одновременно и SMR и CMR диски, уточнять нужно модели.
    Далее, скорость вращения диска. 7200 чуть быстрее, 5400 медленнее но их попроще охлаждать в среднем. Различие скорости для личной медиатеки скорей всего неважно, но на достаточно хорошем интернет-канале торренты могут заметно озадачить массив количеством IO.

    Зеркало будет надежно или лучше пожертвовать местом и сделать raid5 или 6?

    Звучит как полное непонимание вопроса. Каким местом жертвовать, если именно зеркало даст меньше всего форматируемую ёмкость массивов? Местом придётся жертвовать, если делать как раз зеркало.
    На примере шести 10ТБ дисков для удобства счёта, из 60ТБ RAW ёмкость массива:

    raid0 или JBOD - дадут вам все 60ТБ, выпадение любого диска фатально.
    raid1 - зеркало - даст вам как максимум 3 массива по 10ТБ, до 30ТБ форматируемой ёмкости. В каждом массиве соответственно можно потерять по соседнему диску. То есть хранилка выпадение одного любого диска переживёт, выпадение второго диска - смотря какому из дисков не повезёт. Можно потерять один из массивов полностью. (raid1 на всех 6 дисках вряд ли входит в вопрос, 10ТБ итоговой ёмкости, но чтобы их потерять из-за отказа диска нужно чтобы отказали все 6 дисков)
    raid5 - даст вам 50ТБ форматируемой ёмкости. Переживёт выпадение одного любого диска, выпадение второго диска - фатально для всего массива.
    raid6 - ближайший родственник raid5 - даст вам 40ТБ ёмкости. Но зато гарантированно переживёт выпадение любых двух дисков. Только отказ третьего будет фатален для массива.
    raid10 - даст вам 30ТБ ёмкости как raid1, гарантированно выдержит выпадение одного диска, в идеале может работать на только половине дисков массива но критично зависит от структуры raid10, какие именно номера дисков могут быть потеряны без краха всего массива. Отказ второго диска может оказаться фатален. Используется не когда нужна ёмкость или возможность пережить несколько выпавших дисков, а когда нужна производительность, особенно на запись. То есть вряд ли ваш случай.

    Что ещё надо упомянуть - вот диск из массива умер, сколько времени вам нужно это заметить, купить новый на замену, заменить? Плюс на таких объёмах займёт ещё сутки-двое-трое на восстановление массива. Вот тут причина, почему существует RAID6, хотя он по ёмкости хуже RAID5 и не лучше по производительности - пока у вас массив деградировал до 5/6 дисков, он переживёт выпадение ещё одного из дисков пока вы ставите замену и массив восстанавливается.
    Ответ написан
    Комментировать
  • Почему большой iowait в cloud vm c postgres?

    Melkij
    @Melkij
    PostgreSQL DBA
    У яндекса весьма медлительные сетевые диски, совершенно верно. Именно по latency, что куда более критично для СУБД чем обещанная полоса пропускания или IOPS (которые у большинства хранилок предполагают совершенно абсурдную для СУБД глубину очереди команд).
    Ответ написан
    2 комментария
  • Нужно ли стремиться обнулять переменные и по возможности не создавать их копий в проектах php?

    Melkij
    @Melkij
    PostgreSQL DBA
    Ведь когда мы создаем переменную, то в нее копируется значение другой переменной и мы работаем с копией

    Неа. См. zval

    Начав работать с языком Go начал придавать значение экономии памяти - не создавать лишних переменных.

    Разве компилятор go недостаточно умён для элементарных оптимизаций кода?
    Вы проверяли байткод, ваша оптимизация действительно имеет место или это самообман?
    Ответ написан
    5 комментариев
  • Какой кабель DP - DVI нужен для 120/144Гц?

    Melkij
    @Melkij
    PostgreSQL DBA
    Since DisplayPort dual-mode operates by using the pins of the DisplayPort connector to send DVI/HDMI signals, the 20-pin DisplayPort connector can only produce a single-link DVI signal (which uses 19 pins). A dual-link DVI signal uses 25 pins, and is therefore impossible to transmit natively from a DisplayPort connector through a passive adapter. Dual-link DVI signals can only be produced by converting from native DisplayPort output signals with an active conversion device.

    https://en.wikipedia.org/wiki/DisplayPort

    О, мне гугл дал ссылочку именно про ваш монитор: https://forums.tomshardware.com/threads/how-to-con...
    В общем, или жить дальше на 60гц или дорогой активный преобразователь сигнала или замена монитора
    Ответ написан
  • Кластер postgres не инициализирует настройки?

    Melkij
    @Melkij
    PostgreSQL DBA
    Some of the PostgreSQL parameters must hold the same values on the primary and the replicas. For those, values set either in the local patroni configuration files or via the environment variables take no effect. To alter or set their values one must change the shared configuration in the DCS. Below is the actual list of such parameters together with the default values:
    max_connections: 100
    max_locks_per_transaction: 64
    max_worker_processes: 8
    max_prepared_transactions: 0
    wal_level: hot_standby
    track_commit_timestamp: off

    https://patroni.readthedocs.io/en/latest/patroni_c...
    всё выглядит штатно, как задумано разработчиками patroni
    Ответ написан
    3 комментария
  • Как забрать с раздела 500ГБ и передать их другому разделу?

    Melkij
    @Melkij
    PostgreSQL DBA
    resize2fs /dev/centos/home с указанием размера файловой системы с каким-то запасом, до 400ГБ например обрезать. Критично следующим шагом не обрезать часть файловой системы.
    lvresize /dev/centos/home до желаемого размера
    lvresize /dev/centos/root до желаемого размера
    resize2fs /dev/centos/home
    resize2fs /dev/centos/root
    Ответ написан
    4 комментария
  • Почему не удалось перенести базу zabbix?

    Melkij
    @Melkij
    PostgreSQL DBA
    1. запустили намеренно pg_dump с отказом -O - то есть --no-owner
    2. развернули дамп от супера
    3. все объекты теперь ожидаемо принадлежат суперу, owner'а же не переносили
    4. удивляемся, что постороннему пользователю нет прав чтения

    Что же тут могло пойти не так?

    Самое простое для баз с одним пользователем - импортируйте дамп базы от имени этого самого пользователя. Если в базе есть какие-то extension - то сперва их создать от суперпользователя.
    Ответ написан
    3 комментария
  • Как pgbouncer обрабатывает idle сесии?

    Melkij
    @Melkij
    PostgreSQL DBA
    Зависит от pool_mode.

    В режиме session баунсер прозрачен для приложения: не налагает каких-то явных ограничений на использование, но один клиент к баунсеру = один коннект к базе. Соединение с базой сможет быть передано другому клиенту только после того как предыдущий клиент отключится. Поэтому этот режим используется очень редко.

    В режиме transaction пула коннект к базе выдаётся клиенту только на время транзакции. Самый распространённый режим работы, любим именно за то, что сколько бы тысяч коннектов не открыло приложение к баунсеру, на базе открыто небольшое число действительно потребовавшихся соединений.
    Но этот режим пула налагает ограничения на работу приложения. Вы не сможете нормально использовать ничего, что меняет состояние коннекта, потому что следующий ваш запрос с высокой вероятностью попадёт в другой коннект. То есть курсоры, временные таблицы, set (кроме set local), prepared statements (где parse, bind и execute могут разойтись по 3 разным коннектам)

    С prepared statements в transaction pool mode с недавних пор может помочь настройка max_prepared_statements, но только если prepare и deallocate выполняются именно командами протокола, но не SQL запросами. Тут многие широкоиспользуемые библиотеки оказались в пролёте.
    Ответ написан
    1 комментарий
  • Можно ли всем строковым полям задавать тип TEXT и повлияет ли это сильно на производительность?

    Melkij
    @Melkij
    PostgreSQL DBA
    text и varchar - это одно и то же на уровне реализации postgresql.

    varchar с каким-то разумным ограничением (не бессмысленный взятый с потолка 255 везде, а разумный для этого конкретного поля) тем не менее смысл имеет: куда проще найти ошибку в месте записи данных, чем потом искать, откуда в поле обычно содержащем до 30 символов взялось 10 мегабайт текста (история из практики, да)

    Про char ограничусь цитатой письма Tom Lane
    Type character(N) is a hangover from the days of punched cards. Don't use it.

    Просто забудьте про такой тип данных. Он не только бесполезен, но и вреден.
    Ответ написан
    5 комментариев