Ошибка 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
сообщит об ошибках, но продолжит обработку оставшейся части файла дампа.
- Откройте веб-консоль RDS.
- Откройте вкладку "Группы параметров".
- Создайте новую группу параметров. В диалоговом окне выберите семейство MySQL, совместимое с версией базы данных MySQL, дайте ему имя и подтвердите. Выберите только что созданную группу параметров и введите "Редактировать параметры".
- Найдите параметр log_bin_trust_function_creators и установите его значение равным 1.
- Сохраните изменения.
- Откройте вкладку "Экземпляры". Разверните свой экземпляр MySQL и выполните "Действие экземпляра" с именем "Изменить".
- Выберите только что созданную группу параметров и включите "Применить немедленно".
- Нажмите "Продолжить" и подтвердите изменения.
- Дождитесь завершения операции "Модификация".
- Снова откройте вкладку "Экземпляры". Разверните свой экземпляр 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 — создать группу параметров, как и в других ответах, упомянутых здесь.
Для этого конкретного случая установите переменную
Измените базу данных, а затем выберите новую группу параметров в группе параметров БД в разделе «Дополнительная конфигурация» .
Несмотря на то, что я включил 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
от%
Не знаю почему, но у меня этот трюк сработал. Для этого достаточно простого текстового редактора.