Первая попытка перенести EC2 MySQL на Amazon RDS не удалась - СУПЕР привилегии

11

Я пытался переместить существующую базу данных из 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. Интересно, есть ли у кого-нибудь другие рецепты или хитрости, которые могли бы здесь помочь?

Благодарность,

Дейв

dsl101
источник
Извините - забыл сказать, что я пытался изменить log_bin_trust_function_creatorsпараметр на 1, но все равно получаю ту же ошибку в строке 7844.
dsl101
Старый пост, но первую ошибку можно избежать, сказав --masterdata=2. Затем строка будет закомментирована в дампе.
Halfgaar

Ответы:

26

Вам, вероятно, нужно log_bin_trust_function_creators= 1 для RDS, но это не проблема, здесь.

Вы можете указать  DEFINER значение, отличное от вашей собственной учетной записи, только если у вас есть  SUPER привилегия.

- http://dev.mysql.com/doc/refman/5.6/en/stored-programs-security.html

Когда хранимая программа (proc, function, event или trigger) запущена, все, что она делает, имеет разрешения пользователя, который ее определил, или пользователя, явно указанного в DEFINERобъявлении. Это позволяет, среди прочего, хранимым программам разрешать другим пользователям выполнять действия с данными, которыми они напрямую не имеют разрешения манипулировать, если у них есть разрешение на использование самой хранимой программы.

В таком случае это было бы серьезной уязвимостью, если бы не SUPERпользователь мог создать процедуру с произвольным определителем, потому что пользователь мог по желанию наращивать свои привилегии.

Конечно, это верно и для представлений, когда используется определенный контекст безопасности, как в примере, который вы опубликовали.

Одна из самых больших жалоб, которые у меня возникают с RDS, это то, что у вас их не может быть SUPER... и теперь это может быть и у вас тоже :), потому что этот факт является причиной проблемы, с которой вы столкнулись.

Конечно, если бы я запускал управляемую службу MySQL, я бы тоже никому не давал SUPER, поэтому их модель безопасности имеет смысл, даже если она иногда громоздка.

Если все ваши объекты имеют одинаковый определитель, обходным решением будет восстановление дампа с использованием этой учетной записи вместо той, которую вы используете сейчас, но это кажется маловероятным.

Удаление только строки с DEFINERобъявлением должно заставить дампфайл работать в тех случаях, когда он появляется в строке сам по себе, или вы можете использовать sed или perl для изменения файла ... идея, которую я уже знаю, вы не любите, но в MySQL действительно хорошо, что такое хакерство вполне законно, и не так уж далеко от того, что я должен делать как администратор БД даже в среде без RDS.

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

... возможно, это не тот ответ, на который вы надеялись, но вы можете запустить его для своего файла дампа, и в результате получится немного более пригодный для использования файл.

Майкл - sqlbot
источник
Большое спасибо за исчерпывающий ответ и за подтверждение того, что я думал о том, что sed / perl является единственным решением. Приложение, которое я использую, является специально настроенным Joomla, и, хотя с открытым исходным кодом, у меня нет времени / навыков, чтобы проанализировать его, чтобы понять, будет ли оно хорошо переходить на RDS. Моя мысль была «попробуй и посмотри» - но кажется, что первый шаг самый трудный - в немалой степени из-за неадекватных (на мой взгляд) инструментов миграции Amazon. Я согласен с моделью безопасности, но если вывод по умолчанию mysqldump создает так много проблем, почему у них нет лучшего решения? Я спрошу это у них тоже.
dsl101
1
КЛАССНО. Большое спасибо за этот Perl-скрипт. моя резервная копия была 4+ ГБ, и просто открыть ее было непросто. это спасло мой день.
Эмиль Байзел
1
Отличное объяснение, отличный ответ и отличное решение! Тупой определитель.
rkaregaran
4
Большое спасибо за ваш perl один вкладыш. Это единственное, что я смог найти, что на самом деле работает. Многие другие на этих досках просто нет. Я бы снова проголосовал, если бы мог.
lucian303
1

В моем случае это была строка «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"

Игорь Тома
источник