Translate

lunes, 13 de junio de 2016

SCRIPT MYSQL: Backups Automatizados


Este script nos permite hacer dumps a las bases de un servidor Mysql.

La ventaja que posee este script es que cuando se sube una base nueva al servidor, no debemos preocuparnos por el dumps, ya que el script a través de utilizar vectores tiene la capacidad de detectar los cambios automáticamente.

Acá les dejo una somera descripción de su funcionamiento:

1.- Variables para conectar al servidor de Mysql

host="xxx.xxx.xxx.xxx"
user=user
pass=pasword


2.- Genero un vector para los argumentos de Mysql

Vector Argumento (args) de comandos MysqlVectores

Vector lineal                         (base1 base2 base3)
Posición Elementos del vector    0      1        2

Opcion 1:

args=("-h $host -u $user -p$pass" "-h $host -u $user -p$pass --opt ")

Opcion 2:

args=("-h $host -u $user -p$pass" "-h $host -u $user -p$pass --single-transaction ")

3.- Variable para determinar la Fecha y Hora que luego la utilizo para el nombre del dump

datetime=$(date +%Y%m%d)

4.- Variable donde determino el nombre del archivo por el cual después genero el vector

filename=arrays

5- Declaro al vector

declare -a array1

6.- Genero el archivo declarado arriba

mysqlshow ${args[0]} > $filename
7.- Archivo array como lo genera mysqlshow

+--------------------------+
Databases
+--------------------------+
information_schema
base1
base2
base3
.......

+---------------------------+

8.- Variables para el limite inferior y superior del vector
8.1.- Limite inferior del Vector array1

a=0

8.2.- Limite Superior del Vector array1

Cuento las palabras, los sed y el tr los utilizo para sacar los caracteres "+", "|" , el titulo "Database" y la Base "information_schema". La variable counts tiene sentido para utilizar un vector lineal dinámico, gracias al archivo que genero con la consulta que hago con mysqlshow.

counts=(` cat "$filename" | sed -e '/+/d' | tr -d '|' | sed -e '/Database/d'| sed -e '/information_schema/d' | wc -w `)


9.- Leo el archivo y le deleteo todo aquello que no me sirve

array1=( `cat "$filename" | sed -e '/+/d' | tr -d '|' | sed -e '/Database/d' | sed -e '/information_schema/d'`)

10.- Genero un vector dinamico

while [ $a -lt $counts ]
do
echo ${array1[$a]}-$datetime.sql # Permite ver en tiempo real lo que esta haciendo dump
mysqldump ${args[1]} ${array1[$a]} > ${array1[$a]}-$datetime.sql
let a+=1 # Contador que utilizo para recorre el vector
done
echo
exit 0


El script con la "Opción 1" de la variable "args" quedaría así:

#!/bin/bash

declare -a array1
host="xxx.xxx.xxx.xxx"
user=user
pass=password
datetime=$(date +%Y%m%d)
filename=/var/local/arrays
pathbkp=/var/local/dumps
a=0
  args=("-h $host -u $user -p$pass" "-h $host -u $user -p$pass --opt ")
  mysqlshow ${args[0]} > $filename
  counts=( `cat "$filename" | sed -e '/+/d' | tr -d '|' | sed -e '/Database/d'| sed -e '/information_schema/d' | wc -w `)
  array1=( `cat "$filename" | sed -e '/+/d' | tr -d '|' | sed -e '/Database/d' | sed -e '/information_schema/d'` )
while [ $a -lt $counts ]
do
  echo ${array1[$a]}-$datetime.sql
  mysqldump ${args[1]} ${array1[$a]} >  $pathbkp/${array1[$a]}-$datetime.sql
  let a+=1

done
  echo
 exit 0


--------------------------------------------------------------------------------------------------------------------------

Cuarta Version del Script

He realizado una cuarta version, haciendo que los dumps de cada base sean comprimidos en un solo archivo logrando una mejor administracion de espacio en disco, ademas agregue un dump full que tambien se comprime.

El directorio donde queda alojado el archivo tar comprimido de los dumps de la base se denomina
 /var/local/dumps/BKPSQL/SQL y el archivo es:

tarBKPSQLFULL-20161104-140201.tar.gz  -> 20161104-140201 esto indica fecha y hora de realizado


El directoria donde se guarda el dunps FULL es:
/var/local/dumps/BKPSQL/FULL

y su archivo tar es:

Bases-20161104-085201.tar.gz --> -20161104-085201 esto indica fecha y hora de realizado

 
SCRIPT
  
## BEGIN CONFIG ## 
datetime=$(date +%Y%m%d-%H%M%S)
host=10.0.48.160
user=dumps
pass='mysql2011'
pathbkp=/var/local/dumps
logdir=$pathbkp/LOG
filename=$logdir/arrays.file
BKPFULL=$pathbkp/BKPSQL/FULL
TMPSQLFULL=$pathbkp/TMPBKPSQL
BKPSQL=$pathbkp/BKPSQL/SQL
TMPSQL=$TMPSQLFULL/SQL
TMPFULL=$TMPSQLFULL/FULL
## END CONFIG ##


