Mostrando entradas con la etiqueta expdp. Mostrar todas las entradas
Mostrando entradas con la etiqueta expdp. Mostrar todas las entradas

viernes, 22 de septiembre de 2023

Oracle 10 - Nuevo enfoque (7).Free Oracle con docker, aprovechando lo hecho con Oracle Express

 0.Introducción

Abandonamos podman pues no hay tanta documentación y seguimos con docker.

Hemos utilizado el volumen de docker ximo-oracle-volume y lo  montamos el contenedor oracle-free. Vamos a crear un "directorio" desde sqlplus y vamos a intentar restaurar la copia de seguridad que hicimos del SCHEMA SCHM01_XIMO en Oracle Express.

1. Restaurar la copia de seguridad hecho con OracleExpress.

Vamos al contenedor docker que esta corriendo la shell  y hacemos un "ls" dentro de la subcarpeta BKPS y vemos los ficheros de copia de seguridad que creamos dentro del volumen de docker ximo-oracle-volume que apuntaba a la carpeta /opt/ximo-volume  (que limitamos a un tamaño de 100K cada uno)

#ejecutamos
bash-4.4$ ls

#obtenemos:
#  mybkps.log    mybkps02.dmp  mybkps04.dmp  mybkps06.dmp	mybkps08.dmp  mybkps10.dmp
#  mybkps01.dmp  mybkps03.dmp  mybkps05.dmp  mybkps07.dmp	mybkps09.dmp


Ahora nos hace falta crear un directorio (desde un script SQL en la base de datos FREEPDB1) que apunte a la dirección de mapeo del volumen que creamos

1.1 Crear un directorio SQL

Creamos un directorio mapeado a /opt/ximo-volume/BKPS que es donde reside la copia de seguridad

CREATE DIRECTORY oracle_bkp as '/opt/ximo-volume/BKPS';


1.2 Ejecutar el comando impd para restaurar la copia 

Para ejecutar el comando impdp se requiere un usuario de la BD. De moment solo podemos utilizar el usuario "system" junto con la contraseña que le dimos al crear el contedor "myPassword".

impdp system/myPassword@FREEPDB1 DIRECTORY = oracle_bkp DUMPFILE =mybkps%U.dmp LOGFILE=mybkps.log SCHEMAS = SCHM01_XIMO

Observar que para designar los múltiples ficheros dump ( 10 ficheros) hemos indicado  mybkps%U.dmp , también le indicamos el directorio donde están los ficheros, el esquema a copiar y el fichero log.

Pero da errores:

1.3 Corregir el error ORA-00959: tablespace 'TABSPC01_XIMO' does not exist

Vamos a crear el TABLESPACE TABSPC01_XIMO, para ello ejecutamos eliminamos el SCHEMA SCHM01_XIMO para que lo cree el comando impdp

DROP USER SCHM01_XIMO CASCADE;

Volvemos a ejecutar el comando impdp anterior

impdp system/myPassword@FREEPDB1 DIRECTORY = oracle_bkp DUMPFILE =mybkps%U.dmp LOGFILE=mybkps.log SCHEMAS = SCHM01_XIMO

Y parece que todo ha ido bien

Ahora nos queda

  1. Cambiar la contraseña del usuario SCHM01_XIMO
  2. Dar permisos a este usuario READ, WRITE al directorio
  3. Dar el rol DATAPUMP_EXP_FULL_DATABASE al usuario
  4. Poder hacer copis de seguridad con este uduario.





martes, 19 de septiembre de 2023

Oracle 7 - Nuevo enfoque (4).Preparando el sistema de archvos docker para hacer backups de Oracle.

 0. Introducción

Créditos 

https://www.tutorialspoint.com/how-to-copy-files-from-host-to-docker-container

https://www.baeldung.com/linux/docker-mount-host-filesystem#:~:text=To%20mount%20a%20filesystem%20within,container%20target%20directory%20path

https://www.baeldung.com/linux/docker-container-add-volume

http://www.rebellionrider.com/?s=expdp

http://www.rebellionrider.com/?s=impdp

http://www.rebellionrider.com/?s=rman

1. Eligiendo un destino de las copias de seguridad

Se pueden hacer copias de seguridad dentro del sistema de ficheros propios del contenedor o también el el propio servidor físico.

2. Backups dentro  del sistema de ficheros docker

Se pueden hacer copias de seguridad dentro del sistema de ficheros propios del contenedor o también el el propio servidor físico.

