Задать вопрос
  • Почему не компилируется эта функция?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Запрос корректен. Посмотрите в логах базы, какой запрос реально отправляет ваш клиент.
    Ответ написан
    Комментировать
  • Как без проблем расширить корневой диск на лету в виртуальной машине linux?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Раздел данных, который с высокой вероятностью нужно расширять делаете в конце блочного устройства. Так, чтобы за ним ничего не было. И неважно, рутовый это раздел или ещё какой.
    Когда понадобится расширить:
    1. расширяете блочное устройство
    2. через parted командой resizepart увеличиваете раздел
    3. затем расширяете файловую систему: resize2fs для ext4, xfs_growfs для xfs. Если у вас какая-то вдруг другая экзотика - предварительно уточните команду.

    Всё.

    Можно добавить lvm, вся разница что между 2 и 3 пунктом добавятся pvresize и lvresize. Либо, по желанию, можно будет создавать дополнительные разделы (и/или диски) и их добавлять в lvm.
    lvm поможет, если вы решили сделать отдельный раздел под ОС и отдельный под данные, а потом поняли, что раздел ОС сделали слишком маленьким.

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

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Надо найти самую старую по обновленности запись, где n_flag=0 и num_status>=10.

    btree(update_date) where n_flag=0 and num_status>=10
    Ответ написан
    1 комментарий
  • Реален ли хостинг на процессорах с частотой 5ггц?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Уже очень давно больше не существует понятия "процессор работает на постоянной частоте". Это величина динамическая по усмотрению самого процессора. Максимум того что осталось доступным - можно попросить более или менее агрессивную политику энергосбережения. А частотой всё равно будет управлять сам процессор.

    CPU с базовой частотой в 5ггц банально не представлено серийных, а Turbo Boost или аналоги - у них нет постоянной частоты. CPU загружен? CPU сбрасывает частоту чтобы уложиться в заданное тепловыделение или чтобы избежать перегрева. CPU не загружен? Понижаем частоту до минимума вплоть до обесточивания части ядер. CPU загружен умеренно - ок, повысим частоту сверх насколько захочется самому CPU. CPU загружен короткими всплесками (то есть типичная нагрузка от веба, что бекенда, что на стороне баз данных) - да ну нафиг частоту повышать, думает процессор. И не повышает.
    Ответ написан
    1 комментарий
  • Можно ли ограничить доступ usb-носителей с исключениями штатными средствами?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    поройтесь в сторону udev, например
    https://wiki.gentoo.org/wiki/Allow_only_known_usb_...
    https://unix.stackexchange.com/q/63199

    Конечно, это не имеет смысла если у пользователя есть рутовые права либо возможность их получить.
    Ответ написан
    1 комментарий
  • Как убрать readonly в Postgresql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Postgresql вам редактировать и не препятствует. Раз вы смогли сделать create table - значит база не в read only режиме. Напишите соответствующий update и выполните.

    А вот вашему GUI клиенту скорей всего не нравится отсутствие primary key.
    Ответ написан
    Комментировать
  • Как перенести работающую ОС Debian 11 на RAID1 с имеющейся LVM разметкой?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Решили что следующая схема распределения объема HDD будет наиболее подходящей:
    SWAP - RAID1 - 5Gb
    / - RAID1 - 24Gb
    /home - RAID5 - все оставшееся место

    не трогаете sda вообще на данном этапе!

    Вы забыли /boot упомянуть, предположу что считаем его как гигабайтный раздел без существенных изменений.
    Игнорируем разметку sda полностью, делаете таблицы разделов на sd[bcd] как
    1MiB bios_grub
    1GiB boot
    29GiB sys
    всё остальное data

    mdadm -C /dev/md0 -l 1 -n 4 missing /dev/sdb2 /dev/sdc2 /dev/sdd2
    mdadm -C /dev/md1 -l 1 -n 4 missing /dev/sdb3 /dev/sdc3 /dev/sdd3
    mdadm -C /dev/md2 -l 5 -n 4 missing /dev/sdb4 /dev/sdc4 /dev/sdd4 # другие опции по вкусу

    ждёте resync, обновляете mdadm.conf, отправляете железку в ребут для проверки что массивы корректно собираются сами.

    pvinit, vgextend новых md1 и md2 в имеющийся LVM
    pvmove root и swap на md1, хомяка на md2

    umount /boot , dd if=/dev/sda2 of=/dev/md0, grub-install /dev/sdb , grub-install /dev/sdc , grub-install /dev/sdd, обновить fstab вместо sda2 записать md0

    контрольный ребут

    vgreduce sda3 из lvm, удаляете таблицу разделов sda и создаёте новую идентичную прочим дискам,
    mdadm /dev/md0 -a /dev/sda2
    mdadm /dev/md1 -a /dev/sda3
    mdadm /dev/md2 -a /dev/sda4

    после resync всё готово. Через lvresize расширить размеры томов ну и resize2fs как обычно.
    Ответ написан
  • Насколько упадет скорость жёсткого диска при подключении к SATA 2?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Никак не изменится.
    Даже на последовательных операциях механическим дискам далеко до пределов SATA II. А уж чуть только появятся задачи случайного чтения/записи - то и пределы SATA I будут очень далеко и крайне избыточны.
    Ответ написан
    Комментировать
  • Почему в разных типах файлывых систем (ext, btrfs, ntfs) сжирается место по разному?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    ext4 по-умолчанию резервирует место (5%) доступное только для рута. Регулируется ключами
    tune2fs -m N /dev/disk
    mkfs.ext4 -m N ...
    Ответ написан
    2 комментария
  • Почему Postgres не завершает IDLE-транзакции?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    idle != idle in transaction. Это принципиально разные статусы.

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

    В частности, где вызов release()?
    Ответ написан
    2 комментария
  • Оператор BETWEEN для диапазона значений?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    close_price between open_price * 0.9 and open_price * 1.1

    вы имеете в виду простую математическую операцию?
    Ответ написан
    Комментировать
  • Как задать название таблице переменной в postgresql python?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Привести схему данных в нормальную форму. (это термин)
    Затем удивительным образом пропадёт вся проблема как таковая.
    Ответ написан
    Комментировать
  • В чём разница между Postgre SQL и Postgre Pro?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Это две разные СУБД.

    postgres pro - местный закрытый форк свободной postgresql.
    Ответ написан
    Комментировать
  • Как создать нового юзера и новую базу в postgres, на убунту?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Парольная аутентификация лишь один из множества доступных вариантов. Хотя наиболее простой и распространённый. Какой способ аутентификации будет требовать СУБД - зависит от списка правил в pg_hba.conf. Очень редко нужно что-то кроме служебного правила peer для postgres (именно из-за него psql после sudo -iu postgres не спрашивает никакие пароли, но только у postgres'а) и md5 для всего остального.

    Базово создание новой базы с отдельным пользователем-владельцем выглядит так (от суперпользователя базы):
    CREATE USER "$NEWOWNER" PASSWORD '$NEWPASS';
    CREATE DATABASE ${NEWDB} OWNER "$NEWOWNER";
    REVOKE ALL ON DATABASE $NEWDB FROM public;


    В соседнем ответе вам неверно подсказывают, что "можно сразу указать какому юзеру разрешен доступ". create database разрешит доступ всем (но именно подключение к базе, а не ко всему внутри базы - что частая проблема непонимания прав). И имеет смысл наоборот отобрать доступ от всех прочих, т.е. от public. Owner, конечно, доступ сохранит.

    Чуть ближе к production имеет смысл использовать такой шаблон:
    CREATE USER "$NEWOWNER" PASSWORD '$NEWPASS';
    CREATE DATABASE ${NEWDB} OWNER "$NEWOWNER";
    CREATE ROLE ${NEWDB}_role;
    CREATE ROLE ${NEWDB}_ro;
    CREATE ROLE ${NEWDB}_rw;
    GRANT ${NEWDB}_role TO ${NEWDB}_ro, ${NEWDB}_rw;
    REVOKE ALL ON DATABASE $NEWDB FROM public;
    GRANT CONNECT ON DATABASE $NEWDB TO ${NEWDB}_role;
    GRANT ${NEWDB}_rw TO "$NEWOWNER";
    \c $NEWDB
    ALTER SCHEMA public OWNER TO "$NEWOWNER";
    REVOKE ALL ON SCHEMA public FROM public;
    GRANT USAGE ON SCHEMA public TO ${NEWDB}_ro, ${NEWDB}_rw;
    ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT SELECT ON SEQUENCES TO ${NEWDB}_ro;
    ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT SELECT,USAGE ON SEQUENCES TO ${NEWDB}_rw;
    ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT SELECT ON TABLES TO ${NEWDB}_ro;
    ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT SELECT,INSERT,DELETE,UPDATE ON TABLES TO ${NEWDB}_rw;
    ALTER DEFAULT PRIVILEGES FOR ROLE "$NEWOWNER" GRANT SELECT ON SEQUENCES TO ${NEWDB}_ro;
    ALTER DEFAULT PRIVILEGES FOR ROLE "$NEWOWNER" GRANT SELECT,USAGE ON SEQUENCES TO ${NEWDB}_rw;
    ALTER DEFAULT PRIVILEGES FOR ROLE "$NEWOWNER" GRANT SELECT ON TABLES TO ${NEWDB}_ro;
    ALTER DEFAULT PRIVILEGES FOR ROLE "$NEWOWNER" GRANT SELECT,INSERT,DELETE,UPDATE ON TABLES TO ${NEWDB}_rw;

    В результате получим:
    - пользователя-владельца базы, который предназначен выполнять всякие миграции схемы данных
    - роль имя_базы_role которую можно давать другим пользователям для возможности подключения к этой базе, но без доступа к таблицам приложения (например, используем для мониторинга)
    - роль имя_базы_ro которая даст select-only права ко всем (в том числе будущим) таблицам, созданным от пользователя-владельца это базы
    - роль имя_базы_rw - соответственно для выполнения select,insert,update,delete
    Ответ написан
    Комментировать
  • Почему 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 комментариев