x$journal чистка

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

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

Ответить
bat_only
Постоянный гость
Сообщения: 92
Зарегистрирован: 06 апр 2007, 18:21
Откуда: Казань
Контактная информация:

x$journal чистка

Сообщение bat_only »

Был сбой в галактике, за несколько секунд сформировалось около 5 млн записей, сейчас журнал на 6,5 млн записей.

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

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

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

Сообщение edward_K »

последний абзац правильный.
bat_only
Постоянный гость
Сообщения: 92
Зарегистрирован: 06 апр 2007, 18:21
Откуда: Казань
Контактная информация:

Сообщение bat_only »

То есть делаю truncate основной таблицы x$journal и конкретной таблицы j$
и всем счастье так?
bat_only
Постоянный гость
Сообщения: 92
Зарегистрирован: 06 апр 2007, 18:21
Откуда: Казань
Контактная информация:

Сообщение bat_only »

А еще вопрос, размер Journal.dat
из чего складывается?
Sniper
Постоянный обитатель
Сообщения: 114
Зарегистрирован: 26 июн 2009, 18:29
Контактная информация:

Сообщение Sniper »

если база первазив - то проще удалить файл журнала
если нет - то лучше скриптом
какая субд?
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение Ged »

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

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

см. неофициальный саит ОТП в ссылках
вроде Sniper писал :)
Polimer
Местный житель
Сообщения: 489
Зарегистрирован: 27 янв 2006, 12:46
Откуда: Москва

Сообщение 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
Sniper
Постоянный обитатель
Сообщения: 114
Зарегистрирован: 26 июн 2009, 18:29
Контактная информация:

Сообщение Sniper »

очистка журнала простым транкейтом всех таблиц - не правильное решение, потому что есть еще таблицы с мемо полями и такие таблицы надо удалять а не транкейтить.
Sniper
Постоянный обитатель
Сообщения: 114
Зарегистрирован: 26 июн 2009, 18:29
Контактная информация:

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

bat_only
Постоянный гость
Сообщения: 92
Зарегистрирован: 06 апр 2007, 18:21
Откуда: Казань
Контактная информация:

Сообщение bat_only »

СУБД SQL.
Спасибо, приятные скрипты.
Ответить