Então eu tento importar o arquivo sql para rds (1G MEM, 1 CPU). O arquivo sql é como 1.4G
mysql -h xxxx.rds.amazonaws.com -u user -ppass --max-allowed-packet = 33554432 db <db.sql
Ele ficou preso em:
ERROR 1227 (42000) at line 374: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
O conteúdo real do 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
não existe no rds, então eu faço:
GRANT ALL PRIVILEGES ON db.* TO another_user@'localhost';
Ainda sem sorte.
mysql
amazon-web-services
amazon-rds
kenpeter
fonte
fonte
DEFINER
quando o usuário conectado não tem oSUPER
privilégio (o que não é permitido no RDS) permitiria o escalonamento arbitrário de privilégios - programas armazenados executados com as credenciais e privilégios de seusDEFINER
(em oposição aos do usuário que faz a chamada - o delesINVOKER
), por padrão. Também em Server Fault .sed 's/\sDEFINER=`[^`]*`@`[^`]*`//' -i oldfile.sql
awk
que pode ser um pouco mais rápido do quesed
Se o seu arquivo de despejo não tiver
DEFINER
, certifique-se de que essas linhas abaixo também sejam removidas, se estiverem lá, ou comentadas com--
:No começo:
-- SET @@SESSION.SQL_LOG_BIN= 0; -- SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
No fim:
-- SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
fonte
--set-gtid-purged=OFF
ao seumysqldump
comando. Encontrado aqui: stackoverflow.com/a/56251925Outro truque útil é invocar o mysqldump com a opção --set-gtid-purged = OFF, que não grava as seguintes linhas no arquivo de saída:
SET @@SESSION.SQL_LOG_BIN= 0; SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ ''; SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
não tenho certeza sobre o DEFINER.
fonte
SET @@GLOBAL.GTID_MODE = OFF;
MySql Workbench no lado de exportação do banco de dados de origemApenas uma atualização extra do MacOS para a resposta do hjpotter92.
Para fazer
sed
reconhecer o padrão no MacOS, você terá que adicionar uma barra invertida antes do=
sinal, assim:fonte
Problema : você está tentando importar dados (usando o arquivo mysqldump) para seu banco de dados mysql, mas parece que você não tem permissão para realizar essa operação.
Solução : Supondo que seus dados sejam migrados, propagados e atualizados em seu banco de dados mysql, tire um instantâneo usando mysqldump e exporte-o para o arquivo
mysqldump -u [username] -p [databaseName] --set-gtid-purged=OFF > [filename].sql
Em seguida, conecte-se ao seu mysql com o usuário root, dê permissões, libere-as e verifique se seus privilégios de usuário foram atualizados corretamente.
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` | +------------------------------------------------------------------+
agora recarregue os dados e a operação deve ser permitida .
fonte
Para importar arquivo de banco de dados em
.sql.gz
formato, remova definidor e importe usando o comando abaixoAnteriormente, exporte o banco de dados no formato .sql.gz usando o comando abaixo.
mysqldump -u user -p old_db | gzip -9 > path_to_db_exported.sql.gz;
Importe esse banco de dados exportado e remova o definidor usando o comando abaixo,
zcat path_to_db_exported.sql.gz | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | mysql -u user -p new_db
fonte
Ao restaurar o backup, certifique-se de tentar com o mesmo nome de usuário do antigo e do novo.
fonte
Solução Completa
Todas as soluções acima estão bem. E aqui vou combinar todas as soluções para que funcione em todas as situações.
Para Linux e Mac
Para
baixar o atom ou notepad ++ para Windows , abra seu arquivo dump sql com atom ou notepad ++, pressione Ctrl + F,
pesquise a palavra DEFINER e remova a linha DEFINER =
admin
@%
(ou pode ser um pouco diferente para você) de todos os lugares e salve o arquivo.Por exemplo,
antes de remover essa linha: CREATE DEFINER =
admin
@%
PROCEDUREMyProcedure
Depois de remover essa linha: CREATE PROCEDURE
MyProcedure
Exemplo: Abra Dump2020.sql no Atom, pressione ctrl + F, pesquise SET @@ SESSION.SQL_LOG_BIN = 0 , remova essa linha.
SET @@SESSION.SQL_LOG_BIN= 0; SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ ''; SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
fonte
Comentei que todas as linhas começam com
SET
no*.sql
arquivo e funcionou.fonte
* A resposta só pode ser aplicável a MacOS *
Ao tentar importar um arquivo .sql para um contêiner do docker, encontrei a mensagem de erro:
Então, enquanto tentava algumas das outras sugestões, recebi o erro abaixo no meu MacOS (osx)
Finalmente, o seguinte comando deste recurso resolveu meu problema de "Acesso negado".
Então, eu poderia importar para o banco de dados do docker com:
Espero que isto ajude! :)
fonte
É necessário definir o parâmetro "on" do servidor "log_bin_trust_function_creators" no lado do servidor. Este você pode encontrar facilmente na lâmina do lado esquerdo se for azul maria db.
fonte
Declaração
é um problema em seu despejo de backup.
A solução que você pode contornar é remover todas as entradas do arquivo sql dump e importar dados do console do GCP.
Tente importar um novo arquivo (NEW-CLEANED-DUMP.sql).
fonte