martes, 26 de septiembre de 2023

Oracle 15- Nuevo enfoque (12). Oracle Enterprise con docker, Consultas especiales. Tablas, comentarios, columnas, campos, usuarios, esquemas, contenedores

 1. Vistas importantes

  1. V$CONTAINERS : Contenedores (BD) oracle
  2. V$INSTANCE: Información de la BD actual;
  3. ALL_TABLES: Infroamcion de las tablas
  4. ALL_USERS: Usuaios/ esquemas que son visibles al usuario actual
  5. DB_USERS: Todos los usuarios de la BD
  6. USER_USERS: Muestra los datos del usuario actual
  7. ALL_TAB_COMMENTS: Los comentarios de una tabla
  8. ALL_COL_COMMENTS: Los comentarios de las columnas de las tablas
  9. ALL_TAB_COLUMNS: Campos (columnas) de las tablas

2. Arrancar y parar desde sqlplus

Utilizar los comandos 
  • STARTUP;
  • SHUTDOWN IMMEDIATE;
Ver mas información en la web de Oracle.

3. Ver las dependencias por integridad referencial de una tabla

Hay que indicarle el usuario o esquema que es lo mismo en Oracle y el nombre de la tabla

SELECT *
FROM ALL_CONSTRAINTS
WHERE constraint_type = 'R' -- "Referential integrity" 
AND OWNER='[USUARIO O ESQUEMA]';
  AND r_constraint_name IN
    ( SELECT constraint_name
      FROM ALL_CONSTRAINTS
      WHERE table_name = '[NOMBRE_TABLA]'
        AND constraint_type IN ('U', 'P') -- "Unique" or "Primary key"

    );

4. Buscar las tablas que contienen una columna concreta.

A veces no está definia la integridad referencial y hay que buscar por nombre de columna. Por ejemplo hay una tabla de direcciones cuya clave primaria es ID_EPER. Para buscar aquella tablas del esquema que tienen esde campo hacemos uso de la vista ALL_TAB_COLUMNS;

Y si queremos saber que es cada tabla aplicamos esta consulta

SELECT A.TABLE_NAME, B.COMMENTS 
FROM ALL_TAB_COLUMNS A JOIN ALL_TAB_COMMENTS B 
  ON A.TABLE_NAME =B.TABLE_NAME AND A.column_name = 'ID_EPER';









Oracle 14- Nuevo enfoque (11). Oracle Enterprise con docker, Tareas comunes. EN CONSTRUCCION!!!

 0. Introducción

Veamos las tareas comunes de:

  1. Creación de tablas e índices.
  2. Inserción, modificación y borrado
  3. Creación de vistas
  4. Creacion de procedimientos

1. Creación de tablas e índices.

Veamos un ejemplo de creación de dos tablas y un índice

CREATE TABLE SCHM01_XIMO.regions
  (
    region_id NUMBER GENERATED BY DEFAULT AS IDENTITY
    START WITH 5 PRIMARY KEY,
    region_name VARCHAR2( 50 ) NOT NULL
  ) 
  TABLESPACE TABSPC01_XIMO;
-- countries table
CREATE TABLE SCHM01_XIMO.countries
  (
    country_id   CHAR( 2 ) PRIMARY KEY  ,
    country_name VARCHAR2( 40 ) NOT NULL,
    region_id    NUMBER                 , -- fk
    CONSTRAINT fk_countries_regions FOREIGN KEY( region_id )
      REFERENCES  SCHM01_XIMO.regions( region_id ) 
      ON DELETE CASCADE
  ) 
  TABLESPACE TABSPC01_XIMO;

CREATE UNIQUE INDEX idx1_unq_countries
ON SCHM01_XIMO.countries(country_name,region_id);

El resto ver en la web de Oracle.

lunes, 25 de septiembre de 2023

Oracle 13 - Nuevo enfoque (10). Oracle Enterprise con docker, Ampliar el tablespace a mas DE 12 GB

 0. Introducción

Probamos con las versiones FREE y EXPRESS y teníamos una limitación de 12 GB en los tablespaces. Estamos pendientes de recibir una copia de seguridad mucho mayor y seguramente estará hecha con compresión.

Vamos a realizar varias pruebas:

  1. Incrementar un Tabspace por encima de los 12 GB (por ejemplo 20 GB)
  2. Añadir a la tabla PRODUCTS 100 millones de registros

