我正在使用 mysqldump 创建供开发人员使用的实时应用程序的数据库转储。
此数据包含客户数据。我想匿名化这些数据,即删除客户姓名/信用卡数据。
一个选项是:
- 创建数据库副本(创建转储和导入转储)
- 触发对数据进行匿名化的 SQL 查询
- 转储新数据库
但这有很多开销。更好的解决方案是在转储创建期间进行匿名化。
我想我最终会解析所有mysqlsqldump
输出?有没有更智能的解决方案?
如果要随机化数据,为什么要从表中进行选择?
做一个mysqldump
可以安全转储数据的表(配置表等),以及一个mysqldump
只包含结构的敏感表。
然后,在您的应用程序中,您可以根据随机创建的数据为敏感表构造 INSERT 语句。
几天前我不得不开发类似的东西。我不能这样做INTO OUTFILE
,因为数据库是 AWS RDS。我最终采用了这种方法:
从某个表中以表格文本形式转储数据:
mysql -B -e 'SELECT `address`.`id`, "address1" , "address2", "address3", "town", "00000000000" as `contact_number`, "example@example.com" as `email` FROM `address`' some_db > addresses.txt
然后导入它:
mysql --local-infile=1 -e "LOAD DATA LOCAL INFILE 'addresses.txt' INTO TABLE \`address\` FIELDS TERMINATED BY '\t' ENCLOSED BY '\"' IGNORE 1 LINES" some_db
执行此操作只mysql
需要命令。
由于导出非常快(大约 30.000 行需要几秒钟),导入过程有点慢,但仍然很好。我不得不在途中加入几张桌子,并且有一些外键,所以如果你不需要它肯定会更快。此外,如果您在导入时禁用外键检查,它也会加快速度。
您还可以使用SELECT查询中的 SELECT ... INTO OUTFILE 语法来使用列过滤器进行转储。
您可以选择每个表(而不是选择 *)并指定您想要拥有的列并省略或空白那些您不想拥有的列,然后为每个查询使用 phpmyadmin 的导出选项。
我发现了类似的问题,但看起来你想要的没有简单的解决方案。您必须自己编写自定义导出。
phpMyAdmin 为基于 SQL 查询的 SQL 格式提供导出选项。从 PHPmyadmin(可能已经过良好测试)中提取此代码并在此应用程序中使用它可能是一个选项。