Как мне изменить ОПРЕДЕЛИТЕЛЬ ВИДА в 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.