powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как определить размер свободного места в логе базы данных, но не ИНТЕРАКТИВНО?
13 сообщений из 13, страница 1 из 1
Как определить размер свободного места в логе базы данных, но не ИНТЕРАКТИВНО?
    #32021635
Serjio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот возникла такая интересная задача:

На основании свободного места в логе надо делать или а) или б), но вот как определить размер свободного лога в по ходу скрипта, а не интерактивно, например при помощи dbcc sqlperf (logspace)?
...
Рейтинг: 0 / 0
Как определить размер свободного места в логе базы данных, но не ИНТЕРАКТИВНО?
    #32021644
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>как определить размер свободного лога в по ходу скрипта, а не интерактивно
Честное слово не понял, что вы имете ввиду под "по ходу скрипта" и "не интерактивно". Что собственно вам мешает использовать в скрипте dbcc sqlperf (logspace)?
...
Рейтинг: 0 / 0
Как определить размер свободного места в логе базы данных, но не ИНТЕРАКТИВНО?
    #32021645
Serjio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо.

работает у меня скрипт, который чистит данные в базе по определенным параметрам. Лог потихоньку растет.
Я перебирают разные таблицы. Лог растет (вернее сказать место свободное в логе уменьшается).

А база такая, что свободного места в логе при удалении данных из таблиц не хватает.

я хочу на каждом шаге смотреть сколько места в логе есть и если нет то backup transaction with no_log !

Вот собственно, что я хотел сказать.
...
Рейтинг: 0 / 0
Как определить размер свободного места в логе базы данных, но не ИНТЕРАКТИВНО?
    #32021646
Serjio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да. Забыл добавить. Что я хочу чтоб наличие места в логе проверял не я, а скрипт
...
Рейтинг: 0 / 0
Как определить размер свободного места в логе базы данных, но не ИНТЕРАКТИВНО?
    #32021648
Timur Sokolov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не проще ли удалять небольшими порциями (чтобы лог сильно не рос) и checkpoint-ы ставить почаще? Может лог потом бэкапить придеться?
...
Рейтинг: 0 / 0
Как определить размер свободного места в логе базы данных, но не ИНТЕРАКТИВНО?
    #32021650
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>я хочу чтоб наличие места в логе проверял не я, а скрипт
Скрипт пишите вы или кто другой? Если вы, то что вам мешает запускать в скрипте dbcc sqlperf (logspace)? Оформите выполнение этой команды в отдельную процедуру, которая, например, по входному пареметру "имя базы данных" будет возвращать вам нужную цифру и выполняйте на здоровье на каждом шаге.

ЗЫ
А вообще-то Timur Sokolov прав, проще настроить сжатие лога с помощью периодического архивирования.
...
Рейтинг: 0 / 0
Как определить размер свободного места в логе базы данных, но не ИНТЕРАКТИВНО?
    #32021652
Serjio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да в том-то и дело, что руками можно удалять по частям, а вот автоматически из несколько десятков таблиц с разными ключами удаления и разными объемами удаления - тяжело.

Может у меня по одному ключу к удалению будет сто тысяч записей, а по другому 0.

Если я хочу все автоматизировать, то мне надо оттолкнуться все-таки от свободного места в наличии.
Потом могу прикинуть сколько данных к удалению и сколько места в логе, если не хватает то делю на несколько частей (хоть делением отрезка попалам, хоть относительно) и сейчас уже могу удалять по частям, но в АВТОМАТЕ Ж
...
Рейтинг: 0 / 0
Как определить размер свободного места в логе базы данных, но не ИНТЕРАКТИВНО?
    #32021657
Serjio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>процедуру, которая, например, по входному пареметру "имя базы данных" будет возвращать вам нужную цифру и выполняйте >на здоровье на каждом шаге.

Вот тут я не понимаю чего-то. sqlperf (logspace) выдает информацию только на "экран", никаких параметров задавать нельзя. Как я могу засунуть информацию от dbcc sqlperf в переменную?

Я не хочу принимать решение сам, чистить мне лог или нет. Хватит мне места для удаления из таблицы ХХХХ, где record_date < '01-01-2001'?

Я хочу, чтобы программа знала - сколько место свободного в логе!
...
Рейтинг: 0 / 0
Как определить размер свободного места в логе базы данных, но не ИНТЕРАКТИВНО?
    #32021658
Леша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
declare @freelogspace int
declare @countlogfiles int
declare @message varchar(4000)
declare @subject Varchar(100)
declare @nameoffile varchar(255)
declare @fileid int
declare @filepath varchar(255)
declare @sizefile int
declare @freespace int
declare @maxsize_file int
declare @growth int
declare @typegrowth varchar(5)
declare @usage varchar(14)
declare @dbuse varchar(50)
declare @chr_CR varchar(1)

