Salta el contingut
 

Còpies de seguretat

Joan Puigcerver Ibáñez

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Introducció

Un dels aspectes més importants de la seguretat de les dades és garantir la disponibilitat de la informació i la capacitat de recuperació en cas de fallada. Per això, pràcticament tots els gestors de bases de dades incorporen ferramentes per fer còpies de seguretat de les dades i restaurar-les quan siga necessari.

Hi ha dos mecanismes bàsics que permeten recuperar les dades:

  • Còpies de seguretat: ferramentes que permeten exportar la informació de la base de dades a un suport extern al SGBD i importar-la de nou, de manera que es puga recuperar en cas de fallada.
  • Diari de transaccions o quadern de bitàcola: registre de totes les operacions que modifiquen les dades. A mesura que es fan transaccions, s'escriuen en aquest diari. Quan es confirmen amb COMMIT, els canvis es fan permanents, mentre que, si es desfan amb ROLLBACK, s'eliminen els registres corresponents.

Una bona pràctica és separar físicament les còpies de seguretat de les dades originals per evitar pèrdues en cas de fallada del disc, corrupció o atacs.

El procés de recuperació d'una base de dades combina tots dos mecanismes i es basa en tres tasques:

  • Backup: fer còpies de seguretat periòdiques de les dades.
  • Restore: restaurar les dades a partir de les còpies de seguretat.
  • Recovery: aplicar els canvis del diari de transaccions per actualitzar les dades fins a un punt concret en el temps.

Per garantir que aquest procés funciona quan cal, l'administrador de la base de dades s'encarrega de:

  • Definir la política de còpies de seguretat: freqüència, tipus de còpia, emmagatzematge, etc.
  • Definir el procés de restauració i recuperació: com es recuperen les dades en cas de fallada i, si és possible, automatitzar-lo.
  • Planificar simulacres de fallada: comprovar periòdicament que els procediments funcionen.

Tipus de còpies de seguretat

Les còpies de seguretat es poden classificar segons diferents criteris:

  • Segons què es copia:
    • Total: inclou tots els objectes, fitxers, el diari de transaccions, etc.
    • Parcial: només inclou els objectes concrets que es volen copiar.
  • Segons l'abstracció de les dades:
    • Lògica: es copien els objectes de la base de dades (taules, índexs, etc.).
    • Física: es copien els fitxers físics que contenen les dades (datafiles, controlfiles, etc.).
  • Segons l'abast temporal:
    • Completa: es copien totes les dades de la base de dades.
    • Incremental: només es copien les dades que han canviat des de l'última còpia, cosa que redueix el temps i l'espai necessaris.
  • Segons l'estat de la base de dades:
    • En fred (offline): la base de dades està aturada durant la còpia. Garanteix la consistència de les dades, però requereix un temps d'inactivitat.
    • En calent (online): la base de dades està en funcionament durant la còpia. Permet mantindre el servei actiu, però requereix mecanismes addicionals per garantir la integritat.

Còpies de seguretat a Oracle DB

Oracle DB proporciona tres ferramentes per fer còpies de seguretat i recuperar-les:

  • Export/Import (exp/imp): fan còpies de seguretat lògiques, que es guarden en el dispositiu des del qual s'executa la ferramenta.

    Està obsoleta des de la versió 11g.

  • Data Pump (expdp/impdp): fa còpies de seguretat lògiques, que es guarden en fitxers del sistema de fitxers del servidor.

  • Recovery Manager (RMAN): fa còpies de seguretat físiques i incrementals de la base de dades, que també s'emmagatzemen en fitxers del sistema de fitxers del servidor.

La taula següent resumeix quins tipus de còpia permet cada ferramenta:

Ferramenta Totals / Parcials Completes / Incrementals En fred / En calent Lògiques / Físiques
Export/Import Ambdues Completes Ambdues Lògiques
Data Pump Ambdues Completes Ambdues Lògiques
RMAN Ambdues Ambdues Ambdues Físiques

Ferramentes de còpia de seguretat a Oracle DB

Data Pump

Oracle Data Pump és la ferramenta que recomana Oracle per fer còpies de seguretat lògiques i per moure dades entre bases de dades. Substitueix les antigues ferramentes exp/imp i ofereix millor rendiment, paral·lelisme i flexibilitat.

Documentació oficial: Overview of Data Pump – Oracle DB

Components

