28 sept 2009

Oracle Offline backup.

Estoy seguro que debe de haber muchos scripts en la web para hacer backup de base de datos, en frió. Pero decidí hacer el mio que dejo aquí.


#!/bin/bash
# Developer: Alejandro Andino
#+-----------------------------+
#| Backup en frio de DataFiles |
#+-----------------------------+


export ORACLE_SID="test"
export ORACLE_BASE="/u01/app/oracle"
export ORACLE_HOME="/u01/app/oracle/product/10.2.0/test"
export NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
export NLS_DATE_FORMAT="DD-MON-YYYY HH24:MI:SS"
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export SQLPATH=/u01/app/oracle/product/10.2.0/test/sqlplus/admin
backup="/u01/app/oracle/backup/datafiles"
arc="/u01/app/oracle/backup/arc"
fecha=`date +"%d%m%y_%H%M"`
sequence=`sqlplus -s system/xxx @lastArcLog.sql|tr -d "[:blank:]"`
seq=$(($sequence-1))

#+-----------------+
#| FUNCTIONS |
#+-----------------+

#Function DEL_OldLogs: Borrar arc log archivados sin uso.
#Variables externas/globales: sequence, seq,arc

function DEL_OldLogs(){
list=`ls $arc | gawk -F "_" -v sq=$seq -v path=$arc '{ if($2 < sq) print path"/"$1"_"$2"_"$3 }'` for i in $list do if [ -f $i ]; then rm -f $i fi done }

# Se me ocurrio pensar que sucedería si se me rompe el disco que justamente guarda los backup. Asi que guardamos el backup en un almacenamiento
#externo también, con esta función.

function New_Backup(){
        rm -f $backup/*.tar.gz
        #Copy datafiles and archivelogs to backup.
        tar -czvf $backup/$file $ORACLE_BASE/oradata/db10g2 $arc &>/dev/null
        chmod +rw $backup/$file
#       Almecenando backup a ubicacion remota.
        smbclient //STORAGE/backup "" --user=backup%password --workgroup=dominio -c "lcd ${backup};cd Backup_DATA;put ${file};exit"

}


#+------------------------+
#| BEGIN SCRIPT |
#+------------------------+

sqlplus -s '/as sysdba' <<"EOF"
archive log all; --> produce ORA-00271: there are no logs that need archiving
ALTER SYSTEM ARCHIVE LOG CURRENT; --> Forzar el archivado de redologs.
shutdown immediate
exit
EOF
#Copiar datafiles y archivelogs al directorio backup .
tar -czvf $backup/DATAfiles$fecha.tar.gz $ORACLE_BASE/oradata/test $arc
 New_Backup #Reemplaza y mejora la funcionalidad de las lineas anteriores ;-)
#Ejecutamos la función.
DEL_OldLogs
#Levantamos la base de datos.
sqlplus -s '/as sysdba'<<"EOF"
startup
exit
EOF
#+------+
#| FIN |
#+------+

Por ultimo el pequeño script que uso para ver la ultima secuencia procesada por el proceso ARCx.

lastArcLog.sql

set echo off
set heading off
set flush off
set pause off
set feedback off
set pages 0
select MAX(sequence#) from v$archived_log;
exit


Este script se ejecuta diariamente, con lo que me deja el backup de los datafiles y los arclog generado por esta.

10 jun 2009

Chequeo de compatibilidades de SOURCE y TARGE Data Base

Estoy en la fase de acomodar la base de datos TARGET o destino, para
poder migrar los datos de otra db SOURCE o fuente. Esto lo voy a
realizar a través de las herramientas import / export de oracle 8i.


Siguiendo el documento
286775.1 voy realizando los siguiente chequeo entre las dos base de datos
  1. RDBMS 8.1.7.0 source databsae (produccion)
  2. RDBMS 8.1.7.4 target database ( a donde quiero migrar)

Source Database
---------------

3. In the source database, check which options were installed:
- Oracle Text - schema: CTXSYS
- Oracle OLAP - schema: OLAPSYS
- Oracle Spatial - schema: MDSYS
- Oracle Data Mining - schema: DMSYS
- Oracle Ultra Search - schema: WKSYS
- Oracle Label Security - schema: LBACSYS
- Oracle JVM ? - object_types: 'JAVA CLASS',
'JAVA DATA', 'JAVA RESOURCE'
- Oracle interMedia - schema: ORDSYS
- Oracle XML DB - schema: XDB


- run queries:

SELECT username FROM dba_users
WHERE username IN ('CTXSYS', 'OLAPSYS','MDSYS', 'DMSYS', 'WKSYS', 'LBACSYS', 'ORDSYS', 'XDB');

no rows selected

SELECT object_type, COUNT(*) FROM dba_objects
WHERE object_type LIKE 'JAVA%' GROUP BY object_type;

no rows selected

A simple vista observo que no existen tales properties mencionados anteriormente en la base de
datos fuente.

4. In the source database, check the characterset of the database:

SELECT * FROM nls_database_parameters
WHERE parameter LIKE '%SET' ORDER BY 1;

+--------+
| SOURCE |
+--------+

PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET WE8ISO8859P1
NLS_NCHAR_CHARACTERSET WE8ISO8859P1

+--------+
| TARGET |
+--------+


PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET WE8ISO8859P1
NLS_NCHAR_CHARACTERSET US7ASCII


Primer diferencia entre los dos RDBMS, siguiendo el documento llego al docId
77441.1
en donde uno de sus apartados dice:

"El character set es especificado durante la sesión de instalación o con la clasula CHARACTER
SET en la declaracion CREATE DATABASE. Para crear una nueva base de datos con un nuevo CHARACTER
SET, necesitas indicar el character set en el CREATE DATABASE script.
Este es el unico lugar,
por que el CHARACTER SET no puede ser indicado en el init.ora, este no es un parametro valido
del init.ora
"

NOTE: In Oracle 8.x.x there is a new NLS parameter called
NLS_NCHAR_CHARACTERSET. NLS_NCHAR_CHARACTERSET is National Character Set.
It specifies what languages can be used to name database objects. If you
already have a line for NLS_NCHAR_CHARACTERSET in your create database script,
you either need to indicate a character set value on that line in double
quotes as well, or take this line out because if NLS_NCHAR_CHARACTERSET is
not indicated in Create Database Script, it will just default to
NLS_CHARACTERSET value.

Estas es la nota al crear nuevamente la base de datos con este character set. Por lo que llamo al dbassist y
elimino la base de datos previamente creada en el TARGET database. Y la creo con este character set. Y
solucionado el problema.

Ya habiendo eliminado la base de datos, se me da por investigar un poco, y buscar una alternativa para no
eliminar la base de datos y setear nuevamente el character set. En el DocId
66320.1, las posibles
alternativas para realizar el cambio, este no realiza el cambio para los datos ya
existentes con distinto character set.
Sigo un poco mas, y en esta pagina encuentro la referencia a como cambiar el
NL_NCHAR_CHARACTERSET sin eliminar la base de datos en un ambiente de
migración, tal cual es mi caso. Por lo que concluyo que esta es la mejor opción
para mi ambiente.