PDO MySQL sauvegardes fonction
cette fonction ici
http://davidwalsh.name/backup-mysql-database-php
a été flottant autour de l'internet pour un certain temps et est assez célèbre, mais son standard de mysql. quelqu'un aurait-il la même chose mais en PDO? si non quelqu'un veut faire un?
est-il même possible, j'ai lu quelque part que PDO ne pas faire de SHOW CREATE TABLE - est-ce que le droit?
enfin, quelqu'un peut m'expliquer wht différence entre cette fonction et à l'aide de SELECT * INTO OUTFILE est?
(s'il vous plaît ne marque ce pour contenant trop de questions, ils sont tous étroitement liés et je suis sûr que la réponse(s) sera utile pour beaucoup de gens)
OriginalL'auteur Lan | 2013-08-16
Vous devez vous connecter pour publier un commentaire.
Pour une personne qui cherche la fonction qui agit comme la commande mysqldump, voici le dernier projet en date, avec les imperfections discuté dans les commentaires ci-dessus/ci-dessous sont corrigés. Profitez de.
ok, va faire. mais si vous avez ce message d'erreur, il semble que vous navez pas connecté à mysql, c'est à dire somethings mal avec le mot de passe, nom d'utilisateur, databasename ou le nom d'hôte
s'il n'avait pas connecté, il aurait obtenu une erreur beaucoup plus tôt que l'appel à columnCount(). Vous n'avez pas une bonne vérification des erreurs dans le script de capture a échoué consolidés.
Par exemple, si il est la sauvegarde d'une table nommée
order
? C'est un mot réservé, donc le fait que vous n'avez pas délimiter le nom de la table provoque une erreur de syntaxe lors de l'exécution deSELECT * FROM order
. Mais vous ne recherchez pas d'une erreur indiqué par la valeur de retour dequery()
donc vous ne saurez jamais.OriginalL'auteur Lan
Que le script de sauvegarde est ridicule et nul ne devrait faire une autre version. J'ai vu que le script avant de l', ainsi que des tentatives similaires, et ils ont beaucoup de problèmes:
Voir aussi ma dernière réponse sur le malheureux David Walsh script de sauvegarde:
Re votre commentaire:
Lire les commentaires sur la page du lien. Beaucoup de gens ont identifié des problèmes, et certains ont des solutions ou au moins des suggestions.
Le fait que ce script ajoute le tout dans une chaîne de caractères est un deal-breaker, je pense, mais il ne devrait pas être difficile de modifier le script pour ouvrir le fichier de sortie première, puis la sortie de chaque ligne de données au cours de la boucle, puis fermez le fichier après la boucle. C'est un no-brainer, je ne sais pas pourquoi le script ne fait pas ça. Mais il est assez clair que le script n'a pas été testé très bien.
Mais de toute façon, je ne voudrais pas essayer de réinventer la roue. Mysqldump ou mydumper faire ce travail très bien. FWIW, vous n'avez pas à exécuter la commande mysqldump sur le même serveur sur lequel réside la base de données. Mysqldump prend en charge une option pour
--host
de sorte que vous pouvez exécuter la commande mysqldump n'importe où pour sauvegarder une base de données distante, aussi longtemps que les pare-feu ne bloque pas votre client de se connecter. Fondamentalement, si vous pouvez vous connecter en PHP, application à la base de données à partir d'un client de l'hôte, vous pouvez vous connecter mysqldump.Si ce n'est vraiment pas une option, alors je voudrais utiliser le dump de la base de la fonctionnalité de phpmyadmin. Ce sont matures et bien testé et ils dump tout correctement. Voici un article qui explique comment utiliser la fonction de vidage:
http://www.techrepublic.com/blog/smb-technologist/import-and-export-databases-using-phpmyadmin/
[Copie de mes commentaires de votre réponse:]
C'est entrer dans l'examen du code, ce qui n'est pas le but de StackOverflow. Mais brièvement:
Oui, c'est mieux que l'originale de David Walsh script. 🙂
NULL n'est pas la même chose que " dans SQL (sauf dans Oracle, mais ils ne sont pas conformes avec la norme SQL dans ce cas). Voir MySQL, de mieux insérer la valeur NULL ou une chaîne vide?
J'ai mal lu le code sur la question limite de mémoire. Vous êtes à la rédaction de sortie pour chaque ligne, donc ce n'est pas grave (sauf si la ligne contient un 1 go de blob ou quelque chose).
Mais vous ne devriez pas sortie une seule instruction INSERT avec séparées par des virgules ensemble de lignes. Même
mysqldump --extended-insert
sorties d'une longueur finie de données, puis commence une nouvelle instruction INSERT. Le critère est de savoir si la longueur de l'instruction d'INSERTION s'inscrit dans l'argument d'option pour--net-buffer-length
.En ANSI SQL, des simples guillemets " sont utilisés pour délimiter les chaînes de caractères littérales ou la date de littéraux. Double-guillemets "" sont utilisés pour délimiter des identificateurs comme nom de table ou des noms de colonne. Par défaut, MySQL traite le même, mais c'est non-standard. Voir Faire de différentes bases de données utiliser différents nom de devis?. Si vous essayez d'importer vos données de sauvegarde sur un serveur MySQL où vous avez
SET SQL_MODE=ANSI_QUOTES
, l'importation échouera.Exemple:
query('SELECT * FROM '.$table);
et en fait tous les autres cas où vous utilisez $table dans une requête. Vous ne délimité par la table une fois, dans l'instruction INSERT de votre script sorties.MySQL considère toujours en arrière-tiques comme identifiant des séparateurs et des guillemets simples pour les chaînes de caractères, les dates. Mais les guillemets changent de signification selon le SQL_MODE je l'ai mentionné. Vous ne pouvez pas assumer qui SQL_MODE est en effet sur l'instance MySQL vous restaurer, il est donc préférable si vous utilisez l'arrière-tiques pour les identifiants, et des guillemets simples pour les chaînes de caractères. La raison pour laquelle vous pourriez délimiter comme vous interrogez votre table est que vous pourriez avoir une table des noms qui sont des mots réservés SQL, ou qui contiennent des caractères spéciaux, etc.
Vous pouvez insérer tous les types numériques sans délimiteurs. Seules des chaînes de caractères et les dates de besoin délimiteurs. Voir dev.mysql.com/doc/refman/5.6/en/literals.html
merci pour la réponse, oui ive passé une bonne heure à lire tous les commentaires, il y a eu une modification à faire, comme vous l'avez dit, pour créer le fichier abord, puis d'écrire chaque ligne du fichier - c'est ce que je vais faire. qui est intéressant à propos de mysql dumping, mais à distance de ses pas de l'utiliser pour moi. im faisant une simple CRM paquet que les clients d'acheter et de télécharger sur leur serveur. quand ils se déconnecter de la crm, (si il n'en a pas été fait depuis x temps), il enregistre une copie de sauvegarde de leurs données à un dossier à la racine
Notez également que plusieurs intervenants se plaignent que la fonction de vidage ne gère pas les données UTF8. Je recommande vous doit écrire les tests que David Walsh n'a jamais fait. Créer une base de données échantillon avec une variété de tables, nulle et non nulle de données, des caractères internationaux, etc. et assurez-vous qu'il fonctionne pour sauvegarder et restaurer. Vous pouvez le faire maintenant, ou vous pouvez le faire en mode d'urgence lorsque vos clients sont de se plaindre.
bon appel, va le faire
OriginalL'auteur Bill Karwin
Tous
PDO
etext/mysql
ne sont envelopper les commandes de la base de données (MySQL dans ce cas). C'est-à-dire qu'il n'y a rien d'arrêtPDO
de l'exécution deSHOW CREATE TABLE
ou les autres commandes.Pour toutes fins utiles, vous pouvez très bien la remplacer:
Et au lieu de
Utilisation
oui, je sais qu'il peut être facilement converti en PDO mais je suis juste vraiment paresseux et en espérant que quelqu'un d'autre pourrait le faire. pouvez-vous le faire? je parie que vous n'osez pas le faire
demander à quelqu'un d'écrire du code pour vous sur Stackoverflow est généralement mal vues, et la plupart des gens (moi y compris) ne le font pas. Le point des questions et des réponses est d'offrir aide conceptuelle qui s'appliquent à une variété de situations que d'autres puissent apprendre de plus tard
salut, je veux juste vous demander si il est possible de créer un bouton dans la page web lors d'un clic permettra de créer une sauvegarde de la base de données entière. j'ai voulu créer une sauvegarde de ma base de données et je n'ai pas la moindre idée sur la façon d'effectuer une sauvegarde que j'ai été la lecture de quelques articles, mais je ne peux pas simplement déposer une demande de plus qui sont compliqué pour mon niveau. Je suis à l'aide de php pdo ma base de données est mysql en espérant une réponse bientôt
Je viens de lire @BrownmanRevival, sérieux?
OriginalL'auteur Explosion Pills
Comme recommandé par https://stackoverflow.com/a/18281687/2259391 utilisation
mysqldump
avecexec
. Il se résume à ceci:OriginalL'auteur Florian Moser
j'ai juste fini de faire l'AOP version de david walsh d'origine de la fonction de sauvegarde.
j'ai aussi amélioré pour traiter les questions mentionnées dans Le projet de loi Karwin réponse; poignées NULL, écrit individu lignes donc pas de problèmes de mémoire, avec des backticks etc.
Donne à peu près exactement à ce que mysqldump.
Pourrait faire avec un peu de rangement, mais il est ici, veuillez en informer sur toutes les améliorations
''
); pas toujours délimitation des noms de table; à l'aide de non-ANSI guillemets comme délimiteurs de chaînes; à l'aide de tampon de requêtes sur d'immenses tableaux de break PHP max limite de mémoire; ajoutant toutes les lignes d'une table immense, va briser PHP max limite de mémoire; à l'aide de addslashes() au lieu de PDO::quote(); vérifier pour les erreurs de requête qu'à la fin de la fonction, pas de vérification de l'échec de création du fichier; gzip extension ne peut pas être chargéAussi, probablement encore ne prend pas en charge les données UTF8.
ouch. jeu de caractères est indiqué dans la connexion. quoi de mal avec les valeurs Null "? le tableau de la structure doit être très très grand max de la mémoire. chaque ligne d'insertion est écrit dans le fichier individuellement, donc encore une fois, la ligne doit être très très grand max de la mémoire. addslashes n'est pas QUE mauvais, mais il va changer de PDO devis. va ajouter vérifier gzip. d'accord, la vérification des erreurs peut être un peu plus joli. mais c'est de s'y rendre, non?
aussi, ce qui est incorrect avec "" les délimiteurs de chaînes? comment puis-je obtenir de l'ANSI? et quelles sont les tables ne sont pas délimités? merci
Je suis en train de travailler sur une seule. Je me suis mise en œuvre d'une classe PHP qui imite
mysqldump
, et je suis en essais avec la commande mysqldump est propre suite de tests. J'espère qu'il le présente à la Percona Vivre MySQL Conférence & Expo en avril 2014. J'ai créé un dépôt github: github.com/billkarwin/cats-and-dogsOriginalL'auteur Lan
Veuillez noter que...
logMessage()
,getDbConfigFromWordPress()
. Veuillez retirer de la avant de l'utiliser.$db_config['tableprefix']
ou$db_config[...]
doit être changé.OriginalL'auteur vee
J'ai mis en place Lan dernier version avec quelques modifications (voir le code ci-dessous):
Une raison pour l'ajout de la csv option est que j'ai trouvé, il est impossible d'importer à partir de sql fichiers de données dans le TEXTE (UTF8) format quand il est multi-octets (Asiatique scripts). Il fonctionne en effet avec BLOB format, mais nous ne pouvons pas l'indexer comme FULLTEXT. J'ai probablement manquer un point dans le formatage des tableaux...
Voici le code de toute façon:
OriginalL'auteur Bernard Bel