2014-03-13 19 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;