Oracle Data Pump està format per tres components principals:

  • Clients de línia d'ordres (expdp i impdp): permeten iniciar i controlar les operacions d'exportació (Export Data Pump) i d'importació (Import Data Pump) mitjançant paràmetres indicats a la línia d'ordres.
  • Paquet PL/SQL DBMS_DATAPUMP: també conegut com l'API de Data Pump, implementa la lògica principal de les operacions d'exportació i importació. Els clients expdp i impdp l'utilitzen internament, però també es pot utilitzar directament des de PL/SQL.
  • Paquet PL/SQL DBMS_METADATA: també conegut com l'API de metadades, permet extreure, manipular i recrear les metadades del diccionari de dades (taules, índexs, esquemes, etc.). Data Pump l'utilitza quan ha de moure metadades.

Data Pump s'executa en el servidor del SGBD, no en el client des d'on s'executa l'ordre.

Mètodes de moviment de dades

Data Pump tria entre diversos mètodes per moure les dades. Com més s'allunya el mètode de la capa SQL, més ràpid és, però menys transformacions permet:

  • Còpia directa de fitxers de dades: és un moviment físic que copia els fitxers de dades d'una base de dades a una altra sense passar per la capa SQL. És el mètode més ràpid, ja que no s'interpreten ni es modifiquen les dades. No obstant això, requereix que les bases de dades d'origen i de destí siguen compatibles en estructura i format, i no permet transformacions ni filtrats. Per això, s'utilitza principalment per a migracions completes entre entorns similars.
  • Camí directe (Direct Path): és un moviment lògic que escriu les dades directament en els fitxers de dades de la base de dades de destí. És el mètode més ràpid després de la còpia física, ja que evita la capa SQL convencional: les dades es llegeixen directament dels blocs d'origen i s'escriuen en els blocs de destí, amb una interpretació mínima (format, tipus, etc.).
  • Taules externes (External Tables): és un moviment lògic que utilitza taules externes1 per llegir i escriure les dades en un fitxer de bolcat intermedi. Com que les dades es processen mitjançant SQL, permet transformacions i filtrats, però és més lent que el camí directe.
  • Camí convencional (Conventional Path): Oracle utilitza sentències INSERT per moure les dades. Tot passa per la capa SQL, de manera que cada fila es valida amb les restriccions, els triggers i els índexs. Per això, és compatible amb totes les estructures i formats i permet transformacions i filtrats complexos, però és el mètode més lent i el que consumeix més recursos.
  • Importació mitjançant enllaç de xarxa (NETWORK_LINK): mou les dades directament entre dues bases de dades, sense fitxers intermedis. En lloc de generar un fitxer .dmp, les dades es transmeten directament per la xarxa a través d'un database link, que permet accedir a les dades remotes i executar-hi consultes SQL.

Gestió dels directoris

Data Pump no escriu en qualsevol ruta del servidor: cal definir un objecte de tipus DIRECTORY, on es guardaran els fitxers de bolcat (.dmp) i els fitxers de registre (.log). Aquest objecte associa un nom lògic a un directori físic del sistema de fitxers on el servidor té permisos de lectura i escriptura.

CREATE [OR REPLACE] DIRECTORY <name> AS '<path>';
GRANT READ, WRITE ON DIRECTORY <name> TO <user>;
  • <name>: nom lògic del directori, que s'utilitzarà en les ordres de Data Pump.
  • <path>: ruta del directori físic en el servidor.
  • <user>: usuari que podrà llegir i escriure en el directori.

Els directoris existents es poden consultar a la vista DBA_DIRECTORIES:

SELECT DIRECTORY_NAME, DIRECTORY_PATH FROM DBA_DIRECTORIES;

Per eliminar un directori, s'utilitza l'ordre DROP DIRECTORY:

DROP DIRECTORY <name>;
Preparació de l'entorn d'exemple

Els exemples d'aquests apunts s'executen a partir de l'escenari següent:

  1. Crea l'usuari backup_user i assigna-li una quota il·limitada al tablespace USERS:

    CREATE USER backup_user IDENTIFIED BY password
    DEFAULT TABLESPACE USERS
    QUOTA UNLIMITED ON USERS;
    
  2. Concedeix els permisos necessaris a l'usuari backup_user:

    GRANT CREATE SESSION TO backup_user;
    GRANT CREATE ANY TABLE TO backup_user; -- Necessari per a Data Pump
    
  3. Crea la taula productes i insereix-hi algunes dades:

    CONNECT backup_user/password;
    
    CREATE TABLE productes (
        id NUMBER PRIMARY KEY,
        nom VARCHAR2(100),
        preu NUMBER(10,2)
    );
    
    INSERT INTO productes (id, nom, preu) VALUES (1, 'Producte A', 10.50);
    INSERT INTO productes (id, nom, preu) VALUES (2, 'Producte B', 20.00);
    INSERT INTO productes (id, nom, preu) VALUES (3, 'Producte C', 15.75);
    COMMIT;
    
