J'ai un vidage MySQL d'une de mes bases de données. Il contient des clauses DEFINER qui ressemblent à,
"DEFINER=`root`@`localhost`"
À savoir, ces clauses DEFINER se trouvent sur mes instructions CREATE VIEW et CREATE PROCEDURE. Existe-t-il un moyen de supprimer ces clauses DEFINER de mon fichier de vidage?
Réponses:
Je ne pense pas qu'il existe un moyen d'ignorer l'ajout de
DEFINER
s au vidage. Mais il existe des moyens de les supprimer après la création du fichier de vidage.Ouvrez le fichier de vidage dans un éditeur de texte et remplacez toutes les occurrences de
DEFINER=root@localhost
par une chaîne vide ""Modifiez le vidage (ou dirigez la sortie) en utilisant
perl
:Dirigez la sortie à travers
sed
:la source
sed -E 's/DEFINER=
[^]+
@[^
] +/DEFINER=CURRENT_USER/g' dump.sql > new_dump.sql
Il a l'avantage de conserver les restrictions / contrôle d'accès.sed
commande ne supprime pas la clause DEFINER des procédures et des fonctions. Voici la version améliorée qui gère les vues, les déclencheurs, les procédures et les fonctions:sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | sed -e 's/DEFINER[ ]*=[ ]*[^*]*PROCEDURE/PROCEDURE/' | sed -e 's/DEFINER[ ]*=[ ]*[^*]*FUNCTION/FUNCTION/'
Vous pouvez supprimer en utilisant SED
Sous MacOS:
la source
-i extension
"Modifiez les fichiers sur place, enregistrez les sauvegardes avec l'extension spécifiée. Si une extension de longueur nulle est donnée, aucune sauvegarde ne sera enregistrée. Il n'est pas recommandé de donner une extension de longueur nulle lorsque les fichiers d'édition sur place, car vous risquez une corruption ou un contenu partiel dans des situations où l'espace disque est épuisé, etc. "Depuis la version 5.7.8 de mysql, vous pouvez utiliser l'
--skip-definer
option avec mysqlpump, par exemple:Voir le manuel mysql mis à jour sur http://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#option_mysqlpump_skip-definer
la source
mysqldump
etmysqlpump
- voici la question connexe: dba.stackexchange.com/questions/118846/mysqldump-vs-mysqlpumpinformation_schema.user
, et ce n'est pas toujours lisible pour tous les utilisateursJ'ai utilisé ces idées pour supprimer la clause DEFINER de ma propre sortie mysqldump, mais j'ai adopté une approche plus simple:
Supprimez simplement le
!
avant le code et DEFINER, et le reste du commentaire devient un commentaire normal.Exemple:
est rendu impuissant, aussi peu que faire cela.
Cependant, l'expression rationnelle la plus simple consiste à supprimer le! et les chiffres
Cela supprime
!#### DEFINER
et remplace par DEFINER ... vous pouvez également supprimer DEFINER, cela n'a pas vraiment d'importance - une fois le "!" est partila source
Selon les recommandations de l'autre, voici un exemple de la façon de supprimer le DEFINER du vidage, une fois le vidage terminé:
la source
user
@localhost
* / / *! 50003 trigger my_triggername AVANT INSERER SUR ma_table POUR CHAQUE RANG .... * / ;; etgrep -v
abandonnera ces lignes entièrement. (bien que 50017! = 50013)Comme d'autres l'ont mentionné, supprimer le définisseur avec n'importe quel type d'expression régulière n'est pas trop complexe. Mais les autres exemples ont dépouillé les définitions de vue pour moi.
C'est l'expression régulière qui a fonctionné pour moi:
la source
*/
. MySQL 5.6.31.Pour une solution automatisée, vous pouvez regarder
mysqlmigrate
. C'est un wrapper Bashmysqldump
qui vous permet de migrer des bases de données et d'ignorer les instructions DEFINER. Exemple:http://thesimplesynthesis.com/post/mysqlmigrate (ou GitHub )
Sinon, oui, une commande comme le souligne Abhay est nécessaire:
la source
Une autre option sur OSX pour supprimer les définisseurs dans le fichier:
la source
Vous devriez regarder la réponse ici: /dba/9249/how-do-i-change-the-definer-of-a-view-in-mysql/29079#29079
Le meilleur moyen à mon avis de résoudre ce problème, n'est pas d'ajouter une analyse supplémentaire de chaîne avec sed ou grep ou tout autre, mais mysqldump est capable de générer un bon vidage en ajoutant --single-transaction
la source
Un moyen rapide de le faire est de diriger la sortie de mysqldump via sed pour supprimer les
DEFINER
instructions encapsulées dans des commentaires conditionnels. J'utilise ceci pour supprimerDEFINER
desCREATE TRIGGER
déclarations, mais vous pouvez modifier le numéro de version du commentaire de condition dans l'expression régulière en fonction de vos besoins.la source
Je ne sais pas si cela aide mais j'utilise SQLyog Community Edition, disponible sur: -
https://code.google.com/p/sqlyog/wiki/Downloads
Lors du vidage de SQL ou de la copie dans une autre base de données, il vous permet d'ignorer DEFINER
Il est gratuit et fournit les fonctionnalités de base dont beaucoup de gens ont besoin
Il existe également une version payante disponible sur: -
https://www.webyog.com/product/sqlyog
À votre santé
la source
Pour moi, cela fonctionne:
perl -p -i.bak -e "s/DEFINER=[^ |\s]*//g" yourdump.dmp
. Cela a supprimé DEFINER = root @ localhost de mon vidage, à chaque instruction de procédure de créationla source
Voici une solution de travail complète pour supprimer les informations DEFINER pour
MySQL 5.6.x
et Linux. (Testé surCentOS 6.5
).Habituellement, nous devons remplacer les entrées suivantes de Mysql dump (si prises avec les données et les déclencheurs / routines / fonctions).
Le vidage a été effectué avec la commande mysqldump ci-dessous.
Le fichier de vidage requis sans informations DEFINER peut être obtenu avec les trois commandes ci-dessous.
Si le fichier de vidage se trouve dans votre dossier actuel, ignorez [PATH /].
Si les données dans les tables sont très volumineuses, effectuez le vidage dans deux fichiers, dans un fichier de vidage, prenez le vidage avec les données et dans un autre fichier de vidage, prenez le vidage des scripts uniquement (Triggers / Fonctions / Procédures.) Et exécutez les trois ci-dessus. commandes sur le 2ème fichier de vidage (scripts).
la source
Remplacez tous vos utilisateurs définitifs par CURRENT_USER. Dans mon script gradle qui crée la sauvegarde, mon script de remplacement ressemble à:
qui appelle vraiment ANT. Alors vous n'aurez plus à vous en soucier.
la source
Sur les machines Linux, vous pouvez utiliser ce one-liner:
Vous n'avez qu'à remplacer les chaînes en gras par vos informations d'identification d'utilisateur de base de données et le nom de base de données / modèle similaire.
Plus d'informations ici: http://blog.novoj.net/2014/05/16/recreate-mysql-views-without-definer-one-liner-solution-linux/
la source
La seule façon de le faire fonctionner sous Windows:
Installez http://gnuwin32.sourceforge.net/ pour avoir sed dans la ligne de commande et ajoutez-le au PATH Windows : D: \ programmes \ GetGnuWin32 \ bin;
la source
Merci à tous pour les indices. Étant paresseux, j'ai écrit un script nommé: "MYsqldump":
la source
Pour quelque chose comme:
Essaye ça:
la source
ouvrez votre base de données avec n'importe quel éditeur, j'ai utilisé avec notepad ++,
trouver tout le test
DEFINER=root@localhost
et le remplacer par rien (""
) IE. supprime-le.Ensuite, vous pouvez l'importer sur n'importe quel hôte de votre choix.
la source
La regex la plus simple qui fonctionne pour moi avec tous les objets est:
Notez que
quote-names
doit êtreTRUE
(ce qui est par défaut).J'espère que dans les versions plus récentes, le commutateur
--skip-definer
introduit dans mysqlpump dans la version 5.7 viendra également sur mysqldump.la source
J'ai utilisé le script PowerShell pour supprimer toutes les lignes avec
DEFINER
:get-content $ file_in_full_path | select-string -pattern $ line_string_delete -notmatch | Out-File -width 1000000000 -Encoding Default $ file_out_full_path
la source
Rien ne fonctionnait pour moi, donc j'avais besoin d'écrire ma propre regex.
Essayez de vider votre base de données dans un fichier, un fichier
cat
entier etgrep
uniquement vos déclarations définitives pour les voir.cat file.sql | grep -o -E '. {, 60} DEFINER. {, 60}'
Écrivez votre regex
Dirigez votre vidage dans sed avec cette regex. Par exemple, ma déclaration est:
mysqldump | sed -E // *! 500 [0-9] [0-9] DEFINER =. +? * /// '| sed -E 's / DEFINER =
?[^ ]+?
? @?[^ ]+?
? //'Profit!
la source
remove_definers.bat:
la source