Programa de consola Linux para a cópia de segurança da base de dados

Tentei muitos guiões para cópias de segurança da base de dados, mas não consegui. Quero fazer backup da minha base de dados a cada hora.
Adicionei ficheiros ao " / etc / cron.hourly / " pasta, mudou o seu chmod para 755, mas não funcionou. Pelo menos escrevo o meu pseudo-código.

Ficaria feliz se pudesse escrever um guião para esta operação e dizer-me o que devo fazer mais ? Depois de adicionar este ficheiro de programa à pasta /etc/cron.hourly/.

  • obter a data actual e criar uma variável, date=date(d_m_y_H_M_S)
  • criar um variável para o nome do ficheiro, filename="$date".gz
  • Arranja o lixo da minha base de dados assim.
  • apagar todos os ficheiros na pasta /var/www/vhosts/system/example.com/httpdocs/backups/ que tenham mais de 8 dias
  • no ficheiro "/var/www/vhosts/system/example.com/httpdocs/backup_log.txt", este texto será escrito: Backup is created at $("date")
  • muda os proprietários dos ficheiros (chown) do root para "my_user". Porque eu quero abrir os arquivos de backup e log da conta FTP "my_user".
  • Não quero um e-mail depois de cada cron. >/dev/null 2>&1 será adicionado.
Author: trante, 2013-10-29

7 answers

Depois de horas e horas de trabalho, criei uma solução como a que se segue. Copio pasta para outras pessoas que podem beneficiar.

Primeiro crie um ficheiro de programa e dê a este ficheiro Permissão para executar o executável.

# cd /etc/cron.daily/
# touch /etc/cron.daily/dbbackup-daily.sh
# chmod 755 /etc/cron.daily/dbbackup-daily.sh
# vi /etc/cron.daily/dbbackup-daily.sh

Copiar então as seguintes linhas para o ficheiro com Shift + Ins

#!/bin/sh
now="$(date +'%d_%m_%Y_%H_%M_%S')"
filename="db_backup_$now".gz
backupfolder="/var/www/vhosts/example.com/httpdocs/backups"
fullpathbackupfile="$backupfolder/$filename"
logfile="$backupfolder/"backup_log_"$(date +'%Y_%m')".txt
echo "mysqldump started at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
mysqldump --user=mydbuser --password=mypass --default-character-set=utf8 mydatabase | gzip > "$fullpathbackupfile"
echo "mysqldump finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
chown myuser "$fullpathbackupfile"
chown myuser "$logfile"
echo "file permission changed" >> "$logfile"
find "$backupfolder" -name db_backup_* -mtime +8 -exec rm {} \;
echo "old files deleted" >> "$logfile"
echo "operation finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
echo "*****************" >> "$logfile"
exit 0

Editar:
Se usar o InnoDB e a cópia de segurança levar demasiado tempo, poderá adicionar o argumento "single-transaction" para evitar o bloqueio. Então a linha mysqldump será assim:

mysqldump --user=mydbuser --password=mypass --default-character-set=utf8
          --single-transaction mydatabase | gzip > "$fullpathbackupfile"
 84
Author: trante, 2017-12-05 16:38:15

Crie um script semelhante a este:

#!/bin/sh -e

location=~/`date +%Y%m%d_%H%M%S`.db

mysqldump -u root --password=<your password> database_name > $location

gzip $location

Depois poderá editar o crontab do utilizador que o programa irá executar como:

$> crontab -e

E adicionar a entrada

01 * * * * ~/script_path.sh
Isto vai fazê-lo funcionar no primeiro minuto de cada hora todos os dias.

Então você só tem que adicionar em seus rolos e outras funcionalidades e você está pronto para ir.

 29
Author: Peter Party Bus, 2014-02-14 09:22:34
Tenho o mesmo problema. Mas consigo escrever um guião. Espero que isto ajude.
#!/bin/bash
# Database credentials
user="username"
password="password"
host="localhost"
db_name="dbname"
# Other options
backup_path="/DB/DB_Backup"
date=$(date +"%d-%b-%Y")
# Set default file permissions
umask 177
# Dump database into SQL file
mysqldump --user=$user --password=$password --host=$host $db_name >$backup_path/$db_name-$date.sql

