powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
17 сообщений из 17, страница 1 из 1
Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
    #39803209
vadimman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 2 одинаковых тестовых базы с 2мя тестовыми таблицами.
отличие в том что на второй тестовой базе создана FILEGROUP под MEMORY_OPTIMIZED_DATA и создана одна таблица с директивой (MEMORY_OPTIMIZED=ON) Данные в эту таблицу даже не вставляются.
(полный код скрипта на создание приложен ниже)
Recovery model в обеих случаях FULL
Делаем full database backup
в тестовые таблицы записываются данные.
После команды BACKUP LOG вижу что log_reuse_wait_desc = Nothing
однако в dm_db_log_info вижу что в первой базе VLF файлы транкейтятся и vlf_active=0 , во второй где есть MEMORY_OPTIMIZED таблица куда данные даже не записываются эти VLF файлы начинают пожизненно оставаться vlf_active=1

вот пошаговое описание того что я делаю


Код: sql
1.
2.
select @@VERSION
--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 тестовые базы и тестовую table_1

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
create database 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])



Делаем full backup
Код: sql
1.
2.
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




для второй базы создаем MEMORY_OPTIMIZED таблицу (путь на диск впишите свой:)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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)    




Заполняем тестовые table_1 чтобы увеличился лог файл

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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



Видим что для того чтобы начали освобождаться VLF т.к у нас full recovery , нам нужно сделать бекап лога
Код: sql
1.
2.
3.
4.
5.
6.
select recovery_model_desc
	      ,log_reuse_wait_desc 
		  ,log_reuse_wait
		  ,* 
from master.sys.databases
where name in ( 'LogShrinkTest1','LogShrinkTest2')



ворнул для обеих баз log_reuse_wait_desc = LOG_BACKUP

перед этим смотрим что нам возвращает
Код: sql
1.
2.
3.
declare @curDb int=db_id()
	select * ,sum(vlf_size_mb) over ()
	from sys.dm_db_log_info ( @curDb ) 


видим что у нас создались vlf файлы и большинство из vlf_active=1. Пока все на обеих базах одинакого.

Делаем бекап лога
Код: sql
1.
2.
3.
4.
5.
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



И далее смотрим что у нас получилось в
Код: sql
1.
2.
3.
declare @curDb int=db_id()
select * ,sum(vlf_size_mb) over ()
from sys.dm_db_log_info ( @curDb ) 



И в случае первой базы мы видим что почти все VLF файлы почищены, можно ужимать лог файл (если требуется)
а вот в случае второй бызы VLF файлы как были активны так и были, хотя якобы log_reuse_wait_desc = nothing.
прилагаю 2 скриншота.
(ps на всякий случай, уточню что с базами делается только то что выше описано кодом, DBCC OPENTRAN ествественно возвращает No active open transactions. в обоих случаях)

т.е лог на второй базе будет расти и расти пока не выжрет все место((
я пока мало знаком с MEMORY_OPTIMIZED структурами, что я не учитываю, как мне освободить лог ?
...
Рейтинг: 0 / 0
Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
    #39803215
vadimman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так и не понял как приложить jpg файл... choose file я делаю а дальше никакой реакции(
...
Рейтинг: 0 / 0
Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
    #39803224
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadimman,

почему Вас это беспокоит?
...
Рейтинг: 0 / 0
Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
    #39803258
vadimman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

ды как, я ж написал, что VLF не освобождается, лог файл не может повторно использоваться и растет до опупения, на самом деле эта ситуация с которой столкнулись на реальной продакшн базе, просто тут я чтобы голову людям не забивать сделал 2 тестовых упрощенных базы... сейчас чтобы сжать такую базу ее приходится переводить в симпл рекавери , делать чекпоинт и потом обратно в фул рекавери но это изврат :) хочу разобраться в проблеме
...
Рейтинг: 0 / 0
Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
    #39803285
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadimman,

А почему вы решили, что виновником этого является IN-MEMORY?
...
Рейтинг: 0 / 0
Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
    #39803291
vadimman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a_voronin,

ну если посмотрите код выше, это единственное отличие )
предположил я об этом случайно, издевался над тестовой базой у которой не шринкался лог, и так и сяк... потом подумал ,а что если деатачнуть ее, удалить лог и заново прикрепить в восстановлением лога:) Но уперся в то что в базе уже была memory optimized file group , подумал что это может как-то влиять. Сделал для абсолютной чистоты 2 тестовые базы и похоже да, как-то оно влияет на освобождение виртуальных файлов лога, причем именно только в full recovery mode...
...
Рейтинг: 0 / 0
Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
    #39803362
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadimman,

Пишут про какие то ошибки с In-Memory в 2017 RTM, накатите какой нибудь CU поновее
...
Рейтинг: 0 / 0
Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
    #39803363
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgvadimman,

Пишут про какие то ошибки с In-Memory в 2017 RTM, накатите какой нибудь CU поновееНапример, https://dba.stackexchange.com/questions/216982/sql-server-2017-log-file-growth-with-memory-optimized-table
...
Рейтинг: 0 / 0
Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
    #39803364
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadimman,

сильно подозреваю что нужен фулл после добавления файловой группы
...
Рейтинг: 0 / 0
Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
    #39803372
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а не, дело в CHECKPOINT для memory optimized.
...
Рейтинг: 0 / 0
Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
    #39803374
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так и пишут

авторFor memory-optimized tables, an automatic checkpoint is taken when transaction log file becomes bigger than 1.5 GB since the last checkpoint. This 1.5 GB size includes transaction log records for both disk-based and memory-optimized tables.

после этого лог попустит.
...
Рейтинг: 0 / 0
Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
    #39803384
vadimman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

а для memory optimized свой чекпоинт? на обычный в режиме full recovery он не реагирует
...
Рейтинг: 0 / 0
Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
    #39803387
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadimmanTaPaK,

а для memory optimized свой чекпоинт? на обычный в режиме full recovery он не реагирует
в смысле не реагирует? руками CHECKPOIN или как написано 1,5gb

https://docs.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/checkpoint-operation-for-memory-optimized-tables?view=sql-server-2017
...
Рейтинг: 0 / 0
Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
    #39803392
vadimman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

интересно, спасибо! посмотрю и в эту сторону)
...
Рейтинг: 0 / 0
Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
    #39803397
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadimmanalexeyvg,

интересно, спасибо! посмотрю и в эту сторону)
в общем по вашим же скриптам чек и бекап всё освободил
...
Рейтинг: 0 / 0
Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
    #39803418
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadimman,

не думаю, что проблема имеет такие масштабы, какие Вы описали. Для кого-то и 1.5 Гб "большой лог". Журнал растет из-за отсутствия резервного копирования и из-за незавершенных транзакций.
...
Рейтинг: 0 / 0
Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
    #39803727
vadimman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
накатывание последних обновлений не помогло... причем такое же поведение замечено если объявлен пользовательский table type c memory_optimized и в какой-нибудь процедуре использована такая табличная переменная...
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сжатие log файла при наличии MEMORY_OPTIMIZED таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]