Tablespace extract sql

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Script SQL*Plus de diagnostic (Tablespaces)
Voir aussi Tablespace size · Tablespaces infos

Tablespace extract sql génère, à partir des tablespaces existants d'une base, les ordres CREATE TABLESPACE ... DATAFILE ... AUTOEXTEND ON MAXSIZE ... permettant de recréer la même structure de tablespaces (mêmes tailles et mêmes limites d'autoextension) sur une autre base — utile pour préparer un environnement cible avant un import/restore, sans dépendre d'un export DBMS_METADATA complet.

Le script exclut par défaut les tablespaces systèmes (SYSTEM, SYSAUX, UNDO*) et quelques tablespaces génériques (USERS, tablespaces temporaires nommés TEMP_*) : à adapter selon la convention de nommage de l'environnement. La version ci-dessous cible un stockage ASM (pas de chemin de fichier explicite dans le DATAFILE) ; une variante en commentaire permettait de générer un chemin de fichier explicite pour un stockage classique.

Script

-- Génère les ordres CREATE TABLESPACE (taille + autoextend) à partir des
-- tablespaces existants, pour reconstituer la même structure ailleurs.
-- Version ASM (pas de chemin de datafile explicite).

host rm -f create_tbs_dat.sql
SET echo off
SET lines 150
SET feedback off
SET pages 0

SPOOL create_tbs_dat.sql

-- Variante fichier système (hors ASM), à adapter au point de montage cible :
-- select 'create tablespace '||a.tablespace_name||' datafile '''
--        ||'/u01/app/oracle/oradata/<SID>/'||lower(a.tablespace_name)||'01.dbf'''
--        ||' size '||nvl(round(sum(b.bytes)/1024/1024),0)||'M autoextend on maxsize '
--        ||nvl(round(sum(b.maxbytes)/1024/1024),0)||'M;'
-- ...

SELECT
    'create tablespace ' || a.tablespace_name
    || ' datafile size ' || nvl(round(sum(b.bytes)/1024/1024),0) || 'M'
    || ' autoextend on maxsize ' || nvl(round(sum(b.maxbytes)/1024/1024),0) || 'M;'
FROM
    dba_tablespaces a
  , ( SELECT tablespace_name
           , SUM(bytes)                      bytes
           , COUNT(*)                        count_files
           , SUM(GREATEST(maxbytes,bytes))   maxbytes
      FROM   dba_data_files
      GROUP BY tablespace_name
      UNION ALL
      SELECT tablespace_name
           , SUM(bytes)
           , COUNT(*)
           , SUM(GREATEST(maxbytes,bytes))
      FROM   dba_temp_files
      GROUP BY tablespace_name
    ) b
  , ( SELECT tablespace_name, SUM(bytes) free_bytes
      FROM   dba_free_space
      GROUP BY tablespace_name
      UNION ALL
      SELECT tablespace_name, SUM(bytes_free) free_bytes
      FROM   v$temp_space_header
      GROUP BY tablespace_name
    ) c
WHERE
    a.tablespace_name = b.tablespace_name (+)
AND a.tablespace_name = c.tablespace_name (+)
AND a.tablespace_name NOT IN ('SYSAUX','SYSTEM','TEMP','UNDOTBS1','UNDOTBS2','USERS')
GROUP BY
    a.tablespace_name
  , a.contents
  , a.extent_management
  , a.allocation_type
  , a.segment_space_management
  , a.bigfile
  , a.status
ORDER BY
    a.tablespace_name;

SPOOL off

Voir aussi