SQL*Loader иногда зависает навсегда

У меня есть сценарии SQL*Loader, которые я запускаю для базы данных 11g.
Я использую версию SQL*Loader 11g.

У меня возникла проблема, когда SQL*Loader зависает после вставки последней записи, но перед печатью окончательного счетчика фиксации в командном окне и перед печатью в файл журнала.

Кажется, это отлично работает в базе данных, локальной для нашей локальной сети, но зависает здесь, когда запускается в базе данных за пределами нашей локальной сети.

Если я завершу процесс вручную, все записи будут успешно загружены в базу данных.

В .BAT-файле:

sqlldr CONTROL='SOME_TABLE.ctl' log='logs/SOME_TABLE.log' bad='bad/SOME_TABLE.bad' skip=1

В файле .CTL:

OPTIONS(direct=true, rows=20000)
load data 
infile 'data/SOME_TABLE.csv'
append
into table SOME_TABLE
fields terminated by ','
OPTIONALLY ENCLOSED BY '"' AND '"'
trailing nullcols (
    FIELD01     CHAR(38),
    FIELD02     CHAR(500),
    FIELD03     CHAR(34),
    FIELD04     CHAR(1),
    FIELD05     CHAR(1),
    FIELD06     CHAR(10),
    FIELD07     CHAR(2),
    FIELD08     CHAR(5),
    FIELD09     CHAR(2),
    FIELD10     CHAR(5),
    FIELD11     CHAR(5),
    FIELD12     CHAR(4),
    FIELD13     CHAR(2),
    FIELD14     CHAR(9),
    FIELD15     CHAR(9),
    FIELD16     TIMESTAMP      "YYYY-MM-DD HH24:MI:SS.FF6",
    FIELD17     TIMESTAMP      "YYYY-MM-DD HH24:MI:SS.FF6",
    FIELD18     CHAR(38),
    FIELD19     CHAR(2),
    FIELD20     TIMESTAMP      "YYYY-MM-DD HH24:MI:SS.FF6",
    FIELD21     CHAR(2),
    FIELD22     CHAR(38),
    FIELD23     DATE           "MM/DD/YYYY",
    FIELD24     CHAR(15),
    FIELD25     DATE           "MM/DD/YYYY",
    FIELD26     CHAR(15),
    FIELD27     CHAR(3),
    FIELD28     CHAR(5),
    FIELD29     CHAR(4),
    FIELD30     CHAR(10),
    FIELD31     CHAR(10),
    FIELD32     CHAR(1),
    FIELD33     CHAR(4),
    FIELD34     CHAR(1),
    FIELD35     CHAR(1),
    FIELD36     CHAR(1)
)

Таблица DDL:

--------------------------------------------------------
--  DDL for Table SOME_TABLE
--------------------------------------------------------
CREATE TABLE SOME_TABLE (
    FIELD01      NUMBER(*,0)         NOT NULL,
    FIELD02      FLOAT(126)          NOT NULL,
    FIELD03      VARCHAR2(34)            NULL,
    FIELD04      CHAR(1)                 NULL,
    FIELD05      CHAR(1)                 NULL,
    FIELD06      CHAR(10)                NULL,
    FIELD07      CHAR(2)                 NULL,
    FIELD08      CHAR(5)                 NULL,
    FIELD09      CHAR(2)                 NULL,
    FIELD10      CHAR(5)                 NULL,
    FIELD11      CHAR(5)                 NULL,
    FIELD12      CHAR(4)                 NULL,
    FIELD13      CHAR(2)                 NULL,
    FIELD14      CHAR(9)                 NULL,
    FIELD15      CHAR(9)                 NULL,
    FIELD16      TIMESTAMP(6)        NOT NULL,
    FIELD17      TIMESTAMP(6)        NOT NULL,
    FIELD18      NUMBER(*,0)             NULL,
    FIELD19      CHAR(2)                 NULL,
    FIELD20      TIMESTAMP(6)            NULL,
    FIELD21      CHAR(2)                 NULL,
    FIELD22      NUMBER(*,0)             NULL,
    FIELD23      DATE                    NULL,
    FIELD24      VARCHAR(15)             NULL,
    FIELD25      DATE                    NULL,
    FIELD26      VARCHAR(15)             NULL,
    FIELD27      CHAR(3)                 NULL,
    FIELD28      CHAR(5)                 NULL,
    FIELD29      CHAR(4)                 NULL,
    FIELD30      VARCHAR2(10)            NULL,
    FIELD31      VARCHAR2(10)            NULL,
    FIELD32      CHAR(1)                 NULL,
    FIELD33      CHAR(4)                 NULL,
    FIELD34      CHAR(1)                 NULL,
    FIELD35      CHAR(1)                 NULL,
    FIELD36      CHAR(1)                 NULL
)
    NOLOGGING
    NOCOMPRESS
    TABLESPACE RAW_DATA_01_TS
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                BUFFER_POOL      DEFAULT
               )
PARTITION BY RANGE(FIELD16) INTERVAL(NUMTODSINTERVAL(10, 'MINUTE')) (
    PARTITION SOME_TABLE_201001010000 VALUES LESS THAN (TO_DATE('2010-01-01 00:00', 'YYYY-MM-DD HH24:MI'))
);

Ожидал:

SQL*Loader: Release 11.2.0.1.0 - Production on Fri Feb 17 10:36:14 2012

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Load completed - logical record count 252593.

Действительный:

SQL*Loader: Release 11.2.0.1.0 - Production on Fri Feb 17 10:36:14 2012

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

person ScrappyDev    schedule 17.02.2012    source источник
comment
Установка DIRECT=FALSE, кажется, устранила проблему зависания. Теперь мне просто нужно знать, почему он зависает при использовании DIRECT=TRUE. Он отлично работает с нашей локальной базой данных, но зависает для самых больших в удаленных базах данных.   -  person ScrappyDev    schedule 22.02.2012
comment
Сетевая задержка имеет большое значение, когда речь идет об операциях с базой данных. Базы данных в вашей локальной сети будут работать значительно быстрее, чем базы данных, расположенные удаленно.   -  person Nick    schedule 13.05.2012


Ответы (1)


Я подозреваю, что это связано с DIRECT=TRUE. Oracle должен перепроверить индексы и ограничения в конце процесса. Если ваш стол очень большой, это может быть сколь угодно длинным.

person Benoit    schedule 18.02.2012
comment
В этой таблице нет никаких индексов или ограничений. Разве вы не говорите, что есть скрытые индексы для разбиения? - person ScrappyDev; 21.02.2012
comment
@scrappythenell: Может быть, нет… вы пробовали удалить DIRECT=TRUE и измерить продолжительность? - person Benoit; 21.02.2012
comment
Настройка DIRECT=FALSE, похоже, устранила проблему с зависанием. Теперь мне просто нужно знать, почему он зависает, когда используется DIRECT=TRUE. - person ScrappyDev; 22.02.2012
comment
Половину не понимаю, но… .com/cd/B19306_01/server.102/b14215/ldr_modes.htm - person Benoit; 22.02.2012
comment
На самом деле у вас есть ограничения на таблицу. Есть несколько столбцов, определенных как ненулевые. Oracle проверяет, что эти столбцы не являются нулевыми после вставки данных. - person Nick; 13.05.2012