## FUNCTION ##

function CrearDirectory(){
  
 if [ ! -d $pathbkp ];
 then    
    mkdir -p $TMPSQLFULL/FULL
    mkdir -p $pathbkp/BKPSQL/FULL
    mkdir -p $pathbkp/BKPSQL/SQL
    chown -R mysql.mysql $pathbkp
    chmod -R 755 $pathbkp
    touch $pathbkp/LOG/arrays.file
 else
    mkdir -p $TMPSQLFULL/SQL
    mkdir -p $pathbkp/LOG
    mkdir -p $pathbkp/BKPSQL

    mkdir -p $pathbkp/TMPBKPSQL
    chown -R mysql.mysql $pathbkp
    chmod -R 755 $pathbkp 
    touch $pathbkp/LOG/arrays.file
 fi
 }


function DumpsMysql(){

a=0

args=("-h $host -u $user -p$pass" "-h $host -u $user -p$pass --single-transaction --opt --flush-logs " )
args2="-h $host -u $user -p$pass --single-transaction  --events --all-databases"

mysqlshow ${args[0]} > $filename

counts=( `cat "$filename" | sed -e '/+/d' | tr -d '|' | sed -e '/Database/d'| sed -e '/information_schema/d' | wc -w `)
array1=( `cat "$filename" | sed -e '/+/d' | tr -d '|'  | sed -e '/Database/d' | sed -e '/information_schema/d'` )

while [ $a -lt $counts ]
    do
        echo ${array1[$a]}-$datetime.sql
        mysqldump ${args[1]} ${array1[$a]} > $TMPSQL/${array1[$a]}-$datetime.sql

        if [ "$?" != "0" ]; then
      
        echo $TMPSQL/${array1[$a]}-$datetime.sql - $datetime "No se realizo Dumps" >> $logdir/dumps-error.log

        else

        echo $TMPSQL/${array1[$a]}-$datetime.sql - $datetime "Se realizo Dumps" >> $logdir/dumps-exito.log

        fi
   
        let a+=1
    done

  mysqldump $args2 > $TMPFULL/Bases-$datetime.sql

rm -f $filename

}



