HELP! Нужно очистить журнал!

Администрирование баз данных (Pervasive.SQL, MS SQL, Oracle, утилита Support)

Модераторы: m0p3e, edward_K, Модераторы

Ответить
hope
Местный житель
Сообщения: 1353
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

HELP! Нужно очистить журнал!

Сообщение hope »

Добрый день, Всем!

Срочно нужно почистить журнал средсвами MS SQL - подскажите, пожалуйста!

Журнал не чистился, накопилось за несколько лет, стали разбираться, после перенастроек, видимо все-таки журнал начал чиститься, но никто работать не может.... все висит...
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: HELP! Нужно очистить журнал!

Сообщение 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
hope
Местный житель
Сообщения: 1353
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Re: HELP! Нужно очистить журнал!

Сообщение 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)

Результат этого запроса необходимо будет выполнить.
shurik--1
Посетитель
Сообщения: 35
Зарегистрирован: 29 авг 2011, 20:28

Re: HELP! Нужно очистить журнал!

Сообщение shurik--1 »

В продолжение темы: почистил таблицы журнализации по скрипту приведеному здесь. Файл журнализации journal. dat после этого не уменшился. Сжатие не помогает.
Журнализация мне не нужна, может проще вручную удалить этот файл?
maikl
Местный житель
Сообщения: 1503
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Тверь

Re: HELP! Нужно очистить журнал!

Сообщение maikl »

Если сравнить архивные копии базы до очистки и после разница в размерах ощутимая, но это зависит от срока журнализации (у нас 1 месяц)
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: HELP! Нужно очистить журнал!

Сообщение edward_K »

Если скрипт выполнялся на ходу, то просто shrink не поможет - нужно ставить птицу на reorganize before.
Ответить