Exemple: Crear un directori per a Data Pump

Es crea el directori DPUMP_DIR, que s'utilitzarà en la resta d'exemples.

  1. Es crea un directori físic en el sistema de fitxers del servidor, on s'emmagatzemaran els fitxers de Data Pump:

    mkdir -p /home/oracle/dpump
    chown oracle:oinstall /home/oracle/dpump
    chmod 700 /home/oracle/dpump
    
  2. Es crea l'objecte DIRECTORY a Oracle i es concedeixen permisos a l'usuari backup_user:

    CREATE OR REPLACE DIRECTORY DPUMP_DIR AS '/home/oracle/dpump';
    GRANT READ, WRITE ON DIRECTORY DPUMP_DIR TO backup_user;
    
  3. Es comprova que el directori s'ha creat correctament:

    SELECT DIRECTORY_NAME, DIRECTORY_PATH
        FROM ALL_DIRECTORIES
        WHERE DIRECTORY_NAME = 'DPUMP_DIR';
    
    DIRECTORY_NAME  DIRECTORY_PATH
    --------------- ------------------------------
    DPUMP_DIR       /home/oracle/dpump
    

Exportar dades (expdp)

Per exportar dades amb Data Pump, s'utilitza la ferramenta expdp:

expdp <username>/<password> DIRECTORY=<directory_name> DUMPFILE=<dumpfile_name> \
    LOGFILE=<logfile_name> [paràmetres]
  • DIRECTORY=<directory_name>: objecte DIRECTORY on es guardaran els fitxers.
  • DUMPFILE=<dumpfile_name>: nom del fitxer de bolcat.
  • LOGFILE=<logfile_name>: nom del fitxer de registre de l'operació.

Documentació oficial: Oracle Data Pump Export – Oracle DB

L'exportació es pot fer a diferents nivells, segons el paràmetre que s'indique:

  • Base de dades completa (Full Database): exporta tota la base de dades amb FULL=Y.

    Els permisos per exportar i importar tota la base de dades són EXP_FULL_DATABASE i IMP_FULL_DATABASE, respectivament.

  • Esquema (Schema): exporta tots els objectes d'un esquema amb SCHEMAS=<schema_name>.

  • Taula (Table): exporta taules concretes amb TABLES=<table_name1>,<table_name2>.
  • Tablespace: exporta tots els objectes d'un tablespace amb TABLESPACES=<tablespace_name>.
  • Tablespace transportable (Transportable Tablespace): exporta tablespaces per transportar-los a una altra base de dades amb TRANSPORT_TABLESPACES=<tablespace_name>.

A més, hi ha paràmetres addicionals per filtrar les dades, transformar-les o controlar el comportament de l'exportació:

  • QUERY: exporta només les files que compleixen una condició SQL.
  • PARALLEL: executa l'exportació en paral·lel per millorar el rendiment.
  • ESTIMATE_ONLY: estima la mida del bolcat sense fer l'exportació.

Com que la línia d'ordres es fa llarga, és més còmode escriure els paràmetres en un fitxer i indicar-lo amb l'opció PARFILE=<parameter_file>:

example.par
DIRECTORY=<directory_name>
DUMPFILE=<dumpfile_name>
LOGFILE=<logfile_name>
# Tria el que vulgues exportar
    FULL=Y
    SCHEMAS=<schema_name>
    TABLES=<table_name1>,<table_name2>
    ...
# Tria les dades a exportar
    CONTENT=ALL|DATA_ONLY|METADATA_ONLY
    QUERY=<SQL_condition>
Exemple: Exportar els productes amb preu superior a 15

