Supprimer la clause DEFINER de MySQL Dumps

J’ai un dump MySQL d’une de mes bases de données. Dans ce document, il y a des clauses DEFINER qui ressemblent à,

"DEFINER=`root`@`localhost`" 

À savoir, ces clauses DEFINER sont sur mes instructions CREATE VIEW et CREATE PROCEDURE. Est-il possible de supprimer ces clauses DEFINER de mon fichier de vidage?

Je ne pense pas qu’il existe un moyen d’ignorer l’ajout de DEFINER dans le dump. Mais il existe des moyens de les supprimer une fois le fichier de vidage créé.

  1. Ouvrez le fichier de vidage dans un éditeur de texte et remplacez toutes les occurrences de DEFINER=root@localhost par une chaîne vide “”

  2. Editez le dump (ou le tube de sortie) en utilisant perl :

     perl -p -i.bak -e "s/DEFINER=\`\w.*\`@\`\d[0-3].*[0-3]\`//g" mydatabase.sql 
  3. Pipe la sortie via sed :

     mysqldump ... | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > sortingggers_backup.sql 

Vous pouvez supprimer en utilisant SED

 sed -i 's/DEFINER=[^*]*\*/\*/g' mydump.sql 

Dans MacOS:

 sed -i '' 's/DEFINER=[^*]*\*/\*/g' mydump.sql 

Depuis la version 5.7.8 de mysql, vous pouvez utiliser l’option --skip-definer definer avec mysqlpump, par exemple:

 mysqlpump --skip-definer -h localhost -u user -p yourdatabase 

Voir le manuel mis à jour de mysql à http://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#option_mysqlpump_skip-definer

Conformément aux recommandations des autres, voici un exemple de suppression du DEFINER du cliché, une fois le cliché terminé:

 mysqldump -u user --password='password' -h localhost database | grep -v "50013 DEFINER" > dump.sql 

J’ai utilisé ces idées pour supprimer la clause DEFINER de ma propre sortie mysqldump, mais j’ai adopté une approche plus simple:

Il suffit de retirer le ! avant le code et DEFINER, et le rest du commentaire devient un commentaire normal.

Exemple:

 /*!50017 DEFINER=`user`@`111.22.33.44`*/ 

est rendu impuissant, aussi peu que faire cela ..

 /* 50017 DEFINER=`user`@`111.22.33.44`*/ 

L’expression rationnelle la plus simple consiste à supprimer le! et les chiffres

 mysqldump | /usr/bin/perl -pe 's/\!\d+ DEFINER/DEFINER/' > dumpfile.sql 

Cela supprime !#### DEFINER et remplace par DEFINER … vous pouvez également supprimer DEFINER, cela n’a pas vraiment d’importance – une fois le “!” est parti

Comme d’autres l’ont mentionné, dépouiller le définisseur avec une 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:

 sed -e 's/DEFINER=[^ ]* / /' 

Pour une solution automatisée, vous pouvez regarder mysqlmigrate . C’est un wrapper Bash autour de mysqldump qui vous permet de migrer des bases de données et d’ignorer les instructions DEFINER. Exemple:

 $ mysqlmigrate -u root -p pass --ignore-definer from_db to_db 

http://thesimplesynthesis.com/post/mysqlmigrate (ou GitHub )

Sinon, une commande comme celle d’Abhay est nécessaire:

 $ mysqldump -u root -ppass the_db | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > the_db.sql 

Je ne sais pas si cela aide, mais j’utilise SQLyog Community Edition, disponible à: –

https://code.google.com/p/sqlyog/wiki/Downloads

Lors de la sauvegarde de SQL ou de la copie vers une autre firebase database, vous pouvez “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 à partir de: –

https://www.webyog.com/product/sqlyog

À votre santé

Voici une solution complète pour supprimer les informations DEFINER pour MySQL 5.6.x et Linux (testées sur CentOS 6.5 ).

