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

12

Eu tenho uma instalação do MySQL com muitos bancos de dados e usuários que preciso migrar para uma nova instalação do MySQL. Posso usar o phpMyAdmin para exportar e 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?

Nathan Osman
fonte

Respostas:

17

Um script como esse 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 usar isso em vez de simplesmente despejar o banco de dados mysql. O esquema do banco de dados mysql ocasionalmente é atualizado.

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


Recentemente, eu estava usando isso em um usuário que incluía espaços nos nomes, o que confundia read, pois o IFS por padrão inclui o caractere de espaço como um separador. Meu comando novo e aprimorado, que parecia funcionar melhor em nomes de usuário estranhos dos 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")
Zoredache
fonte
3

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

Em seguida, faça eco a cada usuário SHOW GRANTS;e adicione 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 baixar e usar essas ferramentas para fazer a mesma coisa:

De uma chance !!!

RolandoMySQLDBA
fonte
2

Eu acredito que você deve poder migrar esses dados fazendo backup e restaurando o mysqlbanco de dados.

pkaeding
fonte
Em particular a tabela mysql.user
Coops
2
Você precisa garantir que ambas as instâncias do MySQL estejam executando a mesma versão principal, caso contrário, você precisará executar scripts de atualização fornecidos com o servidor MySQL de destino.
Maxwell