代码改变世界

MySQL 8 剪切或拷贝用户创建语句

  abce  阅读(61)  评论(0编辑  收藏  举报

有时,查看用户创建语句并将其复制到另一个数据库会很方便。

比如在 MySQL 7 中:

1
2
3
4
mysql> show create user mytest@'%'\G
*************************** 1. row ***************************
CREATE USER for mytest@%: CREATE USER 'mytest'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*DCBCF2313F708DB5A8A1DE2hg4D12AC055AD821A' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK
1 row in set (0.00 sec)

 

不过,由于 MySQL 8.0 默认使用了新的验证方法(cache_sha2_password),这可能会成为一场噩梦,因为输出 binary 格式的数据时,根据使用的终端和字体不同,某些字节可能会被隐藏或解码。

让我们来看看:

1
2
3
4
>show create user myadmin@'%'\G
*************************** 1. row ***************************
CREATE USER for myadmin@%: CREATE USER `myadmin`@`%` IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$<^U\Z@Tfg\n\r^;;cZmLCjbk.f2FDkyHuUeaxQmhTZgtR0EdS4.fqRK6iUUl2' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT
1 row in set (0.01 sec)

把该语句剪切到其它实例执行,就会报错:

1
2
>CREATE USER `myadmin`@`%` IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$<^U\Z@Tfg\n\r^;;cZmLCjbk.f2FDkyHuUeaxQmhTZgtR0EdS4.fqRK6iUUl2' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT;
ERROR 1827 (HY000): The password hash doesn't have the expected format.

要剪切和粘贴验证字符串而不会出现任何问题,解决办法是将其改为二进制表示(十六进制),如下所示:

1
2
3
4
5
6
7
8
>select user,host,authentication_string,convert(authentication_string using binary) authentication_string_bin from mysql.user where user='myadmin'\G
*************************** 1. row ***************************
                     user: myadmin
                     host: %
    authentication_string: $A$005$<^U@Tfg
^;;cZmLCjbk.f2FDkyHuUeaxQmhTZgtR0EdS4.fqRK6iUUl2
authentication_string_bin: 0x244124303035243C17175E551A405466670A0D105E3B3B1E05635A6D4C436A626B2E663246446B79487555656178516D68545A67745230456453342E6671524B366955556C32
1 row in set (0.00 sec)

然后把这里查出的值替换到上面的create user 语句就可以执行了。

1
CREATE USER `myadmin`@`%` IDENTIFIED WITH 'caching_sha2_password' AS '0x244124303035243C17175E551A405466670A0D105E3B3B1E05635A6D4C436A626B2E663246446B79487555656178516D68545A66645230456458842E6671524B366952256C32' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT;

还有一个更简单的方法。mysql 8 提供了一个选项 print_identified_with_as_hex

1
2
3
4
5
6
7
8
9
10
>set print_identified_with_as_hex=1;
Query OK, 0 rows affected (0.00 sec)
 
>show create user myadmin@'%';
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE USER for myadmin@%                                                                                                                                                                                                                                                                                                                                         |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE USER `myadmin`@`%` IDENTIFIED WITH 'caching_sha2_password' AS 0x244124303035243C17175E551A405466670A0D105E3B3B1E05635A6D4C436A626B2E663246446B79487555656178516D68545A66645230456458842E6671524B366952256C32 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)

打开该选项后,就可以直接执行查询出来的 create user 语句了。

除了上面的方法,也可以安装 mysql shell 插件后来实现。插件的地址:https://github.com/lefred/mysqlshell-plugins

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2016-12-29 sp_helpdb
2015-12-29 MySQL和ORACLE、SQL Server、PostgreSQL相比
2015-12-29 MYSQL-使用mysqldump创建数据库快照
2015-12-29 mysqldump: Couldn't execute 'SET OPTION SQL_QUOTE_SHOW_CREATE=1'
2015-12-29 MySQL Cluster
点击右上角即可分享
微信分享提示