Роли PostgreSQL

Роли PostgreSQL не связаны с пользователями ОС. Пользователи и группы PostgreSQL являются ролями (т.е. являются подмножествами множества “Роли”) — эти сущности устарели, но оставлены для обратной совместимости.
Пользователь — роль с правом входа:
create role rolename login;
или
create role rolename;
Группа — роль без права входа:
create role rolename;
Роль можно включать в другую роль (группу):
role1: grant group to role2;
role1->role2
Исключить из группы:
role1: revoke group from role2;

Права на управление участием в групповых ролях:

  • superuser — в любой
  • createrole — все кроме superuser

Есть возможность передачи прав на управление включением ролей в группу.
Информация о ролях в кластере:

select * from pg_roles;
или
\du
или
\du+
0

Настройки аутентификации пользователя postgres в PostgreSQL по паролю

Аутентификация клиентов управляется конфигурационным файлом, который традиционно называется pg_hba.conf и расположен в каталоге с данными кластера базы данных.
По умолчанию для локального пользователя postgres установлена аутентификация peer (более подробно в документации https://postgrespro.ru/docs/postgrespro/9.6/auth-pg-hba-conf).
Поэтому, для подключения к серверу переключаемся в консоли на пользователя postgres:
sudo su — postgres
Подключаемся к серверу:
psql
Чтобы задать пароль пользователю postgres выполняем в консоли postgres запрос:
alter user postgres encrypted password 'new_password';

Для того чтобы переключить аутентификацию пользователя postgres в режим по паролю (т.к. пароль у него теперь задан) редактируем файл pg_hba.conf:

sudo nano /etc/postgresql/9.6/main/pg_hba.conf

Находим в нем строку:
local all postgres peer
И меняем peer на md5. Сохраняем конфигурационный файл.
Чтобы применить изменения в конфигурации сервера без его рестарта то используется команда:
sudo service postgresql reload
Использование этой команды не приведет к прерыванию любых активных запросов или подключений к базе данных.
Того же эффекта можно достичь выполнив запрос SQL на сервере:
SELECT pg_reload_conf();
После выполнения команды подключимся снова к серверу (из сеанса любого пользователя (чтобы выйти из сеанса пользователя postgres нужно в консоли ввести exit и нажать Enter)):
psql -U postgres
После ввода пароля мы подключимся к серверу БД. Для проверки можно выполнить запрос:
SELECT version();
0

Как сменить пароль пользователя в Linux

Для смены пароля пользователя в Linux, необходимо выполнить в Терминале (или консоли) следующую команду:
passwd
После ввода этой команды, система потребует от вас корректно и дважды ввести ваш новый пароль. Если вы хотите сменить пароль другого пользователя, вам необходимы права суперпользователя root. Если вы наделены такими правами, то выполните в терминале:
sudo bash
И введите пароль суперпользователя root (о переходе в режим суперпользователя будет свидетельствовать знак «#» вместо привычного для вас знака «$»). И, затем, выполните команду:
passwd имя_пользователя
Где имя_пользователя — логин пользователя, которому вы меняете пароль. Система опять же потребует от вас корректно и дважды ввести новый пароль.
0

Настройка бекапа PostgreSQL в Ubuntu Server при помощи pgBackRest с копированием на Windows Share

Настройка доступа из Linux к сетевой шаре бекапного сервера Windows:

Источник: https://www.hippolab.ru/kak-podklyuchit-setevoy-disk-windows-v-linux

Читать далее
0

PostgreSQL Узнать дату и время последнего CHECKPOINT

В PostgreSQL узнать дату и время последнего CHECKPOINT можно выполнив на сервере команду:

pg_controldata /path/to/pgdata

Например:

/usr/pgsql-9.6/bin/pg_controldata /var/lib/pgsql/9.6/data/

Ответ будет вида:

pg_control version number:            960
Catalog version number:               201608131
Database system identifier:           6522699450602703438
Database cluster state:               in production
pg_control last modified:             Tue 04 Sep 2018 10:40:05 AM MSK
Latest checkpoint location:           1/16315950
Prior checkpoint location:            1/1630E4E0
Latest checkpoint's REDO location:    1/16314968
Latest checkpoint's REDO WAL file:    000000010000000100000016
Latest checkpoint's TimeLineID:       1
Latest checkpoint's PrevTimeLineID:   1
Latest checkpoint's full_page_writes: on
Latest checkpoint's NextXID:          0:2535686
Latest checkpoint's NextOID:          49176
Latest checkpoint's NextMultiXactId:  108
Latest checkpoint's NextMultiOffset:  222
Latest checkpoint's oldestXID:        1750
Latest checkpoint's oldestXID's DB:   1
Latest checkpoint's oldestActiveXID:  2535686
Latest checkpoint's oldestMultiXid:   1
Latest checkpoint's oldestMulti's DB: 1
Latest checkpoint's oldestCommitTsXid:0
Latest checkpoint's newestCommitTsXid:0
Time of latest checkpoint:            Tue 04 Sep 2018 10:40:04 AM MSK
Fake LSN counter for unlogged rels:   0/1
Minimum recovery ending location:     0/0
Min recovery ending loc's timeline:   0
Backup start location:                0/0
Backup end location:                  0/0
End-of-backup record required:        no
wal_level setting:                    replica
wal_log_hints setting:                on
max_connections setting:              200
max_worker_processes setting:         8
max_prepared_xacts setting:           0
max_locks_per_xact setting:           64
track_commit_timestamp setting:       off
Maximum data alignment:               8
Database block size:                  8192
Blocks per segment of large relation: 131072
WAL block size:                       8192
Bytes per WAL segment:                16777216
Maximum length of identifiers:        64
Maximum columns in an index:          32
Maximum size of a TOAST chunk:        1996
Size of a large-object chunk:         2048
Date/time type storage:               64-bit integers
Float4 argument passing:              by value
Float8 argument passing:              by value
Data page checksum version:           0

Нас интересует пункт Time of latest checkpoint.

0

PostgreSQL Создание пользователя и выдача ему полных прав на БД

Для того, чтобы создать пользователя (роль) и выдать ему полные права на конкретную бд, подключаемся к серверу PostgreSQL и выполняем запросы:

CREATE USER "i.ivanov" WITH ENCRYPTED PASSWORD 'megapass';
GRANT ALL PRIVILEGES ON DATABASE DatabaseName TO "i.ivanov";
0

PostgreSQL Количество соединений на сервере

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

Текущий лимит соединений:

show max_connections;

Общее количество открытых соединений:

select count(*) from pg_stat_activity;

Количество соединений открытых пользователями:

select count(*) as connections, usename from pg_stat_activity group by usename order by count(*) desc;

За лимит подключений отвечает параметр max_connections в конфиге postgresql.conf. Если требуется изменить лимит, то нужно поменять этот параметр в конфиге и перезапустить PostgreSQL.

0

Узнать сколько места использует БД на MS SQL

Скрипт отображает информацию о занятом файлами БД и логоми пространстве на диске и реально используемом (space used) на данный момент, а так же последние даты и размер файлов бекапа.

IF OBJECT_ID('tempdb.dbo.#space') IS NOT NULL
    DROP TABLE #space
CREATE TABLE #space (
      database_id INT PRIMARY KEY
    , data_used_size_MB DECIMAL(18,2)
    , log_used_size_MB DECIMAL(18,2)
)
DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = STUFF((
    SELECT '
    USE [' + d.name + ']
    INSERT INTO #space (database_id, data_used_size_MB, log_used_size_MB)
    SELECT
          DB_ID()
        , SUM(CASE WHEN [type] = 0 THEN space_used END)
        , SUM(CASE WHEN [type] = 1 THEN space_used END)
    FROM (
        SELECT s.[type], space_used = SUM(FILEPROPERTY(s.name, ''SpaceUsed'') * 8. / 1024)
        FROM sys.database_files s
        GROUP BY s.[type]
    ) t;'
    FROM sys.databases d
    WHERE d.[state] = 0
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '')
EXEC sys.sp_executesql @SQL
SELECT
      d.database_id
    , d.name
    , d.state_desc
    , d.recovery_model_desc
    , t.total_size_MB
    , t.data_size_MB
    , s.data_used_size_MB
    , t.log_size_MB
    , s.log_used_size_MB
    , bu.full_last_date
    , bu.full_size_MB
    , bu.log_last_date
    , bu.log_size_MB
FROM (
    SELECT
          database_id
        , log_size_MB = CAST(SUM(CASE WHEN [type] = 1 THEN size END) * 8. / 1024 AS DECIMAL(18,2))
        , data_size_MB = CAST(SUM(CASE WHEN [type] = 0 THEN size END) * 8. / 1024 AS DECIMAL(18,2))
        , total_size_MB = CAST(SUM(size) * 8. / 1024 AS DECIMAL(18,2))
    FROM sys.master_files
    GROUP BY database_id
) t
JOIN sys.databases d ON d.database_id = t.database_id
LEFT JOIN #space s ON d.database_id = s.database_id
LEFT JOIN (
    SELECT
          database_name
        , full_last_date = MAX(CASE WHEN [type] = 'D' THEN backup_finish_date END)
        , full_size_MB = MAX(CASE WHEN [type] = 'D' THEN backup_size END)
        , log_last_date = MAX(CASE WHEN [type] = 'L' THEN backup_finish_date END)
        , log_size_MB = MAX(CASE WHEN [type] = 'L' THEN backup_size END)
    FROM (
        SELECT
              s.database_name
            , s.[type]
            , s.backup_finish_date
            , backup_size =
                        CAST(CASE WHEN s.backup_size = s.compressed_backup_size
                                    THEN s.backup_size
                                    ELSE s.compressed_backup_size
                        END / 1048576.0 AS DECIMAL(18,2))
            , RowNum = ROW_NUMBER() OVER (PARTITION BY s.database_name, s.[type] ORDER BY s.backup_finish_date DESC)
        FROM msdb.dbo.backupset s
        WHERE s.[type] IN ('D', 'L')
    ) f
    WHERE f.RowNum = 1
    GROUP BY f.database_name
) bu ON d.name = bu.database_name
ORDER BY d.database_id
0

MS SQL Узнать сколько места занимают таблицы в БД

Скрипт позволяет узнать сколько места занимают таблицы в БД:

USE DatabaseName
SELECT
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows AS RowCounts,
    SUM(a.total_pages) * 8 AS TotalSpaceKB,
    CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
    SUM(a.used_pages) * 8 AS UsedSpaceKB,
    CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB,
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
    CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
FROM
    sys.tables t
INNER JOIN     
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN
    sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN
    sys.schemas s ON t.schema_id = s.schema_id
WHERE
    t.NAME NOT LIKE 'dt%'
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255
    --AND t.NAME in ('TableName1', 'TableName2')
GROUP BY
    t.Name, s.Name, p.Rows
ORDER BY
    t.Name
0