2014-03-13 18 views
1

我想從我們的生產數據庫創建一個「創建表空間」腳本。我已經嘗試過這導致了ORA-31603的情況如下:生成「創建表空間」腳本沒有dbms_metadata.get_ddl

select dbms_metadata.get_ddl('TABLESPACE',tablespace_name) from dba_tablespaces where tablespace_name != 'SYSTEM'

google搜索,我發現我需要的SELECT_CATALOG_ROLE使用dbms_metadata.get_ddl後。我擁有的是訪問DBA_TABLESPACES

問題:有沒有辦法生成「創建表空間」-script而不使用SELECT_CATALOG_ROLE僅使用DBA_TABLESPACES

我會自己寫腳本,但我真的不知道如何解釋select * from DBA_TABLESPACES(AUOTEXTEND開或關,初始尺寸等等)給出的信息。

回答

1

自動延伸和尺寸的詳細信息可以在DBA_DATA_FILES表中找到。如果表空間不是BIGFILE表,則表空間可以具有多個具有不同大小和屬性的文件。

的一個簡單的創建腳本(在11g中)不採取最特殊的功能考慮在內(所以請檢查你的表空間的詳細信息,如壓縮和加密,並將它們添加相應的腳本。看到完整的CREATE TABLESPACE參考here)的一個例子 - 並且一如既往地徹底地測試。不包括UNDOTEMP表空間:

SELECT 'CREATE ' 
     || DECODE (ts.bigfile, 'YES', 'BIGFILE ') --assuming smallfile is the default table space 
     || 'TABLESPACE "' 
     || ts.tablespace_name 
     || '" DATAFILE' --assuming OMF (Oracle-Managed File names) is used 
     || CHR (13) 
     || CHR (10) 
     || LISTAGG (
        ' SIZE ' 
       || df.bytes 
       || DECODE (
        df.autoextensible, 
        'YES', CHR (13) 
          || CHR (10) 
          || ' AUTOEXTEND ON NEXT ' 
          || df.increment_by * ts.block_size 
          || ' MAXSIZE ' 
          || CASE 
            WHEN maxbytes < POWER (1024, 3) * 2 
            THEN 
            TO_CHAR (maxbytes) 
            ELSE 
             TO_CHAR (
              FLOOR (maxbytes/POWER (1024, 2))) 
            || 'M' 
           END), 
       ',' || CHR (13) || CHR (10)) 
      WITHIN GROUP (ORDER BY df.file_id) 
     || CHR (13) 
     || CHR (10) 
     || ' ' 
     || ts.logging 
     || ' ' 
     || ts.status 
     || ' BLOCKSIZE ' 
     || ts.block_size 
      ddl 
    FROM dba_tablespaces ts 
     INNER JOIN 
      dba_data_files df 
     ON ts.tablespace_name = df.tablespace_name 
    WHERE ts.contents = 'PERMANENT' --excludes UNDO and TEMP 
GROUP BY ts.tablespace_name, 
     ts.bigfile, 
     ts.logging, 
     ts.status, 
     ts.block_size 
ORDER BY ts.tablespace_name; 

如果你在一個表空間中多個數據文件中考慮將其更改爲一個BIGFILE表空間。

0

如果您知道數據文件路徑併爲它們指定與其表空間相同的名稱,這很有用。 如果需要,它也會生成一些表空間。

SELECT 'CREATE ' 
     || DECODE (ts.bigfile, 'YES', 'BIGFILE ') --assuming smallfile is the default table space 
     || 'TABLESPACE "' 
     || ts.tablespace_name 
     || '" DATAFILE ''C:\Oracle\oradata\yourDATABASEname\'|| ts.tablespace_name || '.DBF''' 
     || CHR (13) 
     || CHR (10) 
     || LISTAGG (
        ' SIZE ' 
       || df.bytes 
       || DECODE (
         df.autoextensible, 
         'YES', CHR (13) 
           || CHR (10) 
           || ' AUTOEXTEND ON NEXT ' 
           || df.increment_by * ts.block_size 
           || ' MAXSIZE ' 
           || CASE 
            WHEN maxbytes < POWER (1024, 3) * 2 
            THEN 
             TO_CHAR (maxbytes) 
            ELSE 
              TO_CHAR (
               FLOOR (
                maxbytes/POWER (1024, 2))) 
             || 'M' 
           END), 
       ',' || CHR (13) || CHR (10)) 
      WITHIN GROUP (ORDER BY df.file_id) 
     || CHR (13) 
     || CHR (10) 
     || ' ' 
     || ts.logging 
     || ' ' 
     || ts.status 
     || ' BLOCKSIZE ' 
     || ts.block_size 
      ddl 
    FROM dba_tablespaces ts 
     INNER JOIN dba_data_files df 
      ON ts.tablespace_name = df.tablespace_name 
    WHERE  ts.contents = 'PERMANENT'    --excludes UNDO and TEMP 
     AND ts.tablespace_name IN ('YOUR_TABLESPACE LIST') 
GROUP BY ts.tablespace_name, 
     ts.bigfile, 
     ts.logging, 
     ts.status, 
     ts.block_size 
ORDER BY ts.tablespace_name;