Habituellement, nous devons remplacer les entrées suivantes du vidage Mysql (si elles sont sockets avec les données et les déclencheurs / routines / fonctions).

 /*!50013 DEFINER=`MYSQLUSER`@`localhost` SQL SECURITY DEFINER */ /*!50013 DEFINER=`MYSQLUSER`@`%` SQL SECURITY DEFINER */ CREATE DEFINER=`MYSQLUSER`@`%` PROCEDURE `PROCEDURENAME`( CREATE DEFINER=`MYSQLUSER`@`localhost` PROCEDURE `PROCEDURENAME`( CREATE DEFINER=`MYSQLUSER`@`%` FUNCTION `FUNCTIONNAME`( CREATE DEFINER=`MYSQLUSER`@`localhost` FUNCTION `FUNCTIONNAME`( /*!50003 CREATE*/ /*!50017 DEFINER=`MYSQLUSER`@`%`*/ /*!50003 TRIGGER `TRIGGERNAME` /*!50003 CREATE*/ /*!50017 DEFINER=`MYSQLUSER`@`localhost`*/ /*!50003 TRIGGER `TRIGGERNAME` 

Le vidage a été effectué avec la commande mysqldump.

 mysqldump -uMYSQLUSER -pPASSWORD DATABASENAME -R > dbdump.sql 

Le fichier de vidage requirejs sans informations DEFINER peut être obtenu avec les trois commandes ci-dessous.

 Command-1 sed -i 's|DEFINER=[^*]*\*|\*|g' [PATH/]dbdump.sql Command-2 find -name [PATH/]dbdump.sql | xargs perl -pi -e "s/ DEFINER=\`MYSQLUSER\`@\`localhost\`//" Command-3 find -name [PATH/]dbdump.sql | xargs perl -pi -e "s/ DEFINER=\`MYSQLUSER\`@\`%\`//" 

Si le fichier de vidage se trouve dans votre dossier actuel, ignorez [PATH /].

Si les données dans les tables sont très volumineuses, prenez 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 / Functions / Procedures.) commandes sur le fichier dump (scripts) 2ème.

Un moyen rapide de procéder consiste à diriger la sortie de mysqldump via sed pour supprimer les instructions DEFINER contenues dans les commentaires conditionnels. J’utilise ceci pour supprimer DEFINER des DEFINER CREATE TRIGGER , mais vous pouvez modifier le numéro de version du commentaire de condition dans le regex en fonction de vos besoins.

 mysqldump -u user --password='password' -h localhost database | \ sed 's/\/\*!50017 DEFINER=`.*`@`.*`\*\///' 

Vous devriez regarder la réponse ici: https://dba.stackexchange.com/questions/9249/how-do-i-change-the-definer-of-a-view-in-mysql/29079#29079

La meilleure façon, à mon avis, de résoudre ce problème, n’ajoute pas une parsing supplémentaire de chaîne avec sed ou grep ou autre, au lieu de cela, mysqldump est capable de générer un bon vidage en ajoutant –single-transaction

Pour moi, cela fonctionne: perl -p -i.bak -e "s/DEFINER=[^ |\s]*//g" yourdump.dmp . Ceci a supprimé DEFINER = root @ localhost de mon dump, à chaque création de procédure

Une autre option sur OSX pour supprimer les définitions dans le fichier:

 sed -i '' 's/DEFINER=`[^`][^`]*`@`[^`][^`]*`//g' file.sql 

Remplacez tous vos utilisateurs avec CURRENT_USER. Dans mon script de graduation qui crée la sauvegarde, mon script de remplacement ressemble à:

 ant.replaceregexp(file: "$buildDir/sql/setupDB.sql", match: "`${project.ext.prod_db_username}`@`%`", replace: "CURRENT_USER", byline: true); 

qui appelle vraiment ANT. Alors vous n’aurez plus à vous en soucier.

Sur les machines Linux, vous pouvez utiliser ce one-liner:

 mysql -uuser -ppwd -A --skip-column-names -e"SELECT CONCAT('SHOW CREATE VIEW ',table_schema,'.',table_name,';') FROM information_schema.tables WHERE engine IS NULL and table_schema like 'mydb%'" | mysql -uuser -ppwd -A --skip-column-names | sed -rn 's/.*?VIEW ([^\s]+?) (AS .*?)\s([^\s]+?)\s([^\s]+?)/DROP VIEW \1;\nCREATE VIEW \1 \2;/p' | mysql -uuser -ppwd -A --skip-column-names 

Vous devez uniquement remplacer les chaînes en gras par les informations d’identification de votre utilisateur de firebase database et le nom de la firebase database ou le modèle similaire.

Plus d’infos ici: http://blog.novoj.net/2014/05/16/recreate-mysql-views-without-definer-one-liner-solution-linux/

Le seul moyen de le faire fonctionner sous Windows:

Installez http://gnuwin32.sourceforge.net/ pour avoir sed dans la ligne de commande et ajoutez-le à Windows PATH: D: \ programs \ GetGnuWin32 \ bin;

 sed -i "s|DEFINER=`mydbuser`@`%%` SQL SECURITY DEFINER||g" "D:/prod_structure.sql" sed -i "s|DEFINER=`mydbuser`@`%%`||g" "D:/prod_structure.sql" mysqldump -P{port} -h{host} -u{user} -p{password} --routines --no-data --lock-tables=false database_prod > D:\prod_structure.sql 

Merci à tous pour les conseils. Étant paresseux, j’ai écrit un script nommé: “MYsqldump”:

 DB=$1 HOST=$2 USER=$3 MYSQLDUMP='/usr/bin/mysqldump' PARAMS="--complete-insert --disable-keys=0 --extended-insert=0 --routines=0 --skip-comments" DAY=`date +%d` MONTH=`date +%m` YEAR=`date +%Y` FILE=$DB.$DAY-$MONTH-$YEAR.sql if (( $# < 3 )) ; then echo "" echo "usage: MYsqldump   " echo "" exit 1 fi $MYSQLDUMP -h $HOST -u $USER -p $PARAMS $DB | grep -v '/*!50013 DEFINER' > $FILE 

Pour quelque chose comme:

 DELIMITER ;;
 CREATE DEFINER = `mydb` @` localhost` FONCTION `myfunction` () RETURNS int (11)
 commencer
 (...)
 fin ;;

Essaye ça:

 mysqldump --force --routines --opt --user = myuser --databases mydb |  sed -e 's / DEFINER = `. *` @ `. *` \ // g'

La regex la plus simple qui fonctionne pour moi avec tous les objects est la suivante:

 sed 's/DEFINER=[^ ]*`//' ... 

Notez que les quote-names doivent être TRUE (ce qui est par défaut).

J’espère que dans les nouvelles versions, le commutateur --skip-definer introduit dans mysqlpump dans la version 5.7 vient également à mysqldump.

J’ai utilisé le script PowerShell pour supprimer toutes les lignes avec DEFINER :

get-content $ file_in_full_path | select-ssortingng -pattern $ line_ssortingng_delete -notmatch | Out-File -width 1000000000 -Encoding Par défaut $ file_out_full_path

  1. ouvrez votre firebase database avec n’importe quel éditeur, j’ai utilisé avec notepad ++,

  2. trouvez tous les tests que DEFINER=root@localhost et remplacez-le par rien ( "" ) IE. supprime-le.

Ensuite, vous pouvez l’importer vers l’hôte de votre choix.