powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как завершить отсоединение партиции (Asynchronous Partition Detach) ?
5 сообщений из 5, страница 1 из 1
Как завершить отсоединение партиции (Asynchronous Partition Detach) ?
    #40008123
AVRomanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, столкнулся с неприятной проблемой, которая тормозит работу.
В базе в разрезе таблицы организовано партицированное хранение данных (ежедневное)
появилась необходимость очистки старых данных. Бала написана процедура для автоматического отсоединение партиции от таблицы и удалении ненужных данных.
но довольно часто в последнее время возникает одна ошибка:
Код: plaintext
1.
SQL20285N  The statement or command is not allowed because the table named "TABLE_DETACHED" has detached dependents or the asynchronous partition detach operation is not complete. Reason code = "2".
Может быть кто-то подскажет, как можно побороть эту проблему?
тайминг между следующим запуском процедуры может быть от нескольких секунд до нескольких минут. в процедуре уже был предусмотрен таймер, который следующую партицию отсоединяет через несколько секунд.
Есть ли другие варианты, чтобы избавиться в принципе от этого?
...
Рейтинг: 0 / 0
Как завершить отсоединение партиции (Asynchronous Partition Detach) ?
    #40008133
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AVRomanenko,

Попробуйте так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
--#SET TERMINATOR @
BEGIN
  DECLARE V_LTIMEOUT, V_DUMMY INT;
  DECLARE V_TABSCHEMA, V_TABNAME VARCHAR(128);
  DECLARE SQLSTATE CHAR(5);
  DECLARE CONTINUE HANDLER FOR SQLSTATE '40001' BEGIN END;

  SET V_TABSCHEMA='MYSCHEMA', V_TABNAME='MYNAME'; -- Имя таблицы, где отключается секция
  VALUES CURRENT LOCK TIMEOUT INTO V_LTIMEOUT;
  SET CURRENT LOCK TIMEOUT 0;

  L1: LOOP
    SELECT 1 INTO V_DUMMY
    FROM SYSCAT.DATAPARTITIONS
    WHERE TABSCHEMA = V_TABSCHEMA AND TABNAME = V_TABNAME AND STATUS IN ('D', 'L')
    FETCH FIRST 1 ROW ONLY
    WITH CS;
    IF SQLSTATE = '02000' THEN LEAVE L1; END IF;
    CALL DBMS_ALERT.SLEEP(3);
  END LOOP L1;
  SET CURRENT LOCK TIMEOUT V_LTIMEOUT;
END@


DETACH - операция асинхронная. Надо ждать, пока не пропадут записи из системного каталога, указывающие на то, что операции обслуживания не закончились.
...
Рейтинг: 0 / 0
Как завершить отсоединение партиции (Asynchronous Partition Detach) ?
    #40008567
AVRomanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein, а можете, пожалуйста, пояснить, что именно делает этот код, и в каком месте его можно использовать. то есть, в BEGIN у меня сразу начинает работать цикл по курсору.
вот полный код процедуры
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
SET CURRENT SCHEMA = DB2INBVB;

SET CURRENT PATH = SYSIBM,SYSFUN,SYSPROC,SYSIBMADM,DB2INBVB;

CREATE OR REPLACE PROCEDURE BVEB_ATOM.DROP_OLD_PARTITIONED_DATA (
    START_DATE IN	VARCHAR(10),
    END_DATE IN	VARCHAR(10),
    SCHEMA_NAME IN	VARCHAR(50),
    TABLE_NAME IN	VARCHAR(50),
    PARTITION_PREFIX IN	VARCHAR(100) )
IS
  /*ПЕРЕМЕННЫЕ ПРОЦЕДУРЫ*/
  DECLARE
  
    /*СГЕНЕРИРОВАННЫЙ SQL*/
    V_EXEC_SQL VARCHAR(1000);
    
    /*ИМЯ ТАБЛИЦЫ, В КОТОРУЮ БУДЕМ ПЕРЕНОСИТЬ ПАРТИЦИЮ*/
    V_DETACHED_TABLE_NAME VARCHAR(200); 
    
    /*ИМЯ ПАРТИЦИИ*/
    V_PARTITION_NAME VARCHAR(200);

    /*ИМЯ ПЕРЕМЕННОЙ ТЕКУЩЕГО СИСТЕМНОГО ВРЕМЕНИ*/
    V_NOW TIMESTAMP;
    
    /*ИМЯ ПЕРЕМЕННОЙ ВРЕМЕНИ = ТЕКУЩЕЕ СИСТЕМНОЕ + N СЕКУНД*/
    V_NOW_PLUS_N_SEC TIMESTAMP;
    
  /*СОЗДАЕМ КУРСОВ ДЛЯ МАССИВА ДАТ*/  
  CURSOR C_TABS IS 

    SELECT
      CDR_DT_ID,
      CDR_DT
    FROM BVEB_DWH.CDR_DT
    WHERE      
      CDR_DT BETWEEN DATE(START_DATE) AND DATE(END_DATE)
    ORDER BY
      CDR_DT_ID;
                    