En el primer caso utilizaremos el comando docker cp para copiar los ficheros entre el servidor físico y el contenedor docker tal como vimos en la entrada anterior:

#1. Listar los contenedores activos para ver su nombre
docker ps

#2. Copiar un fichero del servidor al contenedor
docker cp <src-path> <container-name>:<dest-path> 

#3. Copiar un fichero desde el contenedor al servidor
docker cp <container>:<src-path> <local-dest-path> 

3. Backups en carpetas compartidas con el servidor

OJO: No se debe compartir directamente una carpeta con un contenedor existente. Se puede hacer de forma no recomendable segun Baeldung  modificando el fichero de configuración JSON de docker situado en /var/lib/docker en Ubuntu

Se puede compartir una carpeta entre el servidor y un NUEVO contenedor a crear mediante mapeo directo de una carpeta del servidor o mapeando un VOLUMEN previamente creado con docker.

4. Dos formas de compartir carpetas en el servidor: Montaje directo y volúmenes

Veamos como se pueden crear los dos tipos de contenedores y como arrancarlos. En este caso para simplificar las cosas usaremos la imagen del linux Alpine


# OJO: puede que se pida ejecutar docker con "sudo"!
#-------------------------------------------------------------
#1. Contenedor que comparte la carpeta
#   del servidor/home/ximo/prueba y mapeándola a /tmp_prueba
#   en dicho contenedor            
#--------------------------------------------------------------
#1.1 Crear el contenedor (alpine) 
#                             <nombre contenedor>       <carpeta server>  <carpeta container> <nombre imagen> <programa a ejecutar>
docker container create --name my-alpine-share   -it -v /home/ximo/prueba:/tmp_prueba         alpine:latest   /bin/sh

#1.2 Arrancar el contenedor (alpine) 
docker container start -i my-alpine-share

#--------------------------------------------------------------
#2. Proceso de crear un contendedor que comparta un volumen
#--------------------------------------------------------------
#2.1 Manejo de un volumen 
#2.1.1 Crear un volumen
docker volume create my-volume

#2.1.1 Ver los volumenes creados
docker volumen ls

#2.1.2 Mostrar informacion del volumen
docker volume inspect my-volume

# Y obtenemos la ruta de montaje
#[
#    {
#        "CreatedAt": "2023-09-20T09:12:31+02:00",
#        "Driver": "local",
#       "Labels": null,
#        "Mountpoint": "/var/lib/docker/volumes/my-volume/_data",
#        "Name": "my-volume",
#        "Options": null,
#        "Scope": "local"
#    }
#]

#2.2 Manejo del contendor
#2.2.1 Crear un contenedor (alpine) compartiendo el volumen
#      del servidor/home/ximo/prueba y mapeándola a /tmp_prueba
#      en dicho contenedor                        

#                            <nombre contenedor>            <volumen>        <carpeta container>   <nombre imagen> <programa a ejecutar>
docker container create --name my-alpine-volume -it --mount source=my-volume,target=/opt/my-volume alpine:latest   /bin/sh

#2.2.2 Arrancar el contenedor (alpine) 
docker container start -i my-alpine-volume

Se recomienda crear un volumen pues es mas eficiente (la segunda opción)

5. Proceso de asignación de carpetas compartidas a un contenedor existente

En el apartado anterior hemos visto como crear contenedores nuevos a partir de imágenes y montando las carpetas compartidas o volumenes a compartir. Pero lo mas normal es que nos encontremos con contenedores previamente existentes que no se les ha montado una carpeta o volumen compartido.

