Як я можу змінити ПОКАЗНИК ПЕРЕГЛЯДУ в 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
У вас є перегляди? У таблицях немає дефініцій,
gbn

1
@gbn +1 ви мали рацію - вони були перегляди - thx для посилання, але я не зміг зробити це нормально. Однак мені вдалося змінити представлення даних у SQLyog, щоб я міг зробити дамп.
kfmfe04

Це працює для мене. {{надайте все на . до 'root' @ '%', ідентифікований 'password' з опцією дозволу; }}
Мухаммед Азеем

Відповіді:


33

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

Тепер рішення полягає в тому, що вам доведеться замінити визначені для цих процедур / методів

то ви можете генерувати дамп без помилки.

ви можете зробити це як ..

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

Будьте обережні, тому що це змінить усі визначені для всіх баз даних.

Спробуй це....!

ОНОВЛЕНО 9 лютого 2012 року

Як я побачив посилання, подане @gbn, це відповідь, подана @Rolando, що також може бути випадком. Перейдіть за посиланням

EDIT від @RolandoMySQLDBA 2011-12-16 11:20 EDT

Хоча ризикована ця відповідь є хорошою. Просто для уточнення: Ви можете вказати базу даних у своєму запиті так:

 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
Вибачте, як це вирішує проблему, описану в оригінальному запитанні? Схоже, ви відповіли неправильно на питання ...
дез

6
Структура відповіді помилкова, тому що --sele-транзакція повинна бути перед назвою бази даних, але відповідь насправді правильна. Визначення цієї опції вирішує проблему, змінюючи поведінку блокування mysqldump, тому помилка в початковому питанні більше не виникає.
Michael - 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.