0. Introducción
Nos han facilitado una copia de seguridad con estos ficheros:
- POBLACION_01.DUMP.gz
- POBLACION_02.DUMP.gz
- POBLACION_03.DUMP.gz
- exp_POBLACION.log
1. Crear un volumen de docker para compartir datos con el servidor
#Manejo de un volumen #1 Crear un volumen docker volume create ximo-oracle-volume
#2 Ver los volumenes creados docker volumen ls #3 Mostrar informacion del volumen docker volume inspect ximo-oracle-volume # Y obtenemos la ruta de montaje #[ # { # "CreatedAt": "2023-09-20T09:12:31+02:00", # "Driver": "local", # "Labels": null, # "Mountpoint": "/var/lib/docker/volumes/ximo-oracle-volume/_data", # "Name": "ximo-oracle-volume", # "Options": null, # "Scope": "local" # } #]
2. Descargar imagen y crear y arrancar el contenedor
- Imagen a descargar: container-registry.oracle.com/database/enterprise:latest
- Nombre del contendor a crear: oracle-enterprise
- Mapeo del puerto 1521 a : 1111
- Montaje de volumen del servidor: nombre del volúmen: ximo-oracle-volume
- Montaje de volumen del servidor: punto de montaje del contenedor: /opt/ximo-volume
- Contraseña de Oracle: myPassword
- (Nuevo) Importante, para no tener problemas con el caracter set hay que darlññe la variable de entorno NLS_LANGUAGE=SPANISH_SPAIN.WE8ISO8859P1
docker run --name oracle-enterprise -p 1111:1521 -e ORACLE_PWD=myPassword -e NLS_LANGUAGE=SPANISH_SPAIN.WE8ISO8859P1 --mount source=ximo-oracle-volume,target=/opt/ximo-volume container-registry.oracle.com/database/enterprise:latest
Vamos a entrar en modo comandos y ver los contendores (BD de oracle) que tenemos.
#ejecutamos en nuestro servidor local docker exec -it oracle-enterprise /bin/bash #estamos dentro del contenedor podman entramos en sqlplus como sysdba bash-4.4$ sqlplus / as sysdba #devuelve #SQL*Plus: Release 21.0.0.0.0 - Production on Mon Sep 25 05:09:29 2023 #Version 21.3.0.0.0 #Copyright (c) 1982, 2021, Oracle. All rights reserved. #Connected to: #Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production #Version 21.3.0.0.0 #ejecutamos la consulta de contenedores desde sqlplus SQL> select con_id, name from v$containers; #devuelve: CDB$ROOT, PDB$SEED, ORCLPDB1
Y vemos que hay una base de datos creada ORCLPDB1 con la que vamos a trabajar (en entradas anteriores que trabajabamos en Oracle Express, la BD que tenimos era EXPDB1)
3. Conectarse con DBeaver
Actuamos igual que en entradas anteriores con Oracle Express.
2. Entrar en DBeaver y en el menu Database Seleccionar Driver Manager
Copiamos el driver de Oracle
Cambiamos el puerto a 1111 y hay que tener en cuenta que el default DB es ORCLPDB1 en vez de ORCL y la cambiamos
Y cuando le damos al boton Find Class nos abre una pantalla de descarga que eleccionamos el último elemento
Ahora en la pantalla anterior indicamos Drivers class oracle.jdbc.OracleDriver y le dmos a OK y cerramos
Ahora en el Menu Database -> New Database Connection se elige una BD SQL y escogermos el nuevo driver Oracle-Enterprise y le damos al boton Next
Ahora le indicamos los parámetros marcados y le damos el pasword que le hemos dado "myPassword")
Debeis tener los parametros indicados en la pantalla.
Importante cambiar la BD a ORCLPDB1 !!! Y el usuario system !!! y el puerto 1111 (que por omisión es el 1511)
Le damos a test Connection y nos conecta
Y con DBeaver podemos ver los detalles de la BD:
4. Ver si tenemos un contenedor que nos valga.
Y vemos que nuestro contenedor es el primero
5. Iniciar el contendor que está parado
Ejecutamos docker start "nombre del contenedor" ( o docker start "id del contenedor")
docker start oracle-enterprise
y comprobamos que el contenedor está arrancado con
docker ps
que devuelve:
Por tanto ya lo tenemos arrancado
6. Copiar ficheros de la copia de seguridad y ver informacion básica de la copia de seguridad
Para ello copiamos los ficheros del backup a la carpeta:
/var/lib/docker/volumes/ximo-oracle-volume/_data/BKPS
que se encuentra dentro de nuestro volumen docker. (si no existe, la creamos y le damos permisos 777)
Ahora descomprimimos los ficheros que estan comprimidos (extension .gz), pues he tenido problemas al cargar los ficheros comprimidos.
Ahora creamos un "directorio" de Oracle utilizando un script sql que se puede hacer desde DBeaver, y comprobamos que exista:
CREATE DIRECTORY oracle_backup_sql as '/opt/ximo-volume/BKPS';
SELECT * FROM ALL_DIRECTORIES;
Ejecutamos el contenedor en modo shell.
docker exec -it fd4340afd331 /bin/bash
Creamos en nuestra máquina física la carpeta BKPS dentro de /var/lib/docker/volumes/ximo-oracle-volume/_data y le damos permisos a 777
Ahora queda descomprimir los ficheros indicados en la introducción (POBLACION_*.DUMP.gz) y copiarlos a /var/lib/docker/volumes/ximo-oracle-volume/_data/BKPS. Que se puede hacer desde la máquina física o desde docker.
docker cp ruta_carpeta fd4340afd331:/opt/ximo-volume/BKPS
y ahora como dice stackoverflow podemos crear un fichero con el DDL y ver su contenido y modificando algunas cosillas. Para ello le damos la opción sqlfile=ddl_POBLACION.txt .Dentro del contenedor en la shell que estamos, ejecutamos:
impdp system/myPassword@ORCLPDB1 DIRECTORY = oracle_backup_sql dumpfile=POBLACION_01.DUMP,POBLACION_02.DUMP,POBLACION_03.DUMP logfile=carga_POBLACION.log sqlfile=ddl_POBLACION.txt
Hay que tener cuidado de no meter el mismo log que se nos ha proporcionado, pues escribe el nuevo log en el fichero que le indicamos y lo machaca.
Ese comando no hace cambios en la BD, pero el fichero generado es enorme tiene casi un millón de líneas!
7. Verificar el charset
Ejecutar en DBeaver:
SELECT PARAMETER, VALUE FROM V$NLS_PARAMETERS;
SELECT PARAMETER, VALUE FROM V$NLS_PARAMETERS;
y comprobar que los valores sean : SPANISH_SPAIN.WE8ISO8859P1
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_CHARACTERSET AL32UTF8 WE8ISO8859P1
NLS_TERRITORY SPAIN
NLS_LANGUAGE SPANISH
Si no es así, hay que cambiarlos ejecutando el siguiente script dentro de la sesion bash del contenedor. No se puede hacer con DBeaver.
Para entrar en sqlplus ejecutamos dentro de la shell del contenedor
sqlplus / as sysdba
Y debe aparecer
SQL>
Y copiamos el siguiente script, (obtenido de Oracle y StackOverflow) que tarda bastante en ejecutar
SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; ALTER SYSTEM SET AQ_TM_PROCESSES=0; ALTER DATABASE OPEN; ALTER DATABASE CHARACTER SET INTERNAL_USE WE8ISO8859P1; SHUTDOWN IMMEDIATE; STARTUP;
Ahora con DBeaver ejecutar
ALTER SESSION SET NLS_LANGUAGE = 'SPANISH'; ALTER SESSION SET NLS_TERRITORY = 'SPAIN'; ALTER SESSION SET NLS_DATE_LANGUAGE = 'SPANISH';
Y comprobamos otra vez con
SELECT PARAMETER, VALUE FROM V$NLS_PARAMETERS;
PARAMETER |VALUE |
-----------------------+--------------------------+
NLS_LANGUAGE |SPANISH |
NLS_TERRITORY |SPAIN |
NLS_ISO_CURRENCY |SPAIN |
NLS_NUMERIC_CHARACTERS |,. |
NLS_CALENDAR |GREGORIAN |
NLS_DATE_FORMAT |DD/MM/RR |
NLS_DATE_LANGUAGE |SPANISH |
NLS_CHARACTERSET |WE8ISO8859P1 |
NLS_SORT |SPANISH |
NLS_TIME_FORMAT |HH24:MI:SSXFF |
NLS_TIMESTAMP_FORMAT |DD/MM/RR HH24:MI:SSXFF |
NLS_TIME_TZ_FORMAT |HH24:MI:SSXFF TZR |
NLS_TIMESTAMP_TZ_FORMAT|DD/MM/RR HH24:MI:SSXFF TZR|
NLS_NCHAR_CHARACTERSET |AL16UTF16 |
NLS_COMP |BINARY |
NLS_LENGTH_SEMANTICS |BYTE |
NLS_NCHAR_CONV_EXCP |FALSE |
SELECT PARAMETER, VALUE FROM V$NLS_PARAMETERS;
PARAMETER |VALUE | -----------------------+--------------------------+ NLS_LANGUAGE |SPANISH | NLS_TERRITORY |SPAIN | NLS_ISO_CURRENCY |SPAIN | NLS_NUMERIC_CHARACTERS |,. | NLS_CALENDAR |GREGORIAN | NLS_DATE_FORMAT |DD/MM/RR | NLS_DATE_LANGUAGE |SPANISH | NLS_CHARACTERSET |WE8ISO8859P1 | NLS_SORT |SPANISH | NLS_TIME_FORMAT |HH24:MI:SSXFF | NLS_TIMESTAMP_FORMAT |DD/MM/RR HH24:MI:SSXFF | NLS_TIME_TZ_FORMAT |HH24:MI:SSXFF TZR | NLS_TIMESTAMP_TZ_FORMAT|DD/MM/RR HH24:MI:SSXFF TZR| NLS_NCHAR_CHARACTERSET |AL16UTF16 | NLS_COMP |BINARY | NLS_LENGTH_SEMANTICS |BYTE | NLS_NCHAR_CONV_EXCP |FALSE |
Ahora por si acaso sale este error al pedir la copia de seguridad:
Connected to: Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production ORA-39006: internal error ORA-39213: Metadata processing is not available
Hay que ejecutar en SQLPLUS (no en DBeaver)
SQL> execute dbms_metadata_util.load_stylesheets;
7. Restaurar la copia de seguridad
impdp system/myPassword@ORCLPDB1 DIRECTORY = oracle_backup_sql dumpfile=POBLACION_01.DUMP,POBLACION_02.DUMP,POBLACION_03.DUMP logfile=carga_POBLACION.log
o también más simple
impdp system/myPassword@ORCLPDB1 DIRECTORY = oracle_backup_sql dumpfile=POBLACION_%U.DUMP logfile=carga_POBLACION.log
impdp system/myPassword@ORCLPDB1 DIRECTORY = oracle_backup_sql_doc dumpfile=ADE_POBLACION_GTTL_%U.dmp logfile=carga_ADE_POBLACION.log
Y nos salen los siguientes errores y avisos:
ORA-00959: tablespace 'DATOS10' does not exist ORA-00959: tablespace 'DATOS11' does not exist ORA-00959: tablespace 'DATOS12' does not exist ORA-00959: tablespace 'TOOLS' does not exist
ORA-00959: tablespace 'LOBSTS' does not existORA-00959: tablespace 'INDICES10' does not existORA-00959: tablespace 'INDICES11' does not existORA-00959: tablespace 'STAT' does not existORA-01919: role 'JAVA_DEPLOY' does not exist ORA-01919: role 'LECTORES' does not exist ORA-39112: Dependent object type COMMENT skipped, base object type TABLE:"OPS$GTTORA"."AACO_APLAZ_APLICACION_COSE" creation failed
Hay una advertencia que genera los últimops errores y se refiere al charset
==============================================================================
import done in AL32UTF8 character set and AL16UTF16 NCHAR character set
export done in WE8ISO8859P1 character set and AL16UTF16 NCHAR character set
==============================================================================ORA-02374: conversion error loading table "OPS$GTTORA"."VALO_VALORES"
ORA-12899: value too large for column NOMBRE_SP_VALO (actual: 61, maximum: 60)ORA-02372: data for row: NOMBRE_SP_VALO : 'STUURGROUP FLEET NETTHERLANDS BV SUCURSAL SUCURSAL'Después de arreglar el charset pueden aparecer estos errores:ORA-39006: internal errorORA-39213: Metadada processing not available
Errores de creacion de índices que utiliza funciones que no se han guardado en el backup==============================================================================Estos errores en principio no tendrian porque preocuparnos ,pues los índices
no aportan información nueva
ORA-39083: Object type INDEX:"OPS$GTTORA"."IX_AGPE_ANAGRAMA" failed to create with error: ORA-00904: "OPS$GTTORA"."ANAGRAMA_NOMBRE": invalid identifier Failing sql is: CREATE INDEX "OPS$GTTORA"."IX_AGPE_ANAGRAMA" ON "OPS$GTTORA"."AGPE_AGRUPACIONES_PERSONAS" (SUBSTR("OPS$GTTORA"."ANAGRAMA_NOMBRE"("NOMBRE_AGPE"),1,60)) PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 9830400 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "INDICES11"
Las funciones que no disponemos son:
ANAGRAMA_NOMBRE
PARTENUMERICANIF
OBTENERMATRICULAORDENACION
PESONOMBRE
Errores de creacion de vistas que utiliza funciones que no se han guardado en el backup==============================================================================Estamos en en un caso muy parecido l anterior anterior
En la BD Documental salen estos avisos:
ORA-00959: tablespace 'DATOS' does not exist
ORA-00959: tablespace 'LOBDTS' does not exist
ORA-00959: tablespace 'ARCHDIG' does not exist
ORA-00959: tablespace 'INDICES' does not exist
ORA-00959: tablespace 'LOBIDX' does not exist
8. Resolución de errores
8.1 Para solucionar el problema del character set hay que darle la variable de entorno (se ha actualizado el principio de este post para tenerlo en cuenta pues de lo contrario la cosa se lía)
NLS_LANGUAGE=SPANISH_SPAIN.WE8ISO8859P1
La opción mas fácil tal vez habría sido crear el contenedor y pasarle dicha variable de entorno y actuaríamos así, cosa que hemos destacado al principio de estra entrada.
docker run --name oracle-enterprise -p 1111:1521 -e ORACLE_PWD=myPassword -e NLS_LANGUAGE=SPANISH_SPAIN.WE8MSWIN1252 --mount source=ximo-oracle-volume,target=/opt/ximo-volume container-registry.oracle.com/database/enterprise:latest
8.2 Primero vamos a borrar el esquema que ha creado el backup pues faltan muchas tablas (OPS$GTTORA), y así poder restaurar otra vez el backup. Para elo desde DBeaver:
DROP USER "OPS$GTTORA" CASCADE;
y con ello limpiamos espacio de disco
7.2 Vamos a crear todos los "tablespaces" que no se encontraban: DATOS10, ... y STAT asignándoles un espacio de 100MB y autoincremento.
CREATE TABLESPACE DATOS10 DATAFILE '/opt/oracle/oradata/ORCLCDB/datos10.dbf' SIZE 100M AUTOEXTEND ON; CREATE TABLESPACE DATOS11 DATAFILE '/opt/oracle/oradata/ORCLCDB/datos11.dbf' SIZE 100M AUTOEXTEND ON; CREATE TABLESPACE DATOS12 DATAFILE '/opt/oracle/oradata/ORCLCDB/datos12.dbf' SIZE 100M AUTOEXTEND ON; CREATE TABLESPACE TOOLS DATAFILE '/opt/oracle/oradata/ORCLCDB/toots.dbf' SIZE 100M AUTOEXTEND ON;
CREATE TABLESPACE LOBSTS DATAFILE '/opt/oracle/oradata/ORCLCDB/lobsts.dbf' SIZE 100M AUTOEXTEND ON;CREATE TABLESPACE INDICES10 DATAFILE '/opt/oracle/oradata/ORCLCDB/indices10.dbf' SIZE 100M AUTOEXTEND ON;CREATE TABLESPACE INDICES11 DATAFILE '/opt/oracle/oradata/ORCLCDB/indices11.dbf' SIZE 100M AUTOEXTEND ON;CREATE TABLESPACE STAT DATAFILE '/opt/oracle/oradata/ORCLCDB/stat.dbf' SIZE 100M AUTOEXTEND ON;
En la BD Documental hay que tener en cuenta que hay que crear BIGFILE !!! .Hacemos:
CREATE BIGFILE TABLESPACE DATOS DATAFILE '/opt/oracle/oradata/ORCLCDB/datos_doc.dbf' SIZE 20G AUTOEXTEND ON NEXT 20G;
CREATE BIGFILE TABLESPACE LOBDTS DATAFILE '/opt/oracle/oradata/ORCLCDB/lobdts_doc.dbf' SIZE 20G AUTOEXTEND ON NEXT 20G;
CREATE BIGFILE TABLESPACE ARCHDIG DATAFILE '/opt/oracle/oradata/ORCLCDB/archdig_doc.dbf' SIZE 20G AUTOEXTEND ON NEXT 20G;
CREATE BIGFILE TABLESPACE INDICES DATAFILE '/opt/oracle/oradata/ORCLCDB/indices_doc.dbf' SIZE 20G AUTOEXTEND ON NEXT 20G;
CREATE BIGFILE TABLESPACE LOBIDX DATAFILE '/opt/oracle/oradata/ORCLCDB/lobidx_doc.dbf' SIZE 20G AUTOEXTEND ON NEXT 20G;
8.3 Vamos a crear los roles JAVA_DEPLOY, LECTORES y asignarles permisos
CREATE ROLE JAVA_DEPLOY NOT IDENTIFIED; CREATE ROLE LECTORES NOT IDENTIFIED;
GRANT DBA TO JAVA_DEPLOY;
GRANT SELECT_CATALOG_ROLE TO LECTORES;
En la BD Documental hay que crear el ROLE SIT_GTTL_DBL
CREATE ROLE SIT_GTTL_DBL NOT IDENTIFIED;
8.4 Vamos a restaurar el backup, indicando otro fichero log, desde una sesión bash del contenedor:
impdp system/myPassword@ORCLPDB1 DIRECTORY = oracle_backup_sql dumpfile=POBLACION_%U.DUMP logfile=carga3_POBLACION.log
8.5 Si acaso sale este error al pedir la copia de seguridad:
Connected to: Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production ORA-39006: internal error ORA-39213: Metadata processing is not available
Hay que ejecutar en SQLPLUS (no en DBeaver)
SQL> execute dbms_metadata_util.load_stylesheets;
9. Restaurar una única tabla del backup
impdp system/myPassword@ORCLPDB1 TABLES = 'OPS$AD_GTTL'.ADDE_DOCUMENTOS_ESCANEADOS DIRECTORY = oracle_backup_sql dumpfile=POBLACION_%U.DUMP logfile=carga3_POBLACION.log
10. Problema al restaurar la BD Documental
Al restaurar la BD Documental aparece este error
#1.-- Ejecución del comando
bash-4.2$ impdp system/myPassword@ORCLPDB1 TABLES = 'OPS$AD_GTTL'.ADDE_DOCUMENTOS_ESCANEADOS DIRECTORY = ORACLE_BACKUP_SQL_DOC dumpfile=ADE_POBLACION_GTTL_%U.dmp logfile=carga_ADE_POBLACION.4.log
#2.-- Log de la ejecución
Import: Release 21.0.0.0.0 - Production on Mon Dec 18 07:00:41 2023Version 21.3.0.0.0 Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production Master table "SYSTEM"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded Starting "SYSTEM"."SYS_IMPORT_TABLE_01": system/********@ORCLPDB1 TABLES=OPS$AD_GTTL.ADDE_DOCUMENTOS_ESCANEADOS DIRECTORY=ORACLE_BACKUP_SQL_DOC dumpfile=ADE_POBLACION_GTTL_%U.dmp logfile=carga_ADE_POBLACION.4.log Processing object type SCHEMA_EXPORT/TABLE/TABLE Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA ORA-31693: Table data object "OPS$AD_GTTL"."ADDE_DOCUMENTOS_ESCANEADOS" failed to load/unload and is being skipped due to error: ORA-02354: error in exporting/importing data ORA-39840: A data load operation has detected data stream format error . ORA-39844: Bad stream format detected: [klaprs_12] [0] [512] [0] [3] [985] [] [] Processing object type SCHEMA_EXPORT/TABLE/AUDIT_OBJ Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS Job "SYSTEM"."SYS_IMPORT_TABLE_01" completed with 1 error(s) at Mon Dec 18 07:00:49 2023 elapsed 0 00:00:06
Parece ser que hay una corrupción del fichero DUMP, pues se han cargado otras tablas que contienen BLOBs sin problemas.
No hay comentarios :
Publicar un comentario