Поэтому я пытаюсь импортировать файл sql в rds (1G MEM, 1 CPU). Файл sql похож на 1.4G
mysql -h xxxx.rds.amazonaws.com -u user -ppass --max-allowed-packet = 33554432 db <db.sql
Он застрял в:
ERROR 1227 (42000) at line 374: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
Фактическое содержимое sql:
/*!50003 CREATE*/ /*!50017 DEFINER=`another_user`@`1.2.3.4`*/ /*!50003 TRIGGER `change_log_BINS` BEFORE INSERT ON `change_log` FOR EACH ROW
IF (NEW.created_at IS NULL OR NEW.created_at = '00-00-00 00:00:00' OR NEW.created_at = '') THEN
SET NEW.created_at = NOW();
END IF */;;
another_user
не существует в rds, поэтому я делаю:
GRANT ALL PRIVILEGES ON db.* TO another_user@'localhost';
По-прежнему не повезло.
mysql
amazon-web-services
amazon-rds
Кенпетер
источник
источник
DEFINER
когда у зарегистрированного пользователя нетSUPER
привилегии (что само по себе не разрешено в RDS), позволит произвольное повышение привилегий - сохраненные программы запускаются с учетными данными и привилегиями ихDEFINER
(в отличие от звонящего пользователя - ихINVOKER
) по умолчанию. Также при сбое сервера .sed 's/\sDEFINER=`[^`]*`@`[^`]*`//' -i oldfile.sql
awk
что может быть немного быстрее, чемsed
Если в вашем файле дампа нет
DEFINER
, убедитесь, что эти строки ниже также удалены, если они есть, или закомментированы с помощью--
:В начале:
-- SET @@SESSION.SQL_LOG_BIN= 0; -- SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
В конце:
-- SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
источник
--set-gtid-purged=OFF
в своюmysqldump
команду. Найдено здесь: stackoverflow.com/a/56251925Еще один полезный трюк - вызвать mysqldump с параметром --set-gtid-purged = OFF, который не записывает следующие строки в выходной файл:
SET @@SESSION.SQL_LOG_BIN= 0; SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ ''; SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
не уверен в DEFINER.
источник
SET @@GLOBAL.GTID_MODE = OFF;
в MySql Workbench на стороне экспорта из исходной базы данныхПросто дополнительное обновление MacOS для ответа hjpotter92.
Чтобы
sed
распознать шаблон в MacOS, вам нужно будет добавить обратную косую черту перед=
знаком, например:источник
Проблема : вы пытаетесь импортировать данные (используя файл mysqldump) в свою базу данных mysql, но, похоже, у вас нет разрешения на выполнение этой операции.
Решение : Предполагая, что данные переносятся, заполняются и обновляются в базе данных mysql, сделайте снимок с помощью mysqldump и экспортируйте его в файл.
mysqldump -u [username] -p [databaseName] --set-gtid-purged=OFF > [filename].sql
После этого подключитесь к mysql с правами пользователя root, дайте разрешения, сбросьте их и убедитесь, что ваши права пользователя были обновлены правильно.
mysql -u root -p UPDATE mysql.user SET Super_Priv='Y' WHERE user='johnDoe' AND host='%'; FLUSH PRIVILEGES; mysql> SHOW GRANTS FOR 'johnDoe'; +------------------------------------------------------------------+ | Grants for johnDoe | +------------------------------------------------------------------+ | GRANT USAGE ON *.* TO `johnDoe` | | GRANT ALL PRIVILEGES ON `db1`.* TO `johnDoe` | +------------------------------------------------------------------+
теперь перезагрузите данные, и операция должна быть разрешена .
источник
Для импорта файла базы данных в
.sql.gz
формате удалите определитель и импортируйте, используя команду нижеРанее можно было экспортировать базу данных в формате .sql.gz, используя команду ниже.
mysqldump -u user -p old_db | gzip -9 > path_to_db_exported.sql.gz;
Импортируйте эту экспортированную базу данных и удалите определитель с помощью команды ниже,
zcat path_to_db_exported.sql.gz | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | mysql -u user -p new_db
источник
При восстановлении резервной копии обязательно попробуйте использовать одно и то же имя пользователя для старого и нового.
источник
Полное решение
Все вышеперечисленные решения подходят. И здесь я объединю все решения, чтобы они работали во всех ситуациях.
Для Linux и Mac
Для Windows
загрузите атом или блокнот ++, откройте файл дампа sql с помощью atom или notepad ++, нажмите Ctrl + F,
найдите слово DEFINER и удалите строку DEFINER =
admin
@%
(или может немного отличаться для вас) отовсюду и сохраните файл.Как, например,
перед удалением этой строки: CREATE DEFINER =
admin
@%
PROCEDUREMyProcedure
После удаления этой строки: CREATE PROCEDURE
MyProcedure
Пример: откройте Dump2020.sql в Atom, нажмите ctrl + F, найдите SET @@ SESSION.SQL_LOG_BIN = 0 , удалите эту строку.
SET @@SESSION.SQL_LOG_BIN= 0; SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ ''; SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
источник
Я прокомментировал все строки, начинающиеся с
SET
в*.sql
файле, и это сработало.источник
* Ответ может быть применим только к MacOS *
При попытке импортировать файл .sql в контейнер докеров я обнаружил сообщение об ошибке:
Затем, пробуя некоторые другие предложения, я получил следующую ошибку на моем MacOS (osx)
Наконец, следующая команда из этого ресурса разрешила мою проблему «Доступ запрещен».
Поэтому я мог импортировать в базу данных докеров:
Надеюсь это поможет! :)
источник
Необходимо установить "on" серверный параметр "log_bin_trust_function_creators" на стороне сервера. Этот вы легко найдете на лезвии с левой стороны, если это лазурная мария db.
источник
утверждение
это проблема в резервной копии.
Решение, которое вы можете обойти, - удалить все записи из файла дампа sql и импортировать данные из консоли GCP.
Попробуйте импортировать новый файл (NEW-CLEANED-DUMP.sql).
источник