Oracle Live

11/04/2016

Envio archiver rsync

Filed under: Scripts — mogukiller @ 10:50 pm
Tags:

En una arquitectura de dataguard, se puede dar el caso de un GAP que impida el envio de archiver a la standby. Con este script puedes automatizar el envio de archiver por varias redes y desde una determinada secuencia.

#!/bin/bash
#set -x
#=============================================================================
# Fichero: SCRIPT_envio_archiver.sh
# Autor: lmds
# Fecha: 07/08/2013
# Version: 1.0
# Configurar: 
#	- RUTA_BACKUP_ORIGEN
# 	- RUTA_BACKUP_DESTINO
#	- PATRON_BUSQUEDA
#	- FICHERO_ORIGEN
# Nota:
#	- .ficheros_erroneos.lst contiene el registro de los errores.
#	- HILOS_EJECUCION Parametriza el numero maximo de hilos
#	- SEGUNDOS_MAX_EJECUCION: Tiempo maximo de ejecucion en segundos
# Novedades:
#	- Se configura para que trabaje por dos interfaces de red
#=============================================================================

#--------------------------------------
#	CONFIGURACION
#--------------------------------------
PATRON_BUSQUEDA="*"
FICHERO_ORIGEN="arc119211_1_785592392.log"
RUTA_ARCH_ORIGEN=/altamira_bd/ECPPGA/arch
RUTA_ARCH_DESTINO=/altamira_bd/ECPPGA/flashback/archives_bck

IP_DESTINO1=quibesg6
#IP_DESTINO2=mogubedb11n2

HILOS_EJECUCION=5
USER=oracle

# Tiempo maximo de ejecucion 10h
SEGUNDOS_MAX_EJECUCION=36000 

SESSION_ID=$RANDOM

ficheros_enviados=.ficheros_enviados.lst
ficheros_ordenados=.ficheros_ordenado.lst
ficheros_todos=.ficheros_todos.lst
ficheros_nuevos=.ficheros_nuevos.lst
ficheros_procesando=.ficheros_procesando.lst
ficheros_erroneos=.ficheros_erroneos.lst
fichero_temporal=.ficheros_temporal.lst

if [ -n "$IP_DESTINO2" ]; then
	hilo_proceso1=.hilo_proceso_${SESSION_ID}_1
	hilo_proceso2=.hilo_proceso_${SESSION_ID}_2
else
	hilo_proceso=.hilo_proceso_${SESSION_ID}
fi

rm -f .hilo_proceso* .ficheros_*

>$ficheros_procesando
>$ficheros_enviados
>$ficheros_erroneos

declare -a array_PID
declare -a array_ficheros

# Validamos ruta origen y destino
[ ! -d $RUTA_ARCH_DESTINO ] && echo "ERROR: La ruta origen no existe" && exit 1
ssh $USER@$IP_DESTINO1 mkdir -p $RUTA_ARCH_DESTINO
[ $? -ne 0 ] && echo "ERROR: Al crear ruta destino" && exit 1

[ -n "$IP_DESTINO2" ] && HILOS_EJECUCION=$((HILOS_EJECUCION*2))

