Sometimes need to move objects from one Tablespace to another in Oracle Databases. We can do this multiple ways.
- Move a single object from Multiple Tablespace (one TBS for DATA, another for Index and LOB) to different set of Tablespace
- Move all objects of a schema from Multiple Tablespace (one TBS for DATA, another for Index and LOB) to different set of Tablespace
- Move all objects from one Tablespace to another Tablespace
Script for moving a single object to one/multiple Tablespace
Instruction to execute the Script:
This is recommended and best practices to use separate tablespace for DATA, Index and LOB Segment.
- 1st Input : Object Owner Name
- 2nd Input: Object Name
- 3rd Input: Target Tablespace Name for DATA
- 4th Input: Target Tablespace Name for INDEX
- 5th Input: Target Tablespace Name for LOB
- 6th Input: Enter “EXECUTE” or 1 to Execute Command Immediately Or Enter “SHOW” to Show / Generate Command as output.
NOTE::: If same tablespace for DATA, INDEX and LOB then provide same tablespace name for all inputs [3-5]
set serveroutput on
set lines 350
DECLARE
V_OWNER VARCHAR2(60);
V_OBJECT_NAME VARCHAR2(60);
V_NEW_TBS_DATA VARCHAR2(60);
V_NEW_TBS_IDX VARCHAR2(60);
V_NEW_TBS_LOB VARCHAR2(60);
V_SQL VARCHAR2(1500);
V_OVERFLOW NUMBER := 0;
V_EXECUTE_SHOW VARCHAR2(50) := 'SHOW';
V_TABLE VARCHAR2(30);
V_IOT VARCHAR2(60);
BEGIN
V_OWNER := UPPER('&OWNER');
V_OBJECT_NAME := UPPER('&OBJECT_NAME');
V_NEW_TBS_DATA := UPPER('&NEW_TBS_DATA');
V_NEW_TBS_IDX := UPPER('&NEW_TBS_IDX');
V_NEW_TBS_LOB := UPPER('&NEW_TBS_LOB');
V_EXECUTE_SHOW := UPPER('&execute_or_show_code');
IF (V_EXECUTE_SHOW = 'EXECUTE' OR V_EXECUTE_SHOW = '1') THEN
DBMS_OUTPUT.PUT_LINE('YOU HAVE CHOSEN EXECUTE.');
ELSE
DBMS_OUTPUT.PUT_LINE('YOU HAVE CHOSEN GENERATE COMMAND/CODE.');
END IF;
DBMS_OUTPUT.PUT_LINE('MOVING TABLES TO ' || V_NEW_TBS_DATA || ' TABLESPACE:');
DBMS_OUTPUT.PUT_LINE('---------------------------------------------------------------------');
SELECT OWNER, TABLE_NAME, IOT_NAME INTO V_OWNER, V_TABLE, V_IOT FROM DBA_TABLES WHERE OWNER=V_OWNER AND TABLE_NAME=V_OBJECT_NAME;
IF V_IOT IS NOT NULL THEN
V_SQL := 'ALTER TABLE "' || V_OWNER || '"."' || V_IOT || '" MOVE TABLESPACE ' || V_NEW_TBS_DATA || ';';
IF (V_EXECUTE_SHOW = 'EXECUTE' OR V_EXECUTE_SHOW = '1') THEN
EXECUTE IMMEDIATE V_SQL;
ELSE
DBMS_OUTPUT.PUT_LINE(V_SQL);
END IF;
-- CHECKING OVERFLOW
DBMS_OUTPUT.PUT_LINE('MOVING INDEX ORGANIZED TABLE OVERFLOW ' || V_IOT || '...');
V_SQL := 'ALTER TABLE "' || V_TABLE || '"."' || V_IOT || '" MOVE OVERFLOW TABLESPACE ' || V_NEW_TBS_DATA || ';';
IF (V_EXECUTE_SHOW = 'EXECUTE' OR V_EXECUTE_SHOW = '1') THEN
EXECUTE IMMEDIATE V_SQL;
ELSE
DBMS_OUTPUT.PUT_LINE(V_SQL);
END IF;
ELSE
V_SQL := 'ALTER TABLE "' || V_OWNER || '"."' || V_TABLE || '" MOVE TABLESPACE ' || V_NEW_TBS_DATA || ';';
IF (V_EXECUTE_SHOW = 'EXECUTE' OR V_EXECUTE_SHOW = '1') THEN
EXECUTE IMMEDIATE V_SQL;
ELSE
DBMS_OUTPUT.PUT_LINE(V_SQL);
END IF;
END IF;
DBMS_OUTPUT.PUT_LINE(' ');
DBMS_OUTPUT.PUT_LINE('MOVING LOBS TO ' || V_NEW_TBS_DATA || ' TABLESPACE:');
DBMS_OUTPUT.PUT_LINE('---------------------------------------------------------------------');
FOR LIST_LOBS IN (SELECT OWNER, TABLE_NAME, COLUMN_NAME FROM DBA_LOBS WHERE OWNER=V_OWNER AND TABLE_NAME=V_OBJECT_NAME)
LOOP
V_SQL := 'ALTER TABLE ' || V_OWNER || '.' || LIST_LOBS.TABLE_NAME || ' MOVE LOB(' || LIST_LOBS.COLUMN_NAME || ') STORE AS (TABLESPACE ' || V_NEW_TBS_LOB || ';)';
IF (V_EXECUTE_SHOW = 'EXECUTE' OR V_EXECUTE_SHOW = '1') THEN
EXECUTE IMMEDIATE V_SQL;
ELSE
DBMS_OUTPUT.PUT_LINE(V_SQL);
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
DBMS_OUTPUT.PUT_LINE('MOVING INDEXES TO ' || V_NEW_TBS_IDX || ' TABLESPACE:');
DBMS_OUTPUT.PUT_LINE('---------------------------------------------------------------------');
FOR LIST_INDEXES IN (SELECT INDEX_OWNER, TABLE_NAME, INDEX_NAME FROM ALL_IND_COLUMNS WHERE TABLE_NAME = UPPER(V_OBJECT_NAME) AND TABLE_OWNER = UPPER(V_OWNER))
LOOP
V_SQL := 'ALTER INDEX ' || LIST_INDEXES.INDEX_OWNER || '."' || LIST_INDEXES.INDEX_NAME || '" REBUILD TABLESPACE ' || V_NEW_TBS_IDX || ';';
IF (V_EXECUTE_SHOW = 'EXECUTE' OR V_EXECUTE_SHOW = '1') THEN
EXECUTE IMMEDIATE V_SQL;
ELSE
DBMS_OUTPUT.PUT_LINE(V_SQL);
END IF;
END LOOP;
END;
/
Script for moving all objects of a schema to one/multiple Tablespace
- 1st Input : Object Owner Name
- 2nd Input: Target Tablespace Name for DATA
- 3rd Input: Target Tablespace Name for INDEX
- 4th Input: Target Tablespace Name for LOB
- 5th Input: Enter “EXECUTE” or 1 to Execute Command Immediately Or Enter “SHOW” to Show / Generate Command as output.
NOTE::: If same tablespace for DATA, INDEX and LOB then provide same tablespace name for all inputs [2-4]
set serveroutput on
set lines 350
DECLARE
V_OWNER VARCHAR2(60);
V_CURR_TBS VARCHAR2(60);
V_NEW_TBS_DATA VARCHAR2(60);
V_NEW_TBS_IDX VARCHAR2(60);
V_NEW_TBS_LOB VARCHAR2(60);
V_SQL VARCHAR2(1500);
V_OVERFLOW NUMBER := 0;
V_EXECUTE_SHOW VARCHAR2(20) := 'SHOW';
BEGIN
V_OWNER := UPPER('&OWNER');
V_NEW_TBS_DATA := UPPER('&NEW_TBS_DATA');
V_NEW_TBS_IDX := UPPER('&NEW_TBS_IDX');
V_NEW_TBS_LOB := UPPER('&NEW_TBS_LOB');
V_EXECUTE_SHOW := UPPER('&execute_or_show_code');
IF (V_EXECUTE_SHOW = 'EXECUTE' OR V_EXECUTE_SHOW = '1') THEN
DBMS_OUTPUT.PUT_LINE('YOU HAVE CHOSEN EXECUTE.');
ELSE
DBMS_OUTPUT.PUT_LINE('YOU HAVE CHOSEN GENERATE COMMAND/CODE.');
END IF;
DBMS_OUTPUT.PUT_LINE('MOVING TABLES TO ' || V_NEW_TBS_DATA || ' TABLESPACE:');
DBMS_OUTPUT.PUT_LINE('---------------------------------------------------------------------');
FOR LIST_TABLES IN (SELECT OWNER, TABLE_NAME, IOT_NAME FROM DBA_TABLES WHERE OWNER=V_OWNER)
LOOP
IF LIST_TABLES.IOT_NAME IS NOT NULL THEN
V_SQL := 'ALTER TABLE "' || LIST_TABLES.OWNER || '"."' || LIST_TABLES.IOT_NAME || '" MOVE TABLESPACE ' || V_NEW_TBS_DATA || ';';
IF (V_EXECUTE_SHOW = 'EXECUTE' OR V_EXECUTE_SHOW = '1') THEN
EXECUTE IMMEDIATE V_SQL;
ELSE
DBMS_OUTPUT.PUT_LINE(V_SQL);
END IF;
-- CHECKING OVERFLOW
DBMS_OUTPUT.PUT_LINE('MOVING INDEX ORGANIZED TABLE OVERFLOW ' || LIST_TABLES.IOT_NAME || '...');
V_SQL := 'ALTER TABLE "' || LIST_TABLES.OWNER || '"."' || LIST_TABLES.IOT_NAME || '" MOVE OVERFLOW TABLESPACE ' || V_NEW_TBS_DATA || ';';
IF (V_EXECUTE_SHOW = 'EXECUTE' OR V_EXECUTE_SHOW = '1') THEN
EXECUTE IMMEDIATE V_SQL;
ELSE
DBMS_OUTPUT.PUT_LINE(V_SQL);
END IF;
ELSE
V_SQL := 'ALTER TABLE "' || LIST_TABLES.OWNER || '"."' || LIST_TABLES.TABLE_NAME || '" MOVE TABLESPACE ' || V_NEW_TBS_DATA || ';';
IF (V_EXECUTE_SHOW = 'EXECUTE' OR V_EXECUTE_SHOW = '1') THEN
EXECUTE IMMEDIATE V_SQL;
ELSE
DBMS_OUTPUT.PUT_LINE(V_SQL);
END IF;
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
DBMS_OUTPUT.PUT_LINE('MOVING LOBS TO ' || V_NEW_TBS_LOB || ' TABLESPACE:');
DBMS_OUTPUT.PUT_LINE('---------------------------------------------------------------------');
FOR LIST_LOBS IN (SELECT OWNER, TABLE_NAME, COLUMN_NAME FROM DBA_LOBS WHERE OWNER=V_OWNER)
LOOP
V_SQL := 'ALTER TABLE "' || LIST_LOBS.OWNER || '"."' || LIST_LOBS.TABLE_NAME || '" MOVE LOB(' || LIST_LOBS.COLUMN_NAME || ') STORE AS (TABLESPACE ' || V_NEW_TBS_LOB || ';)';
IF (V_EXECUTE_SHOW = 'EXECUTE' OR V_EXECUTE_SHOW = '1') THEN
EXECUTE IMMEDIATE V_SQL;
ELSE
DBMS_OUTPUT.PUT_LINE(V_SQL);
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
DBMS_OUTPUT.PUT_LINE('MOVING INDEXES TO ' || V_NEW_TBS_IDX || ' TABLESPACE:');
DBMS_OUTPUT.PUT_LINE('---------------------------------------------------------------------');
FOR LIST_INDEXES IN (SELECT OWNER, SEGMENT_NAME, SEGMENT_TYPE FROM DBA_SEGMENTS WHERE OWNER=V_OWNER AND SEGMENT_TYPE='INDEX')
LOOP
V_SQL := 'ALTER INDEX "' || LIST_INDEXES.OWNER || '"."' || LIST_INDEXES.SEGMENT_NAME || '" REBUILD TABLESPACE ' || V_NEW_TBS_IDX || ';';
IF (V_EXECUTE_SHOW = 'EXECUTE' OR V_EXECUTE_SHOW = '1') THEN
EXECUTE IMMEDIATE V_SQL;
ELSE
DBMS_OUTPUT.PUT_LINE(V_SQL);
END IF;
END LOOP;
END;
/
Script for moving all objects of a Tablespace to another Tablespace:
Enter value for current_tablespace: TS_DATA01
old 8: V_CURRENT_TABLESPACE := UPPER('¤t_tablespace');
new 8: V_CURRENT_TABLESPACE := UPPER('TS_DATA01');
Enter value for new_tablespace: TS_DATA
old 9: V_NEW_TABLESPACE := UPPER('&new_tablespace');
new 9: V_NEW_TABLESPACE := UPPER('TS_DATA');
Enter value for execute_or_show: SHOW
old 11: V_EXECUTE_SHOW := UPPER('&execute_or_show_');
new 11: V_EXECUTE_SHOW := UPPER('SHOW');
- 1st Input : Current Tablespace Name
- 2nd Input: New / Target Tablespace Name
- 3rd Input: Enter “EXECUTE” or 1 to Execute Command Immediately Or Enter “SHOW” to Show / Generate Command as output.
set serveroutput on
set lines 350
DECLARE
V_CURRENT_TABLESPACE VARCHAR2(60);
V_NEW_TABLESPACE VARCHAR2(60);
V_SQL VARCHAR2(1500);
V_OVERFLOW NUMBER := 0;
V_EXECUTE_SHOW VARCHAR2(50) := 'SHOW';
BEGIN
V_CURRENT_TABLESPACE := UPPER('¤t_tablespace');
V_NEW_TABLESPACE := UPPER('&new_tablespace');
V_EXECUTE_SHOW := UPPER('&execute_or_show_code');
IF (V_EXECUTE_SHOW = 'EXECUTE' OR V_EXECUTE_SHOW = '1') THEN
DBMS_OUTPUT.PUT_LINE('YOU HAVE CHOSEN EXECUTE.');
ELSE
DBMS_OUTPUT.PUT_LINE('YOU HAVE CHOSEN GENERATE COMMAND/CODE.');
END IF;
FOR LIST_OWNER IN (SELECT DISTINCT OWNER FROM DBA_SEGMENTS WHERE TABLESPACE_NAME=V_CURRENT_TABLESPACE)
LOOP
DBMS_OUTPUT.PUT_LINE('MOVING TABLES FROM TABLESPACE ' || V_CURRENT_TABLESPACE || ' TO ' || V_NEW_TABLESPACE || ':');
DBMS_OUTPUT.PUT_LINE('---------------------------------------------------------------------');
FOR LIST_TABLES IN (SELECT TABLE_NAME, IOT_NAME FROM DBA_TABLES WHERE OWNER=LIST_OWNER.OWNER AND TABLESPACE_NAME=V_CURRENT_TABLESPACE)
LOOP
IF LIST_TABLES.IOT_NAME IS NOT NULL THEN
V_SQL := 'ALTER TABLE "' || LIST_OWNER.OWNER || '"."' || LIST_TABLES.IOT_NAME || '" MOVE TABLESPACE ' || V_NEW_TABLESPACE || ';';
IF (V_EXECUTE_SHOW = 'EXECUTE' OR V_EXECUTE_SHOW = '1') THEN
EXECUTE IMMEDIATE V_SQL;
ELSE
DBMS_OUTPUT.PUT_LINE(V_SQL);
END IF;
-- CHECKING OVERFLOW
V_SQL := 'ALTER TABLE "' || LIST_OWNER.OWNER || '"."' || LIST_TABLES.IOT_NAME || '" MOVE OVERFLOW TABLESPACE ' || V_NEW_TABLESPACE || ';';
IF (V_EXECUTE_SHOW = 'EXECUTE' OR V_EXECUTE_SHOW = '1') THEN
EXECUTE IMMEDIATE V_SQL;
ELSE
DBMS_OUTPUT.PUT_LINE(V_SQL);
END IF;
ELSE
V_SQL := 'ALTER TABLE "' || LIST_OWNER.OWNER || '"."' || LIST_TABLES.TABLE_NAME || '" MOVE TABLESPACE ' || V_NEW_TABLESPACE || ';';
IF (V_EXECUTE_SHOW = 'EXECUTE' OR V_EXECUTE_SHOW = '1') THEN
EXECUTE IMMEDIATE V_SQL;
ELSE
DBMS_OUTPUT.PUT_LINE(V_SQL);
END IF;
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
DBMS_OUTPUT.PUT_LINE('MOVING LOBS FROM TABLESPACE ' || V_CURRENT_TABLESPACE || ' TO ' || V_NEW_TABLESPACE || ':');
DBMS_OUTPUT.PUT_LINE('---------------------------------------------------------------------');
FOR LIST_LOBS IN (SELECT TABLE_NAME, COLUMN_NAME FROM DBA_LOBS WHERE OWNER=LIST_OWNER.OWNER AND TABLESPACE_NAME=V_CURRENT_TABLESPACE)
LOOP
V_SQL := 'ALTER TABLE ' || LIST_OWNER.OWNER || '.' || LIST_LOBS.TABLE_NAME || ' MOVE LOB(' || LIST_LOBS.COLUMN_NAME || ') STORE AS (TABLESPACE ' || V_NEW_TABLESPACE || ';)';
IF (V_EXECUTE_SHOW = 'EXECUTE' OR V_EXECUTE_SHOW = '1') THEN
EXECUTE IMMEDIATE V_SQL;
ELSE
DBMS_OUTPUT.PUT_LINE(V_SQL);
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
DBMS_OUTPUT.PUT_LINE('MOVING INDEXES FROM TABLESPACE ' || V_CURRENT_TABLESPACE || ' TO ' || V_NEW_TABLESPACE || ':');
DBMS_OUTPUT.PUT_LINE('---------------------------------------------------------------------');
FOR LIST_INDEXES IN (SELECT SEGMENT_NAME, SEGMENT_TYPE FROM DBA_SEGMENTS WHERE OWNER=LIST_OWNER.OWNER AND TABLESPACE_NAME=V_CURRENT_TABLESPACE AND SEGMENT_TYPE='INDEX')
LOOP
V_SQL := 'ALTER INDEX ' || LIST_OWNER.OWNER || '."' || LIST_INDEXES.SEGMENT_NAME || '" REBUILD TABLESPACE ' || V_NEW_TABLESPACE || ';';
IF (V_EXECUTE_SHOW = 'EXECUTE' OR V_EXECUTE_SHOW = '1') THEN
EXECUTE IMMEDIATE V_SQL;
ELSE
DBMS_OUTPUT.PUT_LINE(V_SQL);
END IF;
END LOOP;
END LOOP;
END;
/

