Помилка MySQL / Amazon RDS: "у вас немає привілеїв SUPER ..."


97

Я намагаюся скопіювати свою базу даних mysql з Amazon EC2 на RDS:

Я успішно переніс mysqldumpсвою базу даних у свою кореневу папку, використовуючи це:

root@ip-xx-xx-xx-xx:~# mysqldump my_database -u my_username -p > my_database.sql

Потім я спробував перенести цей файл .sql у свою нову базу даних RDS:

root@ip-xx-xx-xx-xx:~# mysql my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql

На жаль, я отримую таке повідомлення про помилку:

You do not have the SUPER privilege and binary logging is enabled 
(you *might* want to use  the less safe log_bin_trust_function_creators variable)

Я намагався GRANT SUPER..різними способами, але при спробі зробити це теж отримую помилки. Набір тексту теж mysql > FLUSH privileges;не працює.

Я новачок у MySQL, так що вибачте за таке легке запитання. Думки?


9
Ви не можете GRANT SUPERна RDS. RDS не пропонує жодних способів отримати привілеї SUPER.
ceejayoz

Використовуйте одне і те ж ім’я користувача MySQL для створення дампа та відновлення його (для підключення та ключового слова DEFINER у дампі). Зміна log_bin_trust_function_creators - не бажане рішення. Найгірше - у цьому випадку використовувати параметр -f
ad4s

у моєму випадку в моєму sqlфайлі є CREATE FUNCTIONвиписка, для якої потрібен привілейований користувач. див. це
Бухгалтер م

Відповіді:


63

Відповідно до http://getasysadmin.com/2011/06/amazon-rds-super-privileges/ , вам потрібно встановити log_bin_trust_function_creatorsзначення 1 у консолі AWS , щоб завантажувати ваш файл дампа без помилок.

Якщо ви хочете ігнорувати ці помилки та завантажити решту файлу дампа, ви можете скористатися -fопцією:

mysql -f my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql

-fПовідомлятиме про помилки, але буде продовжувати обробку решти файлу дампа.


привіт @Ross, дякую за це. На жаль, використання -fне допомогло. Я отримав таку ж помилку. Використовуючи ваше посилання, у мене проблеми з синтаксисом інструментів RDS Cli. Це означає, що коли я йду змінювати привілеї, я отримую таку помилку:rds-modify-db-parameter-group: Malformed input-Unrecognized option: -–parameters=name=log_bin_trust_function_creators, Usage: rds-modify-db-parameter-group DBParameterGroupName --parameters "name=value, value=value, method=value" [ --parameters "name=value, value=value, method=value" ...] [General Options]
tim peterson

ось моя команда, яка видає мені вищезазначену помилку: ./rds-modify-db-parameter-group mygroup -–parameters "name=log_bin_trust_function_creators, value=on, method=immediate" –I="accesskeyxxxxxx" –S="secretkeyxxxxxxxx"я знаю, що це має бути котирування або подвійний тире, але поки жоден із цих типів змін не працює, тьфу!
tim peterson

4
Цей -fпараметр не змусить помилки зникнути, він просто дозволить обробляти нешкідливі оператори SQL у файлі. З того, що я прочитав, RDS задихається збереженими процедурами у файлі дампа. Спробуйте створити файл дампа без процедур зберігання і перевірте, чи завантажується це нормально:mysqldump --routines=0 --triggers=0 --events=0 my_database -u my_username -p
Росс Сміт II

2
- @ Росс, чудово, що працювало, моя база даних є, вау, це неприємна проблема, відчуваю, що AWS повинна щось з цим зробити.
tim peterson

Принаймні я можу завантажити всі дані з -fопцією. Другий етап може полягати в тому, щоб скидати лише підпрограми / stred proc тощо тощо
Каймаз,

