Codzienna automatyczna kopia baz MySQL/MariaDB używanych na serwerze QNAP NAS

Codzienna automatyczna kopia baz MySQL/MariaDB używanych na serwerze QNAP NAS

Ok. Dziś szalejemy tylko w konsoli via ssh :)
Tak więc na start logujemy się na naszego QNAP-a via ssh jako user admin

W moim przypadku zakładkam 2 katalogi – jeden gdzie trzymam sobie różne skrypty oraz drugi gdzie będe trzymał backup baz – dumpy.

mkdir /share/CACHEDEV1_DATA/scripts
mkdir /share/CACHEDEV1_DATA/mysqldump

Teraz musimy utworzyć skrypt który nam wykona backup :)

vim /share/CACHEDEV1_DATA/scripts/sqlbkp.sh

Zawartość:

#!/bin/bash
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/mariadb/bin"
 
#zmienne
BACKUPDIR="/share/CACHEDEV1_DATA/mysqldump"
BACKUPLOG="/dev/null"
DATA=`date -I`
MYSQLDUMPBIN=$(which mysqldump)
MYSQLBIN=$(which mysql)
OUTPUTTMP="/share/CACHEDEV1_DATA/mysqldump/tmp"
SQLPASS="admin"
 
rm -rf $OUTPUTTMP
mkdir $OUTPUTTMP
mkdir $BACKUPDIR/$DATA
for db in $($MYSQLBIN -p$SQLPASS -e "SHOW DATABASES;" | tr -d "| " | grep -v Database); do
    if [[ "$db" != "information_schema" ]] && [[ "$db" != _* ]] ; then
        echo "Dumping database: $db"
        $MYSQLDUMPBIN -p$SQLPASS --force --opt --routines --databases $db | gzip > $OUTPUTTMP/$db.sql.gz
        cp $OUTPUTTMP/$db.sql.gz $BACKUPDIR/$DATA/$db.sql.gz >> $BACKUPLOG 2>&1
        rm -f $OUTPUTTMP/$db.sql.gz
    fi
done

Oczywiście powyższy skrypt to pewna modyfikacja tego co już używam, więc można go też przerobić bez zbędnego kopiowania :) albo zmodyfikować skrypt aby robił upload na inny qnap via ssh :) – ale o tym będzie następnym razem :)

Prawa wykonywania skryptu:

chmod +x /share/CACHEDEV1_DATA/scripts/sqlbkp.sh

Gdy odpalimy skrypt wynik będzie jak poniżej:

/share/CACHEDEV1_DATA/scripts/sqlbkp.sh

Dumping database: mysql
Dumping database: performance_schema
mysqldump: Got error: 1142: "SELECT,LOCK TABL command denied to user 'root'@'localhost' for table 'cond_instances'" when using LOCK TABLES
Dumping database: qnap
Dumping database: test

Błędem się nie przejmujemy :)

Sprawdzamy wykonanie się backupu:

ls -al ../mysqldump/2017-02-10/
total 156
drwxr-xr-x    2 admin    administ      4096 Feb 10 09:52 ./
drwxr-xr-x    4 admin    administ      4096 Feb 10 09:52 ../
-rw-r--r--    1 admin    administ    139204 Feb 10 09:52 mysql.sql.gz
-rw-r--r--    1 admin    administ      1909 Feb 10 09:52 performance_schema.sql.gz
-rw-r--r--    1 admin    administ       537 Feb 10 09:52 qnap.sql.gz
-rw-r--r--    1 admin    administ       537 Feb 10 09:52 test.sql.gz

Teraz pozostaje nam to dodać do cron-a aby kopia robiła się codziennie:

vim /etc/config/crontab

Dodajemy wpis:

0 1 * * * /share/CACHEDEV1_DATA/scripts/sqlbkp.sh

Restartujemy cron-a aby widział zmiany:

crontab /etc/config/crontab && /etc/init.d/crond.sh restart

I to wszystko :)
Teraz mamy codzienna kopie bazy. Oczywiście można dodać modyfikacje, np.: dla katalogu dnia oddać godzinę i wykonywać kilka razy na dzień kopię jeżeli jest taka potrzeba.