Ich habe nicht viel Erfahrung mit EC2 und möchte einen Cron-Job einrichten, um einen Dump meiner RDS-Datenbank zu erstellen und ihn in meinen S3-Bucket zu kopieren.
#!/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"
Wenn ich derzeit den Protokollierungsteil deaktiviere, schlägt das obige Skript aufgrund von Berechtigungen fehl:
/db-take-snapshot-s3.sh: line 25: backup.gz: Permission denied
Die Berechtigungen sind:-rwxr-xr-x 1 root root 1144 Mar 21 10:30 db-take-snapshot-s3.sh
Alle Ideen sind herzlich willkommen
Aktualisieren:
$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)
AKTUALISIERUNG 2
Okay, ich habe es mysqldump -h $MYSQL_HOST -u $MYSQL_USER -p $MYSQL_PASSWORD --all-databases > backup.sql
in meinem Terminal ausgeführt und die Sicherung wurde erfolgreich erstellt.
Allerdings schlägt es als Teil des Bash-Skripts immer noch fehl und der Inhalt der erstellten Datei „backup.sql“ lautet nun:
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
Antwort1
Ich denke, die Probleme mit EC2, S3 und RDS sind im Moment eine Ablenkung. Im Grunde ist RDS wie jede MySQL-Instanz und EC2 wie jede Linux-VM. Es scheint, dass Sie sich noch nicht einmal Gedanken über S3 machen (obwohl dieser Teil gut aussieht).
Sie sollten Ihr Sicherungsskript als Nicht-Root-Benutzer ausführen, verschieben Sie es also /home/ec2-user
vorerst dorthin.
Anschließend sollten Sie den Cron unter dem EC2-Benutzer ausführen – verwenden Sie ihn, sudo -u ec2-user crontab -e
um die Crontab des EC2-Benutzers zu bearbeiten – bearbeiten Sie Crontabs auf einer modernen Distribution nicht direkt.
Dadurch wird das Problem mit Backup.gz gelöst, Sie müssen jedoch auch sicherstellen, dass $MYSQL_USER
@ ec2_ip
ein gültiger Benutzer auf Ihrer RDS-Instanz ist.DasDie Antwort könnte aufschlussreich sein.
Bearbeiten: Ihr neuestes Problem bedeutet wahrscheinlich nur, dass Sie beispielsweise von -u $MYSQL_USER zu -u$MYSQL_USER wechseln müssen – und dasselbe gilt für die Host- und Kennwortparameter.
Antwort2
Dieser Fehler hat nichts mit den Rechten der Skriptdatei selbst zu tun (db-take-snapshot-s3.sh), sondern auf Rechte des Verzeichnisses, in dem das Skript ausgeführt wird und die Datei vorübergehend speichertSicherung.gz.
Ich empfehle Ihnen, die Rechte des Verzeichnisses aufzulisten, in dem Sie ein Skript ausführen
ll -d .
Fügen Sie außerdem Schreibberechtigung für dieses Verzeichnis hinzu
chmod +w .
Wenn es nicht funktioniert, ist es auch wichtig, diese Informationen (aktuelles Verzeichnis und aktueller Benutzer) zu erwähnen, damit wir weiterhelfen können.
id
pwd
ll
ll -d .