Para conseguir un funcionamiento seguro de la BD y una pronta recuperación ante fallos se necesita planear una estrategia de copias de seguridad, backup, y de recuperación, recovery, ya que de nada sirve pensar que estamos a salvo de tales circunstancias, y que eso no me puede pasar a mí. Y el primer paso a dar es definir las características fundamentales de la implantación, porque mal vamos a conseguir unos objetivos si se desconocen o están indefinidos. El segundo paso es establecer unos planes de copias de seguridad y recuperación que nos permitan asegurar los objetivos.
Mayo de 1998.
Planear y comprobar los procedimientos de backup del sistema es la única garantía que existe contra fallos del sistema, del SO, del software o cualquier otro tipo de circunstancias.
Las causas de error en una sistema de BD pueden agruparse en las siguientes categorías:
De entre todas estas posibilidades, el DBA sólo puede influir y prever los errores de funcionamiento, ya que el resto habitualmente no está dentro de sus responsabilidades y capacidades.
Dada la complejidad de los sistemas actuales y las necesidades cada vez más críticas en la disponibilidad de los sistemas, donde una BD caida puede causar pérdidas millonarias, puede ser interesante considerar los mecanismos de protección hardware y de redundancia que la tecnología nos proporciona:
Una de las más importantes decisiones que un DBA debe tomar es decidir si arrancar la BD en modo ARCHIVELOG o no. Esta decisión tiene sus ventajas e inconvenientes:
Los backups se pueden clasificar en físicos y lógicos. Los físicos se realizan cuando se copian los ficheros que soportan la BD. Entre estos se encuentran los backups del SO, los backups en frío y los backups en caliente.
Los backups lógicos sólo extraen los datos de las tablas utilizando comandos SQL y se realizan con la utilidad export/import.
Backups del SO
Este tipo de backup es el más sencillo de ejecutar, aunque consume mucho tiempo y hace inaccesible al sistema mientras se lleva a cabo. Aprovecha el backup del SO para almacenar también todos los ficheros de la BD. Los pasos de este tipo de backup son los siguientes:
Backups de la BD en Frio
Backups de la BD en Caliente
Backups Lógicos con Export/Import
Una vez que se ha planeado una estrategia de backup y se ha probado, conviene automatizarla para facilitar así su cumplimiento.
Oracle proporciona diferentes modos de recuperar un fallo en la BD, y es importante que el DBA conozca como funciona cada uno de ellos para determinar cuándo ha de ser utilizado.
Una de las mayores responsabilidades del DBA consiste en tener la BD a punto, y prepararla ante la posibilidad de que se produzca un fallo. Así, ante un fallo el DBA podrá recuperar la BD en el menor tiempo posible. Los procesos de recuperación dependen del tipo de error y de las estructuras afectadas.
Así, los tipos de error que se pueden producir son:
Errores de Usuario
Fallos de Sentencias
Fallos de Procesos
Fallos de la Red
Fallos de Instancia
Fallos del Sistema
Existen tres tipos de recuperación en Oracle: a nivel de bloque, de thread y física.
Recuperación de bloques
Recuperación de threads
Recuperación física
Un backup válido es una copia de la información sobre la BD necesaria para reconstruir la BD a partir de un estado no utilizable de la misma. Normalmente, si la estrategia de backup se basa en la copia de los ficheros de datos y en el archivado de los ficheros redo log, se han de tener copias de los ficheros de datos, de los ficheros de control, de los ficheros redo log activos y también de los archivados. Si se pierde uno de los ficheros redo log archivados se dice que se tiene un agujero en la secuencia de ficheros. Esto invalida el backup, pero permite a la BD ser llevada hasta el principio del agujero realizando una recuperación incompleta.
Antes de nada, es muy importante entender ciertas reglas que determinan la situación de los ficheros y otras consideraciones que afectarán al esquema de backup:
SVRMGR> alter database backup controlfile to 'destino';
Teniendo en cuenta las reglas anteriores, los siguientes puntos pueden considerarse un ejemplo de estrategia de backup:
Los backups físicos son aquellos que copian físicamente los ficheros de la BD. Existen dos opciones: en frío y en caliente. Se dice que el backup es en frio cuando los ficheros se copian con la BD esta parada. En caliente es cuando se copian los ficheros con la BD abierta y funcionando.
Backup en Frío
El primer paso es parar la BD con el comando shutdown normal. Si la BD se tiene que parar con inmediate o abort debe rearrancarse con el modo RESTRICT y vuelta a parar en modo normal. Después se copian los ficheros de datos, los de redo log y los de control, además de los redo log archivados y aún no copiados.
Una buena idea es automatizar todo este proceso con los scripts correspondientes, de modo que no nos olvidemos de copiar ningún fichero.
Como este tipo de backup es una copia de los ficheros de la BD, si estos contienen algún tipo de corrupción, la traspasaremos a la copia de seguridad sin detectarla. Por esto es importante comprobar las copias de seguridad.
Backup en Caliente
Si la implantación de BD requiere disponibilidad de la misma 24h. al día, 7 dias a la semana no se pueden realizar backups en frio. Para efectuar un backup en caliente debemos trabajar con la BD en modo ARCHIVELOG. El procedimiento de backup en caliente es bastante parecido al frio. Existen dos comandos adicionales: begin backup antes de comenzar y end backup al finalizar el backup. Por ejemplo, antes y después de efectuar un backup del tablespace users se deberían ejecutar las sentencias:
SVRMGR> alter tablespace users begin backup; SVRMGR> alter tablespace users end backup;
Así como el backup en frio permitía realizar una copia de toda la BD al tiempo, en los backups en caliente la unidad de tratamiento es el tablespace. El backup en caliente consiste en la copia de los ficheros de datos (por tablespaces), el actual fichero de control y todos los ficheros redo log archivados creados durante el periodo de backup. También se necesitarán todos los ficheros redo log archivados después del backup en caliente para conseguir una recuperación total.
Este tipo de backups copian el contenido de la BD pero sin almacenar la posición física de los datos. Se realizan con la herramienta export que copia los datos y la definición de la BD en un fichero en un formato interno de Oracle.
Para realizar un export la BD debe estár abierta. Export asegura la consistencia en la tabla, aunque no entre tablas. Si se requiere consistencia entre todas las tablas de la BD entonces no se debe realizar ninguna transacción durante el proceso de export. Esto se puede conseguir si se abre la BD en modo RESTRICT.
Entre las ventajas de efectuar un export están las siguientes:
Una de las desventajas de realizar backups lógicos con export es que son mucho más lentos que los backups físicos.
Parámetros de Export
Parámetro | Defecto | Descripción |
USERID | indefinido | el username/password del usuario que efectua el export. |
BUFFER | dependiente del SO | El tamaño en bytes del buffer utilizado. |
FILE | expdat.dmp | el nombre del fichero destino. |
GRANTS | Yes | indica si se exportan también los derechos. |
INDEXES | Yes | indica si se exportan también los índices. |
ROWS | Yes | indica si se exportan también las filas de las tablas, o sólo las definiciones de las tablas. |
CONSTRAINTS | Yes | indica si se exportan también las restricciones. |
COMPRESS | Yes | indica si se exporta en modo comprimido. |
FULL | No | indica si se exporta la BD entera. |
OWNER | usuario actual | una lista de usuarios cuyos objetos se quieren exportar. |
TABLES | indefinido | la lista de tablas a exportar. |
RECORDLENGTH | dependiente del SO | la longitud en bytes del registro del fichero. |
INCTYPE | indefinido | el tipo de export incremental. |
RECORD | Yes | indica si se anota el export incremental en las tablas SYS.INCVID y en SYS.INCEXP. |
PARFILE | indefinido | el fichero de parámetros. |
Modos de Export
Existen tres modos de realizar una exportación de datos:
$ exp userid=system/manager full=y inctype=complete constraints=Y file=full_export_filename
$ exp userid=system/manager full=y inctype=cumulative constraints=Y file=cumulative_export_filename
$ exp userid=system/manager full=y inctype=incremental constraints=Y file=incremental_export_filename
La política de exportación puede ser la siguiente: realizar una exportación completa el día 1 (por ejemplo el domingo), y luego realizar exportaciones incrementales el resto de la semana. De este modo de lunes a sábado sólo se exportarán aquellas tablas exportadas, ahorrando tiempo en el proceso.
Para entender los principios de la recuperación, se necesita entender las estructuras de datos subyacentes utilizadas en la recuperación.
Los ficheros redo log contienen los cambios realizados sobre la BD. Conviene presentar algunos conceptos relacionados con ellos.
SVRMGR> archive log list; Database log mode No Archive Mode Automatic archival Disabled Archive destination /opt/app/oracle/admin/demo/arch/arch.log Oldest online log sequence 3 Current log sequence 5
Existen varios métodos de recuperación, pero todos ellos se basan en la aplicación de los registros de redo log.
Aplicación de Redo Log
Cuando una BD se arranca con el comando startup, la BD pasa por los estados nomount, mount y open. En este tercer estado, se verifica que se pueden abrir todos los ficheros de log y de datos. Si la BD se arranca por primera vez después de una caida, se necesitará efectuar una recuperación que consiste en dos pasos: avanzar la BD hacia adelante aplicando los registros redo log, deshacer las transacciones no confirmadas.
Cada fichero de datos tiene en su cabecera el último checkpoint efectuado, así como el fichero de control también lleva esa cuenta. El checkpoint lleva incluido el SCN. Este es conocido como SCN de inicio de fichero. Asociado a cada fichero de datos el fichero de control tiene el SCN de final, puesto inicialmente a infinito. El SCN de inicio se incrementa con cada checkpoint.
Cuando la BD se para en modo normal o inmediato iguala el SCN de parada para cada fichero de datos al SCN almacenado en cada fichero de datos. Cuando se abre otra vez la BD se realizan dos comprobaciones. La primera es mirar si el contador de checkpoints en la cabecera de los ficheros de datos coincide con el correspondiente del fichero de control. Si es así, se compara el SCN de inicio de cada fichero de datos con el SCN de final almacenado en el fichero de control. Si son iguales no se necesita recuperación en este fichero de datos. Como parte de la apertura se pone a infinito el SCN de final para ese fichero de datos.
Si la BD se paró con en modo abort no se ejecutó el checkpoint y el SCN de fin para los fichero de datos está a infinito. Así, durante la BD se abre, y suponiendo que el contador de checkpoints coincide, se comparan los SCN de inicio y de final, y como el último es infinito se efectura una recuperación aplicando los cambios almacenados en los ficheros redo log en línea para avanzar la BD, y los registros de roll back de los segmentos de roll back para deshacer las transacciones no confirmadas.
Si después de parar la BD se reemplaza un fichero de datos por su copia de seguridad, al arrancar la BD Oracle detecta que el contador de checkpoints del fichero de datos no coincide con el almacenado en el fichero de control. Así, se tendrá que echar mano a los ficheros redo log archivados, empezando por aquel cuyo número de secuencia aparece en la cabecera del fichero de datos.
La utilización de una copia de backup de ficheros de datos siempre necesita de una recuperación física. También es así cuando un fichero de datos se pone offline sin un checkpoint.
Oracle detecta que se necesita una recuperación física cuando el contador de checkpoints de la cabecera del fichero de datos no coincide con el correspondiente contador de checkpoints del fichero de control. Entonces se hace necesario el comando recover. La recuperación comienza en el SCN menor de los ficheros de datos en recuperación, aplicando los registros de redo log a partir de él, y parando en el SCN de final mayor de todos los ficheros de datos.
Existen tres opciones para realizar una recuperacion física. La primera es una recuperación de BD donde se restaura la BD entera. La segunda es una recuperación de tablespace donde, mientras una parte de la BD está abierta, se puede recuperar un tablespace determinado. Esto significa que serán recuperados todos los ficheros de datos asociados al tablespace. El tercer tipo es la recuperación de un fichero de datos específico mientras el resto de la BD está abierta.
Requisitos para Utilizar Recuperación Física
La primera condición que se ha de poner para poder recuperar físicamente una BD es que ésta se esté utilizando en modo ARCHIVELOG. De otro modo, una recuperación completa puede que no sea posible. Si trabajamos con la BD en modo NOARCHIVELOG, y se hace una copia semanal de los ficheros de la BD, se debería estar preparado para perder, en el peor de los casos, el trabajo de la última semana si sucede un fallo. Ya que los ficheros de redo log contendrían un agujero y no se podia avanzar la BD hasta el intante anterior al fallo. En este caso el único medio para reconstruir la BD es hacerlo desde un export completo, recreando el esquema de la BD e importando todos los datos.
Recuperación de la BD
La BD debe estar montada pero no abierta. El comando de recuperación es el siguiente:
RECOVER [AUTOMATIC] [FROM 'localizacion'] [BD] [UNTIL CANCEL] [UNTIL TIME fecha] [UNTIL CHANGE entero] [USING BACKUP CONTROLFILE]
Las opciones entre corchetes son opcionales:
Recuperación de un tablespace
La BD debe estar abierta, pero con el tablespace a recuperar offline. El comando de recuperación es el siguiente:
RECOVER [AUTOMATIC] [FROM 'localizacion'] TABLESPACE nombre_tablespace [, nombre_tablespace]
Recuperación de un Fichero de Datos
La BD debe estar abierta o cerrada, dependiendo del fichero a recuperar. Si el fichero a recuperar es de un tablespace de usuario la BD puede estar abierta, pero con el fichero a recuperar offline. Si el fichero es del tablespace SYSTEM la BD debe estar cerrada, ya que no puede estar abierta con los ficheros del SYSTEM offline. El comando de recuperación es el siguiente:
RECOVER [AUTOMATIC] [FROM 'localizacion'] DATAFILE nombre_fichero [, nombre_fichero]
Creando un Fichero de Control
Si el fichero de control ha resultado dañado y se ha perdido se puede utilizar una copia de seguridad del mismo o crear uno nuevo. El comando de creación de un nuevo fichero de control es CREATE CONTROLFILE. Este comando se puede ejecutar sólo con la BD en estado nomount. La ejecución del comando produce un nuevo fichero de control y el montaje automático de la BD.
Un comando interesante que ayuda a mantener los ficheros de control a salvo es el siguiente:
SVRMGR> alter database backup controlfile to trace;
que produce un script que puede ser utilizado para generar un nuevo fichero de control y recuperar la BD, en caso necesario. El fichero de traza generado es el siguiente:
Dump file /opt/app/oracle/admin/demo/udump/demo_ora_515.trc Oracle7 Server Release 7.3.2.3.0 - Production Release With the distributed, replication and Spatial Data options PL/SQL Release 2.3.2.3.0 - Production ORACLE_HOME = /opt/app/oracle/product/7.3.2 System name: SunOS Node name: cartan Release: 5.5 Version: Generic Machine: sun4m Instance name: demo Redo thread mounted by this instance: 1 Oracle process number: 7 Unix process pid: 515, image: oracledemo Fri May 15 11:41:19 1998 Fri May 15 11:41:19 1998 *** SESSION ID:(6.2035) 1998.05.15.11.41.19.000 # The following commands will create a new control file and use it # to open the database. # No data other than log history will be lost. Additional logs may # be required for media recovery of offline data files. Use this # only if the current version of all online logs are available. STARTUP NOMOUNT CREATE CONTROLFILE REUSE DATABASE "DEMO" NORESETLOGS NOARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 2 MAXDATAFILES 30 MAXINSTANCES 1 MAXLOGHISTORY 100 LOGFILE GROUP 1 '/export/home/oradata/demo/redodemo01.log' SIZE 2M, GROUP 2 '/export/home/oradata/demo/redodemo02.log' SIZE 2M, GROUP 3 '/export/home/oradata/demo/redodemo03.log' SIZE 2M DATAFILE '/export/home/oradata/demo/system01.dbf', '/export/home/oradata/demo/rbs01.dbf', '/export/home/oradata/demo/rbs02.dbf', '/export/home/oradata/demo/rbs03.dbf', '/export/home/oradata/demo/temp01.dbf', '/export/home/oradata/demo/tools01.dbf', '/export/home/oradata/demo/users01.dbf' ; # Recovery is required if any of the datafiles are restored backups, # or if the last shutdown was not normal or immediate. RECOVER DATABASE # Database can now be opened normally. ALTER DATABASE OPEN;
Oracle dispone de la herramienta import para restaurar los datos de una BD a partir de los ficheros resultados de un export. Import lee los datos de los ficheros de exportación y ejecuta las sentencias que almacenan creando las tablas y llenándolas de datos.
Parámetros del Import
Parámetro | Defecto | Descripción |
USERID | indefinido | el username/password del usuario que efectua el import. |
BUFFER | dependiente del SO | El tamaño en bytes del buffer utilizado. |
FILE | expdat.dmp | el nombre del fichero de exportación a importar. |
SHOW | No | indica si se muestran los contenidos del fichero de exportación, sin importar ningún dato. |
IGNORE | Yes | indica si ignorar los errores producidos al importar un objeto que ya existe en la BD. |
GRANTS | Yes | indica si se importan también los derechos. |
INDEXES | Yes | indica si se importan también los índices. |
ROWS | Yes | indica si se importan también las filas de las tablas. |
FULL | No | indica si se importan el fichero entero. |
FROMUSER | Indefinido | una lista de los usuarios cuyos objetos se han exportado. |
TOUSER | Indefinido | una lista de los usuarios a cuyo nombre se importan los objetos. |
TABLES | indefinido | la lista de tablas a importar. |
RECORDLENGTH | dependiente del SO | la longitud en bytes del registro del fichero. |
INCTYPE | indefinido | el tipo de import incremental (SYSTEM o RESTORE). |
COMMIT | No | indica si se efectua un commit después de importar cada fila. Por defecto, import efectua un commit después de cargar cada tabla. |
PARFILE | indefinido | el fichero de parámetros. |
Para importar un export incremental se puede efectuar la siguiente secuencia de pasos:
$ imp userid=sys/passwd inctype=system full=Y file=export_filename
$ imp userid=sys/passwd inctype=restore full=Y file=filename
$ imp userid=sys/passwd inctype=restore full=Y file=filename
$ imp userid=sys/passwd inctype=restore full=Y file=filename