# Delete files older than 30 days
find $backup_path/* -mtime +30 -exec rm {} \;


#DB backup log
echo -e "$(date +'%d-%b-%y  %r '):ALERT:Database has been Backuped"    >>/var/log/DB_Backup.log
 6
Author: Vinod Amarathunga, 2016-07-04 09:20:36
#!/bin/sh
#Procedures = For DB Backup
#Scheduled at : Every Day 22:00

v_path=/etc/database_jobs/db_backup
logfile_path=/etc/database_jobs
v_file_name=DB_Production
v_cnt=0

MAILTO="[email protected]"
touch "$logfile_path/kaka_db_log.log"

#DB Backup
mysqldump -uusername -ppassword -h111.111.111.111 ddbname > $v_path/$v_file_name`date +%Y-%m-%d`.sql 
if [ "$?" -eq 0 ]
  then
   v_cnt=`expr $v_cnt + 1`
  mail -s "DB Backup has been done successfully" $MAILTO < $logfile_path/db_log.log
 else
   mail -s "Alert : kaka DB Backup has been failed" $MAILTO < $logfile_path/db_log.log
   exit
fi
 2
Author: kartavya soni, 2015-11-05 06:19:09
Aqui está o meu script de backup mysql para o ubuntu, no caso de ajudar alguém.
#Mysql back up script

start_time="$(date -u +%s)"

now(){
date +%d-%B-%Y_%H-%M-%S
}

ip(){
/sbin/ifconfig eth0 2>/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://'
}

filename="`now`".zip
backupfolder=/path/to/any/folder
fullpathbackupfile=$backupfolder/$filename
db_user=xxx
db_password=xxx
db_name=xxx

printf "\n\n"
printf "******************************\n"
printf "Started Automatic Mysql Backup\n"
printf "******************************\n"
printf "TIME: `now`\n"
printf "IP_ADDRESS: `ip` \n"
printf "DB_SERVER_NAME: DB-SERVER-1\n"

printf "%sBACKUP_FILE_PATH $fullpathbackupfile\n"

printf "Starting Mysql Dump \n"

mysqldump -u $db_user -p$db_password $db_name| pv | zip > $fullpathbackupfile

end_time="$(date -u +%s)"

elapsed=$(($end_time-$start_time))

printf "%sMysql Dump Completed In $elapsed seconds\n"

printf "******************************\n"

PS: Rememember to install pv and zip in your ubuntu

sudo apt install pv
sudo apt install zip

Foi assim que defini o crontab usando crontab -e no ubuntu para executar a cada 6 horas

0 */6 * * * sh /path/to/shfile/backup-mysql.sh >> /path/to/logs/backup-mysql.log 2>&1

O legal é que ele vai criar um arquivo zip que é mais fácil de abrir de qualquer lugar

 1
Author: Baljeet Bhinder, 2018-06-22 10:03:33
#!/bin/bash

# Add your backup dir location, password, mysql location and mysqldump        location
DATE=$(date +%d-%m-%Y)
BACKUP_DIR="/var/www/back"
MYSQL_USER="root"
MYSQL_PASSWORD=""
MYSQL='/usr/bin/mysql'
MYSQLDUMP='/usr/bin/mysqldump'
DB='demo'

#to empty the backup directory and delete all previous backups
rm -r $BACKUP_DIR/*  

mysqldump -u root -p'' demo | gzip -9 > $BACKUP_DIR/demo$date_format.sql.$DATE.gz

#changing permissions of directory 
chmod -R 777 $BACKUP_DIR
 0
Author: Shal, 2015-05-04 07:58:39

Podes considerar esta ferramenta de código aberto, matiri, https://github.com/AAFC-MBB/matiri que é um programa de cópia de segurança mysql concorrente com meta-dados em Sqlite3. Características:

  • multi-servidor: são suportados vários servidores de MySQL, quer estejam co-localizados no mesmo ou em servidores físicos separados.
  • paralelo: cada base de dados no servidor a fazer de backup é feita separadamente, em paralelo (concurrencia liquidada: por omissão: 3)
  • comprimido: cada cópia de segurança da base de dados comprimido
  • Checksummed: SHA256 de cada arquivo de backup comprimido armazenado e o arquivo de todos os arquivos
  • arquivado: todas as cópias de segurança da base de dados agrupadas num único ficheiro
  • gravado: informação de salvaguarda armazenada na base de dados Sqlite3

Revelação completa: autor original de matiri.

 0
Author: ggg, 2018-03-17 08:04:18