Удалить предложение DEFINER из MySQL Dumps

У меня есть дамп MySQL одной из моих баз данных. В нем есть предложения ОПРЕДЕЛЕНИЯ, которые выглядят так,

"DEFINER=`root`@`localhost`" 

А именно, эти предложения DEFINER находятся в моих инструкциях CREATE VIEW и CREATE PROCEDURE. Есть ли способ удалить эти предложения DEFINER из моего файла дампа?

Я не думаю, что есть способ игнорировать добавление DEFINER s к DEFINER . Но есть способы удалить их после создания файла дампа.

  1. Откройте файл дампа в текстовом редакторе и замените все вхождения [email protected] пустой строкой “”

  2. Отредактируйте дамп (или запустите вывод) с помощью perl :

     perl -p -i.bak -e "s/DEFINER=\`\w.*\`@\`\d[0-3].*[0-3]\`//g" mydatabase.sql 
  3. Выполните вывод через sed :

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

Вы можете удалить с помощью SED

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

В MacOS:

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

Поскольку mysql версии 5.7.8 вы можете использовать --skip-definer с mysqlpump, например:

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

См. Обновленное руководство по mysql по адресу http://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#option_mysqlpump_skip-definer

В соответствии с рекомендациями другого, вот пример того, как удалить DEFINER из дампа после завершения дампа:

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

Я использовал эти идеи, чтобы снять предложение DEFINER с моего собственного вывода mysqldump, но я использовал более простой подход:

Просто снимите ! перед кодом и DEFINER, а остальная часть комментария становится регулярным комментарием.

Пример:

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

оказывается беспомощным, как мало что делает ..

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

Простейшим регулярным выражением, однако, является удаление! и числа

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

Это удаляет !#### DEFINER и заменяет DEFINER … вы также можете удалить DEFINER, это не имеет значения – однажды «!» ушел

Как говорили другие, разделение определителя с любым регулярным выражением не слишком сложно. Но другие примеры лишили определения вида для меня.

Это регулярное выражение, которое сработало для меня:

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

Для автоматического решения вы можете посмотреть mysqlmigrate . Это shell Bash вокруг mysqldump которая позволяет вам переносить базы данных и игнорировать утверждения DEFINER. Пример:

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

http://thesimplesynthesis.com/post/mysqlmigrate (или GitHub )

В противном случае, да, нужна команда, такая как Абхай:

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

Не уверен, что это помогает, но я использую SQLyog Community Edition, ansible по адресу: –

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

При сбрасывании sql или копировании в другую базу данных он позволяет вам «игнорировать DEFINER»,

Он бесплатный и обеспечивает базовые функции, которые требуют многие люди.

Существует также платная версия: –

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

ура

Вот полное рабочее решение для удаления информации DEFINER для MySQL 5.6.x и Linux (протестировано на CentOS 6.5 ).

Обычно мы должны заменять следующие записи из дампа Mysql (если брать вместе с данными и триггерами / подпрограммами / функциями).

 /*!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` 

Дамп был сделан с помощью команды mysqldump.

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

Необходимый файл дампа без информации DEFINER можно получить с помощью трех команд.

 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\`@\`%\`//" 

Если файл дампа находится в вашей текущей папке, тогда игнорируйте [PATH /].

Если данные в таблицах очень велики, то возьмите дамп в двух файлах, в один файл дампа возьмите дамп с данными и в другом файле дампа, возьмите дамп только скриптов (триггеры / функции / процедуры) и запустите три команд в файле 2-го дампа (скриптов).

Быстрый способ сделать это – DEFINER вывод mysqldump через sed, чтобы удалить инструкции DEFINER завернутые в условные комментарии. Я использую это, чтобы удалить DEFINER из операторов CREATE TRIGGER , но вы можете настроить номер версии комментария комментария условия в регулярном выражении в соответствии с вашими целями.

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

Вы должны посмотреть ответ здесь: https://dba.stackexchange.com/questions/9249/how-do-i-change-the-definer-of-a-view-in-mysql/29079#29079

Лучший способ, по моему мнению, решить эту проблему, не добавляет дополнительный синтаксический анализ строки с sed или grep или любым другим, вместо этого mysqldump способен генерировать хороший дамп, добавляя –single-transaction

Для меня это работает: perl -p -i.bak -e "s/DEFINER=[^ |\s]*//g" yourdump.dmp . Это удалило DEFINER = root @ localhost из моего дампа, на каждом этапе создания процедуры

