uncinc/gdpr-dump

mysqldump的替代品,可选择性地对数据库字段进行清理以更好地符合GDPR规定。

维护者

详细信息

github.com/uncinc/gdpr-dump

源代码

2.0.2 2023-12-14 14:03 UTC

README

mysqldump的替代品,可选择性地对数据库字段进行清理以更好地符合GDPR规定。

它基于ifsnop/mysqldump-php库,原则上可以导出PDO支持的所有数据库。

如何使用

向下滚动一些以查看与Drush的用法。

目前有两种操作数据的方式,第一种是通过操作服务器上实际运行的SQL查询(由gdpr-expressions路径提供),第二种是在生成转储之前替换列输出(由gdpr-replacements选项提供)。

$ ../vendor/bin/mysqldump drupal --host=mariadb --user=drupal --password=xxxxxxxx users_field_data --gdpr-expressions='{"users_field_data":{"name":"uid","mail":"uid","pass":"\"\""}}' --debug-sql
...
--
-- Dumping data for table `users_field_data`
--

/* SELECT `uid`,`langcode`,`preferred_langcode`,`preferred_admin_langcode`,uid as name,"" as pass,uid as mail,`timezone`,`status`,`created`,`changed`,`access`,`login`,uid as init,`default_langcode` FROM `users_field_data` */

INSERT INTO `users_field_data` VALUES (0,'en','en',NULL,'0','','0','',0,1523397207,1523397207,0,0,'0',1);
INSERT INTO `users_field_data` VALUES (1,'en','en',NULL,'1','','1','UTC',1,1523397207,1523397207,0,0,'1',1);

要混淆的字段通过--gdpr-expressions参数传递。请注意,我们使用uid表达式来满足唯一键。

不进行混淆的相同内容

$ ../vendor/bin/mysqldump drupal --host=mariadb --user=drupal --password=xxxxxxxx users_field_data --debug-sql
...
--
-- Dumping data for table `users_field_data`
--

/* SELECT `uid`,`langcode`,`preferred_langcode`,`preferred_admin_langcode`,`name`,`pass`,`mail`,`timezone`,`status`,`created`,`changed`,`access`,`login`,`init`,`default_langcode` FROM `users_field_data` */

INSERT INTO `users_field_data` VALUES (0,'en','en',NULL,'',NULL,NULL,'',0,1523397207,1523397207,0,0,NULL,1);
INSERT INTO `users_field_data` VALUES (1,'en','en',NULL,'admin','$S$Eb6kZl.9OFjoa69Z05pzUhaZJ6vpKaGZVpnjAxxLJ7ip0zOwanEV','admin@example.com','UTC',1,1523397207,1523397207,0,0,'admin@example.com',1);

使用gdpr-replacements

这使用Faker进行大部分列清理。

目前,该工具搜索“gdpr-replacements”选项,无论是作为命令行参数传递,还是作为MySql选项文件的一部分。

"gdpr-replacements"选项期望一个具有以下格式的JSON字符串

{"tableName" : {"columnName1": {"formatter": "formatterType", ...}, {"columnName2": {"formatter": "formatterType"}, ...}, ...}

其中formatterType是以下之一

  • name - 生成一个名称
  • phoneNumber - 生成一个电话号码
  • username - 生成一个随机用户名
  • password - 生成一个随机密码
  • email - 生成一个随机电子邮件地址
  • safeEmail - 同上,但以@example.org结尾
  • date - 生成一个日期
  • longText - 生成一个句子
  • number - 生成一个数字
  • randomText - 生成一个句子
  • text - 生成一个段落
  • uri - 生成一个URI
  • clear - 生成一个空字符串

这将用Faker输出替换指定的列值。

您还可以将替换映射保存到JSON文件中,并使用--gdpr-replacements-file选项使用它。

与drush一起使用

因为它模仿mysqldump,所以可以与drush、backup_migrate以及任何使用mysqldump的工具一起使用。例如,对于您的本地Docker实例

$ export PATH=/var/www/html/vendor/bin:$PATH
$ which mysqldump
/var/www/html/vendor/bin/mysqldump
$ drush sql-dump --tables-list=users_field_data --extra-dump=$'--gdpr-expressions=\'{"users_field_data":{"name":"uid","mail":"uid","init":"uid","pass":"\\"\\""}}\' --debug-sql'

在预发布、接受或生产环境中,您可能想要做以下操作(将environment.nl替换掉)

$ export PATH=/data/www/environment.nl/current/vendor/bin:$PATH
$ which mysqldump
/data/www/environment.nl/current/vendor/bin/mysqldump
$ pwd
/data/www/environment.nl/current
$ drush sql-dump --extra-dump='--gdpr-replacements-file=../gdpr-replacements.json' --result-file=~/gdpr-dump.sql

它在docroot中运行,但大多数仓库都在根目录中具有gdpr-replacements.json,因此使用../

如果您的项目没有gdpr-replacements.json,请使用此项目的模板并添加一个。

为了节省磁盘空间,可以这样运行

$ drush sql-dump --extra-dump='--gdpr-replacements-file=../gdpr-replacements.json' --result-file=~/gdpr-dump.sql --structure-tables-list="batch,cache_*,cachetags,flood,history,sessions,queue,watchdog,webform_submission,webform_submission_data"

Gitlab-CI copy-x-database-to-x工作

如果您的仓库有gdpr-replacements.json,您可以在部署后手动触发一个工作来将数据库复制到接受/预发布环境。这些工作将使用gdpr-replacements.json,如果它可用的话。

排除表内容

drush sql-dump接受一个名为--structure-tables-list的参数。从文档中:“一个逗号分隔的表列表,用于包含结构,但不包括数据。”

Gitlab-CI copy-x-database-to-x工作已扩展了一个新的参数:STRUCTURE_TABLES_LIST您可以在.gitlab-ci.yml中进行配置,如下所示:STRUCTURE_TABLES_LIST: "batch,cache_*,cachetags,flood,history,sessions,queue,watchdog,webform_submission,webform_submission_data"

MySqlOptions文件

您可以将 gdpr-expressions 的替换选项设置在 mysql 配置文件中。它应该出现在 [mysqldump] 部分。

例如,您可能有一个 /etc/my.cnf 文件,内容如下:

[mysqldump]
gdpr-replacements='{"fakertest":{"name": {"formatter":"name"}, "telephone": {"formatter":"phoneNumber"}}}'

状态和进一步发展

目前这只是一个概念验证,旨在激发社区进程。特别是 --gdpr-expressions 选项既不便于人类编写,也不容易扩展。我们可能需要更好的选项。

贡献者笔记

  • 请注意,该项目遵循 PSR-2 格式规范。