it-swarm-es.tech

Cómo importar un volcado de Oracle en un espacio de tabla diferente

Quiero importar un volcado de Oracle en un espacio de tabla diferente.

Tengo un espacio de tabla A utilizado por el usuario A. He revocado el DBA de este usuario y le he dado las subvenciones y el recurso. Luego he dejado todo con el comando

exp a/*** propietario = un archivo = oracledump.dmp log = log.log compress = y

Ahora quiero importar el volcado en el espacio de tabla B utilizado por el usuario B. Así que le he otorgado las concesiones en conexión y recursos (sin DBA). Luego ejecuté la siguiente importación:

imp b/*** archivo = oracledump.dmp log = import.log fromuser = a touser = b

El resultado es un registro con muchos errores:

IMP-00017: la siguiente instrucción falló con el error 20001 de Oracle: "BEGIN DBMS_STATS.SET_TABLE_STATS IMP-00003: El error de Oracle 20001 encontró ORA-20001: valores de entrada no válidos o inconsistentes

Después de eso, probé el mismo comando de importación pero con la opción estadística = ninguna. Esto dio como resultado los siguientes errores:

ORA-00959: el espacio de tabla 'A_TBLSPACE' no existe

¿Cómo debe hacerse esto?

Nota: muchas columnas son de tipo CLOB. Parece que los problemas tienen algo que ver con eso.

Nota 2: Las versiones de Oracle son una mezcla de 9.2, 10.1 y 10.1 XE. Pero no creo que tenga que ver con versiones.

36
Michiel Overeem

Tienes un par de problemas aquí.

En primer lugar, las diferentes versiones de Oracle que está utilizando es la razón del error de estadísticas de la tabla: tuve el mismo problema cuando algunas de nuestras bases de datos Oracle 10g se actualizaron a la Versión 2, y algunas todavía estaban en funcionamiento Versión 1 y estaba intercambiando archivos .DMP entre ellos.

La solución que funcionó para mí fue utilizar la misma versión de las herramientas exp y imp para exportar e importar en las diferentes instancias de la base de datos. Esto fue más fácil de hacer utilizando la misma PC (u Oracle Server) para emitir todos los comandos de exportación e importación.

En segundo lugar, sospecho que está obteniendo el ORA-00959: tablespace 'A_TBLSPACE' does not exist porque está tratando de importar un archivo .DMP de una base de datos Oracle completa en la base de datos 10g Express Edition (XE), que , de forma predeterminada, crea un único espacio de tabla predefinido llamado USERS para usted.

Si ese es el caso, deberá hacer lo siguiente ...

  1. Con su archivo .DMP, cree un archivo SQL que contenga la estructura (Tablas):

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

  2. Abra el archivo de índice (index.sql) en un editor de texto que puede encontrar y reemplazar en un archivo completo, y emita las siguientes declaraciones de buscar y reemplazar EN ORDEN (ignore las comillas simples ... '):

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

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

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

    Find: 'CONNECT' Replace: 'REM CONNECT'

  3. Guarde el archivo de índice, luego ejecútelo en su cuenta de Oracle Express Edition (creo que es mejor crear una nueva cuenta de usuario XE en blanco, o soltar y volver a crear si estoy actualizando):

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

  4. Finalmente, ejecute el mismo archivo .DMP con el que creó el archivo de índice en la misma cuenta para importar los datos, los procedimientos almacenados, las vistas, etc.

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

Puede obtener páginas de errores de Oracle cuando intente crear ciertos objetos, como trabajos de base de datos, ya que Oracle intentará usar el mismo identificador de base de datos, que probablemente fallará cuando se encuentre en una base de datos diferente.

33
Andrew

Si está utilizando Oracle 10g y la bomba de datos, puede usar la cláusula REMAP_TABLESPACE. ejemplo:

REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
16
Neil Kodner

Para mí, esto funciona bien (Oracle Database 10g Express Edition Release 10.2.0.1.0):

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

Pero para una nueva restauración necesitas un nuevo espacio de tabla

PD Quizás útil http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php

6
Grebets Kostyantyn

¿Qué versión de Oracle estás usando? Si es 10g o mayor, debería considerar usar Data Pump en lugar de importar/exportar de todos modos. No estoy 100% seguro de si puede manejar este escenario, pero esperaría que pudiera.

Data Pump es el reemplazo de exp/imp para 10g y superiores. Funciona de manera muy similar a exp/imp, excepto que (supuestamente, no lo uso porque estoy atrapado en tierra 9i) mejor.

Aquí están los documentos de Data Pump

3
Matthew Watson

Quiero mejorar para dos usuarios en diferentes espacios de tabla en diferentes servidores (bases de datos)

1. Primero cree un directorio para el volcado temporal para ambos servidores (bases de datos):

servidor # 1:

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

servidor # 2:

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

2. Exportar (servidor # 1):

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

. Importar (servidor # 2):

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

mi solución es usar la utilidad GSAR para reemplazar el nombre del espacio de tabla en el archivo DUMP. Cuando responda, asegúrese de que el tamaño del archivo de volcado no cambie agregando espacios. P.ej.

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

El problema tiene que ver con las columnas CLOB. Parece que la herramienta imp no puede reescribir la instrucción create para usar otro espacio de tabla.

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

La solución es: crear el esquema a mano en el espacio de tabla correcto. Si no tiene un script para crear el esquema, puede crearlo usando indexfile = de la herramienta imp.

Debe deshabilitar todas las restricciones usted mismo, la herramienta imp de Oracle no las deshabilitará.

Después de eso, puede importar los datos con el siguiente comando:

imp b/*** archivo = oracledump.dmp log = import.log fromuser = a touser = b estadísticas = ninguno ignorar = y

Nota: Todavía necesitaba las estadísticas = ninguna debido a otros errores.

información adicional sobre la bomba de datos

A partir de Oracle 10, se ha mejorado la importación/exportación: la herramienta de bombeo de datos ([ http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php] [1] )

Utilizando esto para volver a importar los datos en un nuevo espacio de tabla:

  1. Primero cree un directorio para el volcado temporal:

    CREAR OR REEMPLAZAR DIRECTORIO tempdump AS '/ temp/tempdump /';
    SUBVENCIÓN LEA, ESCRIBA EN EL DIRECTORIO tempdump TO a;

  2. Exportar:

    expdp a/* schemas = un directorio = tempdump dumpfile = adump.dmp logfile = adump.log

  3. Importar:

    impdp b/* directorio = archivo de volcado tempdump = adump.dmp archivo de registro = bdump.log REMAP_SCHEMA = a: b

Nota: los archivos de volcado se almacenan y leen desde el disco del servidor, no desde el disco local (cliente)

1
Michiel Overeem

La respuesta es difícil, pero factible:

La situación es: usuario A y tablespace X

  1. importe su archivo de volcado a una base de datos diferente (esto solo es necesario si necesita conservar una copia del original)
  2. renombrar tablespace

    alter tablespace X renombrar a Y

  3. crear un directorio para el comando expdp y otorgar derechos

  4. crear un volcado con expdp
  5. eliminar el antiguo usuario y el antiguo espacio de tabla (Y)
  6. crear el nuevo espacio de tabla (Y)
  7. cree el nuevo usuario (con un nuevo nombre), en este caso B - y otorgue derechos (también al directorio creado con el paso 3)
  8. importar el volcado con impdp

    impdp B/B directorio = DIR dumpfile = DUMPFILE.dmp logfile = LOGFILE.log REMAP_SCHEMA = A: B

y eso es...

1
Michiel Overeem

Porque quería import (a Oracle 12.1 | 2) un volcado que era exported de una base de datos de desarrollo local (18c xe), y sabía que todas mis bases de datos de destino tendrán un espacio de tabla accesible llamado DATABASE_TABLESPACE, acabo de crear mi esquema/usuario para usar un nuevo espacio de tabla con ese nombre en lugar del predeterminado USERS (al que no tengo acceso en las bases de datos de destino):

-- 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;

Un exp creado a partir de esto hace imp feliz en mi objetivo.

0
masterxilo