Как перемещать таблицу из одного табличного пространства в другое в oracle 11g
Я запустил oracle 11g
и вам нужно переместить table (tbl1)
из одного tablespace (tblspc1)
в другой (tblspc2)
. Какой самый простой способ сделать это?
Ответы
Ответ 1
Попробуйте следующее: -
ALTER TABLE <TABLE NAME to be moved> MOVE TABLESPACE <destination TABLESPACE NAME>
Очень хорошее предложение от IVAN в комментариях, поэтому подумал добавить в мой ответ
Примечание: это приведет к аннулированию всех табличных индексов. Поэтому для этой команды обычно следует
alter index <owner>."<index_name>" rebuild;
Ответ 2
Используйте sql
от sql
:
вывести этот файл в файл:
select 'alter index '||owner||'.'||index_name||' rebuild tablespace TO_TABLESPACE_NAME;' from all_indexes where owner='OWNERNAME';
spoolfile будет иметь что-то вроде этого:
alter index OWNER.PK_INDEX rebuild tablespace CORRECT_TS_NAME;
Ответ 3
Перемещение таблиц:
Первый запуск:
SELECT 'ALTER TABLE <schema_name>.' || OBJECT_NAME ||' MOVE TABLESPACE '||' <tablespace_name>; '
FROM ALL_OBJECTS
WHERE OWNER = '<schema_name>'
AND OBJECT_TYPE = 'TABLE'
<> '<TABLESPACE_NAME>';
Где <schema_name>
- имя пользователя.
И <tablespace_name>
- это табличное пространство назначения.
В результате вы получите строки вроде:
ALTER TABLE SCOT.PARTS MOVE TABLESPACE USERS;
Вставьте результаты в script или в приложение разработчика asacle sql, например, и запустите его.
Перемещение индексов:
Первый запуск:
SELECT 'ALTER INDEX <schema_name>.'||INDEX_NAME||' REBUILD TABLESPACE <tablespace_name>;'
FROM ALL_INDEXES
WHERE OWNER = '<schema_name>'
AND TABLESPACE_NAME NOT LIKE '<tablespace_name>';
Последняя строка в этом коде может сэкономить вам много времени, поскольку она отфильтровывает индексы, которые уже находятся в правильном табличном пространстве.
В результате вы должны получить что-то вроде:
ALTER INDEX SCOT.PARTS_NO_PK ПОЛЬЗОВАТЕЛИ TABLESPACE REBUILD;
Вставьте результаты в script или в приложение разработчика asacle sql, например, и запустите его.
И последнее, но не менее важное: перемещение LOB:
Первый запуск:
SELECT 'ALTER TABLE <schema_name>.'||LOWER(TABLE_NAME)||' MOVE LOB('||LOWER(COLUMN_NAME)||') STORE AS (TABLESPACE <table_space>);'
FROM DBA_TAB_COLS
WHERE OWNER = '<schema_name>' AND DATA_TYPE like '%LOB%';
Это перемещает объекты LOB в другое табличное пространство.
В результате вы должны получить что-то вроде:
ALTER TABLE SCOT.bin $6t926o3phqjgqkjabaetqg == $0 MOVE LOB (календарь) STORE AS (ПОЛЬЗОВАТЕЛИ TABLESPACE);
Вставьте результаты в script или в приложение разработчика asacle sql, например, и запустите его.
O, и есть еще одна вещь:
По какой-то причине мне не удалось переместить индексы типа DOMAIN. В качестве работы я сбросил индекс. изменили табличное пространство по умолчанию пользователя в нужное табличное пространство. а затем снова воссоздайте индекс.
Есть лучший способ, но это сработало для меня.
Ответ 4
Попробуйте переместить таблицу (tbl1) в табличное пространство (tblspc2).
alter table tb11 move tablespace tblspc2;