Como no debemos asignar carpetas compartidas a un contenedor existente, lo mas cómodo es:

  1. Crear una nueva imagen a partir de un contenedor existente
  2. Crear un contenedor a partir de esta imagen al cual le añadiremos un VOLUMEN previamente creado o el mapeo de la carpeta del servidor (visto en el punto anterior
Para crear una imagen de un contenedor existente se puede hacer de dos maneras:
  1. docker container export y docker container import
  2. docker container commit
Vemos un ejemplo de cada uno de ellos

# OJO: puede que se pida ejecutar docker con "sudo"!
#-------------------------------------------------------------
#1. Contenedor que comparte la carpeta
#   del servidor/home/ximo/prueba y mapeándola a /tmp_prueba
#   en dicho contenedor            
#------------------------------------------------------------------
#1. Exportar el contenedor como imagen en un fichero "tar" (export)
#------------------------------------------------------------------
#1.1 Comando a utilizar para exportar
#                          <fichero.tar>    <nombre-contenedor>
docker container export -o my-alpine.tar     my-alpine

#1.2. Ver el contenido del fichero "tar"
tar -tvf myalpine-vol.tar

#

#1.3. Crear una imagen a partir de este fichero "tar"
#                   <fichero tar> <-nombre nueva imagen>
docker image import my-alpine.tar my-alpine-imported
#------------------------------------------------------------- #2. Exportar el contenedor como imagen directamente (commit) #------------------------------------------------------------- # <nombre-contenedor> <nombre nueva imagen> docker container commit my-alpine my-alpine-committed
#----------------------------------------------------------------------- #3. Ahora solo falta crear los contenedores a partir de las imagenes #----------------------------------------------------------------------- #3.1 Listamos imagenes docker images

6. Proceso completo de asignación de  volumen al contenedor docker existente de Oracle

Vamos a :
  1. Crear una imagen del contenedor de la BD Oracle con un commit
  2. Crear un volumen
  3. Crear un contenedor a partir de la imagen montando el volumen. Hay que advertir que al crear el contenedor SI hace falta dar puertos ni contraseñas.
<
#-------------------------------------------------------------
#1. Exportar el contenedor como imagen directamente (commit)
#    y listamos las imagenes para comprobar
#-------------------------------------------------------------
#                       <nombre-contenedor>  <nombre nueva imagen>
docker container commit ximo-oracle-db       oracle-db-image-committed

docker images

#REPOSITORY                                       TAG             IMAGE ID       CREATED         SIZE
#oracle-db-image-committed                        latest          036d3ff6a2cf   9 minutes ago   16.5GB
#container-registry.oracle.com/database/express   latest          8da8cedb7fbf   6 weeks ago     11.4GB


#-----------------------------------------------
#3. Creamos un volumen y listamos para combrobar
#-----------------------------------------------
docker volume create ximo-oracle-volume

docker volume ls

#DRIVER    VOLUME NAME
#local     ximo-oracle-volume


#------------------------------------------------------------
#4. Creamos un nuevo contenedor a partir de la imagen y 
#   le montamos el volumen
#   OJO: SI hace falta dar pawssword y puertos 
#------------------------------------------------------------
#                             <nombre-contenedor>      <mapeo puerto1> <mapeo puerto2>                                         <volumen a montar>        <punto montaje>  <nombre imagen>
docker container create --name ximo-oracle-db-new -it -p 1111:1521 -p 2222:5500 -e ORACLE_PWD=myPassword --mount source=ximo-oracle-volume,target=/opt/ximo-volume oracle-db-image-committed #-------------------------------- 5. Arrancamos el contenedor #--------------------------------
#                         <nombre-contenedor>
docker container start -i ximo-oracle-db-new


Y vemos que podemos conectar mediante DBeaver.







lunes, 18 de septiembre de 2023

Oracle 6 - Nuevo enfoque (3).Entender Oracle Express con Docker. Copias de seguridad de un esquema de Oracle. Crear y restaurar

0. Introducción

Ahora que tenemos instalado Oracle con docker, vamos a ver si somos capaces de ver el sistema de ficheros  y entender como funciona el sistema. A continuación, con sqlplus intentaremos hacer la copia de seguridad, y finalmente copiaremos los ficheros de copia de seguridad desde docker a una ubicación fuera de docker.

Créditos:

https://www.ajpdsoft.com/modules.php?name=News&file=print&sid=560#copiaseguridadlogicaoracle

https://www.baeldung.com/ops/docker-container-filesystem

http://www.rebellionrider.com/data-pump-expdp-how-to-export-schema-oracle/

https://arvindasdba.blogspot.com/2016/05/restore-database-schema-from-full-expdp.html

1. Entender Docker

1.0. Ver los contenedores docker en marcha (NO los contenedores internos  de Oracle)

docker ps

Y nos sale: (Tomar nota del ID del contenedor y del nombre que está al final)

CONTAINER ID   IMAGE                                            COMMAND                  CREATED      STATUS                PORTS                                                                                  NAMES
34a5f979d3de   container-registry.oracle.com/database/express   "/bin/bash -c $ORACL…"   4 days ago   Up 4 days (healthy)   0.0.0.0:1111->1521/tcp, :::1111->1521/tcp, 0.0.0.0:2222->5500/tcp, :::2222->5500/tcp   ximo-oracle-db

1.1 Copiar ficheros entre un contenedor docker y el servidor físico

Para copiar ficheros desde el servidor físico a un contenedor docker:

docker cp <src-path> <container-name>:<dest-path>    por ejemplo:
docker cp /home/ximo/myFile.txt ximo-oracle-db:/home/oracle

Y para copiar desde el contenedor al servidor

docker cp <container>:<src-path> <local-dest-path>    por ejemplo:
docker cp ximo-oracle-db:/home/oracle/myFile.txt /home/ximo


1.2. Abrir una consola de comandos en dicho contenedor y crear una carpeta donde guardar las copias de seguridad

docker exec -it 34a5f979d3de /bin/bash

Y nos sale una consola de comandos

bash-4.2$

Si ejecutamos pwd para ver donde estmos nos sale /home/oracle  

Podemos crear la carpeta /home/oracle/BACKUP_XIMO para descargar las copias de seguridad ahí (es evidente que estamos en el servidor) y por si acaso le damos permiso a 777

mkdir BACKUP_XIMO

chmod 777 BACKUP_XIMO

2. Introducción a las copias de seguridad en Oracle

2.1. Entrar en sqlplus como sys y mapear el directorio físico a uno de la BD

Tenemos 3 opciones para entrar en sqlplus como sysdba.

La primera opción es desde la consola de comandos ejecutar:

sqlplus / as sysdba

Y la segunda es salirse de la consola de comandos con el comando 

exit

y entramos en sqlplus con docker  

docker exec -it ximo-oracle-db  sqlplus / as sysdba

La tercera opción es hace click derecho sobre la BD XEPDB1 de la pestaña Database Navigator de DBeaver ->SQL Editor -> New SQL Script

Una vez dentro de sqlplus nos vamos al contenedor XEPDB1, (no hace falta en DBeaver pues ya estamos en dicho contenedor)

OJO: Seleccionar el contenedor XEPDB1 interno de Oracle (solo en sqlplus)  en 1ª y 2ª opciones):

