• Не могу выполнить запрос к БД используя PDO. В чём проблема?

    Melkij
    @Melkij
    PostgreSQL DBA
    Как должно быть видно по тексту ошибки, ругается не PHP, а совсем даже СУБД.

    TLDR: структура запроса (например, сортировка) через prepared statements изменяться не может. Только константы в запросе.
    Ответ написан
    Комментировать
  • Как освободить пространство с LVM?

    Melkij
    @Melkij
    PostgreSQL DBA
    Если есть под рукой пустой накопитель от 82гб:
    - подключить доп диск
    - pvcreate на него на всю ёмкость
    - vgextend
    - pvmove старый_диск новый_диск
    - vgreduce
    - pvremove
    - переделываете партиции на nvme как нравится
    - повторить заново с pvcreate только теперь pvmove с временного диска обратно на nvme

    Если на время перенести некуда - то pvresize + уменьшить размер раздела, потом создать новый раздел на освободившемся месте.

    PS: доктор, я в каждой команде написал pg вместо vg, это ещё лечится?
    Ответ написан
    Комментировать
  • Как изменить формат вывода timestamp with time zone в postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    При отсутствии явных функций форматирования даты в запросе стиль вывода timestamp задаётся настройкой datestyle. Это на выбор несколько предустановленных форматов. Для таймзоны форматирование вида здесь. Стиль USE_XSD_DATES используется в xml и json, но через datestyle его использовать невозможно, а потому минутная часть в выводе будет присутствовать только отличная от нуля.

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

    Melkij
    @Melkij
    PostgreSQL DBA
    Это-то динамическая? Хотите посмотреть на динамические цены - посмотрите на ценообразование некоторых авиакопаний, где цена на один и тот же рейс может ощутимо прыгать несколько раз в течении одного часа.

    Не, это вполне статичные цены у вас. А если вам дают формат "отель, категория номера, дата, цена" без дальнейшего деления - то и вовсе простой случай. Вот прямо так и импортируете в табличку id отеля, категория номера, дата, цена. Первые три поля - композитный первичный ключ.
    Запрос стоимости на отрезок времени:
    select hotel_id, category, sum(price) as total_price from hotel_prices where date between ? and ? and not on_stop_sale group by 1,2 having count(*) = количество_дней_в_диапазоне order by total_price

    (having нужен чтобы отсеять категории номеров, недоступные для продажи на весь диапазон дат)

    Ну пяток-десяток категорий номеров, немного лести про сотню отелей, на год вперёд... Вот только попробуйте заикнуться что эта кроха вырастет ну на тааак много строк что будет невероятно медленно работать.
    Ответ написан
    Комментировать
  • Есть ли какие-либо практические различия в PostgreSQL между доступом к jsonb через -> и []?

    Melkij
    @Melkij
    PostgreSQL DBA
    Начну с конца - для индексов это критично разные вещи. Планировщик даже пытаться анализировать не станет, эквивалентные это условия или нет. Если у вас есть индекс по my_column -> 'a', а в запросе вы написали "my_column"['b'] - то этот индекс использоваться не будет.

    Касательно самих двух операторов:
    -> ровесник jsonb как такового
    jsonb[element] - jsonb subscripting на языке документации - штука недавняя, лишь только прошлогодняя из pg14. Пока что нужно иметь в виду если вам может потребоваться более старая версия базы.
    По поведению отличий вроде не должно быть никаких. Оба варианта возвращают jsonb, поэтому IRL куда чаще используется ->> возвращающий текст.
    На уровне реализации оба приходят к одному и тому же getKeyJsonValueFromContainer. Вы скорее упрётесь в производительность разбора формата самого jsonb, чем заметите какую-то разницу в производительности родного оператора от type subscripting.
    Ответ написан
    Комментировать
  • Какие требования к физической репликации Postgresql 11?

    Melkij
    @Melkij
    PostgreSQL DBA
    major версия обязана совпадать, обязаны совпадать ряд флагов компиляции и некоторые настройки.

    с centos 7 на убунту 20.04 реплицировать можно, но вы гарантированно попадаете на изменение правил сортировки строк в libc: https://wiki.postgresql.org/wiki/Locale_data_changes
    Для переезда на другую ОС годится (подняли реплику, в нужный момент переключили на неё мастер и реиндексировали пострадавшие индексы), для долговременной работы уже не очень вариант.
    Ответ написан
    2 комментария
  • Роутер или коммутатор?

    Melkij
    @Melkij
    PostgreSQL DBA
    Можно если ставить коммутатор умеющий VLAN. VLAN'ами разделяете порты так чтобы кабель провайдера был в одном сегменте с микротиком и только с ним, регистратор куда ему там надо (я хз должен ли у вас он быть в локальной сети дома, в сети провайдера или в свой отдельной только для него), микротик соответственно настраиваете маршрутизировать трафик между этими vlan'ами.
    Ответ написан
    Комментировать
  • Как сделать единую реплику базы данных Postresql из трех разных мастер серверов?

    Melkij
    @Melkij
    PostgreSQL DBA
    • 3 независимых экземпляра postgresql на разных портах через потоковую репликацию. Просто, стабильно, надёжно
    • какая-то из форм логических репликаций. Приключения по сопровождению за свой счёт. Начать с pub/sub как штатный механизм
    Ответ написан
    Комментировать
  • Как проверить обьект jsonb на ilike со строкой в Postgres?

    Melkij
    @Melkij
    PostgreSQL DBA
    exists(select from jsonb_array_elements_text(col->'elements') as el where 'first-element' ilike concat('%', el, '%'))

    если я верно понял ваше описание
    Ответ написан
    Комментировать
  • Как безопасно заменить умерший винт в зеркале raid?

    Melkij
    @Melkij
    PostgreSQL DBA
    Сначала выяснить, что это за комп, какой рейд и как именно собран, какой именно из дисков отказал. Затем имея эти данные предметно выяснить как именно на этом контроллере/fakeraid/softraid восстанавливать избыточность после потери диска и на что стоит обратить внимание по пути.
    Ответ написан
    5 комментариев
  • Как построить локальную сеть?

    Melkij
    @Melkij
    PostgreSQL DBA
    Для ethernet сети из только двух хостов вообще ничего не нужно кроме собственно самих двух хостов и кабеля.
    Ответ написан
    Комментировать
  • Почему в ubuntu ошибки Unable to fetch some archives при установке пакетов?

    Melkij
    @Melkij
    PostgreSQL DBA
    impish aka Ubuntu 21.10 уже EOL и удалена из репозиториев.
    Regular releases are supported for 9 months.

    Как и задумано.

    Вероятно, вы хотели использовать LTS релиз.
    Ответ написан
    Комментировать
  • Как поменять тип данных в столбце postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    alter table tablename alter columnname type varchar;
    Ответ написан
    Комментировать
  • Необходим ли индекс для boolean, и если да, то какой?

    Melkij
    @Melkij
    PostgreSQL DBA
    Индексы по bool полям в принципе бесполезны. Любые. У вас в таком индексе всего 3 значения как максимум.
    Распределены равномерно? Ну и смысл по индексу вычитывать треть таблицы? seqscan быстрее будет.
    Распределены неравномерно и вам нужны те редкие значения, отличающиеся от большинства? Сделайте более подходящий под условия запроса частичный индекс с предикатом where column_name = true (или false или is null, смотря где меньше значений)
    Ответ написан
    Комментировать
  • Как функция index scan в postgresql понимает тип индекса?

    Melkij
    @Melkij
    PostgreSQL DBA
    Весь раздел https://www.postgresql.org/docs/current/internals.html
    за исключением разве что System Catalogs

    Узел Index Scan в плане запроса - это далеко не одна функция, а целый отдельный src/backend/executor/nodeIndexscan.c
    Ну и кучка поддерживающих конструкций, чтобы от этого был толк. Большая кучка конструкций. Очень.

    Как функция index scan в postgresql понимает тип индекса?

    А ему и не надо.
    Если планировщик выбрал index scan - значит этот index access method предоставляет совместимый интерфейс. Далее index scan согласно контракту index access method дёргает методы этого конкретного AM, и уже сам AM решает, где у него что лежит и как доставать требуемые TID по заданным условиям.

    и как именно Postgre понимает, какую функцию следует применять

    postgresql или postgres. Базы postgre не существует.
    А муками выбора о плане запроса страдает планировщик, работающий перед executor'ом. И там настоящая чёрная магия (и костыли)
    Ответ написан
    Комментировать
  • Как решить ошибку "must be superuser or replication role to start walsender"?

    Melkij
    @Melkij
    PostgreSQL DBA
    Добавьте в log_line_prefix как минимум %h, затем ищите на том хосте, кто может пытаться запустить walsender. Это может быть как физическая, так и встроенная логическая репликация.
    %u в log_line_prefix покажет каким логином этот процесс авторизовался, может навести на какие-то мысли о том что именно искать.
    Ответ написан
    1 комментарий
  • Стоит ли добавлять гарантийное обслуживание в договор (IT компании)?

    Melkij
    @Melkij
    PostgreSQL DBA
    Договор - это, сюрприз, то о чём вы договорились.

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

    Melkij
    @Melkij
    PostgreSQL DBA
    https://wiki.nftables.org/wiki-nftables/index.php/...
    https://openwrt.org/docs/guide-user/firewall/misc/...

    tldr:
    openwrt для firewall пока что использует старый добрый iptables. Он управляет только L3 уровнем.
    Для фильтрации на уровне коммутации L2 нужен более общий nftables, либо старый ebtables.

    PS: включение фильтрации уровня коммутации пакетов скорей всего отключит кучу оптимизаций и существенно увеличит загрузку CPU.
    Ответ написан
    Комментировать
  • Можно ли обновлять композитные типы в Postgres?

    Melkij
    @Melkij
    PostgreSQL DBA
    Эти две команды именно про enum:
    ALTER TYPE name ADD VALUE [ IF NOT EXISTS ] new_enum_value [ { BEFORE | AFTER } neighbor_enum_value ]
    ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value

    Вот удаления значения из enum нет.

    Команды ADD/DROP/ALTER/RENAME ATTRIBUTE там же - это как раз про композитные типы. Уже используемые менять можно.
    Ответ написан
    Комментировать