No tengo mucha experiencia con EC2 y quiero configurar un trabajo cron para crear un volcado de la base de datos de mi RDS y copiarlo en mi depósito S3.
#!/bin/bash
AWS_ACCESS_KEY_ID=***
AWS_SECRET_ACCESS_KEY=***
BUCKET=db-snapshots
MYSQL_USER=***
MYSQL_PASSWORD=***
MYSQL_HOST=***
MYSQL_DATABASE_NAME= 'database_name'
TIMESTAMP=$(date +"%d-%b-%Y-%H-%M-%S")
#logging
LOG_ROOT="/backup/mysql_dump/logs/dump.log"
#Dump of Mysql Database into S3
echo "[db-take-snapshot]: creating backup of database $MYSQL_DATABASE_NAME start at $TSTAMP" >> "$LOG_ROOT"
mysqldump -u $MYSQL_USER \
-p $MYSQL_PASSWORD \
-h $MYSQL_HOST \
--single-transaction \
--routines --triggers \
--database_name $MYSQL_DATABASES_NAME| gzip > backup.gz
echo "[db-take-snapshot]:Finished backup of database and sending it in S3 Bucket at $TIMESTAMP" >> "$LOG_ROOT"
S3_KEY=$BUCKET/backups/$(date "+%Y-%m-%d")-backup.gz
aws s3 cp backup.gz s3://$S3_KEY --sse AES256
echo "[db-take-snapshot]: Copied to S3 at $TIMESTAMP" >> "$LOG_ROOT"
rm -f backup.gz
echo "[db-take-snapshot]: Backup finished at $TIMESTAMP" >> "$LOG_ROOT"
Desactivando la parte de registro en este momento y el script anterior falla debido a los permisos:
/db-take-snapshot-s3.sh: line 25: backup.gz: Permission denied
Los permisos son:-rwxr-xr-x 1 root root 1144 Mar 21 10:30 db-take-snapshot-s3.sh
Cualquier idea será muy apreciada.
Actualizar:
$ll -d . : drwxr-xr-x 2 root root 4096 Mar 21 11:07 .
$ll: -rwx------ 1 root root 1139 Mar 21 11:06 db-take-snapshot-s3.sh
$pwd: /etc/cron.hourly
id: uid=500(ec2-user) gid=500(ec2-user) groups=500(ec2-user),10(wheel)
ACTUALIZACIÓN 2
Bien, ejecuté mysqldump -h $MYSQL_HOST -u $MYSQL_USER -p $MYSQL_PASSWORD --all-databases > backup.sql
en mi terminal y la copia de seguridad se realizó correctamente.
Sin embargo, todavía falla como parte del script bash y el contenido del archivo backup.sql producido ahora es:
Usage: mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
For more options, use mysqldump --help
Respuesta1
Creo que los problemas de EC2, S3 y RDS son una distracción en este momento, básicamente RDS es como cualquier instancia de MySQL y EC2 es como cualquier máquina virtual de Linux. Parece que ni siquiera estás llegando al punto de preocuparte por el S3 todavía (aunque eso parece estar bien).
Debes ejecutar tu script de respaldo como usuario no root, así que muévelo a /home/ec2-user
por ahora.
Luego, debe ejecutar el cron en ec2-user; utilícelo sudo -u ec2-user crontab -e
para editar el crontab del usuario ec2; no edite los crontab directamente en una distribución moderna.
Eso resolverá el problema de backup.gz pero también deberá asegurarse de que $MYSQL_USER
@ ec2_ip
sea un usuario válido en su instancia de RDS.EsteLa respuesta puede ser informativa.
Editar: Su último problema probablemente solo signifique que necesita cambiar de -u $MYSQL_USER a -u$MYSQL_USER, por ejemplo, y lo mismo para los parámetros de host y contraseña.
Respuesta2
Esta falla no está relacionada con los derechos del archivo de script en sí (db-tomar-instantánea-s3.sh) sino más bien a los derechos del directorio donde se ejecuta el script y guarda temporalmente el archivorespaldo.gz.
Te recomiendo que enumeres los derechos del directorio donde ejecutas un script.
ll -d .
Y también agregue permiso de escritura a ese directorio.
chmod +w .
También es importante que, si no funciona, mencione esta información (directorio actual y usuario actual) para que podamos ayudar más.
id
pwd
ll
ll -d .