У меня есть еженедельный отчет, который я запускаю, где мне нужно загрузить около 48 журналов с примерно 750 тыс. Строк данных в каждом журнале. Чтобы облегчить это, мы использовали задание Java, которое запускает SQL * Loader как внешний процесс (используя ProcessBuilder), один за другим. Однако в последнее время этот процесс ненормально завершается во время загрузки, что вызывает блокировку таблицы и в основном приводит к остановке процесса до тех пор, пока мы не сможем открыть заявку с командой БД, чтобы убить зависший сеанс. Возможно, есть лучший способ обработать этот процесс загрузки, чем использование SQL * Loader, или я могу внести некоторые изменения в управляющий файл или командную строку, чтобы предотвратить смерть от ужасной смерти?
В начале процесса я усекаю таблицу, в которую загружаю, и затем запускаю эту командную строку со следующим управляющим файлом:
КОМАНДНАЯ ЛИНИЯ:
C:\Oracle\ora92\BIN\SQLLDR.EXE userid=ID/PASS@DB_ID load=10000000 rows=100000 DIRECT=TRUE SKIP_INDEX_MAINTENANCE=TRUE control=ControlFile.ctl data=logfile.log
ФАЙЛ УПРАВЛЕНИЯ:
UNRECOVERABLE
Load DATA
INFILE *
Append
PRESERVE BLANKS
INTO TABLE MY_REPORT_TABLE
FIELDS TERMINATED BY ","
(
filler_field1 FILLER char(16),
filler_field2 FILLER char(16),
time TIMESTAMP 'MMDDYYYY-HH24MISSFF3' ENCLOSED BY '"',
partne ENCLOSED BY '"',
trans ENCLOSED BY '"',
vendor ENCLOSED BY '"' "SUBSTR(:vendor, 1, 1)",
filler_field4 FILLER ENCLOSED BY '"',
cache_hit_count,
cache_get_count,
wiz_trans_count,
wiz_req_size,
wiz_res_size,
wiz_trans_time,
dc_trans_time,
hostname ENCLOSED BY '"',
trans_list CHAR(2048) ENCLOSED BY '"' "SUBSTR(:trans_list, 1, 256)",
timeouts,
success ENCLOSED BY '"'
)
После завершения загрузки всех журналов я перестраиваю индексы в таблице и затем запускаю процесс отчета. Кажется, что теперь он просто умирает от случайных логов, при повторном запуске процесса каждый раз он будет завершаться неудачей.
Причинами UNRECOVERABLE и SKIP_INDEX_MAINTENANCE являются ускорение загрузки. Как бы то ни было, загрузка журнала может занять 7-12 минут, еще хуже, если они не включены. В целом, процесс от начала до конца занимает около 18 часов.