我有一个现有的MySQL实例(test),包含两个数据库和几个用户,每个用户对每个数据库都有不同的访问权限.

我现在需要复制一个与之相关的数据库(进入生产).

复制数据库的次数为easy次:

出口:

mysqldump --no-data --tables -u root -p secondb >> secondb_schema.sql

进口:

mysql -u root -p -h localhost secondb < secondb_schema.sql

然而,我没有找到一种直接的方法从command line(mysql内部或外部)导出和导入users.

如何从命令行导入和导出?


Update:到目前为止,我已经找到了实现这一点的手动(因此容易出错)步骤:

-- lists all users
select user,host from mysql.user;

然后找到它的资助:

-- find privilege granted to a particular user
show grants for 'root'@'localhost'; 

然后使用上面"show grants"命令的结果中列出的授权创建用户.

我更喜欢更安全、更自动化的方式.有吗?

推荐答案

我发现导出用户最简单的方法之一是使用Percona的工具pt show grants.Percona工具包是免费的,易于安装,易于使用,包含大量文档.

shell> pt-show-grants --only test_user

该命令的输出示例:

GRANT USAGE ON *.* TO 'test_user'@'%' IDENTIFIED BY PASSWORD '*06406C868B12689643D7E55E8EB2FE82B4A6F5F4';
GRANT ALTER, INSERT, LOCK TABLES, SELECT, UPDATE ON `test`.* TO 'test_user'@'%';

我通常会将输出重新定向到一个文件中,以便编辑所需内容,或将其加载到mysql中.

或者,如果您不想使用Percona工具,并且想对所有用户进行转储,您可以以以下方式使用mysqldump:

shell> mysqldump mysql --tables user db > users.sql

注意:--刷新权限不适用于此,因为不会转储整个数据库.这意味着您需要手动运行它.

shell> mysql -e "FLUSH PRIVILEGES"

Mysql相关问答推荐

一次又一次地删除事件行

找出同一表中列A中的每个值在列B中出现的次数

MySQL:统计单词在单元格中出现的次数,并将数字放在bra中单词的旁边

使用NOT EXISTS()时出现MySQL查询错误

如何在 MySQL 中对同一个表的多个列进行 INNER JOIN

Golang中使用Gorm的Where条件转义字符无法正常工作的问题

条件触发mysql

根据 MySql 中同一表中的多列 Select 多列

如何在Mysql中使用With和Values

如何优化使用多个 LEFT JOIN 和 GROUP BY 子句的慢速 MySQL 查询?

0000-00-00 00:00:00 表中的日期设置为 NOT NULL

从三个不同的表中生成两列,并使用分组变量计算这些列的比率

计算每个用户在第二个表中有多少条记录

MySQL中两个时间字段的分钟差

主键应该始终是无符号的?

If else on WHERE 子句

如何在 MySQL 中 Select 字段具有最小值的数据?

如何在sequelize中定义多列的唯一索引

一次查询 MySQL 插入多行

在mysql中复制没有数据的数据库 struct (带有空表)