1. Incrementar el TABSPACE  a 21 GB

Como hemos creado el tablespace dandole un tamaño de 50 MB con esta sentencia:

CREATE TABLESPACE TABSPC01_XIMO DATAFILE '/opt/oracle/oradata/FREE/FREEPDB1/TABSPC01_XIMO.dbf' SIZE 50M;

Para incrementar su tamaño, tenemos que cambiar el tamaño del DATAFILE así, por ejemplo a 21000 Mbyte:

--Aumentamos el tamaño del DATAFILE a 21GB
ALTER DATABASE DATAFILE '/opt/oracle/oradata/ORCLCDB/ORCLPDB1/TABSPC01_XIMO.dbf' RESIZE 21000M;

Y si además queremos que pueda autoincrementar su tamaño (AUTOEXTEND ON) según le vaya haciendo falta:

--Que autoincremente su tamaño 
ALTER DATABASE DATAFILE '/opt/oracle/oradata/ORCLCDB/ORCLPDB1/TABSPC01_XIMO.dbf' AUTOEXTEND ON;

Y para ver el resultado

SELECT * FROM dba_data_files;

y sale

FILE_NAME                                             |FILE_ID|TABLESPACE_NAME|BYTES      |BLOCKS |STATUS   |RELATIVE_FNO|AUTOEXTENSIBLE|MAXBYTES   |MAXBLOCKS|INCREMENT_BY|USER_BYTES |USER_BLOCKS|ONLINE_STATUS|LOST_WRITE_PROTECT|
------------------------------------------------------+-------+---------------+-----------+-------+---------+------------+--------------+-----------+---------+------------+-----------+-----------+-------------+------------------+
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/system01.dbf     |      9|SYSTEM         |  293601280|  35840|AVAILABLE|           1|YES           |34359721984|  4194302|        1280|  292552704|      35712|SYSTEM       |OFF               |
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/sysaux01.dbf     |     10|SYSAUX         |  387973120|  47360|AVAILABLE|           4|YES           |34359721984|  4194302|        1280|  386924544|      47232|ONLINE       |OFF               |
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/undotbs01.dbf    |     11|UNDOTBS1       |  104857600|  12800|AVAILABLE|           9|YES           |34359721984|  4194302|         640|  103809024|      12672|ONLINE       |OFF               |
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01.dbf      |     12|USERS          |    5242880|    640|AVAILABLE|          12|YES           |34359721984|  4194302|         160|    4194304|        512|ONLINE       |OFF               |
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/TABSPC01_XIMO.dbf|     13|TABSPC01_XIMO  |22020096000|2688000|AVAILABLE|          13|YES           |34359721984|  4194302|           1|22019047424|    2687872|ONLINE       |OFF               |

2. Añadir a la tabla PRODUCTS 100 millones de registros

Vamos a ejecutar este script dentro de nuestra BD (ORCLPDB1) que añade 10 millones de registros a la tabla PRODUCTS


Para ello, como la columna PRODUCT_ID es autogenerada, veamos don DBeaver dicha columna 



y creamos este script en nuestra BD ORCLPDB1 y observar el valor que le damos al campo PRODUICT_ID para que coincida con el que hemos consultado ("SCHM01_XIMO"."ISEQ$$_76482".nextval)


declare
  i number(12) := 1;
begin
   
  while (i<=10000000)
  loop
    INSERT INTO SCHM01_XIMO.PRODUCTS
(PRODUCT_ID, PRODUCT_NAME, DESCRIPTION, STANDARD_COST, LIST_PRICE, CATEGORY_ID)
VALUES("SCHM01_XIMO"."ISEQ$$_76482".nextval, 'AName_' || LTRIM(TO_CHAR(i,'999999999999')), 'ADescription_' || LTRIM(TO_CHAR(i,'999999999999')), 10, 11, 1);
    i := i+1;
  end loop;
 
end;


Para ver el espacio libre de los tabspaces, segun GPSOS ejecutamos

select tablespace_name nb_tablespace, 
       file_id, file_name nb_fichero, 
       size_data_file_mb tamanyo_fichero_MB,
       nvl(free_size_mb,0) espacio_libre_MB
