Tidb如何导出用户和权限(用户迁移)

【TiDB 使用环境】生产环境 /测试/ Poc
【TiDB 版本】 V6.1.5
【遇到的问题:问题现象及影响】
目前想把Tidb得部分数据库迁移到mysql库,如何能把用户和权限一起迁移过去。
现在查看到tidb得用户密码是密文,不能直接使用。
问题:
1、是否有一键迁移方案?
2、如何把用户、密码、权限导出为可执行得sql脚本?

pt-show-grants工具

高版本才有吧

这个也能从tidb导出么? :thinking:

这个是第三方的,看官方介绍,貌似是可以的。https://docs.percona.com/percona-toolkit/pt-show-grants.html


也可以参考这里,这里有案例

下载第三方工具pt-show-grants,然后类似下面,就可以打印用户和权限出来,很方便:
pt-show-grants -hxxxx -P4000 -uroot -p

我以前通过拼sql 查看 show create user 和 show grants for 获取创建用户的语句和用户授权的语句

1 个赞

试试这个,不一定对,我没有验证过:
– 声明结束符为//,避免与存储过程中的分号冲突
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;