Я пытался переместить существующую базу данных из MySQL, работающую на EC2, в новый экземпляр Amazon RDS (эксперимент, чтобы увидеть, сможем ли мы перейти). Пока что все идет не очень хорошо. Я застрял при первоначальном импорте до настройки репликации (инструкции здесь ).
Я подготовил экземпляр RDS, как описано, и могу подключиться к нему из экземпляра EC2 с помощью mysql. Я выполнил команду mysqldump как:
mysqldump --master-data --databases db1 db2 > dump.sql
Затем попытался загрузить его в RDS с помощью:
mysql -h RDSHost -P 3306 -u rdsuser --password=rdspassword < dump.sql
Первая проблема была в строке 22 дампа:
ИЗМЕНИТЬ MASTER TO MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 106;
Эта строка вызвала ошибку ERROR 1227 (42000) at line 22: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
. Нет проблем, просто закомментировал эту строку и надеюсь исправить это позже через mysql.rds_set_external_master (). Повторена загрузка, и получил очень похожую ошибку: ERROR 1227 (42000) at line 7844: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
. Раздел вокруг линии 7844 выглядит следующим образом:
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`dev`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `jos_contributor_ids_view` AS select `jos_resource_contributors_view`.`uidNumber` AS `uidNumber` from `jos_resource_contributors_view` union select `jos_wiki_contributors_view`.`uidNumber` AS `uidNumber` from `jos_wiki_contributors_view` */;
Комментируя первые 2 строки и добавляя «CREATE» к третьей, я смог обойти эту. Но есть тонны разделов , как это. Есть ли способ обойти это без всего редактирования? Как вариант, чтобы mysqldump
не производить ничего, что требует привилегий SUPER?
Похоже, что у многих людей были похожие проблемы, например, из-за необходимости запуска sed
вывода mysqldump / mysqlbinlog! Я также собираюсь публиковать сообщения на форуме AWS - на самом деле, я думаю, что RDS должен иметь более терпимый способ импорта из mysqldump или специальный инструмент, который можно запустить на существующей базе данных для создания дампа, который является жалобой на безопасность RDS. Интересно, есть ли у кого-нибудь другие рецепты или хитрости, которые могли бы здесь помочь?
Благодарность,
Дейв
log_bin_trust_function_creators
параметр на 1, но все равно получаю ту же ошибку в строке 7844.--masterdata=2
. Затем строка будет закомментирована в дампе.Ответы:
Вам, вероятно, нужно
log_bin_trust_function_creators
= 1 для RDS, но это не проблема, здесь.Когда хранимая программа (proc, function, event или trigger) запущена, все, что она делает, имеет разрешения пользователя, который ее определил, или пользователя, явно указанного в
DEFINER
объявлении. Это позволяет, среди прочего, хранимым программам разрешать другим пользователям выполнять действия с данными, которыми они напрямую не имеют разрешения манипулировать, если у них есть разрешение на использование самой хранимой программы.В таком случае это было бы серьезной уязвимостью, если бы не
SUPER
пользователь мог создать процедуру с произвольным определителем, потому что пользователь мог по желанию наращивать свои привилегии.Конечно, это верно и для представлений, когда используется определенный контекст безопасности, как в примере, который вы опубликовали.
Одна из самых больших жалоб, которые у меня возникают с RDS, это то, что у вас их не может быть
SUPER
... и теперь это может быть и у вас тоже :), потому что этот факт является причиной проблемы, с которой вы столкнулись.Конечно, если бы я запускал управляемую службу MySQL, я бы тоже никому не давал
SUPER
, поэтому их модель безопасности имеет смысл, даже если она иногда громоздка.Если все ваши объекты имеют одинаковый определитель, обходным решением будет восстановление дампа с использованием этой учетной записи вместо той, которую вы используете сейчас, но это кажется маловероятным.
Удаление только строки с
DEFINER
объявлением должно заставить дампфайл работать в тех случаях, когда он появляется в строке сам по себе, или вы можете использовать sed или perl для изменения файла ... идея, которую я уже знаю, вы не любите, но в MySQL действительно хорошо, что такое хакерство вполне законно, и не так уж далеко от того, что я должен делать как администратор БД даже в среде без RDS.... возможно, это не тот ответ, на который вы надеялись, но вы можете запустить его для своего файла дампа, и в результате получится немного более пригодный для использования файл.
источник
В моем случае это была строка «CHANGE MASTER TO MASTER_LOG_FILE = ...» в дампе, которая выдала мне ошибку. Эта строка была добавлена опцией «--master-data» mysqldump. В Amazon AWS необходимо начать репликацию, задав основные данные с помощью процедуры «mysql.rds_set_external_master», вместо этого читайте здесь
Поэтому я просто отмечаю эту строку «head 22 backup.dump», где строка 22 сообщает об ошибке. Затем удалите его перед импортом, для моего большого файла, который я использую: "sed '22d' backup.dump> backup_clean.dump"
источник