jueves, 5 de octubre de 2023

Oracle 16- Nuevo enfoque (13). Oracle Enterprise con docker, La hora de la verdad. Restaurar una base de datos REAL de Datos tributarios

0. Introducción

 Nos han facilitado una copia de seguridad con estos ficheros:

  1. POBLACION_01.DUMP.gz
  2. POBLACION_02.DUMP.gz
  3. POBLACION_03.DUMP.gz
  4. exp_POBLACION.log
Donde POBLACION representa el nombre de nuestro municipio.

Vamos a empezar desde cero

Veamos los pasos a realizar

1. Crear un volumen de docker para compartir datos con el servidor

Veamos el proceso de creación de un volumen y mostrar información sobre su ubicación. En este caso se ha creado el volumen ximo-oracle-volume y la ubicacion en el servidor es en /var/lib/docker/volumes/my-volume/_data

#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

Vamos a crear un contenedor a opartir de una imagen, aprovechando el volumen creado en el punto anterior. Los parámetros que le damos son:
  1. Imagen a descargar: container-registry.oracle.com/database/enterprise:latest
  2. Nombre del contendor a crear: oracle-enterprise 
  3. Mapeo del puerto 1521 a :  1111 
  4. Montaje de volumen del servidor: nombre del volúmen: ximo-oracle-volume  
  5. Montaje de volumen del servidor: punto de montaje del contenedor: /opt/ximo-volume  
  6. Contraseña de Oracle: myPassword 
  7. (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.

1. Descargarse el driver jdbc de oracle desde https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html y el driver descargado es ojdbc11.jar .

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



Vamos a la pestaña de libraries y le damos a Add File y buscamos el driver JDBC descargado


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.


Supongamos que ya hace dias que hemos creado el contenedor y lo tenemos parado. Necesitamos buscarlo y seleccionarlo 

docker ps -a
 
y obtenemos


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; 

Para la BD documental se ha creado la carpeta BKPS_DOCUMENTAL con los ficheros enormes de documentos y hacemos
CREATE DIRECTORY oracle_backup_sql_doc as '/opt/ximo-volume/BKPS_DOCUMENTAL';

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;
 

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                     |

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

Para ello utilizamos el comando anterior y le quitamos la opción sqlfile=ddl_POBLACION.txt . Y lo ejecutamos dentro de la shell abierta en el contenedor:

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

En la BD documental hacemos
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 exist
ORA-00959: tablespace 'INDICES10' does not exist
ORA-00959: tablespace 'INDICES11' does not exist
ORA-00959: tablespace 'STAT' does not exist

ORA-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 error
ORA-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

Por ejemplo queremos restaurar solo la tabla ADDE_DOCUMENTOS_ESCANEADOS del fichero dump. Para ello, si existe dicha tabla, se renombra o se borra y se ejectura el mismo comando de carga del backup pero añadiendo TABLES='OPS$AD_GTTL'.ADDE_DOCUMENTOS_ESCANEADOS 

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 2023
Version 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