SQL> ALTER SESSION SET CONTAINER = XEPDB1;

Ahora mapeamos el directorio creado, y le asignamos el nombre exp_schema_ximo. No nos olvidemos de colocar un ";" al final de las sentencias SQL sinó NO SE EJECUTARÁN !!

SQL> CREATE DIRECTORY exp_schema_ximo as '/home/oracle/BACKUP_XIMO';

y nos dice "Directory created"

Si queremos listar todos directorios, o solo el que nos interesa:

SQL> SELECT * FROM ALL_DIRECTORIES;

SQL> SELECT * FROM ALL_DIRECTORIES WHERE DIRECTORY_PATH LIKE '%XIMO%';

 Y nos devuelve:


OWNER|DIRECTORY_NAME |DIRECTORY_PATH          |ORIGIN_CON_ID|
-----+---------------+------------------------+-------------+
SYS  |EXP_SCHEMA_XIMO|/home/oracle/BACKUP_XIMO|            3|

2.2. Otorgar permisios de lectura y escritura del directorio mapeado al usuario

Sabemos que cuando se crea un SCHEMA también se crea un USUARIO con el mismo nombre asociado a dicho SCHEMA. Ahora hay que asignar permisos a dicho usuario al directorio.

SQL> GRANT read, write ON DIRECTORY EXP_SCHEMA_XIMO TO SCHM01_XIMO;

2.3. Otorgar el rol DATAPUMP_EXP_FULL_DATABASE al usuario

El rol DATAPUMP_EXP_FULL_DATABASE permite:

  1. Especificar un esquema cualquiera que no sea el tuyo o una lista de esquemas
  2. Exportar objetos de información adicional de cada esquema especificado, tales como contraseñs etc de manera que se pueden volver a crear los esquemas en la importación a otra BD.
Por tanto los usuarios que no tengan ese rol solo pueden exportar su esquema.

Para asignar dicho rol :

SQL> GRANT DATAPUMP_EXP_FULL_DATABASE TO SCHM01_XIMO;

2.4. BACKUP: Ejecutar el comando expdp (fuera de sqlplus) en una shell.


expdp es una sentnecia que se ejecuta en una ventana de comandos y no dentro sqlplus, por taqnto si estamos dentro de sqlplus hay que salir. Si estamos en docker ejecutamos

SQL> exit 

Si después de ejecutar este comando todavía estamos en docker entonces perfecto, pero si se hemos salido de docker hay que ejecutar el contenedor docker de  oracle en modo shell

docker exec -it 34a5f979d3de /bin/bash

siendo 34a5f979d3de el id del contenedor tal como vimos en el primer punto

Y nos sale una consola de comandos

bash-4.2$


Ahora ejecutamos el comando


