Страница 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

Код: Выделить всё

Exec p_integrity_clear_journal  10

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.