Skip to content

PostgreSQL

andyceo edited this page Jun 27, 2019 · 6 revisions

Первоначальное создание файлов БД, пользователя-админа и пароля с помощью Docker-image

Нужно при первом запуске прокинуть в контейнер переменную POSTGRES_PASSWORD:

environment:
  POSTGRES_PASSWORD: example

При первом запуске скрипт initdb создаст папку для базы данных и инициализирует файлы в ней, пользователя POSTGRES_USER (по умолчанию - postgres) с паролем POSTGRES_PASSWORD.

При последующих запусках переменные POSTGRES_USER и POSTGRES_PASSWORD не учитываются (см. entrypoint образа)

Создание БД, пользователя и предоставление доступа

CREATE USER myuser WITH PASSWORD 'myPassword';
CREATE DATABASE mydb;
GRANT ALL PRIVILEGES ON DATABASE mydb to myuser;

Обновление пароля для пользователя

ALTER USER user_name WITH PASSWORD 'new_password';

Списки пользователей

  • Список всех пользователей:

      SELECT u.usename AS "User name", u.usesysid AS "User ID",
          CASE WHEN u.usesuper AND u.usecreatedb THEN CAST('superuser, create database' AS pg_catalog.text)
              WHEN u.usesuper THEN CAST('superuser' AS pg_catalog.text)
              WHEN u.usecreatedb THEN CAST('create database' AS pg_catalog.text)
          ELSE CAST('' AS pg_catalog.text)
          END AS "Attributes"
      FROM pg_catalog.pg_user u
      ORDER BY 1;
    
  • Список баз данных, к которым пользователь может присоединиться:

      SELECT u.usename, (SELECT string_agg(d.datname, ',' ORDER BY d.datname)
         FROM pg_database d
         WHERE has_database_privilege(u.usename, d.datname, 'CONNECT')) AS allowed_databases
      FROM pg_user u
      ORDER BY u.usename
    
  • Список пользователей, котором разрешено присоединяться к базе:

      SELECT d.datname, (SELECT string_agg(u.usename, ',' order by u.usename) 
          FROM pg_user u
          WHERE has_database_privilege(u.usename, d.datname, 'CONNECT')) AS allowed_users
      FROM pg_database d
      ORDER BY d.datname;
    

Обновление мажорной версии PostgreSQL в Docker-контейнере

docker exec <postgres-old> pg_dumpall -U postgres | docker exec -i <postgres-new> psql -U postgres

Эта команда сделает дамп из старого PostgreSQL и сразу же импортирует в новый. Не забудьте подменить <postgres-old> и <postgres-new> на ваши актуальные имена (или id) контейнеров.

Также, лучше сначала сделать sudo su т.к. пайп | нельзя направить через sudo команде после sudo.

Sidebar is under construction

Clone this wiki locally