while [[ $SECONDS -lt $SEGUNDOS_MAX_EJECUCION ]]; do

	>$ficheros_nuevos
	>$ficheros_todos
	>$fichero_temporal	
	#Obtenemos los ficheros nuevos
	fich_origen=`find $RUTA_ARCH_ORIGEN -name "*${FICHERO_ORIGEN}*" -print`
	[ -z "$fich_origen" ] && echo -e "ERROR: Fichero $FICHERO_ORIGEN NO encontrado" && exit 1 
	
	find $RUTA_ARCH_ORIGEN -name "${PATRON_BUSQUEDA}" -type f -newer $fich_origen -print | sort >$ficheros_todos
	
	sort $ficheros_enviados >$ficheros_ordenados
	diff $ficheros_todos $ficheros_ordenados | grep "<" | awk '{print $2}' >$fichero_temporal
	sort $ficheros_procesando >$ficheros_ordenados
	diff $fichero_temporal $ficheros_ordenados | grep "<" | awk '{print $2}' >$ficheros_nuevos
	
	#Iinicializamos los arrays
	if [ ${#array_PID[@]} -lt $HILOS_EJECUCION ]; then
		last_element=${#array_PID[@]}
		{			 
			for ((i=$last_element; i<$HILOS_EJECUCION; i++))
			do				
				read fichero
				[ -z "$fichero" ] && break
				/sbin/fuser $RUTA_ARCH_ORIGEN/$fichero &>/dev/null
                [ $? -eq 0 ] && ((--i)) && continue
				array_ficheros[$i]=$fichero
				if [ -n "$IP_DESTINO2" ]; then
					if [ $((i%2)) -eq 0 ]; then
						nohup rsync -azq $fichero $USER@$IP_DESTINO1:$RUTA_ARCH_DESTINO &>${hilo_proceso1}_$i &						
					else
						nohup rsync -azq $fichero $USER@$IP_DESTINO2:$RUTA_ARCH_DESTINO &>${hilo_proceso2}_$i &						
					fi
				else					
					nohup rsync -azq $fichero $USER@$IP_DESTINO1:$RUTA_ARCH_DESTINO &>${hilo_proceso}_$i &
				fi
				array_PID[$i]=$!				
				echo $fichero >>$ficheros_procesando				
			done
		}<$ficheros_nuevos
	fi
	#Comprobamos si algun proceso ha terminado el envio
	for ((i=0; i<$HILOS_EJECUCION; i++))
	do			
		pid_process=${array_PID[$i]}
		fichero=${array_ficheros[$i]}
		# El proceso ha terminado
		if [ `ps -p $pid_process | grep $pid_process | wc -l` -eq 0 ]; then
			#Comprobamos el tamaño del log generando
			fichero_log=`ls -1 .*_${i}`
			if [ -s "$fichero_log" ]; then
				#Log >0 el proceso de envio ha fallado. Registramos el error
				echo "ERROR PID:${pid_process} FICHERO:$fichero" >> $ficheros_erroneos					
			else
				#Log =0 enviado correcto. Enviamos un nuevo fichero				
				if [ `grep $fichero $ficheros_enviados | wc -l` -eq 0 ]; then 
					echo $fichero >> $ficheros_enviados					
				fi
				sort $ficheros_procesando >$ficheros_ordenados
				diff $ficheros_nuevos $ficheros_ordenados | grep "<" | awk '{print $2}' >$fichero_temporal
				while read fichero
				do
					/sbin/fuser $RUTA_ARCH_ORIGEN/$fichero &>/dev/null
					[ $? -ne 0 ] && break					
				done < $fichero_temporal
				[ -z "$fichero" ] && break
				array_ficheros[$i]=$fichero
				if [ -n "$IP_DESTINO2" ]; then
					if [ `ls -1 .*_${i} | grep _1_ | wc -l` -eq 1 ]; then
						nohup rsync -azq $fichero $USER@$IP_DESTINO1:$RUTA_ARCH_DESTINO &>${hilo_proceso1}_$i &						
					else
						nohup rsync -azq $fichero $USER@$IP_DESTINO2:$RUTA_ARCH_DESTINO &>${hilo_proceso2}_$i &						
					fi
				else					
					nohup rsync -azq $fichero $USER@$IP_DESTINO1:$RUTA_ARCH_DESTINO &>${hilo_proceso}_$i &
				fi
				array_PID[$i]=$!				
				echo $fichero >>$ficheros_procesando				
			fi
		fi
	done
	sleep 10	
done

exit 0

Dejar un comentario »

Aún no hay comentarios.

RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Crea un blog o un sitio web gratuitos con WordPress.com.

A %d blogueros les gusta esto: