Ошибка MySQL / Amazon RDS: «У вас нет СУПЕР привилегий…»

98

Я пытаюсь скопировать свою базу данных 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 SUPERRDS. RDS не дает возможности получить СУПЕР привилегии.
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сообщит об ошибках, но продолжит обработку оставшейся части файла дампа.

Росс Смит II
источник
привет @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 и т. Д. По отдельности
Kaymaz
134
  1. Откройте веб-консоль RDS.
  2. Откройте вкладку «Группы параметров».
  3. Создайте новую группу параметров. В диалоговом окне выберите семейство MySQL, совместимое с версией вашей базы данных MySQL, дайте ему имя и подтвердите. Выберите только что созданную группу параметров и выполните команду «Редактировать параметры».
  4. Найдите параметр log_bin_trust_function_creators и установите для него значение «1».
  5. Сохраните изменения.
  6. Откройте вкладку «Экземпляры». Разверните свой экземпляр MySQL и выполните «Экземплярное действие» с именем «Изменить».
  7. Выберите только что созданную группу параметров и включите «Применить немедленно».
  8. Нажмите «Продолжить» и подтвердите изменения.
  9. Дождитесь завершения операции «Изменение».
  10. Снова откройте вкладку «Экземпляры». Разверните свой экземпляр MySQL, разверните вкладку «Действия с экземпляром» и выберите «Перезагрузить».
Arun-R
источник
> что делает пункт 9 ... вы настраиваете свой экземпляр для использования группы параметров, определенной ранее. Подробнее см. Это оригинальное сообщение в блоге Дэниела Ферберса: techtavern.wordpress.com/2013/06/17/…
AndrewL
Остановит ли это репликацию RDS Mysql?
Рамратан Гупта
привет @ arun-r, я выполняю шаги, которые вы объяснили, но параметр log_bin_trust_function_creators недоступен в этом случае. Я думаю, что в последней версии AWS RDS что-то изменилось. Не могли бы вы помочь мне, как я могу это сделать сейчас? спасибо,
Pawan Developers
@RamratanGupta Это не прекратится
arun-r
1
@ arun-r спасибо за ваш ответ. Я решил свою проблему. На самом деле я нашел в списке log_bin_trust_function_creators. но мою проблему можно решить, обратившись в службу поддержки AWS
Pawan Developers
33

Проблема с триггерами и хранимыми процедурами в файле дампа заключается в том, что эти определения включают пользователя, которым должна быть создана хранимая процедура, DEFINER. Пользователь, скорее всего, не существует в RDS, поэтому возникает ошибка. Чтобы иметь возможность загрузить файл дампа, вы можете удалить DEFINER с помощью sed или Perl и создать хранимую процедуру / триггер с пользователем, выполняющим импорт.

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

Теперь вы сможете загрузить исправленный файл дампа.

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

Как сказано в предыдущем ответе, вы должны установить параметр БД:

log_bin_trust_function_creators = 1
Андерс
источник
1
Очистку определителей также можно выполнить с помощью sed: sed -i 's / DEFINER = OldDefiner@ localhost/ DEFINER = NewDefiner@ localhost/ g' ./TargetSqlFile.sql
Siliconerockstar
16

Для меня в моем файле дампа было всего 2 команды, которые требовали SUPER привилегий:

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

Согласно документации mysqldump, вы можете отключить их с помощью --set-gtid-purged=OFF.

Затем посмотрим на man mysqldump :

Используйте ON, если намерение состоит в том, чтобы развернуть новое подчиненное устройство репликации, используя только часть данных с выгруженного сервера. Используйте OFF, если намереваются восстановить таблицу, скопировав ее в топологию. Используйте OFF, если намерение состоит в том, чтобы скопировать таблицу между топологиями репликации, которые не пересекаются и останутся таковыми.

Поэтому я решил добавить --set-gtid-purged=OFFк своей mysqldumpкоманде, и тогда я смог успешно импортировать полученный файл дампа.

Yep_It's_Me
источник
1
Да, вот оно что. Мой файл дампа был относительно небольшим, поэтому я удалил из него все вхождения этих двух команд.
Zolbayar
6

Как определено в документации AWS, триггеры, процедуры и функции по умолчанию отключены, поскольку двоичное ведение журнала включено по умолчанию. Отключение в основном делает вашу базу данных более безопасной, но если вы правильно защитили ее через сеть, это не имеет значения.

Выполните следующие действия, и ваша проблема будет решена 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 по %

Не знаю почему, но у меня этот трюк сработал. Для этого достаточно простого текстового редактора.

Дэмиен Фрэнсис
источник