web-dev-qa-db-fra.com

Comment importer un vidage Oracle dans un autre tablespace

Je veux importer un cliché Oracle dans un autre tablespace.

J'ai un espace de table A utilisé par l'utilisateur A. J'ai révoqué l'administrateur de base de données sur cet utilisateur et lui ai attribué les droits d'accès, ainsi que la ressource. Puis j'ai tout vidé avec la commande

exp a/*** propriétaire = un fichier = oracledump.dmp log = log.log compress = y

Maintenant, je veux importer le dump dans le tablespace B utilisé par l'utilisateur B. Je lui ai donc donné les droits sur connect et resource (pas de DBA). Ensuite, j'ai exécuté l'importation suivante:

imp b/*** fichier = oracledump.dmp log = import.log de l'utilisateur = a touser = b 

Le résultat est un journal avec beaucoup d'erreurs:

IMP-00017: L'instruction suivante a échoué avec l'erreur Oracle 20001: "BEGIN DBMS_STATS.SET_TABLE_STATS IMP-00003: Une erreur Oracle 20001 a été détectée ORA-20001: Valeurs d'entrée invalides ou incohérentes

Après cela, j'ai essayé la même commande d'importation mais avec l'option statistics = none. Cela a entraîné les erreurs suivantes:

ORA-00959: le tablespace 'A_TBLSPACE' n'existe pas

Comment cela devrait-il être fait?

Remarque: beaucoup de colonnes sont de type CLOB. Il semble que les problèmes ont quelque chose à voir avec cela.

Note2: Les versions Oracle sont un mélange de 9.2, 10.1 et 10.1 XE. Mais je ne pense pas que cela a à voir avec les versions.

33
Michiel Overeem

Vous avez quelques problèmes ici.

Premièrement , les différentes versions d'Oracle que vous utilisez sont à l'origine de l'erreur de statistiques de table. J'ai eu le même problème lorsque certaines de nos bases de données Oracle 10g ont été mises à niveau vers la version 2 et que certaines étaient encore dans la version 1 J'échangeais des fichiers .DMP entre eux.

La solution qui a fonctionné pour moi a été d’utiliser la même version des outils exp et imp pour effectuer l’exportation et l’importation sur les différentes instances de la base de données. Pour ce faire, il était plus facile d’utiliser le même PC (ou le même serveur Oracle) pour émettre toutes les commandes d’exportation et d’importation.

Deuxièmement , je suppose que vous obtenez le ORA-00959: tablespace 'A_TBLSPACE' does not exist parce que vous essayez d'importer un fichier .DMP à partir d'une base de données Oracle complète dans la base de données 10g Express Edition (XE), qui crée par défaut un seul fichier. , un tablespace prédéfini appelé USERS pour vous.

Si tel est le cas, vous devrez procéder comme suit.

  1. Avec votre fichier .DMP, créez un fichier SQL contenant la structure (Tables):

    imp <xe_username>/<password>@XE file=<filename.dmp> indexfile=index.sql full=y

  2. Ouvrez le fichier index (index.sql) dans un éditeur de texte capable de rechercher et de remplacer un fichier entier, puis exécutez les instructions de recherche et de remplacement suivantes IN ORDER (ignorez les guillemets simples .. '):

    Find: 'REM<space>' Replace: <nothing>

    Find: '"<source_tablespace>"' Replace: '"USERS"'

    Find: '...' Replace: 'REM ...'

    Find: 'CONNECT' Replace: 'REM CONNECT'

  3. Enregistrez le fichier index, puis exécutez-le avec votre compte Oracle Express Edition (il est préférable de créer un nouveau compte utilisateur XE vide - ou de le supprimer et de le recréer si l'actualisation est activée):

    sqlplus <xe_username>/<password>@XE @index.sql

  4. Enfin, exécutez le même fichier .DMP que vous avez créé le fichier index avec le même compte pour importer les données, les procédures stockées, les vues, etc.:

    imp <xe_username>/<password>@XE file=<filename.dmp> fromuser=<original_username> touser=<xe_username> ignore=y

Vous pouvez obtenir des pages d'erreur Oracle lorsque vous essayez de créer certains objets, tels que des travaux de base de données, car Oracle essaiera d'utiliser le même identificateur de base de données, ce qui échouera probablement si vous utilisez une autre base de données.

31
Andrew

Si vous utilisez Oracle 10g et datapump, vous pouvez utiliser la clause REMAP_TABLESPACE. Exemple:

REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
16
Neil Kodner

Pour moi, cela fonctionne bien (Oracle Database 10g Express Edition version 10.2.0.1.0):

impdp B/B full=Y dumpfile=DUMP.dmp REMAP_TABLESPACE=OLD_TABLESPACE:USERS

Mais pour une nouvelle restauration, vous avez besoin d'un nouvel espace de table.

P.S. Peut-être utile http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php

6
Grebets Kostyantyn

Quelle version d'Oracle utilisez-vous? Si sa valeur est supérieure ou égale à 10 g, vous devriez quand même envisager d’utiliser Data Pump au lieu d’importer/exporter. Je ne suis pas sûr à 100% s'il peut gérer ce scénario, mais je m'attendrais à ce qu'il le soit.

Data Pump est le remplacement de exp/imp pour 10g et plus. Cela fonctionne très similaire à exp/imp, sauf que c'est mieux (soi-disant, je ne l'utilise pas puisque je suis coincé dans 9i land).

Voici la documentation Data Pump

3
Matthew Watson

Je veux améliorer pour deux utilisateurs à la fois dans des espaces de tables différents sur des serveurs différents (bases de données)

1 . Commencez par créer un répertoire pour le vidage temporaire des deux serveurs (bases de données):

serveur n ° 1:

CREATE OR REPLACE DIRECTORY tempdump AS '/temp/old_datapump/';
GRANT READ, WRITE ON DIRECTORY tempdump TO old_user;

serveur n ° 2:

CREATE OR REPLACE DIRECTORY tempdump AS '/temp/new_datapump/';
GRANT READ, WRITE ON DIRECTORY tempdump TO new_user;

2 . Export (serveur n ° 1):

expdp tables=old_user.table directory=tempdump dumpfile=adump.dmp logfile=adump.log

3 . Import (serveur n ° 2):

impdp directory=tempdump dumpfile=adump_table.dmp logfile=bdump_table.log
REMAP_TABLESPACE=old_tablespace:new_tablespace REMAP_SCHEMA=old_user:new_user
1
peter

ma solution est d'utiliser l'utilitaire GSAR pour remplacer le nom de l'espace table dans le fichier DUMP. Lorsque vous répliquez, assurez-vous que la taille du fichier de vidage reste inchangée en ajoutant des espaces . E.g.

gsar -f -s"TSDAT_OV101" -r"USERS      " rm_schema.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS      """ ENABLE STORAGE IN ROW CHUNK 8192 RETENTION" -r"                                                                   " rm_schema.n1.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS      """ LOGGING" -r"                                  " rm_schema.n1.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS      """ " -r"                             " rm_schema.n.dump rm_schema.n1.dump
1
Dmitry

Le problème concerne les colonnes CLOB. Il semble que l'outil imp ne puisse pas réécrire l'instruction create pour utiliser un autre espace de table.

Source: http://asktom.Oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:66890284723848

La solution est la suivante: Créez le schéma à la main dans le tablespace correct. Si vous n'avez pas de script pour créer le schéma, vous pouvez le créer à l'aide de l'indexfile = de l'outil imp.

Vous devez vous-même désactiver toutes les contraintes, l'outil Oracle Imp ne les désactivera pas. 

Après cela, vous pouvez importer les données avec la commande suivante:

imp b/*** fichier = oracledump.dmp log = import.log de l'utilisateur = a touser = b statistiques = aucun ignorer = y

Remarque: j'avais toujours besoin des statistiques = aucune en raison d'autres erreurs.

informations supplémentaires sur la pompe de données

A partir d'Oracle 10, l'importation/exportation est améliorée: l'outil de pompe de données ([ http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php][1] }

En utilisant ceci pour réimporter les données dans un nouveau tablespace:

  1. Commencez par créer un répertoire pour le vidage temporaire:

    CREATE OR REPLACE DIRECTORY tempdump AS '/ temp/tempdump /';
    GRANT LIRE, ÉCRIRE AU RÉPERTOIRE tempdump À a;

  2. Exportation:

    expdp a/* schemas = un répertoire = tempdump fichier de vidage = adump.dmp fichier journal = adump.log

  3. Importation:

    impdp b/* répertoire = tempdump fichier_sauvegarde = adump.dmp fichier_journal = bdump.log REMAP_SCHEMA = a: b

Remarque: les fichiers de vidage sont stockés et lus à partir du disque du serveur, pas du disque local (client).

1
Michiel Overeem

La réponse est difficile, mais faisable:

La situation est la suivante: utilisateurAet espace de tableX

  1. importer votre fichier de vidage dans une base de données différente (nécessaire uniquement si vous devez conserver une copie de l'original)
  2. renommer le tablespace

    alter tablespaceXrenomme enY

  3. créer un répertoire pour la commande expdp en accorde les droits

  4. créer un dump avec expdp
  5. supprime l'ancien utilisateur et l'ancien espace de table (Y)
  6. créer le nouveau tablespace (Y)
  7. créer le nouvel utilisateur (avec un nouveau nom) - dans ce cas,B- et accorder des droits (également au répertoire créé à l'étape 3)
  8. importer le dump avec impdp

    répertoire impdp B/B = DIR fichier de vidage = DUMPFILE.dmp fichier_journal = LOGFILE.log REMAP_SCHEMA =A:B

et c'est tout...

1
Michiel Overeem

Parce que je voulais import (dans Oracle 12.1 | 2) un dump qui était exported à partir d'une base de données de développement local (18c xe) et que je savais que toutes mes bases de données cibles disposeraient d'un tablespace accessible appelé DATABASE_TABLESPACE, j'ai créé mon schéma/utilisateur pour utiliser un nouveau tablespace de ce nom au lieu de la valeur par défaut USERS (à laquelle je n'ai aucun accès sur les bases de données cibles):

-- don't care about the details
CREATE TABLESPACE DATABASE_TABLESPACE
  DATAFILE 'DATABASE_TABLESPACE.dat' 
    SIZE 10M
    REUSE
    AUTOEXTEND ON NEXT 10M MAXSIZE 200M;

ALTER DATABASE DEFAULT TABLESPACE DATABASE_TABLESPACE;

CREATE USER username
  IDENTIFIED BY userpassword
  CONTAINER=all;

GRANT create session TO username;
GRANT create table TO username;
GRANT create view TO username;
GRANT create any trigger TO username;
GRANT create any procedure TO username;
GRANT create sequence TO username;
GRANT create synonym TO username;
GRANT create synonym TO username;
GRANT UNLIMITED TABLESPACE TO username;

Une exp créée à partir de ceci rend imp heureux sur ma cible.

0
masterxilo