Добрый день, Всем!
Срочно нужно почистить журнал средсвами MS SQL - подскажите, пожалуйста!
Журнал не чистился, накопилось за несколько лет, стали разбираться, после перенастроек, видимо все-таки журнал начал чиститься, но никто работать не может.... все висит...
			
			
									
						
										
						HELP! Нужно очистить журнал!
Модераторы: m0p3e, edward_K, Модераторы
- 
				edward_K
 - Заслуженный деятель интернет-сообщества
 - Сообщения: 5189
 - Зарегистрирован: 29 мар 2005, 17:49
 - Откуда: SPB galaxy spb
 
Re: HELP! Нужно очистить журнал!
Ну например так - создать задание(job) в MSSQL
В вашем случае нужно модернизировать - если входной параметр 0, то вместо delete сделать типа
truncate table ??????
например truncate table xx$hashvalues
и в первый раз выполнить с 0. Что же касается зависания то если вы прервали процесс не штатно, то пока mssql не откатит транзакцию работать будет не возоможно - аккуратней с этим.
Step1 (везде указываете базу в которой нужно почистить.).
Step 2
			
			
									
						
										
						В вашем случае нужно модернизировать - если входной параметр 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
Код: Выделить всё
Exec p_integrity_clear_journal  10Re: HELP! Нужно очистить журнал!
Спасибо ВСЕМ!
Почистили скриптом выложенным на форум 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)
Результат этого запроса необходимо будет выполнить.
			
			
									
						
										
						Почистили скриптом выложенным на форум 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! Нужно очистить журнал!
В продолжение темы: почистил таблицы журнализации по скрипту приведеному здесь. Файл журнализации journal. dat после этого не уменшился. Сжатие не помогает. 
Журнализация мне не нужна, может проще вручную удалить этот файл?
			
			
									
						
										
						Журнализация мне не нужна, может проще вручную удалить этот файл?
Re: HELP! Нужно очистить журнал!
Если сравнить архивные копии базы до очистки и после разница в размерах ощутимая, но это зависит от срока журнализации (у нас 1 месяц)
			
			
									
						
										
						- 
				edward_K
 - Заслуженный деятель интернет-сообщества
 - Сообщения: 5189
 - Зарегистрирован: 29 мар 2005, 17:49
 - Откуда: SPB galaxy spb
 
Re: HELP! Нужно очистить журнал!
Если скрипт выполнялся на ходу, то просто shrink не поможет - нужно ставить птицу на reorganize before.