O DBA enfrenta em seu dia a dia muita solicitações e entre elas, muitas vezes temos que refazer a instância por diversos motivos, como erro na instância, atualização de versão ou até mesmo a criação de novo ambiente de homologação ou separação de schema.
E pensando nesse momento que nos deparamos com essa situação, precisamos copiar os usuários de uma instalação para outra.
Nesse artigo vou mostrar duas ferramentas que nos auxilia nessa tarefa, e comparar o seu funcionamento e caracteristicas.
Vamos utilizar o “mysqlpump”, que já vem nativo junto com o MySQL, e também o Percona Tools “pt-show-grants”.
Primeiros passos: antes de iniciarmos, temos que fazer a seguinte análise: user, host e plugin. Isso é muito importante porque pode ter alguns usuários que tenham algum plugin de conexão específico.
Também vale a pena reforçar que o plugin mysql_native_password precisa ser habilitado para uso na versão 8.4 e está extinto na versão 9.x em diante. Então, se tiver algum usuário nessa situação, ele precisa ser recriado com o novo método de plugin.
O mysqlpump, com o recurso de exportar usuários, surgiu a partir da versão 5.7.8, com CREATE USER e seus respectivos GRANTs. Na versão 5.7.26, houve uma correção importante relacionada ao funcionamento do recurso --users.
Conhecendo os plugins de nosso ambiente
Vamos explorar previamente se precisamos de algum plugin específico e também nossos usuários.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
mysql> select count(0), plugin from mysql.user group by plugin; +----------+-----------------------+ | count(0) | plugin | +----------+-----------------------+ | 8 | caching_sha2_password | | 2 | mysql_native_password | | 1 | auth_socket | +----------+-----------------------+ 3 rows in set (0.00 sec) mysql> select user, host, plugin from mysql.user ; +------------------+----------------+-----------------------+ | user | host | plugin | +------------------+----------------+-----------------------+ | HR | % | caching_sha2_password | | clone | % | caching_sha2_password | | sistema | 192.% | mysql_native_password | | userlab | 192.% | caching_sha2_password | | clone_user | 192.168.18.122 | caching_sha2_password | | bkpsys | localhost | mysql_native_password | | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | | root | localhost | caching_sha2_password | | vagrant | localhost | auth_socket | +------------------+----------------+-----------------------+ 11 rows in set (0.00 sec) mysql> show plugins; +------------------------------------------+----------+--------------------+-----------------------+---------+ | Name | Status | Type | Library | License | +------------------------------------------+----------+--------------------+-----------------------+---------+ ... | mysql_no_login | ACTIVE | AUTHENTICATION | mysql_no_login.so | GPL | | auth_socket | ACTIVE | AUTHENTICATION | auth_socket.so | GPL | | CONNECTION_CONTROL | ACTIVE | AUDIT | connection_control.so | GPL | | CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS | ACTIVE | INFORMATION SCHEMA | connection_control.so | GPL | +------------------------------------------+----------+--------------------+-----------------------+---------+ 53 rows in set (0.00 sec) mysql> |
Já damos de cara com nosso primeiro desafio. Não achou que ia ser tão fácil ?
Temos um plugin auth_socket instalado. Então, para que funcione 100%, teremos que manter o mesmo plugin em ambos. Caso contrário, dará erro de execução para o usuário que utiliza o mesmo.
Ambiente mapeado, vamos partir para a exportação dos usuários.
1. Primeiro vamos analisar o mysqlpump
|
1 2 3 4 5 |
[root@ol10lab /]# mysqlpump -uuserlab -p -h192.168.18.121 -P3306 --exclude-databases=% --users > pump_user.sql WARNING: mysqlpump is deprecated and will be removed in a future version. Use mysqldump instead. Enter password: Dump completed in 97 [root@ol10lab /]# |
Ele é bem simples e segue o padrão do client MySQL.
mysqlpump -> utilitário
-p -> password (senha)
-h -> host
-P -> porta
–exclude-databases=% -> (para não pegar nenhuma base de dados, queremos apenas os usuários)
–users -> usuários (todos eles, é possível excluir ou adicionar um específico)
> -> saída para o arquivo “pump_user.sql”
Comandos úteis que vou sugerir:
–add-drop-user -> (adiciona DROP USER antes de criar)
–include-user= -> (filtra por usuários desejados)
–exclude-user= -> (filtra por usuários indesejados)
Agora vamos ver o arquivo que foi gerado “pump_user.sql”
2. Vamos analisar o pt-show-grants
|
1 2 |
[root@ol10lab /]# pt-show-grants -uuserlab --ask-pass -h192.168.18.121 -P3306 > pt_user.sql Enter password: |
O pt-show-grants, por sua vez, é muito mais completo e cheio de recursos.
pt-show-grants -> utilitário
-u -> usuário
–ask-pass -> para perguntar a senha, não é o “-p”
-h -> host
-P -> porta do banco
> -> saída para o arquivo pt_user.sql
Comandos úteis que irei sugerir:
–separate -> organiza/separa os comandos individualmente por grant
–drop -> DROP USER antes de criar
–revoke -> monta um comando de REVOKE se precisar, está na mão
–convert-MariaDB -> converte grants do MariaDB para o MySQL
Algo que eu percebi nele é que deixa o arquivo bem mais assertivo e a conversão da senha para o padrão binário, como podemos ver na foto abaixo.
Exportação manual e conversão para binário
Agora vamos fazer uma exportação manual e com a conversão para binário.
O parâmetro global foi introduzido no MySQL 8.0.17, print_identified_with_as_hex, e realiza a conversão da senha para o tipo binário.
Na demonstração abaixo:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
mysql> show create user clone_user@'192.168.18.122'\G *************************** 1. row *************************** CREATE USER for clone_user@192.168.18.122: CREATE USER `clone_user`@`192.168.18.122` IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$r5\\PN\rS?3wh)=#XIpi6dH/JV/b4EKwTQVmghZ78pTzhQHa0aXShtXn7yv4' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT 1 row in set (0.00 sec) mysql> set global print_identified_with_as_hex=1; Query OK, 0 rows affected (0.00 sec) mysql> connect Connection id: 80 Current database: *** NONE *** mysql> show create user clone_user@'192.168.18.122'\G *************************** 1. row *************************** CREATE USER for clone_user@192.168.18.122: CREATE USER `clone_user`@`192.168.18.122` IDENTIFIED WITH 'caching_sha2_password' AS 0x244124303035241C72355C504E120D537E083F337768291C3D23584970693664482F4A562F6234454B775451566D67685A373870547A68514861306158536874586E37797634 REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT 1 row in set (0.00 sec) mysql> show grants for clone_user@'192.168.18.122'\G *************************** 1. row *************************** Grants for clone_user@192.168.18.122: GRANT USAGE ON *.* TO `clone_user`@`192.168.18.122` *************************** 2. row *************************** |
Conclusão
Agora já temos os usuários em mãos para a criação na nova versão, ambas as ferramentas funcionam perfeitamente, cada uma com suas vantagens.
O mysqlpump, que na minha opinião já vem nativo ao MySQL, para uma cópia simples é uma excelente alternativa, se estiver acima nas versões acima de : 5.7.26
Já o Percona pt-show-grants nos traz novas possibilidades de organização, REVOKE dos grants e conversão de MariaDB para MySQL, demonstrando ser mais completo e com mais recursos.
Ambas são excelentes. O importante é saber usar e como usar.
Referencias:
https://dev.mysql.com/doc/refman/8.0/en/mysqlpump.html
https://docs.percona.com/percona-toolkit/pt-show-grants.html








