【发布时间】:2013-01-07 15:55:40
【问题描述】:
我正在使用 mysqldump 创建供开发人员使用的实时应用程序的 DB 转储。
此数据包含客户数据。我想匿名化这些数据,即删除客户姓名/信用卡数据。
一个选项是:
- 创建数据库副本(创建转储和导入转储)
- 触发对数据进行匿名化的 SQL 查询
- 转储新数据库
但这需要很多开销。 更好的解决方案是在转储创建期间进行匿名化。
我想我最终会解析所有mysqlsqldump 输出?有没有更智能的解决方案?
【问题讨论】:
我正在使用 mysqldump 创建供开发人员使用的实时应用程序的 DB 转储。
此数据包含客户数据。我想匿名化这些数据,即删除客户姓名/信用卡数据。
一个选项是:
但这需要很多开销。 更好的解决方案是在转储创建期间进行匿名化。
我想我最终会解析所有mysqlsqldump 输出?有没有更智能的解决方案?
【问题讨论】:
如果要随机化数据,为什么要从表中进行选择?
对可安全转储数据的表(配置表等)进行mysqldump,对敏感表仅使用结构进行mysqldump。
然后,在您的应用程序中,您可以根据随机创建的数据为敏感表构造 INSERT 语句。
【讨论】:
mysqldump 逻辑,而是在构建 SQL 查询。 mysqldump 的工作是转储表中的数据并将其反向工程回查询。但是您不想要表格中的数据……您想要自己的数据。
mysqldump 逻辑但也想要自己的数据。
【讨论】:
几天前我不得不开发类似的东西。我做不到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 行只需几秒钟),导入过程会慢一些,但仍然可以。我不得不在途中加入几张桌子,并且有一些外键,所以如果你不需要它肯定会更快。此外,如果您在导入时禁用外键检查,也会加快速度。
【讨论】:
您可以选择每个表(而不是选择 *)并指定您想要拥有的列并省略或空白那些您不想拥有的列,然后为每个查询使用 phpmyadmin 的导出选项.
【讨论】:
您还可以使用SELECT 查询中的 SELECT ... INTO OUTFILE 语法通过列过滤器进行转储。
【讨论】:
SELECT uid, name, 'test@example.org' AS email INTO OUTFILE '/tmp/anonymised.sql' FROM users 和 LOAD DATA INFILE '/tmp/anonymised.sql' INTO TABLE users 似乎可以很好地协同工作。我会从那里开始。
我发现了类似的问题,但您想要的似乎没有简单的解决方案。您必须自己编写自定义导出。
【讨论】:
phpMyAdmin 为基于 SQL 查询的 SQL 格式提供导出选项。可以选择从 PHPmyadmin 中提取此代码(可能已经过良好测试)并在此应用程序中使用它。
【讨论】: