Я пытался переместить существующую базу данных из 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_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
не производить ничего, для чего нужны СУПЕР привилегии?
Похоже, у многих людей были похожие проблемы, например, необходимость бегать sed
против вывода mysqldump / mysqlbinlog! Я также собираюсь опубликовать сообщение на форуме AWS - на самом деле я думаю, что RDS должен иметь более терпимый способ импорта из mysqldump или специальный инструмент, который можно запускать против существующей базы данных для создания дампа, который нарушает безопасность RDS. Просто интересно, есть ли у кого-нибудь другие рецепты или уловки, которые могут здесь помочь.
Спасибо,
Дэйв
Вам, вероятно, понадобится log_bin_trust_function_creators
= 1 на RDS, но здесь проблема не в этом.
Вы можете указать
DEFINER
значение, отличное от вашей собственной учетной записи, только если у вас естьSUPER
привилегия.- http://dev.mysql.com/doc/refman/5.6/en/stored-programs-security.html
Когда хранимая программа (процедура, функция, событие или триггер) запущена, все, что она делает, имеет разрешения пользователя, который ее определил, или пользователя, явно указанного с помощью DEFINER
декларация. Это позволяет, среди прочего, сохраненным программам разрешать другим пользователям выполнять действия с данными, на которые у них нет прямого разрешения, при условии, что у них есть разрешение на использование самой сохраненной программы.
Тогда это была бы серьезная уязвимость, если бы неSUPER
Пользователь может создать процедуру с произвольным определителем, потому что пользователь может по своему желанию повысить свои привилегии.
Конечно, это также верно и для представлений, когда используется определенный контекст безопасности, как в опубликованном вами примере.
Одна из самых больших претензий к RDS заключается в том, что вы не можете SUPER
... и теперь он может быть одним из ваших :), потому что именно этот факт является причиной вашей проблемы.
Конечно, если бы я запускал управляемую службу MySQL, я бы никому не дал SUPER
в любом случае, поэтому их модель безопасности имеет смысл, даже если она иногда бывает громоздкой.
Если все ваши объекты имеют один и тот же определитель, обходным путем было бы восстановить дамп, используя эту учетную запись вместо той, которую вы используете сейчас, но это кажется маловероятным.
Удалив только строку с DEFINER
объявление должно заставить файл дампа работать в тех случаях, когда он появляется в отдельной строке, или вы можете использовать sed или perl для изменения файла ... идея, которая, как я уже знаю, вам не нравится, но это действительно хорошая Что касается MySQL, то такое хакерство вполне законно, и на самом деле не так уж далеко от того, что я должен делать как администратор базы данных, даже в среде без RDS.
perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < oldfile.sql > newfile.sql
... возможно, это не тот ответ, на который вы надеялись, но вы можете запустить его для своего файла дампа, и в результате вы получите немного более удобный файл.
В моем случае это была строка «CHANGE MASTER TO MASTER_LOG_FILE = ...» в дампе, из-за которой я получил ошибку. Эта строка была добавлена параметром mysqldump "--master-data". В Amazon AWS вам необходимо запустить репликацию, указав основные данные с помощью процедуры mysql.rds_set_external_master вместо чтения Вот
Поэтому я просто отмечу строку «head 22 backup.dump», где строка 22 сообщила об ошибке. Затем удалите его перед импортом, для моего большого файла я использую: "sed '22d' backup.dump> backup_clean.dump"