function DumpZip(){

tar -zcvf $BKPSQL/tarBKPSQLFULL-$datetime.tar.gz $TMPSQL/*.sql

tar -zcvf $BKPFULL/Bases-$datetime.tar.gz $TMPFULL/Bases-*
        
#ls -ltr * | grep "tarBKPSQLFULL" |  awk '{print $9}' | xargs cp -rpt $TMPSQL/*.sql

rm -rf $TMPFULL/*.sql

rm -rf $TMPSQL/*.sql

}


## END FUNCTIONS ##

CrearDirectory $pathbkp $TMPSQLFULL

DumpsMysql $datetime $filename $TMPSQL 

DumpZip $BKPSQL $BKPFULL $datetime  $TMPSQL $TMPFULL

exit 0

 

------------------------------------------------------------------------------------------------------------------------

Tercera Version del SCRIPT

Mejoras:
  1. No borra mas los dumps anteriores, los diferencia con la hora.
Script 

#!/bin/bash

declare -a array1
declare -a counts

## BEGIN CONFIG ## 

host=XX.XX.XX.XX
user=dumps
pass='password'
datetime=$(date +%Y%m%d)
timedate=$(date +%T)
pathbkp=/var/local/dumps
filename=$pathbkp/arrays.file
logdir=$pathbkp/LOG/

## END CONFIG ##

a=0

 if [ ! -d $pathbkp ]; then    
    mkdir -p $pathbkp
    mkdir -p $logdir
    chown -R mysql.mysql $pathbkp
    chmod -R 755 $pathbkp 
    touch $filename
 else
    touch $filename
 fi  

args=("-h $host -u $user -p$pass" "-h $host -u $user -p$pass --opt ")

mysqlshow ${args[0]} > $filename

counts=( `cat "$filename" | sed -e '/+/d' | tr -d '|' | sed -e '/Database/d'| sed -e '/information_schema/d' | wc -w `)
array1=( `cat "$filename" | sed -e '/+/d' | tr -d '|'  | sed -e '/Database/d' | sed -e '/information_schema/d'` )

while [ $a -lt $counts ]
    do
        echo ${array1[$a]}-$datetime-$timedate.sql
        mysqldump ${args[1]} ${array1[$a]} > $pathbkp/${array1[$a]}-$datetime-$timedate.sql2>&1

        if [ "$?" != "0" ]; then
       
        echo ${array1[$a]}-$datetime-$timedate.sql - $datetime - $timedate "No se realizo Dumps" >>  $logdir/dumps-error.log

        else

        echo ${array1[$a]}-$datetime-$timedate.sql - $datetime - $timedate "Se realizo Dumps" >>  $logdir/dumps-exito.log

        fi
       
        let a+=1
    done

rm -f $filename

exit 0


------------------------------------------------------------------------------------------------------------------------

Segunda versión del script.

Mejoras:
  1. Genera los directorios
  2. Genera archivos de Logs
  3. Borra por seguridad el archivo arrays.file 
Script 

#!/bin/bash

declare -a array1
declare -a counts

## BEGIN CONFIG ## 

host=XX.XX.XX.XX
user=dumps
pass='password'
datetime=$(date +%Y%m%d)
timedate=$(date +%T)
pathbkp=/var/local/dumps
filename=$pathbkp/arrays.file
logdir=$pathbkp/LOG/

## END CONFIG ##

a=0

 if [ ! -d $pathbkp ]; then    
    mkdir -p $pathbkp
    mkdir -p $logdir
    chown -R mysql.mysql $pathbkp
    chmod -R 755 $pathbkp 
    touch $filename
 else
    touch $filename
 fi  

args=("-h $host -u $user -p$pass" "-h $host -u $user -p$pass --opt ")

mysqlshow ${args[0]} > $filename

counts=( `cat "$filename" | sed -e '/+/d' | tr -d '|' | sed -e '/Database/d'| sed -e '/information_schema/d' | wc -w `)
array1=( `cat "$filename" | sed -e '/+/d' | tr -d '|'  | sed -e '/Database/d' | sed -e '/information_schema/d'` )

while [ $a -lt $counts ]
    do
        echo ${array1[$a]}-$datetime-$timedate.sql
        mysqldump ${args[1]} ${array1[$a]} > $pathbkp/${array1[$a]}-$datetime-$timedate.sql2>&1

        if [ "$?" != "0" ]; then
       
        echo ${array1[$a]}-$datetime-$timedate.sql - $datetime - $timedate "No se realizo Dumps" >>  $logdir/dumps-error.log

        else

        echo ${array1[$a]}-$datetime-$timedate.sql - $datetime - $timedate "Se realizo Dumps" >>  $logdir/dumps-exito.log

        fi
       
        let a+=1
    done

rm -f $filename

exit 0


------------------------------------------------------------------------------------------------------------------------



miércoles, 15 de julio de 2015

Backup Exec un fiasco ?

Por favor ya hace un año que implementamos Backup Exec, estoy totalmente desilucionando, ya que si bien los backup los hace, tiene en la version 2014 no hace incrementales ni diferenciales de las maquinas virtuales, solo hace Full de las mismas.

Esto es un bug ya que escalamos el problema a symantec en EEUU y nos dijieron que en la version 2015 estaria solucionado !! Estaria !!! Tampoco esta solucionado !!!

Asi que colorario de esto probamos con Veem Backup y todo fluye con normalidad !!


sábado, 15 de junio de 2013

INSTALACION DE OCI8 PARA PHP5

1.- Paso
apt-get install libaio1
 

 
2.- Paso
apt-get install alien

3.- Paso
root@WebServerDeb6:~# alien oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm oracle-instantclient11.2-basic_11.2.0.3.0-2_amd64.deb generated

root@WebServerDeb6:~# alien oracle-instantclient11.2-devel-11.2.0.3.0-1.x86_64.rpm oracle-instantclient11.2-devel_11.2.0.3.0-2_amd64.deb generated

root@WebServerDeb6:~# alien oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm oracle-instantclient11.2-sqlplus_11.2.0.3.0-2_amd64.deb generated


4.- Paso
dpkg -i oracle-instantclient11.2-basic_11.2.0.3.0-2_amd64.deb
dpkg -i oracle-instantclient11.2-devel_11.2.0.3.0-2_amd64.deb
dpkg -i oracle-instantclient11.2-sqlplus_11.2.0.3.0-2_amd64.deb


5.- Paso
mkdir /etc/oracle
nano /etc/oracle/tnsnames.ora

NOMBRE_MAQUINA.DOMINIO.COM =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.10)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = ORCL)
    )
  )

hoja14.tudominio.com.ar =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.48.14 )(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = PROD)
    )
  )

aps1.
tudominio.com.ar =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.160.42)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID=SGS)
    )
  )


6.- Paso
nano /root/.bashrc

export TNS_ADMIN=/etc/oracle
export SQLPATH=/usr/lib/oracle/11.2/client64/bin
export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib:$LD_LIBRARY_PATH
export PATH=$PATH:$SQLPATH


7.- Paso
pecl install oci8
shared,instantclient,/usr/lib/oracle/11.2/client64/lib/
echo extension=oci8.so >> /etc/php5/apache2/php.ini


8.- Paso

service apache2 reload