Задать вопрос
  • Почему SELECT CASE WHEN возвращает только первое значение?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    А вот если заглянуть в документацию...
    Day full capitalized day name (blank-padded to 9 chars)

    Действительно непонятно, почему же так срабатывает сравнение двух разных строк
    'monday' = 'monday '

    Что попросили у to_char - то вполне ожидаемо и получили. При том, в чём вообще смысл получать название дня недели, а не его номер? А вдруг Day окажется locale-specific штукой?
    Ответ написан
    1 комментарий
  • Существуют ли дистрибутивы Linux где изначально встроен весь основной репозитарий?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Невозможно иметь всё в установленном виде - некоторые пакеты банально конфликтуют между собой (например, потому что выполняют одну и ту же задачу)

    А для работы без доступа к глобальной сети - это пожалуйста. Только брать нужно не что-то хипстерское-молодёжное
    Например, репозиторий debian актуального выпуска для amd64 доступен на 19 DVD дисках. Прямо на этапе установки с диска будет предложение вставить другие диски репозитория, затем при попытке установки чего-либо apt будет запрашивать "дайте диск такой-то"
    Обновления релиза так же можно загрузить на дисках.
    Хотя именно iso'шки и прекратили публиковать кроме самого первого (места и сети много жрут, а ресурсы серверов-то не коммерческие), их можно собрать по инструкции через jigdo.
    Ответ написан
    Комментировать
  • Как настроить PITR PostgreSQL?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Для pitr вам нужен:
    - basebackup как основа, должно быть завершено его снятие до датывремени требуемого восстановления pitr
    - непрерывный архив всех и абсолютно каждого сегмента wal без пропусков от момента checkpoint перед снятием используемого в восстановлении basebackup и до требуемой точки восстановления

    database system was shut down at 2022-02-10 13:31:25 UTC
    starting point-in-time recovery to 2022-02-10 07:00:00+00

    Это, конечно, невозможно даже с корректным архивом WAL.
    У postgresql REDO recovery, а не UNDO. Pitr только вперёд от текущей позиции. И не раньше достижения точки консистентности состояния (окончания снятия basebackup)

    Чтобы не ходить по граблям консистентности ещё и файловой системы, basebackup предпочтительнее снимать с самого postgresql, а не снимком блочного устройства. Но в целом вариант предусмотренный, ничем неотличимый от обычного crash recovery вроде старта после пропадания электричества (лишь бы fsync работал на всех уровнях корректно и не игнорировался).
    Ответ написан
    6 комментариев
  • Как будет выглядеть схема для таблицы с отчетами за месяц?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    create table aggregate_montly (
        user_id bigint not null references users(id),
        month date not null check (date_trunc('month', date_period) = date_period),
        orders_count bigint not null default 0,
        -- прочие предаггрегированные данные
        primary key (user_id, month)
    );


    Дату писать всегда как первое число месяца, check constraint гарантирует, что вы не запишете по ошибке данные за 8 февраля вместо месяца.
    id выкинут за бессмысленностью. Тем более uuid.
    Ответ написан
    Комментировать
  • Как уменьшить Wal в postgresql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Не уж то postgres нужно так много журналов хранить?

    А то что перенесено куда-либо через archive_command самому postgresql вообще не нужно и база об этих файлах никак не беспокоится. Это нужно тому, кто это настраивает. И в ведении как раз этого человека и будет вопрос "сколько валов нужно хранить".
    Если тот кто настраивал archive_command тоже не беспокоится об архиве - то архив будет бесконечен (16 EiB, это не шутка).

    Архив wal нужен для pitr (или file-shipment replication). Для pitr нужны абсолютно все wal без исключения с момента снятия basebackup до требуемой точки восстановления (при том точка восстановления не может быть ранее времени окончания взятого за основу basebackup). В каких временных рамках вам нужен pitr - выбираете соответственно при определении собственной же политики требований к бекапам.
    (10гб места под бекапы звучит откровенно поразительно, если у вас настолько маленькая база - то зачем вам 80гб основной диск? И 8 было бы много)
    Ответ написан
    6 комментариев
  • Как реализовать балансировку нагрузки на кластер PostgreSQL, чтобы запросы на чтение поступали только на слейв?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    А как? Ну вот прямым текстом: как это в принципе и в теории возможно сделать без участия приложения?

    begin isolation level repeatable read ;
    select ... from users;
    -- а дальше-то что?

    Окей, begin действительно можно отсрочить до прихода следующего запроса, но вот абсолютно никак не позже запроса select вы обязаны решить, отправлять эту транзакцию на реплику либо на мастер. Как вы это определите? С равной вероятностью следующей командой может быть commit, другой select или пишущий запрос. Вы это никак не можете узнать, но вам уже необходимо эту транзакцию отправить куда-то и получить результат. И ровно так же вы не можете отправить запрос сначала на реплику, а запись потом на мастере потому что у вас развалится снэпшот транзакции.

    select * from calculate_user_rating(423);
    А это читающий или пишущий запрос? Да этого сама база не знает! Хрен его разберёт, что этой pl/python хранимке на непонятном для базы языке вздумается делать.

    Репликами должно уметь пользоваться само приложение. Кроме самого приложения больше никто не знает, допустимо ли запрос отправлять на реплики и если да, то на какие именно
    Ответ написан
    7 комментариев
  • Как в PosgreSQL, в JSON добавить key:value?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    array_to_json(array_agg(row_to_json (r)))
    не первый раз вижу такой конструкт, но не понимать зачем оно такое надо в таком переусложненном виде. Если нашли array_agg - значит могли заметить и json_agg там же, что приводит к простейшему select json_agg(r) from r

    Для json оператора конкатенации нет, возьмите jsonb:
    select jsonb_agg(r) || jsonb_build_object('city', 'SanAndreas') from tablename r;
    Ответ написан
    Комментировать
  • Что значит 100% колонка idle в iostat –dx?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    iostat, как бы это ни было неожиданно по своему названию, показывает статистику устройств I/O, а так же CPU.

    Заинтересовавший вас %idle относится avg-cpu секции и как поясняет прямым текстом man iostat
    %idle
    Show the percentage of time that the CPU or CPUs were
    idle and the system did not have an outstanding disk I/O
    request.

    Это процент времени, когда CPU не был чем-либо занят.
    То есть 99% idle - система фактически ничем не занята.

    Обычно смотрится вживую в iostat -x 1
    Ответ написан
    Комментировать
  • Как запросом смотреть процедуры?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    postgresql
    SELECT pg_catalog.pg_get_functiondef(pg_proc.oid)
    FROM pg_proc
    /* любые where по вкусу */

    Так же известный как \sf в psql.
    Ответ написан
    Комментировать
  • Как перенести bd Mysql c частично неработающего жесткого диска, примонтированного к работающей Linux?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    • перепроверяете, что СУБД остановлена и не запущена
    • находите datadir (например, /var/lib/mysql/ )
    • ставите на рабочей системе mariadb (или mysql - выясните, какая именно была установлена) той же самой версии
    • копируете целиком всё что есть в datadir в новое место жительства
    • запускаете СУБД и смотрите в лог
    Ответ написан
    6 комментариев
  • Какую максимальную карту памяти можно использовать в Raspberry Pi 4?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    До 2тб в теории. https://forums.raspberrypi.com/viewtopic.php?t=244295 + https://elinux.org/RPi_SD_cards
    Пара отзывов пользователей 256гб и 512гб карточек упомянуто.
    Ответ написан
  • Куда копать в сторону поиска ошибки с репликой?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Сообщение самодостаточное, ничего не пропущено.
    У вас есть replication slot под названием japan_replica. Неких хост, настроенный как реплика с primary_slot_name = japan_replica каждые wal_retrieve_retry_interval (5 секунд) пытается продолжить репликацию, подключаясь к primary_conninfo. Указанный в primary_conninfo сервер отвечает "товарищ, ты что-то путаешь, этот слот репликации уже используется".
    Один слот репликации = только один читатель.

    Ищите ошибку в конфигурации. Может быть завели вторую реплику на неправильный слот.
    Вьюшки pg_stat_replication, pg_replication_slots и добавление %h в log_line_prefix помогут прояснить происходящее.

    К "нет соединения с базой" отношения не имеет.
    Ответ написан
    2 комментария
  • Почему не работает mysql2?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior.

    Ммм, вполне простой английский. Гуглопереводчик справляется на ура, я даже специально проверил.

    mysql устал ждать от вас команд и закрыл соединение, которое считает сообразно своим настройкам никому не нужным.
    Ответ написан
  • Как сделать join или SELECT FROM WHERE IN из массива?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    select ... from regions 
    where id in (
        select j::int 
        from tokens cross join json_array_elements_text(regions) as j 
        where user_id = 5
    );


    Функции и операторы json в postgresql явно реализовывались под объекты и возможностей по работе с json массивами чисел порой не хватает.
    А потому приводим вручную к числу.
    Ответ написан
  • Опасно ли на сервере использовать http-зеркала репозиториев, вместо https? Есть ли риск того, что пакеты могут быть подделаны?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Вопрос неполон без указания пакетного менеджера.

    Например, вот перевод объяснений позиции Debian, почему не торопятся переводить транспортный уровень на https.

    Если интересующий вас пакетный менеджер так же верифицирует скачиваемые пакеты - то и вывод будет аналогичным: это достаточно безопасно.
    Ответ написан
    Комментировать
  • Можно ли, зайти в контейнер lxc из сети интернет?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Можно ли так сделать?
    Ну и так же вопрос, могу ли я пару сайтов разместить внутри контейнеров?

    Можно.
    Это чисто настройки сетей вопрос.
    Начните вот отсюда: https://wiki.debian.org/LXC/SimpleBridge
    Скорей всего у вас один ipv4 и потому интересует настройка бриджа без добавления в него физического интерфейса основной системы + настройка NAT для трафика проходящего от моста.
    Для размещения видимых извне сервисов добавляются правила перенаправления входящих пакетов (например на 443 и 80 порты) на внутренний IP этого виртуального bridge.
    Ответ написан
    Комментировать
  • Как одним запросом в Posgres создать или изменить запись с автоинкрементом в поле?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Ответ написан
    Комментировать
  • Почему не уменьшается размер раздела?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Это бывает неожиданностью, но совершенно верно, размер файловой системы не обязан совпадать с размером раздела.
    resize2fs меняет размер только файловой системы. После этого необходимо изменить размер раздела. parted умеет команду resizepart. Про cfdisk не в курсе.

    При том, при уменьшении раздела будьте предельно аккуратны. Как и многое с правами root, система разрешит вам сделать размер раздела меньше чем файловая система. С фатальными последствиями для файловой системы.
    Неплохой идеей будет сначала подрезать размер файловой системы сильнее, чем предполагается (до 7,5гб, например), уменьшить раздел, затем выполнить вновь resize2fs без явного указания размера что увеличит размер ФС до размера раздела. Так будет гораздо ниже риск того, что где-то ошиблись (например, в единицах измерения килобайты либо кибибайты) и отрезали часть файловой системы
    Ответ написан
    2 комментария
  • Как задать валидатор для поля json/jsonb?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    проверку на лишние ключи, так же на пустые строки и на тип данных в ключах (должна быть строка).

    Сделать шаг назад и задать вопрос "а зачем я здесь пытаюсь прикрутить JSON вместо более простых, компактных и быстрых plain полей"

    jsonb_typeof для типа данных в JSON, для проверки "только такие ключи" сходу даже затрудняюсь что-то найти подходящее для check constraint.
    Ответ написан
  • Как оптимизировать запрос sqlite datetime для postgresSQL date?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    select current_date,
    current_date - interval '6 day',
    date_trunc('month', now()),
    now();

    Просто другой набор функций, выберите подходящую.
    Ответ написан
    4 комментария