from (
      select d.tablespace_name, d.file_id, d.file_name, 
             d.bytes/1024/1024 size_data_file_mb, 
             sum(f.bytes)/1024/1024 free_size_mb 
      from dba_data_files d left outer join dba_free_space f on d.file_id=f.file_id
      group by d.tablespace_name, d.file_id, d.file_name, d.bytes
      )
order by tablespace_name, file_name;

y obtenemos

NB_TABLESPACE|FILE_ID|NB_FICHERO                                            |TAMAÑO_FICHERO_MB|ESPACIO_LIBRE_MB|
-------------+-------+------------------------------------------------------+-----------------+----------------+
SYSAUX       |     10|/opt/oracle/oradata/ORCLCDB/ORCLPDB1/sysaux01.dbf     |              370|         22.6875|
SYSTEM       |      9|/opt/oracle/oradata/ORCLCDB/ORCLPDB1/system01.dbf     |              280|            7.75|
TABSPC01_XIMO|     13|/opt/oracle/oradata/ORCLCDB/ORCLPDB1/TABSPC01_XIMO.dbf|            21000|       20245.625|
UNDOTBS1     |     11|/opt/oracle/oradata/ORCLCDB/ORCLPDB1/undotbs01.dbf    |             1920|             131|
USERS        |     12|/opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01.dbf      |                5|               4|






Oracle 12 - Nuevo enfoque (9). Oracle Enterprise con docker, restaurar copias de seguridad

 0. Introducción

Inicialmente se utilizó este comando para crear la copia de seguridad en Oracle Express para copiar el esquema SCHM01_XIMO, observar que hay múltiples ficheros DUMP de 1MByte:

#     <usuario>  <password> <bd>             <directorio>               <dump-file>            <log-file>     <SCHEMAS to backup>   <Size of the dump files>
expdp backupuser/myPassword@EXPDB1 DIRECTORY=oracle_backup_sql DUMPFILE=mybkps%U.dmp   LOGFILE=schm_exp.log   SCHEMAS=SCHM01_XIMO FILESIZE=1M;

Cosa que nos creó una copia del SCHEMA SCHM01_XIMO de la BD EXPDB1  (parametro SCHEMAS=SCHM01_XIMO) en el directorio en cuestion, generando multiples ficheroso "dump" del tamaño de 1 MByte y el fichero "log" indicados en los parametros .

1. Restauración de la BD

Veamos los pasos a realizar:

1.1 Pasos previos a realizar si vamos a trabajar con sqlplus 

Hacer estos pasos si estamos en sqlplus. Con DBeaver no hace falta.

a. Ejecutar el contenedor docker a modo comando. Ojo el id del contenedor es el que tengamos tras realizar un docker ps 

#1. Ejecutar el contenedor docker en modo shell
#               <id contenedor> <programa a ejecutar>
docker exec -it <id-contenedor>    /bin/bash

b. Ejecutar sqlplus

#2. Nos conectamos a sqlplus con el usuario sys y permisos sysdba
sqlplus / as sysdba

c. Escogemos la BD (Contenedor SQL) ORCLPDB1

--3. Una vez dentro de SQL plus, usar la BD (Contenedor) en cuestión
ALTER SESSION SET CONTAINER = ORCLPDB1;


1.2 Crear el directorio en SQL donde está la copia de la BD

Creamos el directorio que apunte donde están las copias de seguridad. Las copias de seguridad se hicieron en el volumen ximo-oracle-volume que se montó en la carpeta /opt/ximo-volume  del contenedor docker. Mas concretamente la copia de seguridad está en la subcarpeta BKPS (/opt/ximo-volume/BKPS)

Creamos pues un directorio  SQL (oracle_backup_sql) que apunte a dicha carpeta (para no liarla mas , se le ha dado el mismo nombre que el que utilizamos para crer la copia de seguridad) o sea mapeado a /opt/ximo-volume/BKPS que es donde reside la copia de seguridad

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

Ojo: usar guiones bajos "_" en vez de guiones normales "-" pues da error.

1.3 Crear el Tablespace

Como las tablas del esquema que vamos a restaurar se crearon en el  TABLESPACE  TABSPC01_XIMO, se requiere crear dicho tablespace sinó dará el error:

ORA-00959: tablespace 'TABSPC01_XIMO' does not exist 

