一聚教程网:一个值得你收藏的教程网站

热门教程

如何备份和还原MySQL账号及授权信息

时间:2026-08-30 19:49:49 编辑:袖梨 来源:一聚教程网

<p>能,但需显式指定mysql库及权限表并授权:GRANT SELECT ON mysql.* TO 'root'@'localhost'; FLUSH PRIVILEGES; 用mysqldump -u root -p --skip-lock-tables --no-create-info --skip-triggers mysql user db tables_priv等导出,还原后必须执行FLUSH PRIVILEGES。</p>

mysqldump 能不能直接备份用户账号?

不能。默认情况下 mysqldump --all-databases 不会导出 mysql 库里的权限表(如 userdbtables_priv 等),除非显式指定要备份该库,且用户有足够权限读取这些系统表。

更关键的是:MySQL 8.0+ 默认启用 caching_sha2_password 认证插件,其密码哈希存储在 mysql.user 表的 authentication_string 字段里——但直接导出并还原这个字段,在目标实例版本不一致或插件未启用时,会导致账号无法登录。

  1. mysqldump -u root -p mysql 可以导出用户表,但还原后需手动刷新权限:FLUSH PRIVILEGES;
  2. 若只备份业务库(如 mysqldump -u root -p myapp),mysql 库完全不会被包含
  3. 使用 --skip-lock-tables--single-transactionmysql 库无效,该库不支持事务

正确备份账号和授权信息的操作方式

最稳妥的方式是单独导出 mysql 库,并配合 --skip-triggers 和显式指定表,避免触发器干扰;同时建议用 --no-create-info 避免建表语句冲突(因系统表结构可能随版本变化)。

推荐命令:

mysqldump -u root -p --no-create-info --skip-triggers mysql user db tables_priv columns_priv procs_priv proxies_priv > mysql_grants_backup.sql
  1. --no-create-info:跳过 CREATE TABLE 语句,防止还原时因表结构差异报错
  2. --skip-triggersmysql 库中部分表(如 user)有触发器,不跳过可能在导入时报错
  3. 只导出核心权限表,不包括日志类表(如 general_logslow_log),减少冗余和风险
  4. 务必确保执行用户拥有对 mysql 库所有相关表的 SELECT 权限

还原账号时为什么 FLUSH PRIVILEGES 很关键?

MySQL 不会自动重载权限缓存。即使你用 mysql -u root -p mysql 成功写入了 user 表,新账号或修改后的权限也不会立即生效。

必须手动执行:

mysql -u root -p -e "FLUSH PRIVILEGES;"
  1. 遗漏这步,常见现象是:账号看起来已存在,但用该账号连接时提示 Access denied
  2. FLUSH PRIVILEGES 是唯一可靠方式,重启 MySQL 服务也能生效,但没必要且影响业务
  3. 如果还原的是整个 mysql 库(含非权限表),仍只需执行一次 FLUSH PRIVILEGES,无需逐表处理

跨版本迁移账号时最容易忽略的兼容性问题

MySQL 5.7 和 8.0 的账号体系差异极大,直接还原 mysql.user 表大概率失败。

  1. MySQL 8.0 移除了 Password 字段,改用 authentication_string;5.7 还保留旧字段,混用会丢权限
  2. 8.0 默认认证插件是 caching_sha2_password,而 5.7 是 mysql_native_password;还原后若客户端不支持新插件,连接直接拒绝
  3. 解决办法不是硬拷贝表,而是用 SHOW CREATE USER + SHOW GRANTS 生成可移植的 SQL:
SELECT CONCAT('CREATE USER '', user, ''@'', host, '' IDENTIFIED WITH ', plugin, ' AS '', authentication_string, '';') FROM mysql.user WHERE user != '';nSELECT CONCAT('GRANT ', privilege, ' ON ', `table_schema`, '.', `table_name`, ' TO '', grantee, '';') FROM information_schema.role_table_grants WHERE grantee != '';

这类语句生成的结果才是版本安全、可复用的账号重建脚本。

热门栏目