Как мне изменить ОПРЕДЕЛИТЕЛЬ ВИДА в Mysql?


35

Когда я запускаю mysqldump, я получаю сообщение об ошибке:

mysqldump: Got error: 1449: The user specified as a definer ('root'@'foobar') does not exist when using LOCK TABLES

Это имеет смысл, потому что foobarэто устаревшая машина, которой больше не существует.

Как мне изменить определитель всех моих таблиц на «root» @ «localhost»?


4
Есть ли у вас Просмотры? У таблиц нет определителей, я уверен ... Также см. Dba.stackexchange.com/q/4129/630
— gbn 16.12.11

1
@gbn +1 ты был прав - они были просмотром - спасибо за ссылку, но я не мог заставить ее работать совершенно правильно. Тем не менее, мне удалось изменить представления в SQLyog, чтобы я мог сделать дамп.
— kfmfe04

Это работает для меня. {{Даруй все на . в «root» @ «%», идентифицируемый как «password» с опцией предоставления; }}
— Мухаммед Азим

Ответы:


33

Я думаю, что база данных, которую вы пытаетесь создать, содержит процедуры / методы, которые были определены пользователем при входе в систему как root @ 'foobar'.

Теперь решение состоит в том, что вы должны заменить определитель для этих процедур / методов

тогда вы можете создать дамп без ошибок.

Вы можете сделать это как ...

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar'

Будьте осторожны, потому что это изменит все определители для всех баз данных.

Попытайся....!

ОБНОВЛЕНИЕ 9 февраля 2012

Как я увидел ссылку, предоставленную @gbn, которая является ответом, данным @Rolando, который также может иметь место. Пожалуйста, перейдите по ссылке

РЕДАКТИРОВАТЬ @RolandoMySQLDBA 2011-12-16 11:20 ПО ВОСТОЧНОМУ ВРЕМЕНИ

Хотя это рискованно, этот ответ хорош. Просто чтобы уточнить: вы можете указать базу данных в вашем запросе следующим образом:

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar' AND db='whateverdbyouwant';

1
Ссылка выше показывает, как это сделать с помощью операторов ALTER, которые могут быть менее рискованными ... Кроме того, пожалуйста, проверьте мое обновление для определителей в вашем ОБНОВЛЕНИИ
— gbn

UPDATEизменил таблицу, но mysqldumpне видит его: mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES. Даже после перезагрузки mysql. Я бегу mysql-5.5.31.
— x-yuri

Виноват. У меня тоже были взгляды с неправильным определителем. update mysql.procподход действительно работает.
— x-yuri

Не работал ....
— オ ナ シ

3
Этот ответ работает для изменения определителя процедур и функций , но не меняет Определитель с видом .
— Энтони Дж. - правосудие для Моники

35

Проще использовать --single-transactionпереключатель:

mysqldump --single-transaction -u username -p db > db.sql

1
Извините, как это решает проблему, описанную в оригинальном вопросе? Похоже, вы ответили не на тот вопрос ...
— dezso

6
Структура ответа неверна, потому что --single-транзакция должна предшествовать имени базы данных, но ответ на самом деле правильный. Задание этой опции обходит проблему, изменяя поведение блокировки mysqldump, поэтому ошибка в исходном вопросе больше не возникает.
— Майкл - sqlbot

Я столкнулся с той же проблемой. сработало - единственная транзакция.

Не уверен, что он делает, но работал, хотя! Спасибо
— Шри Харша Каппала

17

Самым быстрым решением было бы просто воссоздать определитель таким образом, чтобы он существовал, если только он не создает никаких конфликтов с существующими пользователями.

CREATE USER 'root'@'foobar';


Что, если пользователь был root '@'% '? Я просто отрицаю такую ​​вещь на сервере, за который мы несем ответственность.
— Аттила Фулоп

@AttilaFulop Да, безопасность определенно должна быть рассмотрена, но я сказал, что это было «самое быстрое» решение, а не идеальное. После завершения импорта пользователь может быть удален, чтобы снизить риск появления дополнительных пользователей.
— ColinM

Вы правы в этом. Я просто хотел привлечь внимание и к этому конкретному аспекту. Мои коллеги по работе добавили бы 'root' @ '%' и оставили бы его там, пока жив Чак Норрис, т.е. навсегда;)
— Аттила Фулоп

6

Экспортировать все виды базы данных <DB>:

mysql -BNe "SELECT TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA = '<DB>' AND TABLE_TYPE = 'VIEW'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

или:

mysql -BNe "SELECT TABLE_NAME FROM VIEWS WHERE TABLE_SCHEMA = '<DB>'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

Отредактируйте views.sqlи воссоздайте их:

cat views.sql | mysql <DB>

Укажите -uи -pпереключайте при необходимости.


Это самый чистый ответ
— Вулф
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.