Vamos a crear el TABLESPACE TABSPC01_XIMO, para ello ejecutamos

CREATE TABLESPACE TABSPC01_XIMO DATAFILE '/opt/oracle/oradata/ORCLCDB/ORCLPDB1/TABSPC01_XIMO.dbf' size 50M;

Observar que utilizamos un datafile donde aparecen las carpetas ORCLCDB/ORCLPDB1

1.4 Restaurar la copia de seguridad

Salimos de sqlplus y vamos a una shell del contenedor docker de oracle-enterprise. Si no tenemos la sesión shell abierta la abrimos tal como hicimos en los preliminares Ojo el id del contenedor es el que tengamos tras realizar un docker ps 

#1. Ejecutar el contenedor docker en modo shell
#               <id contenedor> <programa a ejecutar>
docker exec -it <id-contenedor>    /bin/bash

Ahora vamos autilizar este comando:

#     <usuario>  <password> <bd>           <directorio>             <dump-file>            <log-file>  
impdp system/myPassword@ORCLPDB1 DIRECTORY=oracle_backup_sql DUMPFILE=mybkps%U.dmp   LOGFILE=schm_exp.log;

Cosa que nos debería de crear una copia del SCHEMA SCHM01_XIMO de la BD ORCLPDB1 en el directorio en cuestion, generando el fichero "dump" y "log" indicados en los parametros . No hay que pasarle el nombre del schema

Importante: usar el usuario system
Ahora vemos que se ha creado el esquema SCHM01_XIMO



-




viernes, 22 de septiembre de 2023

Oracle 11 - Nuevo enfoque (8). Oracle Enterprise con docker

 0.Introducción

La versión Free y la Express solo nos dejan Tablespaces de 12 GB como máximo, vamos a probar la version Enterprise y le montamos el volumen que creamos en post anteriores ximo-oracle-volume


1. Descargar imagen y crear y arrancar el contenedor

docker run --name oracle-enterprise -p 1111:1521 -e ORACLE_PWD=myPassword --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. Si usamos docker, recordar cambiar podman por docker en la primera sentencia


#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 quet tratban Oracle Express, la BD que tenimos era EXPDB1)

2. 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:










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.





Oracle 9 - Nuevo enfoque (6).Free Oracle con Podman y/o docker

 0. Introducción

Se pretende realizar las pruebas pertinentes para poder importar una copia de seguridad grande de una base de datos. Parece ser que Oracle Express tiene una limitación de 6 GB de tamaño, cosa que la descarta.

Para ello se prueba Oracle-Free y seguimos las instrucciones de la web de Oracle.

1. Instalar Podman que sustituye a docker

Se seguiran estos pasos como se indica en clouding.io 


#updating repository
sudo apt-get update -y
sudo apt-get upgrade -y

# add the repository
sudo apt-get install software-properties-common -y
sudo add-apt-repository -y ppa:projectatomic/ppa

#install podman
sudo apt-get install podman -y

#verify
podman info

2. Descargar la imagen, crear contenedor y entrar en sqlplus

Ejecutamos

podman run --name oracle-free -p 1111:1521 -e ORACLE_PWD=myPassword container-registry.oracle.com/database/free:latest

Y tarda mucho tiempo.

Con esto hemos creado el contenedor oracle-free 

NOTA: La misma sentencia hubiera valido con docker solo hay que cambiar podman por docker. Pero, vamos a reutilizar el volumen creado en una entrada anterior (ximo-oracle-volume) y así aprovechamos todo lo hecho. Este volumen alberga las copias de seguridad de Oracle Express.

docker run --name oracle-free -p 1111:1521 -e ORACLE_PWD=myPassword --mount source=ximo-oracle-volume,target=/opt/ximo-volume container-registry.oracle.com/database/free:latest

Vamos a entrar en modo comandos y ver los contendores (BD de oracle) que tenemos. Si usamos docker, recordar cambiar podman por docker en la primera sentencia


#ejecutamos en nuestro servidor local
podman exec -it oracle-free /bin/bash

#estamos dentro del contenedor podman entramos en sqlplus como sysdba
bash-4.4$ sqlplus / as sysdba

#devuelve
#SQL*Plus: Release 23.0.0.0.0 - #Production on Fri Sep 22 06:57:22 2023
#Version 23.3.0.23.09
#Copyright (c) 1982, 2023, Oracle.  All rights reserved.
#Connected to:
#Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
#Version 23.3.0.23.09

