У меня есть дамп MySQL одной из моих баз данных. В нем есть предложения DEFINER, которые выглядят так:
"DEFINER=`root`@`localhost`"
А именно, эти предложения DEFINER находятся в моих операторах CREATE VIEW и CREATE PROCEDURE. Есть ли способ удалить эти предложения DEFINER из моего файла дампа?
Ответы:
Я не думаю, что есть способ игнорировать добавление
DEFINER
s в дамп. Но есть способы удалить их после создания файла дампа.Откройте файл дампа в текстовом редакторе и замените все вхождения
DEFINER=root@localhost
на пустую строку ""Отредактируйте дамп (или перенаправьте вывод), используя
perl
:Подключите выход через
sed
:источник
sed -E 's/DEFINER=
[^]+
@[^
] +/DEFINER=CURRENT_USER/g' dump.sql > new_dump.sql
Он имеет то преимущество, что сохраняет ограничения / контроль доступа.sed
не удаляет предложение DEFINER из процедур и функций. Вот расширенная версия, которая обрабатывает представления, триггеры, процедуры и функции:sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | sed -e 's/DEFINER[ ]*=[ ]*[^*]*PROCEDURE/PROCEDURE/' | sed -e 's/DEFINER[ ]*=[ ]*[^*]*FUNCTION/FUNCTION/'
Убрать можно с помощью SED
В MacOS:
источник
-i extension
«Редактируйте файлы на месте, сохраняя резервные копии с указанным расширением. Если задано расширение нулевой длины, резервная копия не будет сохранена. Не рекомендуется указывать расширение нулевой длины, когда редактирование файлов на месте, поскольку вы рискуете повредить или частично содержимое в ситуациях, когда дисковое пространство исчерпано и т.д.Начиная с версии mysql 5.7.8, вы можете использовать эту
--skip-definer
опцию с mysqlpump, например:См. Обновленное руководство по mysql по адресу http://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#option_mysqlpump_skip-definer
источник
mysqldump
иmysqlpump
- вот связанный с этим вопрос: dba.stackexchange.com/questions/118846/mysqldump-vs-mysqlpumpinformation_schema.user
, и это не всегда доступно для чтения всем пользователямЯ использовал эти идеи, чтобы удалить предложение DEFINER из моего собственного вывода mysqldump, но я выбрал более простой подход:
Просто удалите
!
перед кодом и DEFINER, и остальная часть комментария станет обычным комментарием.Пример:
оказывается беспомощным, даже делая это ..
Однако самым простым регулярным выражением является удаление! и числа
Это удаляет
!#### DEFINER
и заменяет DEFINER ... вы также можете удалить DEFINER, на самом деле это не имеет значения - как только "!" ушелисточник
Согласно другим рекомендациям, вот пример того, как удалить DEFINER из дампа после завершения дампа:
источник
user
@localhost
* / / *! 50003 trigger my_triggername BEFORE INSERT ON my_table FOR EACH ROW .... * / ;; иgrep -v
полностью отбросит эти строки. (хотя 50017! = 50013)Как уже упоминалось, удаление средства определения с помощью любого регулярного выражения не слишком сложно. Но другие примеры лишили меня определений представлений.
Это регулярное выражение, которое у меня сработало:
источник
*/
. MySQL 5.6.31.Для автоматизированного решения вы можете посмотреть
mysqlmigrate
. Это оболочка Bash,mysqldump
которая позволяет переносить базы данных и игнорировать операторы DEFINER. Пример:http://thesimplesynthesis.com/post/mysqlmigrate (или GitHub )
В противном случае, да, необходима такая команда, как указывает Абхай:
источник
Другой вариант в OSX для удаления определителей в файле:
источник
Вы должны посмотреть здесь: /dba/9249/how-do-i-change-the-definer-of-a-view-in-mysql/29079#29079
На мой взгляд, лучший способ решить эту проблему - не добавлять дополнительный синтаксический анализ строки с помощью sed, grep или любого другого, вместо этого mysqldump может сгенерировать хороший дамп, добавив --single-transaction
источник
Быстрый способ сделать это - передать вывод mysqldump по конвейеру через sed, чтобы удалить
DEFINER
операторы, заключенные в условные комментарии. Я использую это для удаленияDEFINER
изCREATE TRIGGER
операторов, но вы можете настроить номер версии комментария к условию в регулярном выражении в соответствии с вашими целями.источник
Не уверен, что это поможет, но я использую SQLyog Community Edition, доступный по адресу: -
https://code.google.com/p/sqlyog/wiki/Downloads
При сбросе sql или копировании в другую базу данных вы можете игнорировать DEFINER
Это бесплатно и предоставляет базовые функции, которые требуются многим людям.
Существует также платная версия, доступная по адресу: -
https://www.webyog.com/product/sqlyog
ура
источник
Для меня, это работает:
perl -p -i.bak -e "s/DEFINER=[^ |\s]*//g" yourdump.dmp
. Это удалило DEFINER = root @ localhost из моего дампа при каждом статусе процедуры созданияисточник
Вот полное рабочее решение для удаления информации DEFINER для
MySQL 5.6.x
Linux и (протестированоCentOS 6.5
).Обычно мы должны заменить следующие записи из дампа Mysql (если они взяты вместе с данными и триггерами / подпрограммами / функциями).
Дамп был получен с помощью следующей команды mysqldump.
Требуемый файл дампа без информации DEFINER можно получить с помощью следующих трех команд.
Если файл дампа находится в вашей текущей папке, игнорируйте [PATH /].
Если данные в таблицах очень большие, возьмите дамп в двух файлах, в одном файле дампа возьмите дамп с данными, а в другом файле дампа возьмите дамп только сценариев (триггеры / функции / процедуры.) И запустите три вышеуказанных команды на 2-м файле дампа (скриптов).
источник
Замените всех ваших определяющих пользователей на CURRENT_USER. В моем скрипте gradle, который создает резервную копию, мой скрипт замены выглядит так:
который на самом деле просто вызывает ANT. Тогда вам не придется об этом беспокоиться.
источник
На машинах Linux вы можете использовать этот однострочник:
Вам нужно только заменить строки, выделенные жирным шрифтом, учетными данными пользователя БД и именем базы данных / подобным шаблоном.
Подробнее здесь: http://blog.novoj.net/2014/05/16/recreate-mysql-views-without-definer-one-liner-solution-linux/
источник
Единственный способ заставить его работать под Windows:
Установите http://gnuwin32.sourceforge.net/, чтобы в командной строке был sed, и добавьте его в ПУТЬ Windows : D: \ programs \ GetGnuWin32 \ bin;
источник
Спасибо всем за подсказки. Будучи ленивым, я написал сценарий под названием «MYsqldump»:
источник
Для чего-то вроде:
Попробуй это:
источник
откройте свою базу данных любым редактором, который я использовал с notepad ++,
найти все тесты
DEFINER=root@localhost
и заменить их ничем (""
) IE. удали это.Затем вы можете импортировать его на любой хост, который хотите.
источник
Самое простое регулярное выражение, которое у меня работает со всеми объектами:
Обратите внимание, что
quote-names
это должно бытьTRUE
(что по умолчанию).Надеюсь, что в более новых версиях переключатель,
--skip-definer
представленный в mysqlpump в версии 5.7, также будет применяться в mysqldump.источник
Я использовал сценарий PowerShell, чтобы удалить все строки
DEFINER
:get-content $ file_in_full_path | строка выбора -паттерн $ line_string_delete -notmatch | Out-File -width 1000000000 -Encoding Default $ file_out_full_path
источник
У меня ничего не работало, поэтому мне нужно было написать собственное регулярное выражение.
Попробуйте сбросить вашу базу данных в файл,
cat
весь файл иgrep
только ваши определяющие операторы, чтобы увидеть их.cat file.sql | grep -o -E '. {, 60} ОПРЕДЕЛИТЕЛЬ. {, 60}'
Напишите свое регулярное выражение
Вставьте свой дамп в sed с этим регулярным выражением. Например, мое заявление:
mysqldump | sed -E 's // *! 500 [0-9] [0-9] DEFINER =. +? * ///' | sed -E 's / DEFINER =
?[^ ]+?
? @?[^ ]+?
? //'Прибыль!
источник
remove_definers.bat:
источник