Script còpia de seguretat

Les entrades còpia de seguretat amb rsync i accés sense contrasenya amb el putty tenen com a finalitat fer una còpia de seguretat de un sistema Linux en un altre sistema ja bé sigui Linux o Windows. Com en tot backup hi ha d’haver una tasca que s’encarregui de prepara els fitxers dels que es farà backup i comprimir-los per a que ocupin poc espai a l’hora de fer la transferència per Internet. Doncs bé en aquesta entrada facil·lito l’script que faig servir jo mitjançant crontab. Es tracta d’un script que fa còpies de seguretat en el home d’un usuari de sistema afegint l’extensió que calgui depenent de si és una còpia diària, setmanal o mensual. El primer que es fa es  definir tota una sèrie de variables  d’entorn, com poden ser el dia, mes, any, número de dia dins de la setmana (de 1 a 6) i rutes de fitxers

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#! /bin/bash

DD=`date +%d`

MM=`date +%m`

YYYY=`date +%Y`

WKD=`date +%u`

WN=`date +%V`

CRON_DIR="/<strong>ruta</strong>/scripts"

DEST_DIR="/home/<strong>usuari</strong>/backup"

LOG="backup.log"

Tot seguit establim el valor inicial de la variable fi de mes ja que el farem servir després, i obtenim els fitxers dels quals fem backup mitjançant TAR o zip i li posem l’extensió del dia de la setmana en que estem:

1
2
3
4
5
6
7
8
9
10
11
fi_mes=0

echo "${YYYY}${MM}${DD} `date +%H:%M:%S` INI LOG" &gt;&gt; $LOG

#Backup de dir www, fitxers de configuració de Apache i BBDD de mysql
echo -e "\tCreant còpia de seguretat" &gt;&gt; $LOG
tar -zcvf ${DEST_DIR}/www_backup.$WKD.tgz /var/www --exclude-from ${CRON_DIR}/exclude_dirs_www_backup.txt
tar -zcvf ${DEST_DIR}/config_apache.$WKD.tgz /etc/httpd/conf.d /etc/httpd/conf
tar -zcvf ${DEST_DIR}/www_logs.$WKD.tgz /var/log/httpd

mysqldump -u <strong>usuari</strong> -p<strong>contrasenya</strong> --all-databases &gt; ${DEST_DIR}/mysql_dump.$WKD.sql

En el cas que es mostra en l’exemple es fa backup dels directoris /var/www (les pàgines web que tenim al nostre servidor), /etc/httpd/conf.d (configuració de servidors virtuals de Apache), /var/log/httpd (logs de Apache) i la base de dades de MySQL. Cal remarcar que quan es fa el backup del directori /var/www s’exclouen alguns directoris ja que pot ser que tinguem algunes llibreries o imatges de les quals no volem que es faci backup. Això s’aconsegueix editat un fitxer com el que hi ha en l’script. També podríem agafar la còpia de seguretat de SVN que és on esta el codi del nostre projecte web. Cada fitxer té l’extensió del dia actual de la setmana o sigui que si avui és dimarts, el dia de la setmana serà 2.

 

Mirem si el dia de la setmana és 7 o el que és el mateix, si és l’últim dia de la setmana. Si no és l’últim dia de la setmana es deixa el número de dia de la setmana actual, tal i com s’ha explicat en el pas anterior. Si ho és li posem l’extensió de la setmana que acaba:

1
2
3
4
5
6
7
8
#Mirem si és l'ultim dia de la setmana i en cas que ho sigui creem la copia setmanal
if [ ${WKD} -eq 7 ]
then
mv ${DEST_DIR}/www_backup.${WKD}.tgz ${DEST_DIR}/www_backup.week${WN}.tgz
mv ${DEST_DIR}/config_apache.${WKD}.tgz ${DEST_DIR}/config_apache.week${WN}.tgz
mv ${DEST_DIR}/www_logs.${WKD}.tgz ${DEST_DIR}/www_logs.week${WN}.tgz
mv ${DEST_DIR}/mysql_dump.$WKD.sql ${DEST_DIR}/mysql_dump.week${WN}.sql
fi

 

Ara passem a comprovar si és l’ultim dia de mes. En cas que ho sigui activem la variable d’entorn que havíem comentat anteriorment, fi_mes:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#Comprovem si avui és l'últim dia del mes. en cas que ho sigui hem de crear la còpia de final de mes.
case "$MM" in
01|03|05|07|08|10|12)
if [ $DD -eq "31" ]
then
echo "\tEs un mes de 31 dies i avui es dia $DD" &gt;&gt; $LOG
fi_mes=1
fi
;;
02)
traspas=`expr $YYYY % 4`
if [ $traspas -eq 0 ]
then
if [ $DD -eq "29" ]
then
echo "\tEs l'ultim dia de FEBRER i estem en un any de traspas, avui es dia $DD" &gt;&gt; $LOG
fi_mes=1
fi
else
if [ $DD -eq "28" ]
then
echo -e "\tEs l'ultim dia de FEBRER i NO estem en un any de traspas, avui es dia $DD" &gt;&gt; $LOG
fi_mes=1
fi
fi
;;
04|06|09|11)
if [ $DD -eq "30" ]
then
fi_mes=1
echo -e "\tEs un mes de 30 dies i avui es dia $DD" &gt;&gt; $LOG
fi
;;
*)
echo -e "\tNo es un mes valid" &gt;&gt; $LOG
exit
;;
esac

