Skrypt do tworzenia kopii bazy danych - Bash

0

Stworzyłem skrypt:

#!/bin/bash

#create /root/.my.cnf and add:
#[mysqldump]
#user=root
#password=PASSWORD
#remove the password and user for mysqldump from script
#Wtedy nie będzie warningów w konsoli


DATE=$(date +"%d-%m-%Y")
DIRECTORY="/var/www/biosfera.it/home/biosfera_sh/backups"
MYSQLDUMP=/usr/bin/mysqldump
    
#need create .password file in proper directory contains data in form -> user,password
MYSQL_USER="`awk 'BEGIN {FS=","} {print $1}' /root/.credentials`"
MYSQL_PASSWORD="`awk 'BEGIN {FS=","} {print $2}' /root/.credentials`"

#file will be stored in this place
cd $DIRECTORY

#backup the database, each in own file
databases=$(mysql --user=$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -E 'biosfera_base1|biosfera_base2')
for database in $databases
do
   echo -e "\e[38;5;40mI am doing backup of $database.\e[39m"
   $MYSQLDUMP --force --log-error=error_file.log --user=$MYSQL_USER -p$MYSQL_PASSWORD --databases $database > $database.sql
done

#here need to archive and compress each file
echo -e "\e[38;5;45mNow I am going to create zipped archives to save some disk space and remove not necessary files. Please, give me a moment. :)\e[39m"
 
db="*.sql"
 
for archive in $db
do
    tar -czvf $archive.tar.gz $archive >/dev/null 2>&1
   /bin/mv $archive.tar.gz $archive"_"$DATE.tar.gz
done
 
#make the backup files readable only by root
/bin/chmod 600 *.tar.gz

#delete unnecessary dumped db files
rm *.sql
 
echo
echo "Open path $DIRECTORY to see details."
 
#mail admin that all went properly
echo "All databases from server $(hostname -f) became backuped. You can check the log file attached to message." | mutt -s "Report - backup from day $(date +%y-%m-%d-%H:%M:%S)" [email protected] -a "$DIRECTORY/error_file.log"

echo
echo -e "\e[38;5;45mFinished doing databases backup.\e[39m"

W linii

$MYSQLDUMP --force --log-error=error_file.log --user=$MYSQL_USER -p$MYSQL_PASSWORD --databases $database > $database.sql

po dodaniu $database"-"$DATE.sql (zamiast końcowego $database.sql) pliki nie są tworzone. Próbowałem różnych sposobów jak np. $database$DATE.sql, ${database}-${DATE} i kilku innych kombinacji. Żaden sposób nie zadziałał. Do celów testowych zakomentowałem pętlę tworzącą zarchiwizowane pliki oraz usuwanie plików .sql. Moim celem jest utworzenie nazwy pliku składającej się z nazwy backupowanej bazy danych i daty. Próbowałem powyższych kombinacji analogicznie w pętli archiwizującej do .tar.gz. Niestety bez efektu. Dopiero dodanie w pętli - jak można zobaczyć w powyższym skrypcie - linii:

/bin/mv $archive.tar.gz $archive"_"$DATE.tar.gz

robi robotę. Niemniej jestem ciekaw dlaczego dodanie zmiennej $DATE podczas tworzenia bazowego pliku .sql z kopiowaną bazą oraz to samo w przypadku tworzenia skompresowanych archiwów nie chce działać.

PS
Czy jest możliwe, aby usunąć warningi z mysqldump dotyczące user/pass w powyższym skrypcie?

0
mysqldump ... > "${DATABASE}_${DATE}.sql"
0
Patryk27 napisał(a):
mysqldump ... > "${DATABASE}_${DATE}.sql"

Tego też próbowałem i nie działało, ale znalazłem powód problemu. Format daty z godziną nie przejdzie choćby nie wiem co. Poprawiłem na:

DATE=$(date +"%d-%m-%Y")

dump zmieniłem na:

$MYSQLDUMP --force --log-error=error_file.log --user=$MYSQL_USER -p$MYSQL_PASSWORD --databases $database > $database"_"$DATE.sql

skasowałem z pętli archiwizującej linię:

#/bin/mv $archive.tar.gz $archive"_"$DATE.tar.gz

Wiesz może jak się pozbyć "Warning: Using a password on the command line interface can be insecure mysqldump" ?

0
Poliman napisał(a):
Patryk27 napisał(a):
mysqldump ... > "${DATABASE}_${DATE}.sql"

Tego też próbowałem i nie działało, ale znalazłem powód problemu. Format daty z godziną nie przejdzie choćby nie wiem co. Poprawiłem na:

DATE=$(date +"%d-%m-%Y")

dump zmieniłem na:

$MYSQLDUMP --force --log-error=error_file.log --user=$MYSQL_USER -p$MYSQL_PASSWORD --databases $database > $database"_"$DATE.sql

skasowałem z pętli archiwizującej linię:

#/bin/mv $archive.tar.gz $archive"_"$DATE.tar.gz

Wiesz może jak się pozbyć "Warning: Using a password on the command line interface can be insecure mysqldump" ?

Dzięki za link, widziałem go wcześniej. Znalazłem lepsze rozwiązanie:

create /root/.my.cnf and add:
[mysqldump]
user=root
password=PASSWORD
#you can remove the password and user for mysqldump from your script

0

Finalna wersja skryptu bez warningów:

#!/bin/bash

#functions which gives colors
Info () {
        echo -e "\e[1;34m$1\e[0m"
}

Success () {
        echo -e "\e[1;32m$1\e[0m"
}

Important () {
        echo -e "\e[1;33m$1\e[0m"
}

DATE=$(date +"%d-%m-%Y")
DIRECTORY="/var/www/biosfera.it/home/biosfera_sh/backups"
MYSQLDUMP=/usr/bin/mysqldump

#files will be stored in this place
cd $DIRECTORY

#backup the database, each in own file
databases=$(mysql -e "SHOW DATABASES;" | grep -E 'biosfera_base1|biosfera_base2')
for database in $databases
do
        Info "I am doing backup of \e[4m$database\e[24m."
        echo
        $MYSQLDUMP --force --log-error=error_file.log --databases $database > $database"_"$DATE.sql

        #here need to archive and compress each file
        Important "Now I am going to create zipped archives to save some disk space and remove not necessary files. Please, give me a moment. Working on \e[4m$database\e[24m. :)"
        echo
        tar -czvf $database"_"$DATE.sql.tar.gz $database"_"$DATE.sql >/dev/null 2>&1
done

#make the backup files readable only by root
/bin/chmod 600 *.tar.gz

#delete unnecessary dumped db files
rm *.sql

Info "Open path $DIRECTORY to see details."

#mail admin that all went properly
echo "All databases from server $(hostname -f) became backuped. You can check the log file attached to message." | mutt -s "Report - backup from day $(date +%y-%m-%d-%H:%M:%S)" [email protected] -a "$DIRECTORY/error_file.log"

echo
Success "Finished doing databases backup."

W /root/.my.cnf trzeba było dodać dwie sekcje:
[client] oraz [mysqldump] i w każdej z nich podać user=nazwa_usera oraz password=haslo

1 użytkowników online, w tym zalogowanych: 0, gości: 1