#ejecutamos la consulta de contenedores desde sqlplus
SQL> select con_id, name from v$containers;
#devuelve: CDB$ROOT, PDB$SEED, FREEPDB1 

Y vemos que hay una base de datos creada FREEPDB1 con la que vamos a trabajar (en entradas anteriores quet tratban 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 FREEDB1 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 Crivers class oracle.jdbc.OraclweDriver 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- Free 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 FREEPDB1  !!! 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:














miércoles, 20 de septiembre de 2023

Oracle 8 - Nuevo enfoque (5).Profundizando en los backups de Oracle con expdp.

 0. Introducción

Créditos: 
https://www.oracle.com/a/ocom/docs/oracle-data-pump-best-practices.pdf

Vamos a ver como crear backups de:

  1. La base de datos /FULL)
  2.  Un SCHEMA
  3. Varias tablas
  4. Un Tablespace
También vamos a ver como:
  1. Usar un fichero de parámetros de copia de seguridad
  2. Fraccionar los ficheros de coopia de seguridad en varios ficheros de tamaño limitado
  3. Comprimir las copias 
Pero no nos olvidemos que nuestra base de datos corre en un contenedor docker, y en el punto anterior hemos visto como crear volúmenes en docker para tener acceso directo  a dichos volumenes tanto por parte de los contenedores docker como del propio servidor. También hemos visto como se asignaban los volúmenes a los contenedores en el proceso de creación de los mismos a partir de una imágen

1. Pasos previos

Para cada uno de estos procesos hay una parte común que és:
  1. Ejecutar el contenedor docker en modo shell
  2. Crear una carpeta en el contenedor docker y a ser posible que esté en el volumen docker
  3. Entrar a sqlplus como usario sys y permisos sysdba
  4. Usar la BD en cuestión
  5. Si no tenemos creado un usuario lo creamos
  6. Mapear dicha carpeta con sqlplus (CREATE DIRECTORY)
  7. Otorgar permisos de read, write del directorio a un usuario
  8. Otorgar permisos DATAPUMP_EXP_FULL_DATABASE al ususario
Veamos estos 5 pasos previos:

#----------------------
# PRELIMINARES
#----------------------

#1. Ejecutar el contenedor docker en modo shell
#               <id contenedor> <programa a ejecutar>
docker exec -it 34a5f979d3de    /bin/bash

#2. Dentro del contenedor docker creamos la carpeta
#   Es conveniente que esta carpeta se encuentre en el volumen
#   asignado al crear el contenedor a partir de la imagen
mkdir /home/ximo/oracle-backup-server #3. Nos conectamos a sqlplus con el usuario sys y permisos sysdba sqlplus / as sysdba
#4. Una vez dentro de SQL plus, usar la BD (Contenedor) en cuestión
ALTER SESSION SET CONTAINER = XEPDB1;

#5. Si no tenemos creado un usuario lo creamos
CREATE USER backupuser IDENTIFIED BY myPassword; #6. Mapear la carpeta física a un directorio de SQL CREATE DIRECTORY oracle_backup_sql AS '/home/ximo/oracle-backup-server'; #7. Otorgamos permisos al usuario en ese directorio GRANT read, write ON DIRECTORY oracle_backup_sql TO backupuser;

#8. Otorgamos permisos al usuario de DATAPUMP_EXP_FULL_DATABASE
GRANT DATAPUMP_EXP_FULL_DATABASE TO backupuser;

#9. Ahora queda realizar la copia de la BS, SQCHEMA, TABLESPACE ...

2. Copia de seguridad de la BD entera

Hay que tener en cuenta que NO SE COPIAN:
  1. Los esquemas del sistema como SYS, ORDSYS, MDSYS
  2. Los Grants sobre los objetos propietarios de SYS.
  3. Hay que tener autorización para el REALM para exportar datos protegidos por REALM
La sentencia a ejecutar dentro de una ventana de comandos (shell) :

#     <usuario>  <password> <bd>             <directorio>               <dump-file>            <log-file>     <FULL copy>
expdp backupuser/myPassword@EXPDB1 DIRECTORY=oracle-backup-sql DUMPFILE=orclfull.dmp   LOGFILE=full_exp.log   FULL=YES;