Es creen un fitxer de paràmetres i una exportació dels productes amb preu superior a 15.

  1. Es configura un fitxer de paràmetres per exportar els productes amb preu superior a 15 de la taula productes de l'usuari backup_user al fitxer productes.dmp del directori DPUMP_DIR:

    productes.par
    DIRECTORY=DPUMP_DIR
    DUMPFILE=productes.dmp
    LOGFILE=productes_exp.log
    TABLES=productes
    QUERY="WHERE preu > 15"
    
    echo "DIRECTORY=DPUMP_DIR" > productes.par
    echo "DUMPFILE=productes.dmp" >> productes.par
    echo "LOGFILE=productes_exp.log" >> productes.par
    echo "TABLES=productes" >> productes.par
    echo "QUERY=\"WHERE preu > 15\"" >> productes.par
    
  2. S'executa la ferramenta expdp amb el fitxer de paràmetres:

    expdp backup_user@XEPDB1/password PARFILE=productes.par
    
    Export: Release 21.0.0.0.0 - Production on Thu Jan 22 00:54:57 2026
    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 "BACKUP_USER"."SYS_EXPORT_TABLE_01":  backup_user/********@XEPDB1 TABLES=productes DIRECTORY=DPUMP_DIR DUMPFILE=productes.dmp LOGFILE=productes_exp.log 
    Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
    Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
    Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
    Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
    Processing object type TABLE_EXPORT/TABLE/TABLE
    Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
    . . exported "BACKUP_USER"."PRODUCTES"                   5.984 KB       2 rows
    Master table "BACKUP_USER"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
    ******************************************************************************
    Dump file set for BACKUP_USER.SYS_EXPORT_TABLE_01 is:
      /home/oracle/dpump/productes.dmp
    Job "BACKUP_USER"."SYS_EXPORT_TABLE_01" successfully completed at Thu Jan 22 09:15:52 2026 elapsed 0 00:00:13
    
  3. Es comprova que s'han creat el fitxer de bolcat i el fitxer de registre al directori físic:

    ls -l /home/oracle/dpump/
    
    total 196
    -rw-r-----. 1 oracle oinstall 188416 Jan 22 09:55 productes.dmp
    -rw-r--r--. 1 oracle oinstall   1226 Jan 22 09:55 productes_exp.log
    

S'observa que l'exportació només inclou 2 files, les que compleixen la condició preu > 15.

Importar dades (impdp)

Per importar dades amb Data Pump, s'utilitza la ferramenta impdp, amb els mateixos paràmetres bàsics que expdp:

impdp <username>/<password> DIRECTORY=<directory_name> DUMPFILE=<dumpfile_name> \
    LOGFILE=<logfile_name> [paràmetres]

La importació també es pot fer als mateixos nivells que l'exportació (base de dades completa, esquema, taula o tablespace).

Documentació oficial: Oracle Data Pump Import – Oracle DB

Exemple: Importar la taula productes

Es restaura la taula productes a partir de la còpia de l'exemple anterior.

  1. S'elimina la taula productes de l'usuari backup_user per simular la pèrdua:

    DROP TABLE productes;
    
  2. S'executa la ferramenta impdp per importar la taula productes des del fitxer productes.dmp del directori DPUMP_DIR. Es reutilitza el mateix fitxer de paràmetres que en l'exportació:

    impdp backup_user@XEPDB1/password PARFILE=productes.par
    
    Import: Release 21.0.0.0.0 - Production on Thu Jan 22 01:01:26 2026
    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
    Master table "BACKUP_USER"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded
    Starting "BACKUP_USER"."SYS_IMPORT_TABLE_01":  backup_user/********@XEPDB1 TABLES=productes DIRECTORY=DPUMP_DIR DUMPFILE=productes.dmp LOGFILE=productes_imp.log 
    Processing object type TABLE_EXPORT/TABLE/TABLE
    Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
    . . imported "BACKUP_USER"."PRODUCTES"                   5.984 KB       2 rows
    Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
    Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
    Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
    Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
    Job "BACKUP_USER"."SYS_IMPORT_TABLE_01" successfully completed at Thu Jan 22 09:01:42 2026 elapsed 0 00:00:14
    
  3. Es comprova que la taula productes s'ha importat correctament:

    SELECT * FROM productes;
    
    ID  NOM         PREU
    --  ----------  ------
    2   Producte B  20.00
    3   Producte C  15.75
    

S'observa que només s'han recuperat els productes que contenia la còpia.

Recovery Manager (RMAN)

Recovery Manager (RMAN) és la ferramenta d'Oracle per fer i recuperar còpies de seguretat físiques. A més, manté un catàleg de còpies i permet automatitzar tasques mitjançant scripts.

Preparació de l'entorn

Abans d'utilitzar RMAN, cal preparar la instància perquè guarde els registres necessaris per a la recuperació i indicar on es guardaran les còpies:

  1. Posa la instància en mode archive log, que permet la recuperació de les dades:

    SHUTDOWN IMMEDIATE;
    STARTUP MOUNT;
    ALTER DATABASE ARCHIVELOG;
    ALTER DATABASE OPEN;
    
  2. Comprova l'estat de l'archive log, que hauria d'estar habilitat:

    ARCHIVE LOG LIST;
    
  3. Estableix la mida màxima dels fitxers de còpia de seguretat mitjançant el paràmetre DB_RECOVERY_FILE_DEST_SIZE:

    ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=5G SCOPE=BOTH;
    
  4. Configura el directori on s'emmagatzemaran les còpies de seguretat mitjançant el paràmetre DB_RECOVERY_FILE_DEST:

    ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/path/to/directory' SCOPE=BOTH;
    

    El directori ha d'existir prèviament al sistema de fitxers del SGBD.

Fer còpies de seguretat (BACKUP)

Per fer còpies de seguretat, s'utilitza el client rman, que es connecta a la instància de la base de dades i permet executar-hi ordres de còpia de seguretat:

rman TARGET <username>/<password>@<service_name>

Una vegada connectat, l'ordre BACKUP fa la còpia. Segons què es vol copiar, s'utilitza una variant o una altra:

  • Base de dades completa:

    BACKUP DATABASE;
    
  • Pluggable database (PDB): primer es consulta el nom de les PDB i després se'n fa la còpia.

    SELECT CON_ID, DBID, GUID, NAME FROM V$PDBS;
    
    BACKUP PLUGGABLE DATABASE <pdb_name> [TAG '<tag_name>'];
    

  • Tablespace:

    BACKUP TABLESPACE <tablespace_name>;
    
  • Datafile: primer es consulta el número del datafile i després se'n fa la còpia.

    SELECT FILE#, NAME FROM V$DATAFILE;
    
    BACKUP DATAFILE <datafile_number>;
    

L'estat de les còpies de seguretat fetes es pot consultar amb l'ordre LIST BACKUP:

LIST BACKUP [OF DATABASE | TABLESPACE <tablespace_name> | DATAFILE <datafile_number>]
    [TAG '<tag_name>'];
  • [OF DATABASE]: (opcional) llista totes les còpies de seguretat de la base de dades.
  • [OF TABLESPACE <tablespace_name>]: (opcional) llista les còpies del tablespace indicat.
  • [OF DATAFILE <datafile_number>]: (opcional) llista les còpies del datafile indicat.
  • [TAG '<tag_name>']: (opcional) filtra les còpies per una etiqueta.

Restauració de les dades (RESTORE i RECOVER)

La recuperació amb RMAN es fa en dos passos: RESTORE recupera els fitxers a partir de la còpia de seguretat i RECOVER hi aplica els canvis registrats després de la còpia. Abans de restaurar, l'element afectat s'ha de posar fora de línia:

  • Base de dades completa: primer, cal aturar la base de dades i muntar-la.

    SHUTDOWN IMMEDIATE;
    ALTER DATABASE MOUNT;
    

    A continuació, des de rman:

    RESTORE DATABASE;
    RECOVER DATABASE;
    ALTER DATABASE OPEN;
    
  • Pluggable database (PDB):

    ALTER PLUGGABLE DATABASE <pdb_name> CLOSE;
    RESTORE PLUGGABLE DATABASE <pdb_name>;
    RECOVER PLUGGABLE DATABASE <pdb_name>;
    ALTER PLUGGABLE DATABASE <pdb_name> OPEN;
    
  • Tablespace: primer es consulten els seus datafiles i després es restaura.

    SELECT FILE_ID, FILE_NAME FROM CDB_DATA_FILES WHERE TABLESPACE_NAME = '<tablespace_name>';
    
    ALTER TABLESPACE <tablespace_name> OFFLINE IMMEDIATE;
    RESTORE TABLESPACE <tablespace_name>;
    RECOVER TABLESPACE <tablespace_name>;
    ALTER TABLESPACE <tablespace_name> ONLINE;
    

  • Datafile: primer es consulta quins datafiles tenen errors i després es restaura.

    SELECT FILE#, ERROR, RECOVER FROM V$DATAFILE_HEADER;
    
    ALTER DATABASE DATAFILE <datafile_number> OFFLINE;
    RESTORE DATAFILE <datafile_number>;
    RECOVER DATAFILE <datafile_number>;
    ALTER DATABASE DATAFILE <datafile_number> ONLINE;
    


  1. Les taules externes permeten accedir amb SQL a dades emmagatzemades fora de la base de dades com si foren taules internes. ↩

📌 Aquest document pot quedar desactualitzat després d’imprimir-lo. Pots consultar la versió més recent a la pàgina web.
🌿 Abans d’imprimir aquest document, considera si és realment necessari. Redueix el consum de paper i ajuda a protegir el nostre entorn.