Змініть DEFINER на багатьох переглядах


25

У мене виникають проблеми із резервним копіюванням баз даних після оновлення. Я роздумував над своєю системою, намагаючись з'ясувати, чому. Один запит, яким я керував, повернув цей результат.

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

Після деякого розслідування виявляється, що визначальним для цих поглядів є старий обліковий запис розробника, який очищено від системи. Бази даних та погляди з цією проблемою використовуються дуже рідко, і більшість зберігаються навколо для архівних цілей.

Існує близько 40 поглядів з певним, що більше не існує. Чи є простий спосіб змінити коефіцієнт на інший рахунок одночасно? Чи є спосіб отримати mysqldump просто скинути всі перегляди у файл, щоб я міг редагувати цей файл і відтворити подання?


для мене я просто додав відсутність облікового запису до бази даних і помилка пішла.
користувач1794918

Відповіді:


13

Створіть текстовий файл із усіма визначеннями перегляду:

mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('SHOW CREATE VIEW ',table_schema,'.',table_name,'\\G') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A --skip-column-names > AllMyViews.sql

Ви редагуєте AllMyViews.sql звідти. Потім відкиньте перегляди

mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('DROP VIEW ',table_schema,'.',table_name,';') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A

Після редагування AllMyViews.sql перезавантажте їх

mysql -uusername -ppassword -A < AllMyViews.sql

Спробувати !!!


+1 як чудова альтернатива, якщо view_definition information_schema не відображається, але SHOW CREATE VIEW працює добре.
Дерек Дауні

Хоча теоретично мені подобалося рішення DTest, щось із моєї системи заважало йому працювати. Я в основному використовував вище, щоб скинути шоу, створюючи заяви у файл, і мені довелося трохи їх відредагувати вручну, а потім запустити.
Зоредаче

SHOW CREATE VIEW не працює, коли визначеного користувача не існує - він видає ту ж помилку, що і mysqldump:The user specified as a definer ('abc'@'1.2.3.4') does not exist
Marki555

@ Marki555 Тоді ви повинні тимчасово створити цього користувача. бігати CREATE USER 'abc'@'1.2.3.4';. Потім спробуйте ще раз.
RolandoMySQLDBA

Я щойно помітив, що View використовує певну збережену процедуру, і повідомлення про помилку пов'язане з визначенням цієї процедури, а не переглядає себе
Marki555,

25

Ви можете використовувати ALTER VIEW спільно з інформаційною схемою . Ви згадали про викидання його в текстовий файл, тому, можливо, щось подібне:

SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW `",table_name,"` AS ", view_definition,";") 
FROM information_schema.views WHERE table_schema='databasename'

Змішайте це з командним рядком mysql (припускаючи * nix, не знайомий з Windows):

> echo "*abovequery*" | mysql -uuser -p > alterView.sql
> mysql -uuser -p databasename < alterView.sql

Sidenote: Ви не можете безпосередньо змінювати записи information_schema . Примітка2: Це працює лише для однієї бази даних за один раз, якщо ви вимкнетесь WHERE table_schema, вам потрібно вставити USE команди між кожною.


Мені це подобається, тому що він виглядає трохи менш причетним і більш лаконічним, ніж мій. +1 !!! (Я забув про
ПОВІТРЕННЯ ПОГЛЯДУ

Будь-яка ідея, чому поле view_definition буде порожнім? SELECT table_name,view_definition FROM information_schema.views WHERE table_schema='cittmp'; повертається| Staff | |
Зоредаче

З обговорення в чаті, схоже, це питання дозволу із супер привілеєм. bugs.mysql.com/bug.php?id=39733
Дерек Дауні

Ідеальне рішення! +1
Пабло Мартінес

Принаймні на RedHat, якщо ви виводите файл, вам доведеться уникати зворотних кліщів, наприкладecho "SELECT CONCAT("ALTER DEFINER=\`youruser\`@\`host\` VIEW...
clav

3

Автоматизуючи рішення Derek, це змінить DEFINER на root@localhostта встановить SQL SECURITY INVOKER(переконайтеся, що ви цього хочете спочатку!) У всіх представленнях даних у всіх базах даних:

mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do 
    mysql -BNe "SELECT CONCAT(\"ALTER DEFINER=\`root\`@\`localhost\` SQL SECURITY INVOKER VIEW \",table_name,\" AS \", view_definition,\";\") FROM information_schema.views WHERE table_schema=\"$DB\"" | \
    mysql $DB
done

ПОПЕРЕДЖЕННЯ: переконайтеся, що ви створили повну резервну копію mysql (наприклад, зупинивши mysqld та створивши резервну копію всіх файлів у / var / lib / mysql) перед тим, як запустити його - на всякий випадок ... Це працювало для мене, але YMMV .

ви також повинні перевірити всі свої таблиці / представлення за допомогою:

mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do 
   mysql -BNe 'show tables' $DB | \
   while read t
   do
      echo "check table $t;"
   done | mysql -BN $DB
done | \
egrep -v 'status\s*OK'

вона більше не повинна скаржитися на недійсні визначення у видах.


Безсоромно додав це до моїх фрагментів. Спасибі!
stefgosselin

3

Експортуйте всі перегляди бази даних <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якщо потрібно, перемикачі.


Яким способом слід views.sqlредагувати VIEWS ? Також, як їх відтворити?
SherylHohman

@SherylHohman Зміна DEFINER = olduser@oldhostдо DEFINER = newuser@newhost, cat views.sql | mysql <DB>відтворює види.
x-yuri
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.