Cosa que nos creará una copia de la BD EXPDB1 entera (parametro FULL=YES) en el directorio oracle-backup-sql que está mapeado al volumen de docker, el cual tenenos acdeso desde el servidor físico. La copia de seguridad se descarga en los ficheros ".dump" y ".log" que hemos indicado (orclfull.dmp y full_exp.log

3. Copia de seguridad de un SCHEMA

La sentencia a ejecutar dentro de una ventana de comandos (shell) :

#     <usuario>  <password> <bd>             <directorio>               <dump-file>            <log-file>     <SCHEMAS to backup>
expdp backupuser/myPassword@EXPDB1 DIRECTORY=oracle-backup-sql DUMPFILE=orclschm.dmp   LOGFILE=schm_exp.log   SCHEMAS=SCHM01_XIMO;

Cosa que nos creará una copia del SCHEMA SCHM01_XIMO de la BD EXPDB1  (parametro SCHEMAS=SCHM01_XIMO) en el directorio en cuestion, generando el fichero "dump" y "log" indicados en los parametros .

4. Copia de seguridad de tablas

Lógicamente no se exportan relaciones entre tablas.

La sentencia a ejecutar dentro de una ventana de comandos (shell) :

#     <usuario>  <password> <bd>             <directorio>               <dump-file>           <log-file>          <TABLES to backup>
expdp backupuser/myPassword@EXPDB1 DIRECTORY=oracle-backup-sql DUMPFILE=orcltabls.dmp LOGFILE=tabls_exp.log TABLES=regions, products;

Cosa que nos creará una copia de llas tablas regions y products de la BD EXPDB1  (parametro TABLES=regions,products) en el directorio en cuestion, generando el fichero "dump" y "log" indicados en los parametros .

5. Copia de seguridad de TABLESPACE

Lógicamente no se exportan relaciones entre tablas.

La sentencia a ejecutar dentro de una ventana de comandos (shell) :

#     <usuario>  <password> <bd>             <directorio>               <dump-file>            <log-file>       <TABLESPACE to backup>
expdp backupuser/myPassword@EXPDB1 DIRECTORY=oracle-backup-sql DUMPFILE=orcltblspc.dmp LOGFILE=tblspc_exp.log   TABLESPACES=TBLSPC1, TBLSPC2;

Cosa que nos creará una copia de los  TABLESPACES TBLSPC1, TBLSPC2 de la BD EXPDB1  (parametro TABLESPCES=TBLSPC1, TBLSPC2) en el directorio en cuestion, generando el fichero "dump" y "log" indicados en los parametros .


6. Múltiples ficheros del mismo tamaño, compresión, archivo de configuración...

6.1 Partir la copia en varios ficheros

Para crear múltiples ficheros de  copia de seguridad del mismo tamaño , hay que modificar el parámetro DUMPFILE y añadir el parámetr FILESIZE quedando:

DUMPFILE=orcltblspc%U.dmp FILESIZE=1M  

Observar el parámetro %U de DUMPFILE que se sustituye por el número correlativo del fichero generado y el parámetro FILESIZE que admite un valor entero seguido de una de estas letras B:byte, K:Kbyte, M: Megabyte y G:Gigabyte. En el ejemplo hemos puesto un mega de tamaño

6.2 Comprimir la copia de seguridad

OJO: Para utilizar compresión hay que tener la licencia Enterprise!
Para crear las copias comprimidas utilizamos el parámetro COMPRESSION que puede tomar los valores:
ALL: lo comprime todo.or the entire export operation.
DATA_ONLY: Solo datos.
METADATA_ONLY: Solo metadatos.
NONE: No comprime.

6.3 Archivo de configuración

Se puede crear un archivo de configuración. En mi caso he creado el archivo /home/oracle/COPY.par con la siguiente información

DIRECTORY=oracle-backup-sql 
DUMPFILE=orclschm%U.dmp   
FILESIZE=1M
LOGFILE=schm_exp.log
SCHEMAS=SCHM01_XIMO
COMPRESSION=ALL NO USAR EN ORACLE EXPRESS, SOLO EN ENTERPRISE

Y la sentencia a ejecutar es:

expdp backupuser/myPassword@EXPDB1 PARFILE=/home/oracle/COPY.par






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.