Другой вариант в OSX для удаления определений в файле:

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

Замените всех пользователей-определителей CURRENT_USER. В моем скрипте gradle, который создает резервную копию, сценарий замены выглядит так:

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

который на самом деле просто вызывает ANT. Тогда вам не придется беспокоиться об этом.

На машинах Linux вы можете использовать этот однострочный интерфейс:

 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 

Вы должны только заменить строки, выделенные жирным шрифтом, с вашими учетными данными пользователя БД и именем базы данных / подобным шаблоном.

Больше информации здесь: http://blog.novoj.net/2014/05/16/recreate-mysql-views-without-definer-one-liner-solution-linux/

Единственный способ заставить его работать под Windows:

Установите http://gnuwin32.sourceforge.net/, чтобы иметь команду в командной строке и добавить ее в 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 

Спасибо всем за подсказки. Будучи ленивым, я написал сценарий под названием «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 

Для чего-то вроде:

 DELIMITER ;;
 CREATE DEFINER = `mydb` @` localhost` FUNCTION `myfunction` () RETURNS int (11)
 начать
 (...)
 конец ;;

Попробуй это:

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

Простейшее регулярное выражение, которое работает для меня со всеми объектами:

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

Обратите внимание, что quote-names должны быть TRUE (по умолчанию).

Надеюсь, что в новых версиях коммутатор --skip-definer введенный в mysqlpump в версии 5.7, также поставляется в mysqldump.

Я использовал сценарий PowerShell для удаления всех строк с помощью DEFINER :

get-content $ file_in_full_path | select-string -pattern $ line_string_delete -notmatch | Out-File -width 1000000000 -Encoding По умолчанию $ file_out_full_path

  1. откройте свою базу данных любым редактором, я использовал с блокнотом ++,

  2. найти все тесты, которые [email protected] и заменить его ничем ( "" ) IE. удали это.

Затем вы можете импортировать его на любой хост, который вы хотите.

  • Зачем мне нужен ./ для команд для запуска на Mountain Lion?
  • Рассчитать расстояние, заданное двумя точками, широтой и долготой
  • Проблема с написанием строки JDBC MySQL UTF-8
  • Как добавить предложение where в инструкции MySQL Insert?
  • Как использовать MySql User Defined Variable в .NET MySqlCommand?
  • Как распознавать символы UTF-8 в кодированном латинском столбце - MySQL
  • Запуск MySQLDump без таблиц блокировки
  • Внешний ключ MySQL для использования NULL?
  • Группа Laravel Eloquent по самой последней записи
  • Entity Framework создает множественное имя таблицы, но представление ожидает уникальное имя таблицы?
  • MySQL - запрос UPDATE на основе запроса SELECT
  • Interesting Posts

    Как получить консоль устройства в Xcode6?

    Ошибка Ubuntu: нет кандидата ver

    Отслеживание продолжительности звонка

    Как получить 0-заполненное двоичное представление целого числа в java?

    Как скопировать профиль пользователя Windows 7 при изменении доменов

    Вход в Windows 7 с одной учетной записью очень медленный. Зачем?

    Существует ли межсегментный авторезистор высоты iframe, который работает?

    Датированные напоминания в календаре sharepoint

    Получить загрузочный раздел для распознавания второй операционной системы

    Как реализовать has_many: через отношения с Mongoid и mongodb?

    Можно ли реплицировать автоматическое числовое преобразование Swifts в Foundation (NSNumber) для типов (U) Int8 / 16/32/64?

    Где хранятся пути к файлам, открытые в Notepad ++ (последние открытые вкладки)?

    Подключение входного streamа к выходному streamу

    Как эффективно выполнять преобразования double / int64 с помощью SSE / AVX?

    Как перенести мои SSH-ключи на другую машину?

    Давайте будем гением компьютера.