viernes, septiembre 21, 2012

Oracle: modo archivelog

Nuestras base de datos de producción deberían estar en modo archivelog. Voy a enumerar los pasos a seguir para ponerlo en este modo:

1.-Comprobar los parámetros actuales:

Importante: El directorio donde se van a generar los ficheros de archivado debe existir antes de cambiar al modo archivelog.


SQL> archive log list;
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     233
Current log sequence           235

En "Archive destination" puede venir el directorio destino de los archives, o puede venir el parámetro "use_db_recovery_file_dest" como en mi caso.

SQL> show parameter recovery

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      /oracle10g/flash_recovery_area
db_recovery_file_dest_size           big integer 2G
recovery_parallelism                 integer     0
SQL>

En db_recovery_file_dest_size indicamos el límite máximo de espacio para los archives. Podemos aumentarlo:

SQL> alter system set db_recovery_file_dest_size = 20G scope=both;

Ahora vamos a ver el formato de los ficheros que se van a generar. Eso viene definido por el parámetro log_archive_format.


SQL> show parameter archive

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target                   integer     0
log_archive_config                   string
log_archive_dest                     string
log_archive_dest_state_1             string      enable
log_archive_dest_state_10            string      enable
log_archive_dest_state_2             string      enable
log_archive_dest_state_3             string      enable
log_archive_dest_state_4             string      enable
log_archive_dest_state_5             string      enable
log_archive_dest_state_6             string      enable
log_archive_dest_state_7             string      enable

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_state_8             string      enable
log_archive_dest_state_9             string      enable
log_archive_dest_1                   string
log_archive_dest_10                  string
log_archive_dest_2                   string
log_archive_dest_3                   string
log_archive_dest_4                   string
log_archive_dest_5                   string
log_archive_dest_6                   string
log_archive_dest_7                   string
log_archive_dest_8                   string

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_9                   string
log_archive_duplex_dest              string
log_archive_format                   string      %t_%s_%r.dbf
log_archive_local_first              boolean     TRUE
log_archive_max_processes            integer     2
log_archive_min_succeed_dest         integer     1
log_archive_start                    boolean     FALSE
log_archive_trace                    integer     0
remote_archive_enable                string      true
standby_archive_dest                 string      ?/dbs/arch


2.-Activar la generación del archivado:

Paramos la base de datos:


SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

Montar la base de datos:


SQL> startup mount;
ORACLE instance started.

Total System Global Area 1610612736 bytes
Fixed Size                  2096632 bytes
Variable Size             503317000 bytes
Database Buffers         1090519040 bytes
Redo Buffers               14680064 bytes
Database mounted.

Poner la base de datos en modo archivelog:

SQL> alter database archivelog;

Abrir la base de datos:

SQL> alter database open;

3.-Revisar el ALERT.LOG para ver se ha generado algún error durante el cambio.

4.-Forzar la generación de un fichero de archivado para ver que funciona OK:

SQL> alter system archive log current;

SQL> alter system switch logfile;

5.-Implementar la liberación de ficheros de archivado (archives):

Si en algún momento se llega al 100% del límite que hemos especificado, o se llena el filesystem donde se dejan los archivados, la base de datos no permitirá hacer nuevas actualizaciones. Se parará y los usuarios llamarán porque Oracle no funciona.

Tenemos que ir liberando espacio periódicamente. Lo más normal es que un script de RMAN se dedique a salvar los archivados a cinta, y vaya borrándolos del directorio a medida que lo hace.

6.-Comprobar que todas las tablas de usuarios, índices, objetos LOB y tablespaces estén en modo logging.

Para que los cambios en los objetos vayan a los redolog, es necesario que estén en estado LOGGING y no en estado NOLOGGING. Es normal que haya objetos del sistema (SYS, SYSTEM, SYSAUX,...) en estado NOLOGGING. Los tablespaces temporales también suelen ser NOLOGGING.

TABLAS:


select owner, table_name
from dba_tables
where LOGGING = 'NO'
order by owner, table_name;

TABLAS PARTICIONADAS:


select table_owner, table_name, partition_name
from dba_tab_partitions
where LOGGING = 'NO'
order by table_owner, table_name, partition_name;


ÍNDICES:


select owner, index_name
from dba_indexes
where LOGGING = 'NO'
order by owner, index_name;


ÍNDICES PARTICIONADOS:


select index_owner, index_name, partition_name
from dba_ind_partitions
where LOGGING = 'NO'
order by index_owner, index_name, partition_name;


OBJETOS LOB:


select owner, table_name, index_name
from dba_lobs
where LOGGING = 'NO'
order by owner, table_name;


TABLESPACES:


select tablespace_name
from dba_tablespaces
where LOGGING = 'NOLOGGING'
order by tablespace_name;


7.-Cambiar estado de objetos de NOLOGGING A LOGGING:

TABLAS:

ALTER TABLE owner.tabla LOGGING;

TABLAS PARTICIONADAS:

ALTER TABLE owner.tabla MODIFY PARTITION particion LOGGING;

ÍNDICES:

ALTER INDEX owner.indice LOGGING;

ÍNDICES PARTICIONADOS:

ALTER INDEX owner.indice MODIFY PARTITION particion LOGGING;

OBJETOS LOB:

ALTER TABLE owner.tabla_con_campo_lob LOGGING;

TABLESPACES:


ALTER TABLESPACE tablespace LOGGING;





1 comentario:

Unknown dijo...

Excelente post, solo me gustaría que pudieras añadir que le sucede a la base de datos, y como lo solucionarías si no tuvieras RMAN