Eu tenho um despejo do MySQL de um dos meus bancos de dados. Nele, existem cláusulas DEFINER que se parecem com,
"DEFINER=`root`@`localhost`"
Ou seja, essas cláusulas DEFINER estão em minhas instruções CREATE VIEW e CREATE PROCEDURE. Existe uma maneira de remover essas cláusulas DEFINER do meu arquivo de despejo?
Respostas:
Não acho que haja uma maneira de ignorar a adição de
DEFINER
s ao dump. Mas há maneiras de removê-los após a criação do arquivo de despejo.Abra o arquivo de despejo em um editor de texto e substitua todas as ocorrências de
DEFINER=root@localhost
por uma string vazia ""Edite o dump (ou canalize a saída) usando
perl
:Canalize a saída através de
sed
:fonte
sed -E 's/DEFINER=
[^]+
@[^
] +/DEFINER=CURRENT_USER/g' dump.sql > new_dump.sql
Tem a vantagem de manter restrições / controle de acesso.sed
comando não remove a cláusula DEFINER de procedimentos e funções. Aqui está a versão aprimorada que lida com visualizações, gatilhos, procedimentos e funções:sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | sed -e 's/DEFINER[ ]*=[ ]*[^*]*PROCEDURE/PROCEDURE/' | sed -e 's/DEFINER[ ]*=[ ]*[^*]*FUNCTION/FUNCTION/'
Você pode remover usando SED
Em MacOS:
fonte
-i extension
"Editar arquivos no local, salvando backups com a extensão especificada. Se uma extensão de comprimento zero for fornecida, nenhum backup será salvo. Não é recomendado fornecer uma extensão de comprimento zero quando arquivos de edição no local, pois você corre o risco de corromper ou conteúdo parcial em situações em que o espaço em disco se esgota, etc. "Desde a versão 5.7.8 do mysql você pode usar a
--skip-definer
opção com mysqlpump, por exemplo:Consulte o manual atualizado do mysql em http://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#option_mysqlpump_skip-definer
fonte
mysqldump
emysqlpump
- aqui está a pergunta relacionada: dba.stackexchange.com/questions/118846/mysqldump-vs-mysqlpumpinformation_schema.user
, e nem sempre é legível para todos os usuáriosUsei essas ideias para remover a cláusula DEFINER de minha própria saída do mysqldump, mas optei por uma abordagem mais simples:
Apenas remova o
!
antes do código e o DEFINER, e o resto do comentário se torna um comentário normal.Exemplo:
fica desamparado, tão pouco quanto fazer isso ..
A regexp mais fácil, porém, é remover o! e os números
Isso remove
!#### DEFINER
e substitui o DEFINER ... você também poderia remover o DEFINER, realmente não importa - uma vez que o "!" se foifonte
De acordo com as recomendações do outro, aqui está um exemplo de como remover o DEFINER do dump, após o término do dump:
fonte
user
@localhost
* / / *! 50003 gatilho my_triggername ANTES DE INSERIR EM my_table PARA CADA LINHA .... * / ;; egrep -v
eliminará totalmente essas linhas. (embora 50017! = 50013)Como outros mencionaram, remover o definidor com qualquer tipo de expressão regular não é muito complexo. Mas os outros exemplos eliminaram as definições de exibição para mim.
Esta é a expressão regular que funcionou para mim:
fonte
*/
. MySQL 5.6.31.Para uma solução automatizada, você pode olhar
mysqlmigrate
. É um wrapper Bashmysqldump
que permite a você migrar bancos de dados e ignorar as instruções DEFINER. Exemplo:http://thesimplesynthesis.com/post/mysqlmigrate (ou GitHub )
Caso contrário, sim, um comando como Abhay aponta é necessário:
fonte
Outra opção no OSX para remover definidores no arquivo:
fonte
Você deve procurar a resposta aqui: /dba/9249/how-do-i-change-the-definer-of-a-view-in-mysql/29079#29079
A melhor maneira, em minha opinião, de resolver este problema, é não adicionar uma análise extra de string com sed ou grep ou qualquer outro, em vez disso, o mysqldump é capaz de gerar um bom dump adicionando - single-transaction
fonte
Uma maneira rápida de fazer isso é canalizar a saída do mysqldump por meio do sed para remover as
DEFINER
instruções contidas em comentários condicionais. Eu uso isso para removerDEFINER
a partir deCREATE TRIGGER
declarações, mas você pode ajustar o número da versão condição comentário na regex para atender às suas finalidades.fonte
Não tenho certeza se ajuda, mas eu uso o SQLyog Community Edition, disponível em: -
https://code.google.com/p/sqlyog/wiki/Downloads
Ao despejar sql ou copiar para outro banco de dados, ele permite que você 'Ignore o DEFINER'
É gratuito e fornece a funcionalidade básica que muitas pessoas precisam
Também existe uma versão paga disponível em: -
https://www.webyog.com/product/sqlyog
Felicidades
fonte
Para mim, isso funciona:
perl -p -i.bak -e "s/DEFINER=[^ |\s]*//g" yourdump.dmp
. Isso removeu DEFINER = root @ localhost do meu dump, em cada instrução de procedimento de criaçãofonte
Aqui está uma solução de trabalho completa para remover informações do DEFINER para
MySQL 5.6.x
e Linux. (Testado emCentOS 6.5
).Normalmente, temos que substituir as seguintes entradas de despejo do Mysql (se tomadas junto com dados e gatilhos / rotinas / funções).
O dump foi feito com o comando mysqldump abaixo.
O arquivo de despejo necessário sem informações do DEFINER pode ser obtido com os três comandos abaixo.
Se o arquivo de despejo estiver na pasta atual, ignore [PATH /].
Se os dados nas tabelas forem muito grandes, faça o despejo em dois arquivos, em um arquivo despeje o despejo com os dados e em outro arquivo de despejo apenas faça o despejo dos scripts (acionadores / funções / procedimentos.) E execute os três acima comandos no segundo arquivo de despejo (scripts).
fonte
Substitua todos os seus usuários definidores por CURRENT_USER. No meu script Gradle que cria o backup, meu script de substituição se parece com:
que realmente é apenas chamar ANT. Então você não terá que se preocupar com isso.
fonte
Em máquinas Linux, você pode usar este one-liner:
Você só precisa substituir as cadeias de caracteres em negrito pelas credenciais do usuário do banco de dados e nome / padrão do banco de dados.
Mais informações aqui: http://blog.novoj.net/2014/05/16/recreate-mysql-views-without-definer-one-liner-solution-linux/
fonte
A única maneira de fazê-lo funcionar no Windows:
Instale http://gnuwin32.sourceforge.net/ para ter sed na linha de comando e adicione-o ao PATH do Windows : D: \ programs \ GetGnuWin32 \ bin;
fonte
Obrigado a todos pelas dicas. Por ser preguiçoso, escrevi um script chamado: "MYsqldump":
fonte
Para algo como:
Experimente isto:
fonte
abra seu banco de dados com qualquer editor, usei com o notepad ++,
encontre todos os testes
DEFINER=root@localhost
e substitua por nothing (""
) IE. delete isso.Em seguida, você pode importá-lo para qualquer host que desejar.
fonte
O regex mais simples que funciona para mim com todos os objetos é:
Observe que
quote-names
tem que serTRUE
(o que é por padrão).Espero que nas versões mais recentes a opção
--skip-definer
introduzida no mysqlpump na versão 5.7 chegue ao mysqldump também.fonte
Usei o script do PowerShell para remover todas as linhas com
DEFINER
:get-content $ file_in_full_path | select-string -pattern $ line_string_delete -notmatch | Out-File -width 1000000000 -Encoding Default $ file_out_full_path
fonte
Nada estava funcionando para mim, então precisei escrever minha própria regex.
Tente despejar seu banco de dados em um arquivo,
cat
um arquivo inteiro egrep
apenas suas declarações definidoras para vê-los.cat file.sql | grep -o -E '. {, 60} DEFINER. {, 60}'
Escreva sua regex
Canalize seu dump em sed com este regex. Por exemplo, a minha declaração é:
mysqldump | sed -E 's // *! 500 [0-9] [0-9] DEFINER =. +? * ///' | sed -E 's / DEFINER =
?[^ ]+?
? @?[^ ]+?
? //'Lucro!
fonte
remove_definers.bat:
fonte