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

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

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 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?

Responder1

Um script como este usará o cliente mysql cli para imprimir uma série de declarações de concessão que você precisaria usar para recriar as contas de usuário. Este comando funcionará melhor se você tiver as credenciais do seu banco de dados armazenadas em seu .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ê estiver saltando de uma versão do MySQL para outra, você pode querer 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ê gostaria de eliminar.


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

Responder2

Isso criará um SHOW GRANTS;arquivo 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} -AN < /tmp/ShowGrants.sql | sed 's/$/;/g' > MySQLUserGrants.sql
rm -f /tmp/ShowGrants.sql

Você também pode baixar e usar estas ferramentas para fazer a mesma coisa:

De uma chance !!!

Responder3

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

informação relacionada