Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warum funktioniert mein Datenbank-Backup-Skript nicht in PHP?

Dies funktioniert nicht, um Ihre Datenbank als SQL-Skript zu sichern, es sei denn, Ihre Datenbank ist nur eine Spielzeugdatenbank, das Äquivalent eines "Hallo Welt"-Skripts.

Dieses Drehbuch ist erschreckend. Sie sollten es nicht zum Sichern einer Datenbank verwenden. Dieses Skript wurde zuvor gepostet:PHP-Datenbank Dump-Skript – gibt es Probleme?

  • Keine Fehlerprüfung nach mysql_connect() oder mysql_queries(). Sie haben wahrscheinlich nur ein falsches Passwort oder so etwas angegeben, aber Sie würden es nie erfahren, weil das Skript nicht überprüft, ob die Verbindung erfolgreich war.

  • Es wird nicht die richtige INSERT-Anweisung erzeugen, wenn Ihre Datenbank NULL-Werte enthält.

  • Zeichensätze werden nicht behandelt.

  • addslashes() ist nicht geeignet um Daten zu entkommen.

  • Tabellennamen sind nicht getrennt.

  • Sichert keine Ansichten, Prozeduren, Funktionen oder Trigger.

  • mysql_query() puffert Ergebnisse, wenn Sie also eine Tabelle mit Tausenden von Zeilen oder mehr haben, werden Sie Ihr PHP-Speicherlimit überschreiten. Tatsächlich verkettet das Skript die Reihe von INSERT-Anweisungen zu einer einzigen PHP-Variablen. Bevor es fertig ist, haben Sie also Ihr gesamtes Datenbank im Speicher dargestellt.

Niemand sollte dieses Skript jemals verwenden. Es ist völliger Müll, und ich sage das nicht leichtfertig.

Verwenden Sie einfach shellexec(), um mysqldump auszuführen.

@Álvaro G. Vicario hat einen guten Punkt, Sie müssen PHP für diese Aufgabe nicht einmal verwenden. Ich ging davon aus, dass Sie ein Backup von einem PHP-Skript erstellen müssen. So würde ich ein Backup von einem Cron-Skript erstellen:

Erstellen Sie ein Shell-Skript, es kann beliebig heißen, z. mymysqldump.sh. So würde ich es schreiben:

:
: ${BACKUP_HOST:="localhost"}
: ${BACKUP_DATABASE:="mydatabase"}
: ${BACKUP_DIR:="/opt/local/var/db/mysql5/backups"}
: ${BACKUP_FILE:="${DATABASE}-`date +%Y%m%d%H%M%S`"}

mysqldump -h ${BACKUP_HOST} ${BACKUP_DATABASE} > ${BACKUP_DIR}/${BACKUP_FILE}

Natürlich passen Sie die Werte der Variablen nach Bedarf an Ihre Umgebung an.

Möglicherweise stellen Sie fest, dass der Benutzername und das Passwort nicht sind in dieser Datei. Bitte fügen Sie Passwörter nicht im Klartext in Skripte ein, damit sie jeder lesen kann. Stattdessen fügen wir sie in eine Optionsdatei ein, um sie sicherer zu machen.

Erstellen Sie einen speziellen Betriebssystembenutzer, der die Sicherung von cron aus ausführen wird. Ihr System hat möglicherweise einen speziellen Benutzer „mysql“ oder „_mysql“, um den MySQL-Server auszuführen, aber dieser Benutzer kann so konfiguriert sein, dass er kein gültiges Home-Verzeichnis hat. Sie benötigen einen Benutzer, der über ein Home-Verzeichnis verfügt. Nennen wir es "mybackup".

Erstellen Sie im Home-Verzeichnis dieses Benutzers eine Datei .my.cnf mit folgendem Inhalt:

[mysqldump]
user = alupto_backup
password = xyzzy

Wobei "alupto_backup" und "xyzzy" der MySQL-Benutzername und sein Passwort sind (ändern Sie diese für Ihre Umgebung). Legen Sie Eigentümerschaft und Modus dieser Datei fest, sodass nur ihr Eigentümer sie lesen kann:

chown mybackup .my.cnf
chmod 600 .my.cnf

Erstellen Sie ein bin-Verzeichnis unter dem Home dieses Benutzers und fügen Sie unser Shell-Skript darin ein.

mkdir ~mybackup/bin
mv mymysqldump ~mybackup/bin

Jetzt können Sie das Shell-Skript zum Testen ausführen:

sh ~mybackup/bin/mymysqldump

Erstellen Sie nun eine Cron-Datei für diesen Benutzer:

crontab -u mybackup

@daily ~mybackup/bin/mymysqldump

Das sollte es sein.