expdp SCHM01_XIMO/myPassword@XEPDB1  DIRECTORY = EXP_SCHEMA_XIMO DUMPFILE =exp_schm_ximo.dmp LOGFILE=ximo_lg.log SCHEMAS = SCHM01_XIMO

Siendo
  • SCHM01_XIMO/myPassword@XEPDB1 : nombre esquema/contraseña esquema@contenedor interno de la base de datos
  • DIRECTORY = EXP_SCHEMA_XIMO : el directorio creado con CREATE DIRECTORY de sqlplus
  • DUMPFILE y LOGFILE son los nombres de los ficheros a generar y pueden ser cualquiera que queramos y a ser posible sin cambiar las extensiones
  • SCHEMAS = SCHM01_XIMO es el esquema a guardar. Si se quisiese guardar mas esquemas, se seararían por comas (ejemplo SCHEMAS= SCHM01_XIMO, miesquema1, otro_esquema )
y tras ejecutar el comando sale:

Export: Release 21.0.0.0.0 - Production on Tue Sep 19 12:50:50 2023
Version 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Starting "SCHM01_XIMO"."SYS_EXPORT_SCHEMA_01":  SCHM01_XIMO/********@XEPDB1 DIRECTORY=EXP_SCHEMA_XIMO DUMPFILE=exp_schm_ximo.dmp LOGFILE=ximo_lg.log SCHEMAS=SCHM01_XIMO 
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/TABLE/IDENTITY_COLUMN
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
. . exported "SCHM01_XIMO"."INVENTORIES"                 21.41 KB    1112 rows
. . exported "SCHM01_XIMO"."REGIONS"                     5.562 KB       4 rows
. . exported "SCHM01_XIMO"."CONTACTS"                    28.72 KB     319 rows
. . exported "SCHM01_XIMO"."COUNTRIES"                   6.382 KB      25 rows
. . exported "SCHM01_XIMO"."CUSTOMERS"                   32.28 KB     319 rows
. . exported "SCHM01_XIMO"."EMPLOYEES"                   17.35 KB     107 rows
. . exported "SCHM01_XIMO"."LOCATIONS"                   8.390 KB      23 rows
. . exported "SCHM01_XIMO"."ORDERS"                      9.781 KB     105 rows
. . exported "SCHM01_XIMO"."ORDER_ITEMS"                 21.21 KB     665 rows
. . exported "SCHM01_XIMO"."PRODUCTS"                    33.68 KB     288 rows
. . exported "SCHM01_XIMO"."PRODUCT_CATEGORIES"          5.585 KB       5 rows
. . exported "SCHM01_XIMO"."WAREHOUSES"                  6.171 KB       9 rows
Master table "SCHM01_XIMO"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SCHM01_XIMO.SYS_EXPORT_SCHEMA_01 is:
  /home/oracle/BACKUP_XIMO/exp_schm_ximo.dmp
Job "SCHM01_XIMO"."SYS_EXPORT_SCHEMA_01" successfully completed at Tue Sep 19 12:51:48 2023 elapsed 0 00:00:56

Y si vamos al directorio /home/oracle/BACKUP_XIMO y hacemos "ls -al" sale

total 956
drwxrwxrwx 2 oracle oinstall   4096 Sep 19 12:50 .
drwxr-xr-x 1 oracle oinstall   4096 Sep 19 06:04 ..
-rw-r----- 1 oracle oinstall 962560 Sep 19 12:51 exp_schm_ximo.dmp
-rw-r--r-- 1 oracle oinstall   2603 Sep 19 12:51 ximo_lg.log

2.5. RESTORE Ejecutar el comando impdp (fuera de sqlplus) en una shell.


impdp es una sentnecia que se ejecuta en una ventana de comandos y no dentro sqlplus, por taqnto si estamos dentro de sqlplus hay que salir. 

Si queremos restaurar el  backup anterior en un nuevo SCHEMA por ejemplo SCHM01_XIMO_COP añadiremos  REMAP_SCHEMA=SCHM01_XIMO:SCHM01_XIMO_COP

La senterncia ejecutar es:

impdp SCHM01_XIMO/myPassword@XEPDB1 DIRECTORY = EXP_SCHEMA_XIMO DUMPFILE =exp_schm_ximo.dmp LOGFILE=ximo_lg.log SCHEMAS = SCHM01_XIMO REMAP_SCHEMA=SCHM01_XIMO:SCHM01_XIMO_COP


Y si observamos, se ha creado el nuevo esquema.