BEGIN

  /*ПОЛУЧАЕМ ИМЯ ТАБЛИЦЫ, В КОТОРУЮ БУДЕМ ПЕРЕНОСИТЬ ПАРТИЦИЮ*/
  V_DETACHED_TABLE_NAME := TABLE_NAME || '_DETACHED';   
  
    FOR TAB IN C_TABS LOOP
  
      /*ПОЛУЧАЕМ ПОЛНОЕ ИМЯ ПАРТИЦИИ*/
        V_PARTITION_NAME := PARTITION_PREFIX || TAB.CDR_DT_ID;       
                  
        IF EXISTS (SELECT 1 FROM SYSCAT.DATAPARTITIONS WHERE TABSCHEMA = SCHEMA_NAME AND TABNAME = TABLE_NAME AND DATAPARTITIONNAME = V_PARTITION_NAME) 
          THEN
          
            IF EXISTS (SELECT 1 FROM SYSCAT.TABLES WHERE TYPE = 'T' AND TABSCHEMA = SCHEMA_NAME AND TABNAME = V_DETACHED_TABLE_NAME) 
          THEN
            V_EXEC_SQL := 'DROP TABLE ' || SCHEMA_NAME || '.' || V_DETACHED_TABLE_NAME;
          
            /*ЗАПИСЬ ПОЛУЧИВШЕГОСЯ В ЛОГ*/    
            --TRUNCATE TEST.LOG_NEW_2;    
            --INSERT INTO TEST.LOG_NEW_2(SQL) VALUES(V_EXEC_SQL);
          
            EXECUTE IMMEDIATE V_EXEC_SQL;
        END IF;
            V_EXEC_SQL := 'ALTER TABLE ' || SCHEMA_NAME || '.' || TABLE_NAME || ' DETACH PARTITION ' || V_PARTITION_NAME || ' INTO ' || SCHEMA_NAME || '.' || V_DETACHED_TABLE_NAME;
          
            --TRUNCATE TEST.LOG_NEW_2;  
            --INSERT INTO TEST.LOG_NEW_2(SQL) VALUES(V_EXEC_SQL);
            
            EXECUTE IMMEDIATE V_EXEC_SQL; 
          
          COMMIT;             

          -------------- ТАЙМИНГ ДЛЯ ОЖИДАНИЯ ОТСОЕДИНЕНИЯ ПАРТИЦИИ И РАЗБЛОКИРОВКИ ТАБЛИЦЫ --------------
          
          SELECT SYSDATE + 5 SECOND INTO V_NOW_PLUS_N_SEC FROM DUAL;
          
          /*ЦИКЛ ДЛЯ ОПРЕДЕЛЕНИЯ ТЕКУЩЕГО ВРЕМЕНИ*/
          LOOP
            SELECT SYSDATE INTO V_NOW FROM DUAL;
            
            /*УСЛОВИЕ ДЛЯ ЗАВЕРШЕНИЯ ЦИКЛА, КОГДА ТЕКУЩЕЕ ВРЕМЯ СТАНЕТ БОЛЬШЕ ИЛИ РАВНО УСТАНОВЛЕННОМУ*/
            EXIT WHEN V_NOW >= V_NOW_PLUS_N_SEC;
          END LOOP;
          
          -------------------------------------------------------------------------------------------------
  
        END IF;
        
        COMMIT;
        
    END LOOP;
     
END;
...
Рейтинг: 0 / 0
Как завершить отсоединение партиции (Asynchronous Partition Detach) ?
    #40008653
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AVRomanenko,

Код можно использовать после DETACH и COMMIT.
Код тормозит выполнение до тех пор, пока таблицу с отключённой секцией не станет возможным удалить.
Предполагается, что на секционированную таблицу не выдаётся несколько параллельных отключений разных секций. Иначе код надо модифицировать так, чтоб предварительно запоминать ID отключаемой секции (не имя), и использовать этот запомненный ID дополнительным предикатом при проверке статусов.

Иными словами: нельзя удалять таблицу с отключённой секцией, пока в системном каталоге есть запись про эту секцию с одним из указанных статусов в составе секционированной таблицы.
...
Рейтинг: 0 / 0
Как завершить отсоединение партиции (Asynchronous Partition Detach) ?
    #40011927
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AVRomanenko
Здравствуйте, столкнулся с неприятной проблемой, которая тормозит работу.
В базе в разрезе таблицы организовано партицированное хранение данных (ежедневное)
появилась необходимость очистки старых данных. Бала написана процедура для автоматического отсоединение партиции от таблицы и удалении ненужных данных.
но довольно часто в последнее время возникает одна ошибка:
Код: plaintext
1.
SQL20285N  The statement or command is not allowed because the table named "TABLE_DETACHED" has detached dependents or the asynchronous partition detach operation is not complete. Reason code = "2".
Может быть кто-то подскажет, как можно побороть эту проблему?
тайминг между следующим запуском процедуры может быть от нескольких секунд до нескольких минут. в процедуре уже был предусмотрен таймер, который следующую партицию отсоединяет через несколько секунд.
Есть ли другие варианты, чтобы избавиться в принципе от этого?
Несколько с задержкой, но...

А на уровне аппликации данные чистятся? Если да, то присмотритесь к Insert Time Clustering таблицам.
Я так понимаю, данные у вас "исторические" (логи в том или ином виде). Они и пишутся как в режиме "APPEND", и удаляются, наверное, в порядке добавления.
ITC дадут:
- co-location последовательно приходящих записей. Они и добавляться, и последовательно читаться, и, что тоже важно, удаляться будут существенно быстрее.
- возможность откусывать освободившиеся экстенты он-лайн реоргом с опцией "RECLAIM EXTENTS ONLY ALLOW WRITE ACCESS"
- но в принципе и reclaim не нужен, т.к. оказавшись пустыми экстенты ре-используются.

По внутренним механизмам ITC таблицы работают на движке MDC таблиц, вот только отсутствует риск получить непредсказуемо большое количество почти пустых/полу-пустых экстентов/групп экстентов (по измерениям с большим количеством значений) - записи не разбрасываются, а "пакуются" в страницы/экстенты одна за одной.

Смотреть - поссылкам про ITC из доки - https://www.ibm.com/support/knowledgecenter/SSEPGG_11.5.0/com.ibm.db2.luw.admin.partition.doc/doc/c0007201.html
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как завершить отсоединение партиции (Asynchronous Partition Detach) ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]