Mysql
 sql >> Database >  >> RDS >> Mysql

Perché il mio script di backup del database non funziona in php?

Questo non funzionerà per eseguire il backup del tuo database come script SQL, a meno che il tuo database non sia solo un database giocattolo, l'equivalente di uno script "hello world".

Quella sceneggiatura è spaventosa. Non dovresti usarlo per eseguire il backup di un database. Tale script è stato pubblicato in precedenza:database PHP Dump Script:ci sono problemi?

  • Nessun controllo degli errori dopo mysql_connect() o mysql_queries(). Probabilmente hai appena fornito una password sbagliata o qualcosa del genere, ma non lo sapresti mai perché lo script non verifica che la connessione sia andata a buon fine.

  • Non produrrà l'istruzione INSERT corretta se il database contiene NULL.

  • I set di caratteri non vengono gestiti.

  • addlashes() è non adatto per l'escape dei dati.

  • I nomi delle tabelle non sono delimitati.

  • Non esegue il backup di viste, procedure, funzioni o trigger.

  • mysql_query() memorizza i risultati nel buffer, quindi se hai una tabella con migliaia di righe o più, supererai il limite di memoria PHP. In effetti, lo script concatena la serie di istruzioni INSERT in un'unica variabile PHP. Quindi, prima che finisca, avrai il tuo intero database rappresentato in memoria.

Nessuno dovrebbe mai usare quello script. È una vera immondizia, e non lo dico alla leggera.

Usa shellexec() per eseguire mysqldump.

@Álvaro G. Vicario ha un buon punto, non c'è nemmeno bisogno che tu usi PHP per questo compito. Supponevo che fosse necessario eseguire un backup da uno script PHP. Ecco come creerei un backup da uno script cron:

Crea uno script di shell, può essere chiamato come vuoi, ad es. mymysqldump.sh. Ecco come lo scriverei:

:
: ${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}

Ovviamente personalizza i valori delle variabili secondo necessità per il tuo ambiente.

Potresti notare che il nome utente e la password non sono in questo file. Si prega di non inserire le password negli script in testo normale in modo che tutti possano leggerle. Invece, li metteremo in un file di opzioni per renderlo più sicuro.

Crea un utente speciale del sistema operativo che eseguirà il backup da cron. Il tuo sistema potrebbe avere un utente speciale "mysql" o "_mysql" per eseguire il server MySQL, ma questo utente potrebbe essere configurato per non avere una home directory valida. Hai bisogno di un utente che abbia una home directory. Chiamiamolo "mybackup".

Nella home directory di quell'utente, crea un file .my.cnf con il seguente contenuto:

[mysqldump]
user = alupto_backup
password = xyzzy

Dove "alupto_backup" e "xyzzy" sono il nome utente MySQL e la relativa password (cambiali per il tuo ambiente). Imposta la proprietà e la modalità di questo file in modo che solo il suo proprietario possa leggerlo:

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

Crea una directory bin sotto la home di questo utente e inserisci il nostro script di shell al suo interno.

mkdir ~mybackup/bin
mv mymysqldump ~mybackup/bin

Ora puoi eseguire lo script della shell per testarlo:

sh ~mybackup/bin/mymysqldump

Ora crea un file cron per questo utente:

crontab -u mybackup

@daily ~mybackup/bin/mymysqldump

Dovrebbe essere così.