Добрый день, Всем!
Срочно нужно почистить журнал средсвами MS SQL - подскажите, пожалуйста!
Журнал не чистился, накопилось за несколько лет, стали разбираться, после перенастроек, видимо все-таки журнал начал чиститься, но никто работать не может.... все висит...
HELP! Нужно очистить журнал!
Модераторы: m0p3e, edward_K, Модераторы
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 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 10
Re: 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 месяц)
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: HELP! Нужно очистить журнал!
Если скрипт выполнялся на ходу, то просто shrink не поможет - нужно ставить птицу на reorganize before.