Pomoc Automatyczny backup bazy danych i transfer danych na drugiego QNAP'a TS-209

SecNetPL

Passing Basics
Beginner
11 Luty 2017
13
1
3
QNAP
TS-x59 Pro
Ethernet
1 GbE
Cześć,
Przymierzam się do stworzenia skryptu w bash'u, który zatrzymywał by zapis w bazie danych, dokonywał jej zrzutu/kopii i przesyłał do drugiego QNAP'a. Czy ktoś z was ma już jakiś doświadczenie w tworzeniu tego typu rozwiązań ? Tabele w bazie danych są bardzo ważne, więc oprócz przechowywania kopii na oddzielnym dysku w ramach jednego QNAP TS-469, chciałbym również transferować kopię na drugiego QNAP'a. QNAP TS-209 wykorzystywany byłby do przechowywania kopi bazy spakowanej do pliku *.zip.

Wersja oprogramowania Firmware: 4.2.3 Build 20170121
Model serwera: QNAP TS-469
 
po co ? jaka to baza ?
Baza przechowywać będzie zdjęcia wykonane przy pomocy aparatury medycznej. Z drugiej strony zapis do bazy będzie tylko w konkretnych godzinach, więc rzeczywiście zatrzymywanie bazy nie bedzie potrzebne.
mała reklama blogu kolegi z forum :p
Dzięki ! zaraz spróbuję to wdrożyć (po lekkiej modyfikacji kodu) i zobaczę jak taka kopia bedzie wyglądać :). Wynikami również się podzielę, bo sądzę, że tego typu rozwiązania są dosyć istotne jeśli chodzi o wykorzystanie serwerów QNAP.
Dodać tylko jakiś rsync :) i wymienić klucze ssh
Posiadasz jakieś dobre materiały odnośnie wymiany kluczy SSH ? Przyznam, że nie zagłębiałem się w te rozwiązania, ale Twoja sugestia wydaję mi się być bardzo pomocna ;)
 
bkp :) plik
Kod:
#!/bin/bash
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/mariadb/bin"
SSH=$1

#MySQL-SSH-BACKUP
BACKUPDIR="/katalog/miejsce/docelowe"
BACKUPLOG="/dev/null"
OUTPUT="/tmp"
DATA=`date -I`
SSHBIN=$(which ssh)
MYSQLDUMPBIN=$(which mysqldump)
MYSQLBIN=$(which mysql)
SCPBIN=$(which scp)


$SSHBIN -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" $SSH 'mkdir -p '$BACKUPDIR'/'$DATA''
rm -rf $OUTPUT
mkdir $OUTPUT

for db in $($MYSQLBIN -pTWOJE_HASLO -e "SHOW DATABASES;" | tr -d "| " | grep -v Database); do
    if [[ "$db" != "information_schema" ]] && [[ "$db" != _* ]] ; then
        echo "Dumping database: $db"
        $MYSQLDUMPBIN -pTWOJE_HASLO --force --opt --routines --databases $db | gzip > $OUTPUT/$db.sql.gz
        $SCPBIN -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" $OUTPUT/$db.sql.gz $SSH:$BACKUPDIR/$DATA/$db.sql.gz >> $BACKUPLOG 2>&1
        rm -f $OUTPUT/$db.sql.gz
    fi
done

odpalasz nazwaskrypt.sh user@nazawa.serwera
Kod:
[admin@syn .ssh]# ls -al
total 48
drwx------    2 admin    administ      4096 Feb 10 12:46 ./
drwxr-xr-x   37 admin    administ     12288 Feb 12 03:00 ../
-rw-------    1 admin    administ       403 Nov 24 12:06 authorized_keys
lrwxrwxrwx    1 admin    administ        16 Nov 24 04:15 id_rsa -> ssh_host_rsa_key
lrwxrwxrwx    1 admin    administ        20 Nov 24 04:15 id_rsa.pub -> ssh_host_rsa_key.pub
-rw-r--r--    1 admin    administ      1679 Jan  2 18:26 known_hosts
-rw-------    1 admin    administ       668 Nov 24 04:10 ssh_host_dsa_key
-rw-r--r--    1 admin    administ       605 Nov 24 04:10 ssh_host_dsa_key.pub
-rw-------    1 admin    administ      1675 Nov 24 04:10 ssh_host_rsa_key
-rw-r--r--    1 admin    administ       397 Nov 24 04:10 ssh_host_rsa_key.pub
-rw-r--r--    1 admin    administ       214 Feb 10 12:46 sshd_config
-rw-r--r--    1 admin    administ        17 Feb 10 12:46 sshd_user_config

tak wiec
Kod:
cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> .ssh/authorized_keys'
 
1. Wykorzystałem skrypt zaproponowany przez @grzenio jednak wyrzuca mi poniższy błąd. Czy w tym przypadku jakiś dodatkowy service powinnien być zrestartowany ?

[/share/Dane/backup/skrypty] # ./backup.sh admin@AGSNeT
ssh: Could not resolve hostname mkdir -p /share/dane/backup/wersja/2017-02-17: Name or service not known
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: phpmyadmin
Dumping database: test