Si es fi de mes, canviem l’extensió i posem el mes que acaba:

1
2
3
4
5
6
7
8
if [ ${fi_mes} -eq 1 ]
then
echo -e "\tEs final de mes. Avui es dia $DD del mes de $MM." &gt;&gt; $LOG
mv ${DEST_DIR}/www_backup.${WKD}.tgz ${DEST_DIR}/www_backup.${YYYY}month${MM}.tgz
mv ${DEST_DIR}/config_apache.${WKD}.tgz ${DEST_DIR}/config_apache.${YYYY}month${MM}.tgz
mv ${DEST_DIR}/www_logs.${WKD}.tgz ${DEST_DIR}/www_logs.${YYYY}month${MM}.tgz
mv ${DEST_DIR}/mysql_dump.${WKD}.sql ${DEST_DIR}/mysql_dump.${YYYY}month${MM}.sql
fi

Finalment donem permisos per a l’usuari que es connectarà mitjançant rsync per a que pugui obtenir els fitxers.

1
2
chown <strong>usuari</strong>.<strong>usuari</strong> ${DEST_DIR}/*
echo "${YYYY}${MM}${DD} `date +%H:%M:%S` FI LOG" &gt;&gt; $LOG

Nota: s’ha de canviar usuari per l’usuari on volgueu que es desi el backup, posar una contrasenya vàlida per connectar-nos a MySQL i especificar la ruta al directori on es troba l’script.

Backup i restore de Drupal

Per fer el backup de Drupal es pot fer servir el següent script, que he extret de la pàgina oficial de Drupal, configurant l’apartat de connexió a la base de dades i el directori d’accés a on es troba instal·lat Drupal:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/bin/bash
#
# fullsitebackup.sh V1.1
#
# Full backup of website files and database content.
#
# A number of variables defining file location and database connection
# information must be set before this script will run.
# Files are tar'ed from the root directory of the website. All files are
# saved. The MySQL database tables are dumped without a database name and
# and with the option to drop and recreate the tables.
#
# ----------------------
# March 2007 Updates
#    - Updated script to resolve minor path bug
#    - Added mysql password variable (caution - this script file is now a security risk - protect it)
#    - Generates temp log file
#    - Updated backup and restore scripts have been tested on Ubunutu Edgy server w/Drupal 5.1
#
#    - Enjoy!  BristolGuy
#-----------------------
#
## Parameters:
#    tar_file_name (optional)
#
#
# Configuration
#
# Database connection information
dbname="drupal"     
# (e.g.: dbname=drupaldb) dbhost="localhost" dbuser=""        
# (e.g.: dbuser=drupaluser) dbpw=""
# (e.g.: dbuser password)

# Website Files
webrootdir="/var/www/drupal" 
# (e.g.: webrootdir=/home/user/public_html)

#
# Variables
#
# Default TAR Output File Base Name
tarnamebase=sitebackup
datestamp=`date +'%m-%d-%Y'`

# Execution directory (script start point)
startdir=`pwd` logfile=$startdir"/fullsite.log"

# file path and name of log file to use

# Temporary Directory tempdir=$datestamp

#
# Input Parameter Check
#
if test "$1" = ""
then
    tarname=$tarnamebase$datestamp.tgz
else
    tarname=$1
fi

#
# Begin logging
#
echo "Beginning drupal site backup using fullsitebackup.sh ..." &gt; $logfile

#
# Create temporary working directory
#
echo "   Creating temp working dir ..." &gt;&gt; $logfile
mkdir $tempdir

#
# TAR website files
# echo "   TARing website files into $webrootdir ..." &gt;&gt; $logfile cd $webrootdir tar cf $startdir/$tempdir/filecontent.tar .
#
# sqldump database information
#
echo "   Dumping drupal database, using ..." &gt;&gt; $logfile
echo "      user:$dbuser; database:$dbname host:$dbhost " &gt;&gt; $logfile
cd $startdir/$tempdir
mysqldump --user=$dbuser --password=$dbpw --add-drop-table $dbname &gt; dbcontent.sql

#
# Create final backup file
#
echo "   Creating final compressed (tgz) TAR file: $tarname ..." &gt;&gt; $logfile
tar czf $startdir/$tarname filecontent.tar dbcontent.sql

#
# Cleanup
#
echo "   Removing temp dir $tempdir ..." &gt;&gt; $logfile
cd $startdir
rm -r $tempdir

#
# Exit banner
#
endtime=`date`
echo "Backup completed $endtime, TAR file at $tarname. " &gt;&gt; $logfile

Link dins de Drupal: http://drupal.org/node/129202

El que fa aquest script és una còpia de la BBDD i del sistema de fitxers que haguem especificat en l’apartat de configuració.

Per recuperar el backup realitzat es recomana esborrar la base de dades i crear-la de nou.

 

IMPORTANT!!!!

En reestablir un site des d’una còpia de seguretat, pot ser que les urls no funcionin. Això pot ser culpa de les clean url. Per tant s’haurien de configurar com si no en tinguéssim:


1
2
UPDATE variable SET VALUE = 's:1:"0";' WHERE name = 'clean_url';
DELETE FROM cache;

Quan provem a tornar a entrar al nostre site de Drupal, és probable que surti un missatge dient-nos que el site no esta en funcionament i això pot ser degut a que les dades de configuració d’accés a la base de dades no són correctes. Es modifica el fitxer settings.php posant les dades que calguin i ha de funcionar.