Страница 1 из 1
HELP! Нужно очистить журнал!
Добавлено: 16 янв 2012, 10:18
hope
Добрый день, Всем!
Срочно нужно почистить журнал средсвами MS SQL - подскажите, пожалуйста!
Журнал не чистился, накопилось за несколько лет, стали разбираться, после перенастроек, видимо все-таки журнал начал чиститься, но никто работать не может.... все висит...
Re: HELP! Нужно очистить журнал!
Добавлено: 16 янв 2012, 10:51
edward_K
Ну например так - создать задание(job) в MSSQL
В вашем случае нужно модернизировать - если входной параметр 0, то вместо delete сделать типа
truncate table ??????
например truncate table xx$hashvalues
и в первый раз выполнить с 0. Что же касается зависания то если вы прервали процесс не штатно, то пока mssql не откатит транзакцию работать будет не возоможно - аккуратней с этим.
Step1 (везде указываете базу в которой нужно почистить.).
Код: Выделить всё
------------------------------------
-- Запуск как
-- Exec p_integrity_clear_journal 10
------------------------------------
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[AlexFDateToInt]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[AlexFDateToInt]
GO
CREATE FUNCTION AlexFDateToInt (@dd datetime)
RETURNS int
AS
BEGIN
DECLARE @id int
SET @id = convert(integer,( + convert(binary(2), year(@dd)) + convert(binary(1), month(@dd)) + convert(binary(1), day(@dd)) ))
RETURN(@id)
END
--End----------------------------------------------------------------------------
GO
if exists (select * from sysobjects where id = object_id('dbo.p_integrity_clear_journal') and sysstat & 0xf = 4)
drop procedure dbo.p_integrity_clear_journal
GO
-- Процедура для быстрой очистки журнала LastDate datetime)
CREATE PROCEDURE dbo.p_integrity_clear_journal ( @dd integer )
AS
SET NOCOUNT ON
DECLARE @TableCode integer,
@TableName sysname,
@execsql nvarchar(1000)
DECLARE @LastDate integer
--SET XACT_ABORT ON
SET @LastDate = dbo.AlexFDateToInt(dateadd( day, @dd * (-1), getdate()) )
-- SET @LastDate=ISNULL(@LastDate, CAST('99991231' as datetime)) -- очищаем весь журнал, если передан NULL
--SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
--BEGIN TRAN
-- Блокируем удаляемые записи
--SELECT @TableCode=MAX(TableCode) FROM X$JOURNAL WHERE STATUS IN (0,1,2,3) AND LASTDATE<=@LastDate
-- begin
--IF @TableCode IS NULL -- нет записей в журнале
-- RETURN
DECLARE JNRecCursor CURSOR LOCAL FAST_FORWARD
FOR SELECT DISTINCT TableCode FROM X$JOURNAL WHERE STATUS IN (0,1,2,3) AND LASTDATE<=@LastDate group by TableCode
OPEN JNRecCursor
WHILE 1=1
BEGIN
FETCH NEXT FROM JNRecCursor INTO @TableCode
IF @@FETCH_STATUS<>0
BREAK
SET @TableName = 'J$'+CONVERT(VARCHAR(32),@TableCode)
SET @execsql = 'DELETE FROM '+@tablename+' WHERE J#NRec IN (SELECT NREC FROM X$JOURNAL WHERE STATUS IN (0,1,2,3) AND LASTDATE<='+str(@LastDate)+' AND TableCode='+str(@TableCode)+')'
EXEC sp_executesql @execsql
--, '@LastDate Interger, @TableCode int', @LastDate, @TableCode
END
CLOSE JNRecCursor
DEALLOCATE JNRecCursor
ALTER TABLE X$JOURNAL DISABLE TRIGGER X$JOURNAL_D
DELETE FROM X$JOURNAL WHERE STATUS IN (0,1,2,3) AND LASTDATE<=@LastDate
ALTER TABLE X$JOURNAL ENABLE TRIGGER X$JOURNAL_D
--end
--COMMIT TRAN
GO
--End----------------------------------------------------------------------------
GRANT EXECUTE ON dbo.p_integrity_clear_journal TO public
GO
Step 2
Re: HELP! Нужно очистить журнал!
Добавлено: 16 янв 2012, 11:06
hope
Спасибо ВСЕМ!
Почистили скриптом выложенным на форум maikl:
Очистка журнала средствами MSSQLServer | 16.X.2002 @ 18:41 |
УДАЛЕНИЕ ВСЕГО ЖУРНАЛА:
Выполнить скрипт на базе с установленной Галактикой средствами MS SQL Server (например в Query Analizer):
truncate table X$JOURNAL; --очистка журнальной таблицы Галактики
delete XX$MEMO where M#CODE = 15; -- Очистка таблицы с мемо-полем
результат следующего запроса (скрипт по очистке журнальных таблиц), также необходимо будет выполнить:
select 'truncate table J$'+ cast(xf$code as varchar)+';' from x$files
where
((xf$flags & 0x200)/0x200 = 1 or
(xf$flags & 0x400)/0x400 = 1 or
(xf$flags & 0x800)/0x800 = 1 ) and
(xf$code > 200 or
xf$code = 5 or
xf$code = 6 or
xf$code = 7 or
xf$code = 9)
Результат этого запроса необходимо будет выполнить.
Re: HELP! Нужно очистить журнал!
Добавлено: 06 мар 2012, 17:47
shurik--1
В продолжение темы: почистил таблицы журнализации по скрипту приведеному здесь. Файл журнализации journal. dat после этого не уменшился. Сжатие не помогает.
Журнализация мне не нужна, может проще вручную удалить этот файл?
Re: HELP! Нужно очистить журнал!
Добавлено: 07 мар 2012, 16:20
maikl
Если сравнить архивные копии базы до очистки и после разница в размерах ощутимая, но это зависит от срока журнализации (у нас 1 месяц)
Re: HELP! Нужно очистить журнал!
Добавлено: 07 мар 2012, 16:40
edward_K
Если скрипт выполнялся на ходу, то просто shrink не поможет - нужно ставить птицу на reorganize before.