Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pourquoi mon script de sauvegarde de base de données ne fonctionne-t-il pas en php ?

Cela ne fonctionnera pas pour sauvegarder votre base de données en tant que script SQL, à moins que votre base de données ne soit qu'une base de données jouet, l'équivalent d'un script "hello world".

Ce scénario est épouvantable. Vous ne devez pas l'utiliser pour sauvegarder une base de données. Ce script a déjà été publié :Base de données PHP Script de vidage :y a-t-il des problèmes ?

  • Aucune vérification d'erreur après mysql_connect() ou mysql_queries(). Vous venez probablement de donner un mauvais mot de passe ou quelque chose du genre, mais vous ne le saurez jamais car le script ne vérifie pas que la connexion a réussi.

  • Il ne produira pas la bonne instruction INSERT si votre base de données contient des valeurs NULL.

  • Les jeux de caractères ne sont pas gérés.

  • addslashes() n'est ne convient pas pour échapper des données.

  • Les noms de table ne sont pas délimités.

  • Ne sauvegarde pas les vues, les procédures, les fonctions ou les déclencheurs.

  • mysql_query() tamponne les résultats, donc si vous avez une table avec des milliers de lignes ou plus, vous dépasserez votre limite de mémoire PHP. En fait, le script concatène la série d'instructions INSERT en une seule variable PHP. Donc, avant qu'il ne se termine, vous aurez votre intégralité base de données représentée en mémoire.

Personne ne devrait jamais utiliser ce script. C'est de la foutaise, et je ne dis pas ça à la légère.

Utilisez simplement shellexec() pour exécuter mysqldump.

@Álvaro G. Vicario a un bon point, vous n'avez même pas besoin d'utiliser PHP pour cette tâche. Je supposais que vous deviez faire une sauvegarde à partir d'un script PHP. Voici comment créer une sauvegarde à partir d'un script cron :

Créez un script shell, il peut être appelé comme vous voulez, par ex. mymysqldump.sh. Voici comment je l'écrirais :

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

Bien sûr, personnalisez les valeurs des variables selon les besoins de votre environnement.

Vous remarquerez peut-être que le nom d'utilisateur et le mot de passe ne sont pas dans ce dossier. Veuillez ne pas mettre de mots de passe dans des scripts en texte brut afin que tout le monde puisse les lire. Au lieu de cela, nous les placerons dans un fichier d'options pour le rendre plus sûr.

Créez un utilisateur spécial du système d'exploitation qui exécutera la sauvegarde à partir de cron. Votre système peut avoir un utilisateur spécial "mysql" ou "_mysql" pour exécuter le serveur MySQL, mais cet utilisateur peut être configuré pour n'avoir aucun répertoire personnel valide. Vous avez besoin d'un utilisateur disposant d'un répertoire personnel. Appelons-la "mybackup".

Sous le répertoire personnel de cet utilisateur, créez un fichier .my.cnf avec le contenu suivant :

[mysqldump]
user = alupto_backup
password = xyzzy

Où "alupto_backup" et "xyzzy" sont le nom d'utilisateur MySQL et son mot de passe (modifiez-les pour votre environnement). Définissez la propriété et le mode de ce fichier afin que seul son propriétaire puisse le lire :

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

Créez un répertoire bin sous le home de cet utilisateur et placez-y notre script shell.

mkdir ~mybackup/bin
mv mymysqldump ~mybackup/bin

Vous pouvez maintenant exécuter le script shell pour le tester :

sh ~mybackup/bin/mymysqldump

Créez maintenant un fichier cron pour cet utilisateur :

crontab -u mybackup

@daily ~mybackup/bin/mymysqldump

Ça devrait être ça.