【TiDB 使用环境】生产环境 /测试/ Poc
【TiDB 版本】 V6.1.5
【遇到的问题:问题现象及影响】
目前想把Tidb得部分数据库迁移到mysql库,如何能把用户和权限一起迁移过去。
现在查看到tidb得用户密码是密文,不能直接使用。
问题:
1、是否有一键迁移方案?
2、如何把用户、密码、权限导出为可执行得sql脚本?
pt-show-grants工具
高版本才有吧
下载第三方工具pt-show-grants,然后类似下面,就可以打印用户和权限出来,很方便:
pt-show-grants -hxxxx -P4000 -uroot -p
我以前通过拼sql 查看 show create user 和 show grants for 获取创建用户的语句和用户授权的语句
试试这个,不一定对,我没有验证过:
– 声明结束符为//,避免与存储过程中的分号冲突
DELIMITER //
– 创建存储过程用于导出所有用户的账户、密码及权限信息
CREATE PROCEDURE ExportAllUserInfo()
BEGIN
– 声明变量
DECLARE done INT DEFAULT 0;
DECLARE uname VARCHAR(100);
DECLARE hname VARCHAR(100);
– 声明游标,获取所有用户的用户名和主机名
DECLARE user_cursor CURSOR FOR
SELECT user, host FROM mysql.user;
– 声明异常处理,当游标遍历结束时设置done为1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 创建临时表存储导出的信息
DROP TABLE IF EXISTS temp_user_info;
CREATE TABLE temp_user_info (
info_type VARCHAR(20) NOT NULL COMMENT '信息类型:CREATE_USER或GRANTS',
user_host VARCHAR(200) NOT NULL COMMENT '用户名@主机名',
sql_statement TEXT NOT NULL COMMENT 'SQL语句'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 打开游标
OPEN user_cursor;
-- 循环遍历游标
user_loop: LOOP
FETCH user_cursor INTO uname, hname;
IF done THEN
LEAVE user_loop;
END IF;
-- 插入创建用户的SQL语句(包含账户和密码)
SET @create_user_sql = CONCAT('INSERT INTO temp_user_info (info_type, user_host, sql_statement) VALUES (''CREATE_USER'', ''', uname, '@', hname, ''', (SELECT CONCAT(''CREATE USER '', QUOTE(user), ''@'', QUOTE(host), '' IDENTIFIED BY PASSWORD ''', ''', authentication_string, ''');'') FROM mysql.user WHERE user = ''', uname, ''' AND host = ''', hname, '''))');
PREPARE stmt FROM @create_user_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 插入用户权限的SQL语句
SET @grants_sql = CONCAT('INSERT INTO temp_user_info (info_type, user_host, sql_statement) SELECT ''GRANTS'', ''', uname, '@', hname, ''', CONCAT(GRANT, '';'') FROM (SHOW GRANTS FOR ''', uname, '''@''', hname, ''') AS t (GRANT)');
PREPARE stmt FROM @grants_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP user_loop;
-- 关闭游标
CLOSE user_cursor;
-- 查询临时表,展示所有导出的信息
SELECT * FROM temp_user_info ORDER BY user_host, info_type;
END //
– 恢复结束符为分号
DELIMITER ;
– 调用存储过程,导出所有用户的账户、密码及权限信息
CALL ExportAllUserInfo();
– 如果需要清理临时表,可以执行以下语句
– DROP TABLE IF EXISTS temp_user_info;
– 如果需要删除存储过程,可以执行以下语句
– DROP PROCEDURE IF EXISTS ExportAllUserInfo;

