Архив метки: db

Настройка бекапа 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

Узнать сколько места использует БД на 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

MS SQL Узнать процент создания/восстановления бекапа БД/лога транзакций

SELECT
    [command]
    ,[start_time]
    ,[percent_complete]
    ,[estimated_completion_time] / 60000. AS [estimated_completion_time_min]
FROM sys.dm_exec_requests
WHERE [command] = 'BACKUP DATABASE'
    OR [command] = 'RESTORE DATABASE'
    OR [command] = 'BACKUP LOG'
    OR [command] = 'RESTORE LOG'
    OR [command] LIKE '%DBCC%'
0

MS SQL Узнать дату и время последнего бекапа БД

Чтобы узнать дату последнего бекапа БД нужно выполнить скрипт:

SELECT sdb.Name AS DatabaseName,
MAX(bus.backup_finish_date) AS LastBackUpTime
FROM sys.sysdatabases sdb
LEFT OUTER JOIN msdb.dbo.backupset bus ON bus.database_name = sdb.name
GROUP BY sdb.Name
0

MS SQL Синхронизация пользователей (Logins) на разных инстансах

В случае построения отказоустойчивого решения на основе зеркалирования БД или использования технологии Always On Availability Groups, возникает необходимость в синхронизации пользователей SQL.

Одно из решений, создание login с одинаковым SID.

Автономная БД содержит в себе user-ов которые содержат права доступа на БД и привязаны в БД к конкретным login-ам при помощи SID (login это сущность инстанса, user — сущность БД). При переезде автономной БД на другой инстанс, связь между login и user нарушится, если login на другом инстансе создан с отличным от исзодного инстанса SID. Решением данной проблемы является создание на другом инстансе (по сути на всех инстансах куда может переехать БД) login с принудительным указанием SID такого же как и на исходном инстансе.

Текущий SID:

select SUSER_SID ('Login')

Создание Login с необходимым SID:

CREATE Login AppUser WITH password = 'password@123', SID = 0x59B662112A43D24585BFE2BF80D9BE19

Если логин уже создан, и нет необходимости переноса автономной БД между разными инстансами (например AlwaysOn), то можно использовать менее правильный способ — примапить User и Login при помощи запроса:

USE DatabaseName
ALTER USER UserName WITH LOGIN = UserLogin
0

MS SQL Расчет прироста БД (примерный) на основе истории Full backup

Если БД регулярно бекапится (Full + Log) то на основе истории бекапов можно примерно определить прирост объемов БД на диске. Для того чтобы выбрать интересующие нас данные из истории бекапов, нужно выполнить скрипт:

SET NOCOUNT ON;
SET DEADLOCK_PRIORITY LOW;
SELECT TOP 1000
     tBS.[database_name]                                                                         AS [DatabaseName]
    ,tBS.[type]                                                                                  AS [BackupType]
    ,tBS.[backup_finish_date]                                                                    AS [BackupFinishDate]
    ,CONVERT([NUMERIC](20, 2), tBS.[backup_size] / (CONVERT([NUMERIC](20, 2), 1024.0 * 1024.0))) AS [DatabaseBackupSizeMB] 
FROM
    [msdb].[dbo].[backupset] tBS
WHERE
    tBS.[backup_finish_date] IS NOT NULL
    AND tBS.[type] = 'D'
    AND tBS.[database_name] = 'DBName'
ORDER BY
    tBS.[database_name], tBS.[backup_finish_date] DESC;
0

Просмотреть настройки зеркалирования баз на сервере MS SQL

Чтобы посмотреть какие базы на сервере находятся в зеркале и какое состояние у зеркалирования нужно выполнить запрос:

select database_id, db_name(database_id) as database_name, mirroring_guid, mirroring_state, mirroring_state_desc, mirroring_role, mirroring_role_desc,
case mirroring_safety_level
    when 1 then 'High perfomance'
    when 2 then 'High safety'
    else NULL
end as mirroring_safety_level_name,
mirroring_partner_name,mirroring_partner_instance, mirroring_redo_queue, mirroring_redo_queue_type, mirroring_end_of_log_lsn, mirroring_replication_lsn
mirroring_safety_level, mirroring_safety_level_desc, mirroring_connection_timeout as 'mirroring_connection_timeout(sec)'
from sys.database_mirroring
0

MS SQL Получение информации о нагрузке чтения/записи на файлы БД

SELECT
    [ReadLatency] =
        CASE WHEN [num_of_reads] = 0
            THEN 0 ELSE ([io_stall_read_ms] / [num_of_reads]) END,
    [WriteLatency] =
        CASE WHEN [num_of_writes] = 0
            THEN 0 ELSE ([io_stall_write_ms] / [num_of_writes]) END,
    [Latency] =
        CASE WHEN ([num_of_reads] = 0 AND [num_of_writes] = 0)
            THEN 0 ELSE ([io_stall] / ([num_of_reads] + [num_of_writes])) END,
    [AvgBPerRead] =
        CASE WHEN [num_of_reads] = 0
            THEN 0 ELSE ([num_of_bytes_read] / [num_of_reads]) END,
    [AvgBPerWrite] =
        CASE WHEN [num_of_writes] = 0
            THEN 0 ELSE ([num_of_bytes_written] / [num_of_writes]) END,
    [AvgBPerTransfer] =
        CASE WHEN ([num_of_reads] = 0 AND [num_of_writes] = 0)
            THEN 0 ELSE
                (([num_of_bytes_read] + [num_of_bytes_written]) /
                ([num_of_reads] + [num_of_writes])) END,
    LEFT ([mf].[physical_name], 2) AS [Drive],
    DB_NAME ([vfs].[database_id]) AS [DB],
    [mf].[physical_name]
FROM
    sys.dm_io_virtual_file_stats (NULL,NULL) AS [vfs]
JOIN sys.master_files AS [mf]
    ON [vfs].[database_id] = [mf].[database_id]
    AND [vfs].[file_id] = [mf].[file_id]
-- WHERE [vfs].[file_id] = 2 -- log files
-- ORDER BY [Latency] DESC
-- ORDER BY [ReadLatency] DESC
ORDER BY [WriteLatency] DESC;
GO
0