Kod:
#!/bin/bash
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/mariadb/bin"
#zmienne
BACKUPDIR="/share/Dane/backup/wersja"
BACKUPLOG="/dev/null"
DATA=`date -I`
MYSQLDUMPBIN=$(which mysqldump)
SCPBIN=$(which scp)
SSHBIN=$(which ssh)
MYSQLBIN=$(which mysql)
OUTPUTTMP="/share/Dane/backup/tmp"
SQLPASS="admin"

$SSHBIN -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" $SSH 'mkdir -p '$BACKUPDIR'/'$DATA''

rm -rf $OUTPUTTMP
mkdir $OUTPUTTMP

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
        mkdir -p $BACKUPDIR/$DATA
#cp $OUTPUTTMP/$db.sql.gz $BACKUPDIR/$DATA/$db.sql.gz >> $BACKUPLOG 2>&1
 $SCPBIN -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" $OUTPUTTMP/$db.sql.gz $SSH:$BACKUPDIR/$DATA/$db.sql.gz >> $BACKUPLOG 2>&1
rm -f $OUTPUTTMP/$db.sql.gz
    fi
done
 
Kod:
cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> .ssh/authorized_keys'

Próbuję wykorzystać powyższą komedę, nie bardzo jednak wiem w jakis sposób i co wprowadzić do okna w pliku authorized.

Wykonałem poniższą komendą, ale nie znalazłem pliku authorized_keys.

Kod:
[/share/Dane/backup/wersja] # cd ~/.ssh
[~/.ssh] # ls
id_rsa@               ssh_host_dsa_key      ssh_host_rsa_key      sshd_config
id_rsa.pub@           ssh_host_dsa_key.pub  ssh_host_rsa_key.pub

Wykonałem więc komendę ssh-keygen aby uzyskac nowe klucze.

Kod:
[~/.ssh] # ls -al
drwxr-xr-x    2 admin    administ      4096 Feb 18 14:11 ./
drwxr-xr-x   32 admin    administ      4096 Feb 18 14:20 ../
-rw-r--r--    1 admin    administ         0 Feb 18 14:11 authorized
lrwxrwxrwx    1 admin    administ        16 Jun 21  2012 id_rsa -> ssh_host_rsa_key
lrwxrwxrwx    1 admin    administ        20 Jun 21  2012 id_rsa.pub -> ssh_host_rsa_key.pub
-rw-r--r--    1 admin    administ       394 Feb 18 13:54 known_hosts
-rw-------    1 admin    administ       668 Jun 21  2012 ssh_host_dsa_key
-rw-r--r--    1 admin    administ       605 Jun 21  2012 ssh_host_dsa_key.pub
-rw-------    1 admin    administ      1675 Jun 21  2012 ssh_host_rsa_key
-rw-r--r--    1 admin    administ       397 Jun 21  2012 ssh_host_rsa_key.pub
-rw-r--r--    1 admin    administ      3105 Feb 18 13:10 sshd_config

Podmieniłem nazwę pliku w kodzie
Kod:
.ssh/authorized_keys'
na authorized. W tym momencie muszę wprowadzić jakiś wartości w tym pliku.
Kod:
[~/.ssh] # cat ~/.ssh/id_rsa.pub | ssh admin@AGSNeT 'cat >> .ssh/authorized
>

Czy powinienem w nim umieścić wygenerowany przy pomocy SHA256 klucz ?
Dla przykładu: SHA256:9w3ZiHTDorKEeAGrJnwGrXK3s0TZYIUpBe3+EeYk9O8 admin@AGSNeT (klucz został ręcznie zmodyfikowany :Dumny:)
 
zawartość pliku ~/.ssh/id_rsa.pub z pierwszej maszyny musi wylądować w .ssh/authorized na drugiej maszynie

Dla jasności od teraz będe operował na 2 maszynach, które nazwe A (TS-459 gdzie umieszczona jest baza i uruchamiany jest skrypt) oraz B (TS-209 gdzie docelowo ma trafiać kopia pliku)

Przekopiowałem zawartość pliku ~/.SSH/id_rsa.pub z A do .SSH/authorized na B jak zasugerowałeś :). Plik authorized też skopiowałem z A do B (nie był on widoczny nawet w chwili wykonania polecenia ssh-keygen). W momencie kiedy próbuję uruchomić skrypt ./backup.sh admin@adres_IP (maszyny B) w dalszym ciągu pyta mnie o hasło. Zauważyłem, że nie jest również możliwe wykonanie skryptu bez podania hasła na maszynie A.

2. Zastanawiam się również, ponieważ kopie danej bazy chciałbym mieć zarówno na maszynie A i B. W tym przypadku będe potrzebował delikatnie zmodyfikować skryt i dodać 2 odnośniki do skryptów do crontab ? Czy da się to obejść przy jednym skrypcie ? Wydaje mi się, że w tej chwili z racji wykorzystania przesyłania plików przez SSH (i wymiany kluczy) w ramach jednego skrypt mogłoby to być trudne.
 

Użytkownicy znaleźli tą stronę używając tych słów:

  1. authorized_keys
  2. kopia mariadb