134
  1. Відкрийте веб-консоль RDS.
  2. Відкрийте вкладку «Групи параметрів».
  3. Створіть нову групу параметрів. У діалоговому вікні виберіть сімейство MySQL, сумісне з вашою версією бази даних MySQL, дайте йому назву та підтвердьте. Виберіть щойно створену групу параметрів та видайте “Редагувати параметри”.
  4. Шукайте параметр 'log_bin_trust_function_creators' і встановіть для нього значення '1'.
  5. Збережіть зміни.
  6. Відкрийте вкладку "Екземпляри". Розгорніть примірник MySQL та видайте “Дію екземпляра” з назвою “Змінити”.
  7. Виберіть щойно створену групу параметрів і увімкніть «Застосувати негайно».
  8. Натисніть «Продовжити» та підтвердьте зміни.
  9. Дочекайтеся завершення операції "Змінення".
  10. Знову відкрийте вкладку «Екземпляри». Розгорніть примірник MySQL і розгорніть вкладку «Instance Action» та виберіть «Reboot».

> що робить пункт 9 ... ви налаштовуєте свій екземпляр на використання групи параметрів, визначеної раніше. Більш докладно див. Цей оригінальний допис у блозі Даніеля Ферберса: techtavern.wordpress.com/2013/06/17/…
AndrewL,

Це зупинить реплікацію RDS Mysql?
Рамратан Гупта,

привіт @ arun-r, я проходжу кроки, які ти пояснив, але параметр 'log_bin_trust_function_creators' для цього випадку недоступний. Я думаю, що щось змінилося в останніх AWS RDS. Чи можете ви допомогти мені, як я можу це зробити зараз? спасибі,
розробники Pawan

@RamratanGupta Це не зупиниться
arun-r

1
@ arun-r дякую за вашу відповідь. Я вирішив своє питання. Насправді я знайшов у списку log_bin_trust_function_creators. але мою проблему вирішено, звернувшись до служби підтримки AWS
Pawan Developers

33

Проблема тригерів та збережених процедур у файлі дампа полягає в тому, що ці визначення включають користувача, якому слід створити збережену процедуру, DEFINER. Користувача, швидше за все, не існує в RDS, тож виникає помилка. Щоб мати змогу завантажити файл дампа, ви можете видалити ВИЗНАЧИТЕЛЬ за допомогою sed або Perl і створити збережену процедуру / тригер з користувачем, який виконує імпорт.

perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < mysqldump.sql > mysqldump.fixed.sql

Тепер ви зможете завантажити виправлений файл дампа

mysql my_database -u my_username -p -h rds_host < mysqldump.fixed.sql

Як було сказано у попередній відповіді, слід встановити параметр DB:

log_bin_trust_function_creators = 1

1
Очищення дефінерів також можна здійснити за допомогою sed: sed -i 's / DEFINER = OldDefiner@ localhost/ DEFINER = NewDefiner@ localhost/ g' ./TargetSqlFile.sql
siliconrockstar

14

Для мене у моєму файлі дампа було лише 2 команди, які вимагали привілеїв SUPER:

  • SET @@GLOBAL.gtid_purged
  • SET @@SESSION.SQL_LOG_BIN

Згідно з документами mysqldump, ви можете їх відключити за допомогою --set-gtid-purged=OFF.

Потім дивлячись на людину mysqldump :

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

Тому я вирішив додати --set-gtid-purged=OFFдо своєї mysqldumpкоманди, і тоді я міг успішно імпортувати отриманий файл дампа.


1
Так, це було все. Мій файл дампа був відносно невеликий, тому я видалив з нього всі випадки цих 2 команд.
Zolbayar

6

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

Виконайте ці кроки, і ваша проблема буде виправлена https://aws.amazon.com/premiumsupport/knowledge-center/rds-mysql-functions/

Також не слід використовувати визначення під час створення процедур. Проста команда sed може його видалити.



1

Після використаної відповіді arun-r, якщо проблема не вирішена, вам потрібно змінити файл дампа. Це просто.

У файлі дампа ви знайдете такі рядки:

DELIMITER ;;
CREATE DEFINER=`username_from_dumped_database`@`host_from_dumped_database` PROCEDURE `procedure_or_function_name`()
BEGIN

Ви повинні замінити:

  • username_from_dumped_database за вашим іменем користувача в базі даних rds.
  • host_from_dumped_databse від %

Не знаю чому, але цей фокус у мене спрацював. Для цього достатньо простого текстового редактора.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.