Файл журнала базы данных MS SQL Shrinking (база данных имеет MEMORY_OPTIMIZED_DATA) - PullRequest
0 голосов
/ 18 апреля 2019

Пожалуйста, смотрите пример.Есть 2 тестовые базы данных.Единственное отличие состоит в том, что секунда использует FILEGROUP для MEMORY_OPTIMIZED_DATA и существует таблица, созданная с помощью (MEMORY_OPTIMIZED = ON).Но я даже не вставляю данные в эту таблицу

Полный скрипт для создания БД приведен ниже.Все 2 тестовых БД имеют режим полного восстановления.Я делаю полное резервное копирование БД, вставляю некоторые данные в тестовую таблицу, после этого я делаю BACKUP LOG и вижу, что log_reuse_wait_desc = Nothing, но из dm_db_log_info я вижу, что в первом БД почти все VLF-файлы усекаются, но дляво-вторых, большинство по-прежнему имеют vlf_active = 1

шаг за шагом

1)

select @@VERSION
--returns
--Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64)   Aug 22 2017 17:04:49   Copyright (C) 2017 Microsoft Corporation  Enterprise Edition: Core-based Licensing (64-bit) on Windows 10 Enterprise 10.0 <X64> (Build 17134: ) 

2) создание 2 тестовых баз данных создание базы данных LogShrinkTest1

CREATE TABLE LogShrinkTest1.[dbo].[Table_1](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [val] [varchar](50) NULL,
    [val2] [varchar](50) NULL,
 CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)
)

CREATE NONCLUSTERED INDEX [ix_1] ON LogShrinkTest1.[dbo].[Table_1]([val2])



create database LogShrinkTest2

CREATE TABLE LogShrinkTest2.[dbo].[Table_1](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [val] [varchar](50) NULL,
    [val2] [varchar](50) NULL,
 CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)
)
GO
CREATE NONCLUSTERED INDEX [ix_1] ON LogShrinkTest2.[dbo].[Table_1]([val2])

3) создание полной резервной копии

BACKUP DATABASE LogShrinkTest1 TO  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Backup\LogShrinkTest1_FULL.bak' WITH NOFORMAT, NOINIT,  NAME = N'LogShrinkTest1-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
go
BACKUP DATABASE LogShrinkTest2 TO  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Backup\LogShrinkTest2_FULL.bak' WITH NOFORMAT, NOINIT,  NAME = N'LogShrinkTest2-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

4) создание оптимизированной для памяти таблицы на 2 дБ

ALTER DATABASE LogShrinkTest2 ADD FILEGROUP LogShrinkTest2_MO CONTAINS MEMORY_OPTIMIZED_DATA   
    go
ALTER DATABASE LogShrinkTest2 ADD FILE (name='LogShrinkTest2_mo_data', filename='E:\SQL SERV Backups\LogShrinkTest2_mo_data') TO FILEGROUP LogShrinkTest2_MO  



CREATE TABLE LogShrinkTest2.dbo.Table_2 (   
    id INT IDENTITY(1,1) PRIMARY KEY NONCLUSTERED,  
    UserId INT  , 
    CreatedDate DATETIME2  NULL,   
    TotalPrice MONEY  
    ) WITH (MEMORY_OPTIMIZED=ON)    

5) вставка некоторых данных в таблицу_1

insert into LogShrinkTest1.dbo.table_1 default values
go 100000

update LogShrinkTest1.dbo.table_1 set val='xxx1' , val2 ='zzz1' where val is null


insert into LogShrinkTest2.dbo.table_1 default values
go 100000

update LogShrinkTest2.dbo.table_1 set val='xxx1' , val2 ='zzz1' where val is null

6) проверка того, что для усечения VLF нам нужно резервное копирование журнала, потому что мы в режиме полной перепроверки

select recovery_model_desc
          ,log_reuse_wait_desc 
          ,log_reuse_wait
          ,* 
from master.sys.databases
where name in ( 'LogShrinkTest1','LogShrinkTest2')

result is log_reuse_wait_desc = LOG_BACKUP

7) заметили, что большинство VLF активнысейчас.

declare @curDb int=db_id()
    select * ,sum(vlf_size_mb) over ()
    from sys.dm_db_log_info ( @curDb ) 

пока что у нас одинаковое изображение для обоих db

8) резервного копирования журнала

BACKUP LOG LogShrinkTest1 TO  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Backup\log_for_LogShrinkTest1.bak' WITH NOFORMAT, NOINIT,  NAME = N'LogShrinkTest1-Log Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

go

BACKUP LOG LogShrinkTest2 TO  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Backup\log_for_LogShrinkTest2.bak' WITH NOFORMAT, NOINIT,  NAME = N'LogShrinkTest2-Log Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

9) проверки VLF

declare @curDb int=db_id()
select * ,sum(vlf_size_mb) over ()
from sys.dm_db_log_info ( @curDb ) 

для 1 дБ у нас почти все VLF-файлы урезаны!но они все равно vlf_active = 1 для второй БД!

log_reuse_wait_desc = ничего для всех тестовых БД и возврат DBCC OPENTRAN Нет активных открытых транзакций.

В чем причина этой проблемы?потому что это заставляет файл журнала расти, пока он не заполняет все дисковое пространство.

...