У меня проблемы с резервным копированием баз данных после обновления. Я копался в своей системе, пытаясь понять, почему. Один запрос, который я выполнил, дал этот результат
Got error: 1449: The user specified as a definer ('cittool'@'%') does not exist when using LOCK TABLES
После некоторого расследования выясняется, что определяющим для этих представлений является старая учетная запись разработчика, которая была удалена из системы. Базы данных и представления с этой проблемой используются очень редко, и большинство из них хранятся в архивных целях.
Существует около 40 просмотров с определителем, который больше не существует. Есть ли простой способ изменить определитель на другой аккаунт на все сразу? Есть ли способ заставить mysqldump просто выгрузить все представления в файл, чтобы я мог отредактировать этот файл и воссоздать представления?
Ответы:
Создайте текстовый файл со всеми определениями вида:
Вы редактируете AllMyViews.sql оттуда. Затем бросьте взгляды
После редактирования AllMyViews.sql перезагрузите их
Попробуйте!
источник
The user specified as a definer ('abc'@'1.2.3.4') does not exist
CREATE USER 'abc'@'1.2.3.4';
. Затем попробуйте еще раз.Вы можете использовать ALTER VIEW в сочетании с информационной схемой . Вы упоминали, что выгрузили его в текстовый файл, так что, возможно, что-то вроде этого:
Смешайте это с командной строкой mysql (при условии * nix, не знакомый с windows):
Sidenote: Вы не можете напрямую изменять записи в information_schema . Примечание 2: Это работает только для одной базы данных за раз, если вы не указали WHERE table_schema, вам нужно вставить команды USE между ними.
источник
SELECT table_name,view_definition FROM information_schema.views WHERE table_schema='cittmp';
возвращается| Staff | |
echo "SELECT CONCAT("ALTER DEFINER=\`youruser\`@\`host\` VIEW...
Автоматизируя решение Дерека, это изменит DEFINER на
root@localhost
и установитSQL SECURITY INVOKER
(убедитесь, что вы хотите это сначала!) Во всех представлениях во всех базах данных:ВНИМАНИЕ: убедитесь, что вы сделали полную резервную копию mysql (например, остановив mysqld и сделав резервную копию всех файлов в / var / lib / mysql), прежде чем запускать его - на всякий случай ... Это сработало для меня, но YMMV ,
Вы также должны проверить все ваши таблицы / представления с:
он больше не должен жаловаться на недействительных определителей во взглядах.
источник
Экспортировать все виды базы данных
<DB>
:или:
Редактировать
views.sql
(изменить определитель) и воссоздать их:Укажите
-u
и-p
переключайте при необходимости.источник
views.sql
редактировать VIEWS? Кроме того, как их воссоздать?DEFINER = olduser@oldhost
наDEFINER = newuser@newhost
,cat views.sql | mysql <DB>
воссоздает виды.