Пожалуйста, смотрите пример.Есть 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 Нет активных открытых транзакций.
В чем причина этой проблемы?потому что это заставляет файл журнала расти, пока он не заполняет все дисковое пространство.