set nocount on
select @dbuse=value from settings where settingname='DB'
select @chr_CR=value from settings where settingname='separator'
set @subject='databases_files'
exec ('use '+@dbuse +N' DBCC UPDATEUSAGE (0) WITH NO_INFOMSGS ')

create table #spaceinformation
(
nameoffile varchar(255),
fileid int,
filepath varchar(255),
sizefile int,
freespace int,
maxsize_file varchar(50),
growth int,
typegrowth varchar(5),
usage varchar(14),
)

CREATE TABLE #logspace (
DBName varchar( 100),
LogSize float,
PrcntUsed float,
status int
)


CREATE TABLE #dataspace
( FileID int,
FileGrp int,
TotExt int,
UsdExt int,
LFileNm varchar( 100),
PFileNm varchar( 100)
)


insert #spaceinformation
select name, fileid, filename,
'size' = convert(nvarchar(15), size * /1024,0,
'maxsize' = (case maxsize when -1 then 0
else
convert(nvarchar(15), maxsize * /1024 end),
'growth' = (case status & 0x100000 when 0x100000 then
convert(nvarchar(3), growth)
else
convert(nvarchar(15), growth * 8/1024) end),
'typegrows'=(case status & 0x100000 when 0x100000 then
'PRCNT'
else
'MB' end),
'usage' = (case status & 0x40 when 0x40 then 'log only' else 'data only' end)
from sysfiles
order by usage, size desc

select @countlogfiles=count(*) from #spaceinformation where usage='log only'

insert #dataspace
exec( 'dbcc showfilestats')

update #spaceinformation set freespace=(totext-usdext)*32/512
from #dataspace where #spaceinformation.fileid=#dataspace.fileid





INSERT INTO #logspace
EXEC ('DBCC sqlperf( logspace)')

select @freelogspace=convert(int,logsize*(100-prcntused)/100)/@countlogfiles from #logspace where dbname=@dbuse

update #spaceinformation set freespace=@freelogspace where usage='log only'
update #spaceinformation set usage='log' where usage='log only'
update #spaceinformation set usage='data' where usage='data only'


/* gathering data about files using cursor*/
declare look_over_files cursor for select * from #spaceinformation
open look_over_files
fetch look_over_files into @nameoffile,@fileid, @filepath, @sizefile, @freespace, @maxsize_file, @growth, @typegrowth, @usage
while @@fetch_status=0
begin
set @message=isnull(@message,'')+''''+convert(varchar(25),getdate(),120)+''', '''+@server_id+''', '''+@dbuse+''', '''+rtrim(@nameoffile)+''', '+convert(varchar,@fileid)+', '''+rtrim(@filepath)+''', '+convert(varchar,@sizefile)
+', '+convert(varchar,@freespace)+', '+convert(varchar,@maxsize_file)+', '+convert(varchar,@growth)+', '''+@typegrowth+''', '''+@usage+''', '''+substring(@filepath,1,1)+''''+@chr_CR+char(13)
fetch next from look_over_files into @nameoffile,@fileid, @filepath, @sizefile, @freespace, @maxsize_file, @growth, @typegrowth, @usage
end
deallocate look_over_files

drop table #spaceinformation
drop table #dataspace
drop table #logspace
...
Рейтинг: 0 / 0
Как определить размер свободного места в логе базы данных, но не ИНТЕРАКТИВНО?
    #32021660
Леша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
процедурка собирает информацию о всех файлах базы данных, соответственно ты используй только необходимую часть её.
Рожи в скрипте смещные получились
...
Рейтинг: 0 / 0
Как определить размер свободного места в логе базы данных, но не ИНТЕРАКТИВНО?
    #32021665
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Вот тут я не понимаю чего-то. sqlperf (logspace) выдает информацию только на "экран",

Так вот вы о чем! Ну насчет выдачи "только на экран", тут Леша вам показал, как можно перенаправить вывод команды или процедуры во временную таблицу.
...
Рейтинг: 0 / 0
Как определить размер свободного места в логе базы данных, но не ИНТЕРАКТИВНО?
    #32021670
Serjio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да рожи получились отменные

Да подобное перенаправление вывода я "чувствовал", но умом дойти не мог.


Спасибо огромное, МУЖИКИ!
...
Рейтинг: 0 / 0
Как определить размер свободного места в логе базы данных, но не ИНТЕРАКТИВНО?
    #32021671
Serjio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а эти строки только для 2000 что-ль?

>select @dbuse=value from settings where settingname='DB'
>select @chr_CR=value from settings where settingname='separator'
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как определить размер свободного места в логе базы данных, но не ИНТЕРАКТИВНО?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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