como canalizar um mysql dump para s3cmd

5

Eu quero transferir um dump mysql, compactado, para s3.

Eu tentei:

mysqldump -u root -ppassword -all-databases | gzip -9 | s3cmd put s3://bucket/sql/databases.sql.gz

mas depois fico:

ERROR: Not enough paramters for command 'put'

Como posso fazer isso (em uma linha)?

    
por zensys 17.06.2014 / 17:56

4 respostas

16

Isso é possível com s3cmd 1.5+ ( link ):
$ mysqldump ... | s3cmd put - s3://bucket/file-name.sql

    
por 07.05.2015 / 15:35
2

Você está perdendo o arquivo real que deseja fazer o backup para iniciar.

s3cmd put /backup_dir/somefile.sql.gz s3://bucket/sql/

O s3cmd usa dois argumentos básicos, o arquivo e o repositório para fazer backup também.

Em segundo lugar, eu não posso levar o crédito para o seguinte, mas basicamente fazendo o que você quer com um script intermediário. Basicamente, crie um arquivo bak.sh com o seguinte, e então esse script de shell será executado via bash. (Crédito: link )

S3BUCKET="<bucketname>"

# Array of Databases
DBS=("<db1>" "<db2>" "<db3>" "<db4>")

for i in "${DBS[@]}"
do
    DBNAME=$i
    FILE=$DBNAME-'date "+%Y%m%d-%H%M"'.sql.gz
    mysqldump $DBNAME -u[uname] -p[password] | gzip -9> /home/$FILE
    #location of s3cmd may vary, modify if needed
    /usr/bin/s3cmd --config /root/.s3cfg put /home/$FILE s3://$S3BUCKET/DBBackup-$DBNAME/ >> /var/log/mysqlback.log
    sleep 5
    rm /home/$FILE

done
    
por 17.06.2014 / 18:10
0

Você poderia tentar usar - para indicar ao s3cmd que ele deveria ler stdin para o parâmetro source, pode funcionar. Caso contrário, você poderia fazer isso com uma etapa intermediária

mysqldump -u root -ppassword -all-databases | gzip -9 >tmp.file && s3cmd put tmp.file s3://bucket/sql/databases.sql.gz ... && rm tmp.file

Isso comprimirá a saída para tmp.file e, se for bem-sucedida ( && ), colocará o arquivo em s3 e, se tiver êxito, apagará o arquivo temporário.

    
por 17.06.2014 / 18:15
0

Crie mysql.sh para armazenar mysqldump direto para s3 via pipline Nenhum arquivo local será armazenado.

#!/bin/bash

#/home/ec2-user/s3/mysql.sh

#logging
    LOG_ROOT="/var/www/html/laravel/storage/logs/laravel-$(date +%Y-%m-%d).log"

# Basic variables

# Database credentials
USER=root
PASSWORD=password
HOST=localhost
DB_NAME=dbname

#Backup_Directory_Locations

S3BUCKET=s3://bucket/database/$(date +%a).sql.gz

# Timestamp (sortable AND readable)
TSTAMP=$(date +"%Y-%m-%d %H:%M:%S")

#Dump of Mysql Database into S3\
echo "[$TSTAMP] MYSQL_Dump.WARNING: MySQL Dump for DB_NAME started from cron s3/mysql.sh" >> "$LOG_ROOT"
echo "Stack trace:" >> "$LOG_ROOT"
echo "#wil be stored as s3://bucket/database/$(date +%a).sql.gz" >> "$LOG_ROOT"

mysqldump --host=$HOST --user=$USER --password=$PASSWORD  $DB_NAME  --routines  --single-transaction | gzip -9 | aws s3 cp - $S3BUCKET

$TSTAMPEND=$(date +"%Y-%m-%d %H:%M:%S")
echo "[$TSTAMPEND] MYSQL_Dump.INFO: MySQL Dump finished." >> "$LOG_ROOT"
echo "Stack trace:" >> "$LOG_ROOT"
echo "#Backup stored at s3://bucket/database/$(date +%a).sql.gz" >> "$LOG_ROOT"

Criar Cronjob para backup diário

#crontab -e
0 0 * * *  bash /home/ec2-user/s3/mysql.sh to  >/dev/null 2>&1
#midnight 12 daily
    
por 31.08.2018 / 11:56