Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Transaction logs / 2 сообщений из 2, страница 1 из 1
25.03.2002, 09:50
    #32026107
Андрей
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Transaction logs
Люди, просветите, пожалуйста.
Я только-начинающий-администратор MS SQL 2000.
И такая у меня проблема.
Есть у меня база main на сервере ~300Mb, есть к ней transaction log,
и время от времени он вырастает очень нехило, последний рекорд ~1,2Gb.
Вопрос первый почему он ТАК много и внезапно растет? Я читал, конечно,
что такое transaction log, но почему он автоматически не уменьшается?
(это вопрос №2)
Его что руками надо чистить? (№3 )
Если я поставлю Recovery - Simple или Bulk-logged - это критично к
безопасности данных? (UPS у нас есть, базы бэкапятся...)

Просьба не пинать, а если отвечать лень, то дайте хоть URL, где про это
написано...

Спасибо.
...
Рейтинг: 0 / 0
25.03.2002, 12:13
    #32026127
ABURSH
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Transaction logs
Об этом в BOL неплохо написано.
Если выбрать SIMPLE MODE, то BACKUP transaction log вообще не выполняется, а выполнюется только полный или дифференциальный BACKUP всей базы данных. Сие означает, что при восстановлении можно восстановить данные лишь на момент последнего копирования базы, которое выполняется как правило ночью. Вся дневная работа при трахе будет потеряна.
Сжатие transaction log в этом режиме выполняется периодически сервером - в предыдущих версиях это называлось TRUNCATE ON EVENT.

BULK_LOGGED MODE означает, что при работе часть информации - операции SELECT INTO BULK INSERT, BCP - не попадают в transaction log , а, значит, при восстановлении не будут восстановлены. Однако в этом режиме transaction log необходимо копировать.
Сжатие transaction log выполняется ТОЛЬКО при его копировании - команде BACKUP log.

И наконец FULL MODE означает, что ВСЯ информация проходит через transaction log , который, как и в режиме BULK_LOGGED MODE, необходимо копировать, и он во время копирования будет сжиматься. Частое копирование transaction log не занимает много времени, выполняется и днем, обеспечивает восстановление данных на момент последнего копирования transaction log .

Следует иметь в виду, что обрезаются только те сегменты transaction log , которые содержат информацию об уже ЗАКОНЧЕННЫХ транзакциях.

Чтоб определить состояние transaction log рекомендую команду DBCC LOGINFO.

Прилагаю текст процедуры для насильственного сжатия transaction log:

------------------------------------------------------------------------------------
drop proc sp_force_shrink_log
go
create proc sp_force_shrink_log
--------------------------------------------------------------------------------
-- Purpose: Shrink transaction log of the current database in SQL Server --
--------------------------------------------------------------------------------
@target_percent tinyint = 0,
@target_size_MB int = 10,
@max_iterations int = 1000,
@backup_log_opt nvarchar(1000) = 'with truncate_only'
as
set nocount on

declare @db sysname,
@last_row int,
@log_size decimal(15,2),
@unused1 decimal(15,2),
@unused decimal(15,2),
@shrinkable decimal(15,2),
@iteration int,
@file_max int,
@file int,
@fileid varchar(5)

select @db = db_name(),
@iteration = 0

create table #loginfo (
id int identity,
FileId int,
FileSize numeric(22,0),
StartOffset numeric(22,0),
FSeqNo int,
Status int,
Parity smallint,
CreateTime varchar(250)
)

create unique clustered index loginfo_FSeqNo on #loginfo ( FSeqNo, StartOffset )

create table #logfiles ( id int identity(1,1), fileid varchar(5) not null )
insert #logfiles ( fileid ) select convert( varchar, fileid ) from sysfiles where status & 0x40 = 0x40
select @file_max = @@rowcount

if object_id( 'table_to_force_shrink_log' ) is null
exec( 'create table table_to_force_shrink_log ( x nchar(3000) not null )' )

insert #loginfo ( FileId, FileSize, StartOffset, FSeqNo, Status, Parity, CreateTime ) exec ( 'dbcc loginfo' )
select @last_row = @@rowcount

select @log_size = sum( FileSize ) / 1048576.00,
@unused = sum( case when Status = 0 then FileSize else 0 end ) / 1048576.00,
@shrinkable = sum( case when id < @last_row - 1 and Status = 0 then FileSize else 0 end ) / 1048576.00
from #loginfo

select @unused1 = @unused -- save for later

select 'iteration' = @iteration,
'log size, MB' = @log_size,
'unused log, MB' = @unused,
'shrinkable log, MB' = @shrinkable,
'shrinkable %' = convert( decimal(6,2), @shrinkable * 100 / @log_size )

while @shrinkable * 100 / @log_size > @target_percent
and @shrinkable > @target_size_MB
and @iteration < @max_iterations begin
select @iteration = @iteration + 1 -- this is just a precaution

exec( 'insert table_to_force_shrink_log select name from sysobjects
delete table_to_force_shrink_log')

select @file = 0
while @file < @file_max begin
select @file = @file + 1
select @fileid = fileid from #logfiles where id = @file
exec( 'dbcc shrinkfile( ' + @fileid + ' )' )
end

exec( 'backup log [' + @db + '] ' + @backup_log_opt )

truncate table #loginfo
insert #loginfo ( FileId, FileSize, StartOffset, FSeqNo, Status, Parity, CreateTime ) exec ( 'dbcc loginfo' )
select @last_row = @@rowcount

select @log_size = sum( FileSize ) / 1048576.00,
@unused = sum( case when Status = 0 then FileSize else 0 end ) / 1048576.00,
@shrinkable = sum( case when id < @last_row - 1 and Status = 0 then FileSize else 0 end ) / 1048576.00
from #loginfo

select 'iteration' = @iteration,
'log size, MB' = @log_size,
'unused log, MB' = @unused,
'shrinkable log, MB' = @shrinkable,
'shrinkable %' = convert( decimal(6,2), @shrinkable * 100 / @log_size )
end

if @unused1 < @unused
select 'After ' + convert( varchar, @iteration ) +
' iterations the unused portion of the log has grown from ' +
convert( varchar, @unused1 ) + ' MB to ' +
convert( varchar, @unused ) + ' MB.'
union all
select 'Since the remaining unused portion is larger than 10 MB,' where @unused > 10
union all
select 'you may try running this procedure again with a higher number of iterations.' where @unused > 10
union all
select 'Sometimes the log would not shrink to a size smaller than several Megabytes.' where @unused <= 10

else
select 'It took ' + convert( varchar, @iteration ) +
' iterations to shrink the unused portion of the log from ' +
convert( varchar, @unused1 ) + ' MB to ' +
convert( varchar, @unused ) + ' MB'

exec( 'drop table table_to_force_shrink_log' )
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Transaction logs / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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