Ошибка MySQL/Amazon RDS: "У вас нет привилегий SUPER..."

Я пытаюсь скопировать мою базу данных 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.. различными способами, но я получаю ошибки, когда я пытаюсь сделать это тоже. Typing mysql > FLUSH privileges; тоже не работает.

Я новичок в MySQL, извините за такой простой вопрос. Мысли?

9 ответов

Решение

На 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 сообщит об ошибках, но продолжит обработку оставшейся части файла дампа.

  1. Откройте веб-консоль RDS.
  2. Откройте вкладку "Группы параметров".
  3. Создайте новую группу параметров. В диалоговом окне выберите семейство MySQL, совместимое с версией базы данных MySQL, дайте ему имя и подтвердите. Выберите только что созданную группу параметров и введите "Редактировать параметры".
  4. Найдите параметр log_bin_trust_function_creators и установите его значение равным 1.
  5. Сохраните изменения.
  6. Откройте вкладку "Экземпляры". Разверните свой экземпляр MySQL и выполните "Действие экземпляра" с именем "Изменить".
  7. Выберите только что созданную группу параметров и включите "Применить немедленно".
  8. Нажмите "Продолжить" и подтвердите изменения.
  9. Дождитесь завершения операции "Модификация".
  10. Снова откройте вкладку "Экземпляры". Разверните свой экземпляр MySQL, разверните вкладку "Действие экземпляра" и выберите "Перезагрузка".

Для меня в моем файле дампа было всего 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 команду, а затем я смог успешно импортировать полученный файл дампа.

Проблема с триггерами и хранимыми процедурами в файле дампа состоит в том, что в эти определения входит пользователь, которым должна быть создана хранимая процедура, 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

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

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

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

В дополнение к редактированию

log_bin_trust_function_creators = 1

вам нужно удалить все DEFINER из вашего файла дампа, проверьте следующую ссылку для команды SED, которая может помочь очистить ваш файл дампа sql.

https://www.percona.com/blog/2014/07/02/using-mysql-triggers-and-views-in-amazon-rds/

Для того, чтобы завершить @ Арун-R ответа , перезагрузка необходима при создании новой группы параметров.

Правильный способ настроить параметр в AWS/RDS — создать группу параметров, как и в других ответах, упомянутых здесь.

Для этого конкретного случая установите переменнуюна 1 в разделе параметров при создании новой группы параметров .

Измените базу данных, а затем выберите новую группу параметров в группе параметров БД в разделе «Дополнительная конфигурация» .

Несмотря на то, что я включил Apply немедленно, у меня это не сработало (MySQL v8). После перезагрузки заработало !

После использования ответа 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 от %

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

Другие вопросы по тегам