Como copiar privilégios de usuário com o MySQL?

11

Eu tenho uma instalação do MySQL com muitos bancos de dados e usuários que eu preciso migrar para uma nova instalação do MySQL. Eu posso usar o phpMyAdmin para exportar e depois importar os bancos de dados / tabelas, mas não sei de nada para mover os usuários e permissões. Como posso fazer isso facilmente?

    
por Nathan Osman 23.01.2010 / 08:21

3 respostas

15

Um script como este usará o cliente mysql cli para imprimir uma série de instruções de concessão que você precisaria usar para recriar as contas de usuário. Este comando funcionará melhor se você tiver suas credenciais de banco de dados armazenadas em você .my.cnf

#!/bin/bash
# adapted from (http://www.pyrosoft.co.uk/blog/2006/10/18/show-grants-for-all-users-on-mysql/)
(
 mysql --batch --skip-column-names -e "SELECT user, host FROM user" mysql 
) | while read user host
do
  echo "# $user @ $host"
  mysql --batch --skip-column-names -e"SHOW GRANTS FOR '$user'@'$host'"
done

Se você está pulando de uma versão do mysql para outra, você pode querer usar isto ao invés de simplesmente descarregar o banco de dados mysql. O esquema do banco de dados mysql ocasionalmente é atualizado.

Isso também permitirá que você escolha e escolha as contas que deseja recriar, se houver alguma coisa que você queira eliminar.

Eu estava recentemente usando isso em um usuário que incluía espaços em nomes, o que confundiu read , já que o IFS, por padrão, inclui o caractere de espaço como um separador. Meu novo e melhorado comando, que parecia funcionar melhor em nomes estranhos de sistemas.

IFS=$'\t'; while read user host; do
  echo "user:$user host:$host"
  mysql --batch --skip-column-names -e"SHOW GRANTS FOR '$user'@'$host'"
  echo ""
done < <(mysql --batch --skip-column-names -e "SELECT user, host FROM mysql.user")
    
por 23.01.2010 / 09:58
3

Isso criará um arquivo SHOW GRANTS; para cada usuário.

Em seguida, faça eco de cada usuário SHOW GRANTS; e acrescente um ponto e vírgula a cada linha.

MYSQL_CONN="-uroot -prootpassword"
SQLSTMT="SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';')"
SQLSTMT="${SQLSTMT} FROM mysql.user WHERE user<>''"
mysql ${MYSQL_CONN} -ANe"${SQLSTMT}" > /tmp/ShowGrants.sql
mysql ${MYSQL_CONN} -ANe < /tmp/ShowGrants.sql | sed 's/$/;/g' > MySQLUserGrants.sql
rm -f /tmp/ShowGrants.sql

Você também pode fazer o download e usar essas ferramentas para fazer o mesmo:

Experimente!

    
por 08.08.2013 / 05:09
2

Acredito que você possa migrar esses dados fazendo backup e restaurando o banco de dados mysql .

    
por 23.01.2010 / 08:41