Advertisement
Guest User

Script para backup de banco de dados FirebirdSQL

a guest
Apr 22nd, 2010
944
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 10.38 KB | None | 0 0
  1. #!/bin/bash
  2. # Script desenvolvido por :
  3. # Hamacker <sirhamacker [em] gmail.com>
  4. # Data : 02/02/2006
  5. # Uso : Faz backup de servidores firebird em discos ou pendrives externos.
  6.  
  7. # trap ctrl-c and call ctrl_c() trap ctrl_c INT
  8. trap ctrl_c INT
  9. function ctrl_c() {
  10.   echo "*** backup interrompido pelo usuario ***" ;
  11.   do_sendmail;
  12.   exit 1;
  13. }
  14.  
  15. function log() {
  16.   if [ -z "$1" ] ; then
  17.     echo "Parametro para log esta vazio"
  18.     return
  19.   fi
  20.   if ! [ -f "$file_error_log" ] ; then
  21.     echo "Arquivo para registrar log [$file_error_log]  não existe !"
  22.     echo -ne "Criando um arquivo vazio..."
  23.     touch "$file_error_log"
  24.     echo "[OK]"
  25.   fi
  26.   echo "$1"
  27.   echo "$1" >>$file_error_log
  28. }
  29.  
  30. function do_montar_dev() {
  31.   alvo_device="$1"
  32.   alvo_pasta="$2"
  33.   RESULT_VALUE="FALHOU"
  34.   if [ "$alvo_device" = "" ] ; then
  35.      log "Erro na montagem de dispositivo : O nome do dispositivo não foi informado."
  36.      return
  37.   fi  
  38.   if [ "$alvo_pasta" = "" ] ; then
  39.      log "Erro na montagem de dispositivo : O nome do pasta onde seria montado o dispositivo não foi informado."
  40.      return
  41.   fi
  42.   if ! [ -d  "$alvo_pasta" ] ; then
  43.     mkdir -p "$alvo_pasta"
  44.   fi
  45.   # montando a unidade de destino, normalmente o usbdisk
  46.   mount -t $ponto_fs $alvo_device $alvo_pasta -o sync,nosuid,nouser,rw,dirsync,users
  47.   if [ $? -ne 0 ] ; then
  48.     log "A montagem da unidade de destino-backup falhou !"
  49.     log "Tentativa : mount -t $ponto_fs $ponto_device $ponto_destino -o sync,nosuid,nouser,rw,dirsync,users"
  50.     log "Certifique-se que :"
  51.     log "- tenha ligado a unidade numa porta USB deste servidor;"
  52.     log "- o dispositivo USB esteja ligado com o led de funcionamento piscando."
  53.     log "Desligue o aparelho, aguarde alguns instantes e ligue-o novamente"
  54.     log "e repita a operacao, se insistir o problema contate"
  55.     log "imediatamente o supervidor."
  56.   else
  57.     RESULT_VALUE="OK"  
  58.   fi
  59. }
  60.  
  61. function do_desmontar() {
  62.   alvo="$1"
  63.   if [ "$alvo" = "" ] || \
  64.      ! [ -d "$alvo" ] ; then
  65.      echo "alvo para desmontar nao existe : [$alvo]"
  66.      return
  67.   fi
  68.   # so posso desmontar unidades em /mnt ou /media
  69.   dir_to_unmount=$(mount |grep "$alvo"|cut -d" " -f 3|cut -d"/" -f 2)
  70.   if [ "$dir_to_unmount" != "media" ] && [ "$dir_to_unmount" != "mnt" ] ; then
  71.     return
  72.   fi
  73.  
  74.   # verifica se esta realmente montado
  75.   EXISTE=`mount |grep $alvo|wc -l`
  76.   if [ "$EXISTE" -gt 0 ] ; then
  77.     umount $alvo
  78.     [ -d "$alvo" ] && rmdir $alvo
  79.   fi
  80.  
  81.   # se o diretorio montado estiver vazio e estiver localizado em /mnt entao remove-lo
  82.   if ! [[ "$alvo" =~ "/media" ]] ; then
  83.     if [ -d "$alvo" ] && [ "$dir_to_unmount" = "mnt" ] ; then
  84.       if [ "$alvo/*" = "$alvo/*" ] ; then
  85.         echo "removendo diretorio vazio [$alvo]"
  86.         rmdir $alvo
  87.       fi
  88.     fi
  89.   fi
  90. }
  91.  
  92. function do_backup_firebirdsql() {
  93.   log "****************************************************"
  94.   log "* BACKUP DO SERVIDOR DE BANCO DE DADOS FIREBIRDSQL *"
  95.   log "****************************************************"
  96.   # montando a unidade de destino, normalmente o usbdisk
  97.   do_montar_dev "$ponto_device" "$ponto_destino"
  98.   if [ "$RESULT_VALUE" != "OK" ] ; then
  99.     do_sendmail;
  100.     return;
  101.   fi
  102.   # lista de databases do firebird a serem backupeados
  103.   # coloque os databases em ordem de importancia
  104.   # lista de pastas a serem backupeadas
  105.   unset backup_lista
  106.   backup_lista=( "${backup_lista[@]}" "192.168.1.14:admin1.fdb" )
  107.   #backup_lista=( "${backup_lista[@]}" "192.168.1.14:security2.fdb" )
  108.   #backup_lista=( "${backup_lista[@]}" "192.168.1.14:c:/Arquivos de programas/Firebird/Firebird_2_1/security2.fdb" )
  109.   #backup_lista=( "${backup_lista[@]}" "192.168.1.14:/var/lib/firebird2/system/security.fdb" )
  110.  
  111.   for fb_source in "${backup_lista[@]}" ; do  
  112.     # o nome do arquivo de backup sera praticamente o mesmo
  113.     # nome da origem, apenas o sufixo .fbk para diferenciar
  114.     # e os _ que subsituirao caracteres especiais
  115.     fb_dest="$fb_source"
  116.     fb_dest=${fb_dest//.fb/\.fbk}
  117.     fb_dest=${fb_dest//.fdb/\.fbk}
  118.     fb_dest=${fb_dest//.dat/\.fbk}
  119.     fb_dest=${fb_dest//.gdb/\.fbk}
  120.     # trocando / por _
  121.     fb_dest=${fb_dest//\//\_}
  122.     # trocando : por apenas -
  123.     fb_dest=${fb_dest//:/\-}
  124.     # trocando \\ por apenas -
  125.     fb_dest=${fb_dest//\\/\-}
  126.     # trocando -_ por apenas -  
  127.     fb_dest=${fb_dest//-_/\-}
  128.     # acrescentando o path de destino
  129.     fb_dest="$backup_folder/firebird/$fb_dest"
  130.     fb_folder=`dirname "$fb_dest"`
  131.     if ! [ -d "$fb_folder" ] ; then
  132.       mkdir -p "$fb_folder"
  133.     fi
  134.     log "Processando backup de  \"$fb_source\" para \"$fb_dest\""
  135.     $GBAK -t -user "$FB_USER" -password "$FB_PASSWORD" "$fb_source" "$fb_dest" 2>>$file_error_log
  136.     if [ $? -ne 0 ] ; then
  137.       log "[backup-falhou] firebird : $GBAK -v -t -user \"$FB_USER\" -password \"*****\" \"$fb_source\" \"$fb_dest\""
  138.       DO_BACKUP_STATUS_FIREBIRDSQL="N"
  139.     else
  140.       log "[sucesso] firebird : backup de \"$fb_source\" para \"$fb_dest\""
  141.     fi
  142.   done
  143.  
  144.   ### desmontando a unidade de destino
  145.   do_desmontar "$ponto_destino"
  146. }
  147.  
  148. ############################
  149. # Inicio do Programa       #
  150. ############################
  151.  
  152. export LANGUAGE="pt_BR:pt:pt_PT"
  153. export LANG="pt_BR.UTF-8"
  154.  
  155. if [ "$USER" != "root" ] ; then
  156.   echo  "Infelizmente este programa só pode ser executado com o usuario root ou através de [sudo]."
  157.   exit 3;
  158. fi
  159.  
  160. # Nome do usuário e senha que acessará a base
  161. # de dados FirebirdSQL
  162. FB_USER='SYSDBA'
  163. FB_PASSWORD='masterkey'
  164. GBAK="/usr/bin/gbak"
  165. #
  166. # Preparando o disco que armazenará o backup
  167. #
  168. ponto_device=""
  169. ponto_origem=""
  170. ponto_fs=auto
  171. ponto_montagem=/media/usbdisk
  172.  
  173. # Defina onde ficará o log desse backup
  174. backup_log_folder="/var/log/firebird/backup/`date +%Y-%m`";
  175.  
  176. # Insira os UUIDs usados para manter o backup
  177. # Isso permitirá que este script faça backup
  178. # apenas em discos previamente identificados
  179. # pode ser usado qualquer disco,
  180. # incluindo pendrives e cartoes SSD
  181. # Para saber o UUID dos discos inseridos :
  182. # ls -l /dev/disk/by-uuid/
  183. disco[0]="C91C-DA27"  # meu pendrive pessoal usando vfat
  184. disco[1]="dbf9372a-fd1e-4a5a-9e9d-011c9b093380"  # disco externo ext2 sata da empresa #1
  185. disco[2]="ff44fe91-e61e-4d42-9d8c-6fa4ba6e9571"  # disco externo ext2 sata da empresa #1
  186. disco[3]="4c93fef0-82f7-409e-b294-84d19b06c228"  # disco externo ext2 sata da empresa #1
  187. disco[4]="6113ec83-d13e-4e16-9938-6faa2bbb7f72"  # disco externo ext2 sata da empresa #1
  188. disco[5]="821be611-5106-4db6-9fb2-30b98c74ec52"  # use a mesma logica para acrescentar mais discos
  189. for disco_plugado in "${disco[@]}" ; do
  190.   if [ -e "/dev/disk/by-uuid/$disco_plugado" ] ; then
  191.     echo "Encontrado disco de backup :"
  192.     ponto_device="/dev/disk/by-uuid/$disco_plugado"
  193.     ponto_device=`find /dev/disk/by-uuid/ -type l -printf "%f\t%l\n" | grep "$disco_plugado"|cut  -f 2`
  194.     ponto_device=`echo /dev/${ponto_device//\//\.}|tr -d "."`
  195.     echo "UDEV disco detectado em $ponto_device"
  196.   fi
  197. done
  198.  
  199. ### se nao foi encontrado nenhum disco entao abandona
  200. ### o script.
  201. if [ "$ponto_device" = "" ] ; then
  202.   echo "Nenhuma unidade de backup foi detectada!"
  203.   exit 2;
  204. fi
  205. echo "ponto_device=$ponto_device"
  206. # verificando se a particao existe realmente
  207. fs_existe=`/sbin/fdisk -l|grep $ponto_device|wc -l`
  208. if [ "$fs_existe" -eq 0 ] ; then
  209.   echo "A particao indicada nao existe :"
  210.   echo $ponto_device
  211.   echo "operacao abortada !";
  212.   exit 1;
  213. fi;
  214.  
  215. ### o disco detectado nao pode estar montado
  216. ### isso previne que discos que façam parte do
  217. ### sistema -que nascem montados- nao sejam escaneados
  218. fs_existe=`/bin/mount|grep $ponto_device|wc -l`
  219. if [ $fs_existe -gt 0 ] ; then
  220.   echo "A particao indicada ja existe e esta montada :"
  221.   echo $ponto_device
  222.   echo "operacao abortada !";
  223.   exit 1;
  224. fi;
  225.  
  226. ### desmontando a unidade USB se ela estiver montada
  227. if [ "`mount |grep $ponto_device|wc -l`"  -gt 0 ] ; then
  228.   umount $ponto_device
  229.   if [ $? -ne 0 ] ; then
  230.     echo "Erro ao tentar desmontar $ponto_device."
  231.     echo "desmonte-a manualmente e repita a operacao."
  232.     echo "operacao cancelada."
  233.     exit 2;
  234.   fi
  235. fi
  236.  
  237. ponto_destino="$ponto_montagem"
  238.  
  239. #
  240. # variaives importantes que definem destino do backup
  241. # titulos, etc...
  242. backup_title="backup-`date +%Y-%m-%d`"
  243. file_error_log="$backup_log_folder/$backup_title.log"
  244. backup_folder="$ponto_destino/`date +%Y-%m-%d`"
  245. backup_inicio="`date +%Y-%m-%d+%H:%M`"
  246. data_ini="`date +%Y-%m-%d+%H:%M`"
  247.  
  248. if [ -f "$file_error_log" ] ; then
  249.   rm -f "$file_error_log"
  250.   touch "$file_error_log"
  251.   chmod 644 "$file_error_log"
  252. fi
  253.  
  254. # verificando se o ponto de montagem existe, se nao existir entao cria
  255. if ! [ -d $ponto_destino ] ; then
  256.   mkdir -p $ponto_destino
  257. fi
  258.  
  259. ### desmontando a unidade USB se ela estiver montada
  260. if [ "$ponto_device" != "" ] ; then
  261.   if [ "`mount |grep $ponto_device|wc -l`" -gt 0 ] ; then
  262.     umount $ponto_device
  263.   fi
  264. fi
  265.  
  266. # montando a unidade de destino, normalmente o usbdisk
  267. do_montar_dev "$ponto_device" "$ponto_destino"
  268. if [ "$RESULT_VALUE" != "OK" ] ; then
  269.   echo "Erro ao montar unidade [$ponto_device] em [$ponto_destino]"
  270.   exit 1;
  271. fi
  272.  
  273. log "Iniciando backup as $data_inicio"
  274.  
  275. # criando algumas pastas e arquivos
  276. if ! [ -d "$backup_folder" ] ; then
  277.   echo "criando pasta $backup_folder"
  278.   mkdir -p "$backup_folder"
  279.   if [ $? -ne 0 ] ; then
  280.     log "[backup-falhou] : erro ao criar pasta $backup_folder"
  281.   else
  282.     echo -n "pasta criada."  
  283.   fi
  284. fi
  285.  
  286. if ! [ -d "$backup_log_folder" ] ; then
  287.   mkdir -p "$backup_log_folder"
  288. fi
  289.  
  290. # preparando arquivo de log
  291. touch $file_error_log
  292.  
  293. # no relatorio final acrescentando o espaco disponivel
  294. # antes de iniciar o backup :
  295. log "-"
  296. log ".   Espaco na unidade $ponto_device antes de iniciar o backup :"
  297. log ".  `df -h $ponto_device|grep \"Uso\%\"`"
  298. log ".  `df -h $ponto_device|grep \"$ponto_device\"`"
  299. log "-"
  300.  
  301. ### desmontando a unidade USB se ela estiver montada
  302. if [ "$ponto_device" != "" ] ; then
  303.   if [ "`mount |grep $ponto_device|wc -l`" -gt 0 ] ; then
  304.     umount $ponto_device
  305.   fi
  306. fi
  307.  
  308. echo "Arquivo de log sera gerado em :"
  309. echo "=>$file_error_log"
  310.  
  311. #
  312. # Variaveis importantes
  313. #
  314.  
  315. data_ini=`date +%d-%m-%Y+%H:%M`
  316.  
  317. #########################
  318. # processando o backup  #
  319. #########################
  320. log "[inicio] Relatorio do backup $backup_title iniciado em $data_ini :"
  321.  
  322. do_backup_firebirdsql
  323.  
  324. echo "preparando um relatorio para envio..."
  325. data_fim=`date +%d-%m-%Y+%H:%M`
  326.  
  327. log "[fim] $backup_title iniciado em $data_ini ate $data_fim"
  328.  
  329. # Fim do Programa
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement