Ответы пользователя по тегу PostgreSQL
  • Как сделать alter database для текущей базы данных в Postgres?

    @Xtensive
    1) Так делать не надо. Как минимум потому что для этого нужны права суперадмина и это может испортить жизнь другим пользователям/сессиям/идущим_запросам в непредсказуемой манере.
    2) Dr. Bacon уже верно указал что есть вариант через :DBNAME
    3) Если уж дошло до этого, то есть ещё варианты
    Ответ написан
    Комментировать
  • У кого-нибудь есть опыт подобной архитектуры с Postgres?

    @Xtensive
    Есть сведения, что один кластер может держать 10 тыс БД.


    На ext4 лимит 60к субдиректорий. Теоретический максимум для ПГ - 4 миллиарда баз в одном кластере
    https://www.postgresql.org/docs/current/limits.html
    Вопрос переносится в плоскость трудности обслуживания и развёртывания дополнительных ресурсов. Управлением опять же такой "махиной".

    Это выглядит решаемым, но как будут обстоять дела с конкурентным доступом к разным БД на одном сервере?

    Дела с конкурентным доступом будут посредственны. Постгрес на каждое клиентское соединение будет плодить один серверный процесс. Потребуется очень детальное конфигурирование сервера СУБД по памяти чтобы work_mem и прочие не преводили к OOM падению всего кластера.

    Приблизительно: сервер 56 тредов, 512ГБ памяти может выдержать около 2-4 тысячи клиентов со смешанной OLTP нагрузкой, на одной БД. И тут на само деле не сильно принципиально одна или несколько БД, поскольку всё упирается в диски/хранилище и доступную пропускную способность.

    Количество соединений можно +/- решить пулером соединений (PgBouncer, Odyssey или другие)

    С какими еще проблемами придется столкнуться при администрировании?

    • Бэкапы. Всегда. Особенно инкрементальные.
    • Количество пользователей, и прав к ним.
    • Количество сервисных процессов ПГ
    • Настройка всего этого дела и переконфигурирование по необходимости
    • Апгрейд и патчинг самого ПГ (пока нет и не предвидется подъёма версии СУБД на работающем кластере)
    • Первая же ошибка записи WAL или скрытый коррапт данных убьёт весь кластер 8(


    То есть насколько вообще жизнеспособна такая архитектура по сравнению с традиционной, когда данные разных аккаунтов хранятся в секционируемых таблицах и разделяются по ключу?


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

    @Xtensive
    Судя по описанию задачи, вы пытаетесь сделать механизмы позволяющие производить изменения на БД программным способом.
    Реализовать такое с нуля - трудная задача, полная непредвиденных особенностей. Как минимум часть DDL операций будут сопровождаться изменением самих данных.

    Есть набор утилит которые позволяют это делать чуть более правильным способом - database source control системы. Самые известные - Liquibase и Flyway.
    Не скажу есть ли у них интерфейсы для вызова из C++ но стоит определённо взглянуть в эту сторону.
    Ответ написан
    Комментировать
  • Как в Postgres скрыть из списка базы данных, которые не доступны пользователю?

    @Xtensive
    Если не залезать в глубь системной БД postgres - никак.

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

    Быстрый поиск даёт такой и такой ответы на SO.

    Во втором варианте предлагают у простого пользователя отнять права на Select из Information Schema в системной БД. К сожалению такие действия могут привести к непредсказуемым последствиям.

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

    @Xtensive
    0) Сработает для "простой" инсталляции без стендбай серверов или мультимастера.
    1) Сделать холодный бэкап базы (скопировать файлы в PGDATA).
    2) Потом Попробовать запустить PG на дефолтном конфиге.
    3) Если получится - снимать дамп (на всякий случай).
    4) Если не работает, попробовать во временной папке создать новый кластер через initdb, проверить что с ним работает.

    Если ошибка в конфиге есть надежда что это действительно ошибка в конфиге, а не критические повреждения файлов. Тут проще всего исправить конфиг. Если же умерли файлы БД, то это долго и печально восстанавливать.

    ЕМНИП при старте PG проверяет файл конфигурации и явно говорит строку с ошибочным параметром.
    Ответ написан
    Комментировать