• Как скопировать данные с одной таблицы в другую и обновить данные?

    Melkij
    @Melkij
    PostgreSQL DBA
    при наличии уникального ограничения по phone
    insert into desc (phone, name, nickname)
    select phone, name, nickname from src
    on conflict (phone) do update name = excluded.name
    Ответ написан
  • Почему не работает хранимая процедура?

    Melkij
    @Melkij
    PostgreSQL DBA
    но она ничего не возвращает (данные не показываются)

    давайте начнём с простого "а почему должно?". Где в мануале вы это вычитали? В том самом мануале, где написано, что процедуры в отличии от функций ничего не возвращают сами по себе и вовсе не имеют returning?

    Вам нужна функция, а не процедура.

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

    Melkij
    @Melkij
    PostgreSQL DBA
    Тот самый случай где как раз уместнее просто jsonb.
    Для каждой системы будут нужны свои данные, это всё равно у вас будет фабрика в коде для обработки и валидации требований конкретной системы. А поиск по этому json напротив является исключением, а не частой ситуацией.

    То есть payment_data: id, user_id, payment_system (enum), data jsonb
    В users default_payment FK на payment_data

    PS: по моему опыту, лучше сразу предположите что в будущем возможно деление платежа в настраиваемых пользователем пропорциях на несколько кошельков. С задачей такой встречался несколько раз, во всех случаях через несколько лет приходили к задаче "нужно дать возможность пользователю настроить выплаты на несколько кошельков".
    Ответ написан
    2 комментария
  • Почему возникает такая ошибка pg_restore: [archiver] unsupported version (1.14) in file header?

    Melkij
    @Melkij
    PostgreSQL DBA
    custom format version 1.14 - это поддержка table access method. Дамп был снят с использованием pg_dump по крайней мере от postgresql 12.
    pg_restore должен быть никак не ниже версии postgresql 12 для распаковки этого формата. С 99% вероятность сможет распаковать в базу более старой версии чем 12, но сам pg_restore обязан быть не ниже этой версии.

    Совместимость с будущими версиями формата, знаете ли, сложное дело без машины времени.
    Ответ написан
    Комментировать
  • Как восстановить RAID5 synology?

    Melkij
    @Melkij
    PostgreSQL DBA
    Развалился RAID 5, диск в первой корзине просто пропал скорее всего полностью вышел из строя. Шара была доступна частично, после перезагрузки доступ к файлам пропал.

    нехарактерное поведение для повреждения одного диска. Скорей всего один диск умер уже давно но остался незамеченным, сегодня вывалился ещё один.
    Характерное поведение raid5 при выпадении одного диска - стало медленнее работать, но все данные на месте без перерывов в работе.

    raid5 допускает выпадение максимум только одного диска массива. Отсутствуют два = массив потерян со всеми данными. Просто неоткуда читать в вашем случае треть данных.

    Если три диска массива ещё читаются, хоть и не собираются в массив, то закупить новые диски, на них клонировать то что читается, попробовать собрать вручную. https://habr.com/ru/articles/128429/
    Ответ написан
    Комментировать
  • Как импортировать данные из csv в Postgres?

    Melkij
    @Melkij
    PostgreSQL DBA
    create temp table import_data (...);
    copy import_data from '/path/to/file' (format csv, ...);
    insert into tablename (...) select .. from import_data where not exists (select from tablename where tablename.phone = import_data.phone) on conflict do nothing;
    Ответ написан
    Комментировать
  • Как сделать отказоустойчивый кластер nginx в разных ЦОД-ах?

    Melkij
    @Melkij
    PostgreSQL DBA
    Дёшево - это через DNS. В комплекте приключения, на которые вы в принципе не сможете повлиять - как надолго кэшируются ответы DNS даже в нарушении заданного TTL.

    Правильно - это BGP с анонсом своего IP. Вопрос очень далеко не SOHO сегмента.

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

    Melkij
    @Melkij
    PostgreSQL DBA
    Ни то ни другое.

    max_wal_size - пороговое значение, при срабатывании которого начинаем checkpoint. Ближайший родственник checkpoint_timeout, только checkpoint_timeout вызывает checkpoint по прошествии указанного времени с прошлого чекпойнта, а max_wal_size - после записи такого объёма WAL. Работают оба, чекпойнт начинается смотря что произойдёт раньше.
    Ответ написан
    7 комментариев
  • Golang PGX как добавлять значения в jsonb?

    Melkij
    @Melkij
    PostgreSQL DBA
    сильно сомневаюсь, что $2 и $3 тоже у вас корректно указаны с точки зрения библиотеки и их хоть кто-то будет искать внутри текстового литерала, так что так:
    UPDATE type
        SET characteristics = jsonb_insert(
            characteristics, array[$1], jsonb_build_object('type', $2, 'measure', $3)
        )
        WHERE id=$4

    или
    update type set characteristics[$1] = jsonb_build_object('type', $2, 'measure', $3) WHERE id=$4;
    Ответ написан
    1 комментарий
  • Как найти к какому коммутатору подключена розетка?

    Melkij
    @Melkij
    PostgreSQL DBA
    "посмотреть в документации" не предлагать, да? Ну вот отличный повод начать уже вести документацию.
    Ответ написан
    1 комментарий
  • Вопрос с собеседования: Есть ли в PHP нативная возможность инициализировать переменную как в функции preg_match()?

    Melkij
    @Melkij
    PostgreSQL DBA
    function foo(&$out) 
    {
    	$out = 'hello!';
    }
    
    foo($hello);
    var_dump($hello);
    Ответ написан
    Комментировать
  • Как правильно настроить pgbouncer и postregsql?

    Melkij
    @Melkij
    PostgreSQL DBA
    max_client_conn в конфиге баунсера - это максимальное число возможных подключений от клиентов к самому баунсеру.
    Если у вас max_client_conn стоит, например, 100, а каждый из 20 бекендов попробует открыть по 10 соединений с баунсером - то первая сотня подключений будет успешна, остальные получат ошибку "no more connections allowed (max_client_conn)"
    max_client_conn ставится в 10000 и про него надолго забываем. Штука фактически бесплатная, libevent хорошо умеет с таким работать. Но требуется выставить корректный open file limit. Каждый коннект - это файловый дескриптор, если не скорректировать настройки ОС - то будет неприятный сюрприз.

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

    pool size 20 на всего лишь 8 ядер CPU может быть чрезмерно. Но далее нужно смотреть уже мониторинг. Сколько реальных процессов базы в работе, очередь ожиданий на баунсере, хватает ли баунсеру процессорного времени (тут скользкий момент, баунсер строго однопоточный и может упираться в производительность одного ядра CPU)
    Ответ написан
    2 комментария
  • Как увеличить размер раздела без потери данных?

    Melkij
    @Melkij
    PostgreSQL DBA
    Disklabel type: dos

    вот и есть лимит в 2ТиБ, msdos label больше не умеет.

    - делаете бекап
    - внимательно сохраняете номер стартового и конечного сектора файловой системы
    - отмонтируете раздел
    - убираете disklabel msdos, создаёте gpt
    - создаёте новый раздел начинающийся в точности на той же позиции. Конец раздела можно сразу до конца диска сдвинуть
    - монтируете раздел, проверяете что файловая система на месте
    - resize2fs
    - правите fstab если надо
    Ответ написан
    2 комментария
  • Как настроить рабочую среду для установки расширения pgTap?

    Melkij
    @Melkij
    PostgreSQL DBA
    pgxs.mk не может быть пустым. Для того он и требуется, чтобы не быть пустым. Разбирайтесь с первопричиной тут:
    Но он только для 14 версии, в у меня 15.

    если это rpm PGDG репа - то включен ли у вас -devel?
    Ответ написан
  • Реально ли разместить в корпусе U1 две материнские платы mini atx am 4?

    Melkij
    @Melkij
    PostgreSQL DBA
    Форм-фактор 1U предписывает предельные размеры по ширине и высоте корпуса. А вот по глубине простора вполне достаточно. Можно и пару ATX запихать с точки зрения геометрии без проблем. Например, одну материнку вывести front view, вторую back view. Если решите вопрос с охлаждением и общим смыслом сей затеи кастомного корпуса.
    Ответ написан
    Комментировать
  • Перемещение оперативных файлов на SSD?

    Melkij
    @Melkij
    PostgreSQL DBA
    ядерный bcache, LVM cache
    Ответ написан
    Комментировать
  • Как исправить ошибку запуска?

    Melkij
    @Melkij
    PostgreSQL DBA
    Берёте бекап и восстанавливаетесь из него.

    Затем внимательно и придирчиво задаёте вопросы софту и железу на предмет где и как продолбали fsync, где ошибка в настройках, нарушающая гарантии durability?

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

    Melkij
    @Melkij
    PostgreSQL DBA
    pg15+ умеет публиковать только часть полей таблицы: https://www.postgresql.org/docs/current/logical-re...
    вычисляемые поля так, впрочем, опубликовать не получится.

    Так что старые-добрые пачка триггеров вам помогут.
    Ответ написан
    Комментировать
  • Чем загрузчик в виртуальных процессорах отличается от реального? Какой жизненный цикл запущенной ОС на виртулальном?

    Melkij
    @Melkij
    PostgreSQL DBA
    Запуститься ли обычная ос на виртуальном процессоре(не понимаю как это протестировать. так как образы ос для виртуалок, чет немного другие, а что в них другого в этом вопрос)

    Есть разные варианты виртуализации.
    Если мы виртуализируем всё железо - это предназначено именно для запуска ОС, ничего не знающей о виртуализации. Но за виртуализацию всякой периферии (вроде дисков и сети) расплачиваемся снижением производительности.
    Можно не виртуализировать периферийные устройства - но тогда гостевая система должна уметь работать с такой периферией. Если ОС не знает как работать с диском - то она банально не сможет загрузиться.
    Может вся ОС быть в режиме паравиртуализации

    Точно не все, к примеру в qemu память выделяется динамически. А значит. Ram может расти. А в реальности, я не могу взять и RAM увеличить в 2 раза по команде. Значит есть инструкция, new которая берет и из неоткуда(с точки зрения вирт ос) берет память.

    https://en.wikipedia.org/wiki/Memory_ballooning
    Ядро гостевой ОС намеренно модифицировано и знает как попросить больше памяти у гипервизора.

    То что вы упускаете: виртуального процессора не существует.
    Управление памятью же... Хе-хе. Если не сильно ошибусь в исторический экскурс, то в прошлом году исполнилось уже 50 лет с тех пор как память в x86 перестала работать так наивно, как вы описали. https://en.wikipedia.org/wiki/Virtual_memory
    malloc гигабайтного куска памяти уже очень давно не даёт гигабайтный кусок непрерывных адресов в физической RAM. Фактически, malloc сейчас вообще не даёт память, а только обещает её дать позже. Куда и как эта память будет распределена по физической RAM - да фиг его знает, этим управляет операционная система. Виртуализация соответственно возводит сложность управления виртуальной памятью в квадрат. Это может быть как двойная работа - сначала гость в том что считает своей RAM распихивает всё что есть как нравится, затем гипервизор ничего не зная о алгоритмах управления памятью в госте распихивает занимаемую гостем память по своей виртуальной памяти. Или это может быть какая-то кооперация.
    Ответ написан
    Комментировать