使用 exp 匯出資料時,空表(無資料列)未出現在匯出檔中。
Oracle 11g 引入 deferred_segment_creation = TRUE(預設),建立空表時不立即配置 Segment(Extent),導致 exp 忽略此類表。
-- 1. 先更新統計資訊確認 NUM_ROWS=0
ANALYZE TABLE table_name COMPUTE STATISTICS;
-- 2. 產生 ALTER TABLE ... ALLOCATE EXTENT 指令
SELECT 'ALTER TABLE ' || table_name || ' ALLOCATE EXTENT;'
FROM user_tables WHERE num_rows = 0;
-- 3. 複製輸出的指令至 SQL 工具執行,再重新 exp 即可匯出空表
SELECT 'ALTER TABLE ' || table_name || ' ALLOCATE EXTENT;'
FROM user_tables WHERE num_rows = 0;
DECLARE
v_table tabs.table_name%TYPE;
v_sql VARCHAR2(888);
v_q NUMBER;
v_alter VARCHAR2(1000);
CURSOR c1 IS SELECT table_name tn FROM tabs;
TYPE c IS REF CURSOR;
c2 c;
BEGIN
DBMS_OUTPUT.PUT_LINE('以下為空資料表的表名:');
FOR r1 IN c1 LOOP
v_table := r1.tn;
v_sql := 'SELECT COUNT(*) q FROM ' || v_table;
OPEN c2 FOR v_sql;
LOOP
FETCH c2 INTO v_q;
EXIT WHEN c2%NOTFOUND;
IF v_q = 0 THEN
DBMS_OUTPUT.PUT_LINE(v_table);
v_alter := 'ALTER TABLE ' || v_table || ' ALLOCATE EXTENT';
DBMS_OUTPUT.PUT_LINE(v_alter);
-- 取消下行註解即實際執行
-- EXECUTE IMMEDIATE v_alter;
END IF;
END LOOP;
CLOSE c2;
END LOOP;
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error occurred');
END;
ALTER SYSTEM SET deferred_segment_creation = FALSE SCOPE = BOTH;
修改後需重啟資料庫實例,後續新建表即會立即配置 Segment,exp 可正常匯出空表。
SHOW PARAMETER deferred_segment_creation;