Удалить предложение DEFINER из MySQL Dumps
У меня есть дамп MySQL одной из моих баз данных. В нем есть предложения DEFINER, которые выглядят как
"DEFINER=`root`@`localhost`"
А именно, эти предложения DEFINER находятся в моих инструкциях CREATE VIEW и CREATE PROCEDURE. Есть ли способ удалить эти предложения DEFINER из моего файла дампа?
Ответы
Ответ 1
Я не думаю, что есть способ игнорировать добавление DEFINER
к дампу. Но есть способы удалить их после создания файла дампа.
Ответ 2
Вы можете удалить с помощью SED
sed -i 's/DEFINER=[^*]*\*/\*/g' mydump.sql
В MacOS:
sed -i '' 's/DEFINER=[^*]*\*/\*/g' mydump.sql
Ответ 3
Начиная с версии 5.7.8 mysql вы можете использовать опцию --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
Ответ 4
В соответствии с другими рекомендациями, вот пример того, как удалить DEFINER из дампа после завершения дампа:
mysqldump -u user --password='password' -h localhost database | grep -v "50013 DEFINER" > dump.sql
Ответ 5
Я использовал эти идеи, чтобы снять предложение 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, это не имеет значения - как только "!" ушел
Ответ 6
Как упоминалось выше, разделение определителя с любым регулярным выражением не слишком сложное.
Но другие примеры лишили определения вида для меня.
Это регулярное выражение, которое сработало для меня:
sed -e 's/DEFINER=[^ ]* / /'
Ответ 7
Для автоматического решения вы можете посмотреть mysqlmigrate
. Это оболочка 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
Ответ 8
Здесь вы должны посмотреть ответ: https://dba.stackexchange.com/questions/9249/how-do-i-change-the-definer-of-a-view-in-mysql/29079#29079
Лучший способ, по моему мнению, решить эту проблему, не добавляет дополнительный синтаксический анализ строки с sed или grep или любым другим, вместо этого mysqldump способен генерировать хороший дамп, добавляя --single-transaction
Ответ 9
Быстрый способ сделать это - передать вывод mysqldump через sed, чтобы удалить инструкции DEFINER
, завернутые в условные комментарии. Я использую это, чтобы удалить DEFINER
из операторов CREATE TRIGGER
, но вы можете настроить номер версии комментария комментария условия в регулярном выражении в соответствии с вашими целями.
mysqldump -u user --password='password' -h localhost database | \
sed 's/\/\*!50017 DEFINER=`.*`@`.*`\*\///'
Ответ 10
Не уверен, что это помогает, но я использую SQLyog Community Edition, доступный по адресу: -
https://code.google.com/p/sqlyog/wiki/Downloads
При сбрасывании sql или копировании в другую базу данных он позволяет вам игнорировать DEFINER
Это бесплатно и предоставляет базовую функциональность, которой требует много людей.
Существует также платная версия: -
https://www.webyog.com/product/sqlyog
Приветствия
Ответ 11
Еще одна опция для OSX для удаления определений в файле:
sed -i '' 's/DEFINER=`[^`][^`]*`@`[^`][^`]*`//g' file.sql
Ответ 12
Для меня это работает: perl -p -i.bak -e "s/DEFINER=[^ |\s]*//g" yourdump.dmp
.
Это удалило DEFINER = root @localhost из моего дампа, на каждом этапе создания процедуры
Ответ 13
Вот полное рабочее решение для удаления информации 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-го дампа (скрипты).
Ответ 14
Замените всех ваших пользователей-определителей CURRENT_USER. В моем gradle script, который создает резервную копию, моя замена script выглядит так:
ant.replaceregexp(file: "$buildDir/sql/setupDB.sql", match: "`${project.ext.prod_db_username}`@`%`", replace: "CURRENT_USER", byline: true);
который действительно просто вызывает ANT. Тогда вам не придется беспокоиться об этом.
Ответ 15
На машинах 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/
Ответ 16
Единственный способ заставить его работать под Windows:
Установите http://gnuwin32.sourceforge.net/, чтобы иметь sed в командной строке и добавить его в Windows PATH: D:\программы\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
Ответ 17
Спасибо всем за подсказки.
Будучи ленивым, я написал script имя: "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 <db> <host> <user>"
echo ""
exit 1
fi
$MYSQLDUMP -h $HOST -u $USER -p $PARAMS $DB | grep -v '/*!50013 DEFINER' > $FILE
Ответ 18
Для чего-то вроде:
DELIMITER ;;
CREATE DEFINER=`mydb`@`localhost` FUNCTION `myfunction`() RETURNS int(11)
begin
(...)
end ;;
Попробуйте следующее:
mysqldump --force --routines --opt --user=myuser --databases mydb | sed -e 's/DEFINER=`.*`@`.*`\ //g'
Ответ 19
-
откройте свою базу данных любым редактором, который я использовал с notepad++,
-
найти все тесты, которые [email protected]
и заменить его ничем (""
) IE. удали это.
Затем вы можете импортировать его на любой хост, который вы хотите.
Ответ 20
Простейшее регулярное выражение, которое работает для меня со всеми объектами:
sed 's/DEFINER=[^ ]*`//' ...
Обратите внимание, что quote-names
должно быть TRUE
(которое по умолчанию).
Надеюсь, что в новых версиях коммутатор --skip-definer
, введенный в mysqlpump в версии 5.7, также приходит в mysqldump.
Ответ 21
Я использовал скрипт PowerShell для удаления всех строк с помощью DEFINER
:
get-content $ file_in_full_path | строка выбора -pattern $ line_string_delete -notmatch | Out-File -width 1000000000 -Encoding По умолчанию $ file_out_full_path
Ответ 22
У меня ничего не получалось, поэтому мне нужно было написать свое собственное регулярное выражение.
-
Попробуйте сбросить свою базу данных в файл, cat
весь файл и grep
только ваши заявления DEFINER, чтобы увидеть их.
кошка file.sql | grep -o -E '. {, 60} DEFINER. {, 60}'
-
Напишите свое регулярное выражение
-
Скопируйте свой дамп в sed с помощью этого регулярного выражения. Например, мое выражение:
mysqldump | sed -E//*! 500 [0-9] [0-9] DEFINER =. +? *///'| SED -E s/DEFINER = ?[^ ]+?
? @?[^ ]+?
//?"
-
Прибыль!
Ответ 23
remove_definers.bat:
@echo off
(for /f "tokens=1,2*" %%a in (dumpfile.sql) do (
if "%%b"=="" (echo %%a) else (
echo %%b | find "DEFINER" > null && echo %%a %%c || echo %%a %%b %%c
)
)) > dumpfile_nodefiners.sql