Страница 1 из 1

x$journal чистка

Добавлено: 30 июл 2009, 15:11
bat_only
Был сбой в галактике, за несколько секунд сформировалось около 5 млн записей, сейчас журнал на 6,5 млн записей.

Стандартной очисткой, думаю буду долго чистить,
плюс тормоза для всех пользователей.

Хочу чистить через БД, здесь появляется вопрос:
Достаточно ли почистить таблицу x$journal?

или нужно еще по каким то таблицам пробежаться,
например по J$100..-вым по таблицам.

Добавлено: 30 июл 2009, 15:41
edward_K
последний абзац правильный.

Добавлено: 30 июл 2009, 15:45
bat_only
То есть делаю truncate основной таблицы x$journal и конкретной таблицы j$
и всем счастье так?

Добавлено: 30 июл 2009, 16:32
bat_only
А еще вопрос, размер Journal.dat
из чего складывается?

Добавлено: 12 авг 2009, 20:29
Sniper
если база первазив - то проще удалить файл журнала
если нет - то лучше скриптом
какая субд?

Добавлено: 13 авг 2009, 23:28
Ged

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

Select 'Truncante  Table '+ Name+' ;' 
From SysObjects
Where xType='U' 
And Name Like 'J$%' 
В результате получите чудный скрипт, который отранкейтит все таблицы журнализации если его запустить. Не забудте в конец скрипта
добавить trucate table gal.x$journal

см. неофициальный саит ОТП в ссылках
вроде Sniper писал :)

Добавлено: 14 авг 2009, 10:59
Polimer
Не помню, публиковал этот скрипт или нет для MSSQL:

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

DECLARE curTables CURSOR 
FOR
SELECT
  so.Name, 
  src.Name,
  xf.XF$Title
FROM
  SysObjects so
  INNER JOIN X$FILES xf ON xf.XF$Code = CONVERT(INT, SUBSTRING(so.Name, 3, 16))
  INNER JOIN SysObjects src ON src.type='U' AND src.name = 'T$' + xf.XF$Name
WHERE
  so.Type = 'U' AND so.Name LIKE 'J$%'
ORDER BY so.Name

DECLARE @Name VARCHAR(200), @SrcName VARCHAR(200), @Title VARCHAR(200), @SQL VARCHAR(8000)
DECLARE @I INTEGER
SELECT @I = 0

SET NOCOUNT ON
OPEN curTables
FETCH NEXT FROM curTables INTO @Name, @SrcName, @Title
WHILE @@FETCH_STATUS = 0
BEGIN
  SET @SQL = 'TRUNCATE TABLE [' + RTRIM(@Name) + ']'
  PRINT 'Очищаю таблицу ' + @Name + ' (журнал таблицы ' + @SrcName + ' - ' + @Title + ')'
  EXEC(@SQL)  
  SELECT @I = @I + 1
  FETCH NEXT FROM curTables INTO @Name, @SrcName, @Title
END
PRINT 'Всего очищено таблиц: ' + LTRIM(@I)

CLOSE curTables
DEALLOCATE curTables
SET NOCOUNT OFF

Добавлено: 14 авг 2009, 12:40
Sniper
очистка журнала простым транкейтом всех таблиц - не правильное решение, потому что есть еще таблицы с мемо полями и такие таблицы надо удалять а не транкейтить.

Добавлено: 14 авг 2009, 13:09
Sniper
вот для примера нашел старый скрипт для зачистки журнала на оркале

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

SELECT 
'TRUNCATE TABLE GAL."X$JOURNAL";'  
FROM DUAL   
UNION
SELECT 
'TRUNCATE TABLE GAL."J$' ||XF$CODE|| '";'
FROM GAL.X$FILES
WHERE 
(MOD(TRUNC(XF$FLAGS/1024),2) = 1 OR MOD(TRUNC(XF$FLAGS/2048),2) = 1) AND
MOD(TRUNC(XF$FLAGS/16384),2) = 0 AND XF$CODE != 0 AND
245 > (SELECT COUNT(DISTINCT XE$FILECODE) FROM GAL.X$FIELDS WHERE XE$FILECODE = XF$CODE)
AND MOD(TRUNC(XF$FLAGS/4),2) = 0
UNION
SELECT 
'DELETE FROM GAL."J$' ||XF$CODE|| '";'
FROM GAL.X$FILES
WHERE 
(MOD(TRUNC(XF$FLAGS/1024),2) = 1 OR MOD(TRUNC(XF$FLAGS/2048),2) = 1) AND
MOD(TRUNC(XF$FLAGS/16384),2) = 0 AND XF$CODE != 0  AND
245 > (SELECT COUNT(DISTINCT XE$FILECODE) FROM GAL.X$FIELDS WHERE XE$FILECODE = XF$CODE)
AND MOD(TRUNC(XF$FLAGS/4),2) = 1

--XF$FLAGS/1024 и XF$FLAGS/2048 журналируется ли таблица (журнал и корпо)
--XF$FLAGS/16384 не должен стоять - это пользовательская таблица (не журналируется)
-- 245 -  непонятно зачем
-- XF$FLAGS/4 - проверяется есть ли мемо поле - 0 или 1


Добавлено: 20 авг 2009, 17:38
bat_only
СУБД SQL.
Спасибо, приятные скрипты.