Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 LOBSEGMENT - LOBINDEX  [new]
Alert.log
Guest
Всед доброе время суток.
Вопрос состоит в следующем, по каким-то причинам LOBSEGMENT и LOBINDEX ложаться в табличное пространство USERS, а хотелось бы из держать в "своих" табличных пространствах, т.е. в тех схемах которым они принадлежат, как корректно можно их перенести?
24 апр 08, 10:05    [5588977]     Ответить | Цитировать Сообщить модератору
 Re: LOBSEGMENT - LOBINDEX  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Посмотреть синтаксис команд CREATE/ALTER TABLE
24 апр 08, 10:17    [5589032]     Ответить | Цитировать Сообщить модератору
 Re: LOBSEGMENT - LOBINDEX  [new]
влоб
Guest
LOBSEGMENT можно поместить в отдельный сегмент.
А LOBINDEX будет автоматом находится там же где LOBSEGMENT - это верно для последних версий БД, с 9i точно, скорее всего и в 8i тоже.
24 апр 08, 12:22    [5590225]     Ответить | Цитировать Сообщить модератору
 Re: LOBSEGMENT - LOBINDEX  [new]
влоб
Guest
влоб
LOBSEGMENT можно поместить в отдельный сегмент.
А LOBINDEX будет автоматом находится там же где LOBSEGMENT - это верно для последних версий БД, с 9i точно, скорее всего и в 8i тоже.


Описька - в отдельное ts.
24 апр 08, 12:23    [5590229]     Ответить | Цитировать Сообщить модератору
 Re: LOBSEGMENT - LOBINDEX  [new]
Alert.log
Guest
Вячеслав Любомудров
Посмотреть синтаксис команд CREATE/ALTER TABLE


Спасибо :) вот что получилось:
declare
lowner varchar2(100) default 'XXX';--владелец схемы
--Табличное пространство с которого перетягиваем
ltablespace_name varchar2(100) default 'USERS';
ltablespace_name_i varchar2(100) default 'USERS';
--Табличное пространство в которое перетягиваем
ttablespace_name varchar2(100) default 'AUDIT_TBS';
ttablespace_name_i varchar2(100) default 'AUDIT_TBS';

-- Перемещение таблиц в др.табличное пространство
    for c in (select 'ALTER TABLE '||owner||'.'||table_name||' MOVE TABLESPACE '||ttablespace_name
       ||' LOB ("'||column_name||'") STORE AS '|| segment_name
       ||' (TABLESPACE '||ttablespace_name||') STORAGE (INITIAL 64K)' alter_table
       from dba_lobs where tablespace_name = ltablespace_name and owner = lowner) loop
        dbms_output.put_line(c.alter_table);        
        execute immediate c.alter_table;
    end loop;
    
    for c in (select 'ALTER TABLE '||table_owner||'.'||table_name||' MOVE PARTITION '
       ||partition_name||' TABLESPACE '||ttablespace_name_i||' LOB ("'|| column_name
       || '") STORE AS '||' (TABLESPACE '||ttablespace_name_i||') STORAGE (INITIAL 64K)' alter_table
       from dba_lob_partitions where tablespace_name = ltablespace_name_i and table_owner = lowner) loop
        dbms_output.put_line(c.alter_table);        
        execute immediate c.alter_table;
    end loop;
    
    for c in (select 'ALTER TABLE '||Owner||'.'||DECODE( PARTITION_NAME, NULL, segment_name, segment_name || ':' || PARTITION_NAME) || 
    ' MOVE TABLESPACE '||ttablespace_name||' STORAGE (INITIAL 64K)' alter_table
		  	 		 from   dba_segments
					 where  tablespace_name = ltablespace_name and owner = lowner and segment_type = 'TABLE' and SEGMENT_NAME not like 'BIN$%' and 
                     segment_name not in ('SQLN_EXPLAIN_PLAN', 'PLAN_TABLE', 'DDL_LOG', 'DEF_IGROUP_TBL', 'DB_DICT_COL', 'DB_DICT_CONSTRAINT', 'DB_DICT_TRI', 'DB_DICT_VIEW')) loop
        dbms_output.put_line(c.alter_table);    	
        execute immediate c.alter_table;

    end loop;
exception
    when others then
       dbms_output.put_line(sqlcode || ' ' || sqlerrm);       
    
end;
работает, но проблема только с типом Long, но с этим по-моему всегда проблема :)
24 апр 08, 16:46    [5592336]     Ответить | Цитировать Сообщить модератору
 Re: LOBSEGMENT - LOBINDEX  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
А он нужен именно LONG? Может преобразовать его в CLOB (см. там же), большинство приложений этого не заметит, а ты от большого геморроя избавишься. Естественно, протестить надо...

А если низя, то пересоздавать (exp/imp, SQL*Plus copy, PL/SQL или OCI код)
25 апр 08, 04:31    [5594352]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить