Задать вопрос
  • Почему в разных типах файлывых систем (ext, btrfs, ntfs) сжирается место по разному?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Melkij
    @Melkij
    DBA Team для вашего 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 Team для вашего 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 Team для вашего 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 Team для вашего 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 Team для вашего 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 Team для вашего 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 Team для вашего PostgreSQL?
    postgresql
    SELECT pg_catalog.pg_get_functiondef(pg_proc.oid)
    FROM pg_proc
    /* любые where по вкусу */

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

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

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

    Melkij
    @Melkij
    DBA Team для вашего 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 Team для вашего 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 Team для вашего 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 массивами чисел порой не хватает.
    А потому приводим вручную к числу.
    Ответ написан