PHPackages                             machbarmacher/gdpr-dump - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. machbarmacher/gdpr-dump

ActiveLibrary

machbarmacher/gdpr-dump
=======================

A drop-in replacement for mysqldump that optionally sanitizes DB fields for better GDPR conformity.

6515.2k34[11 PRs](https://github.com/machbarmacher/gdpr-dump/pulls)PHP

Since Aug 4Pushed 3y ago6 watchersCompare

[ Source](https://github.com/machbarmacher/gdpr-dump)[ Packagist](https://packagist.org/packages/machbarmacher/gdpr-dump)[ RSS](/packages/machbarmacher-gdpr-dump/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

GDPR Dump
=========

[](#gdpr-dump)

A drop-in replacement for mysqldump that optionally sanitizes DB fields for better GDPR conformity.

It is based on the [ifsnop/mysqldump-php](https://github.com/ifsnop/mysqldump-php) library, and can in principle dump any database that PDO supports.

How to use
----------

[](#how-to-use)

There are presently two ways of manipulating data, the first is by manipulating the actual SQL queries that are run on the server (given by the gdpr-expressions path), and the second is by replacing column output before the dump is generated (given by the gdpr-replacements option).

```
$ ../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);

```

The fields to obfuscate are passed via a `--gdpr-expressions` parameter. Note that we use `uid` expression to satisfy unique keys.

The same without obfuscation:

```
$ ../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);

```

### Using gdpr-replacements

[](#using-gdpr-replacements)

This uses [Faker](https://packagist.org/packages/fzaninotto/faker) for most of the column sanitization.

Presently, the tool searches for the "gdpr-replacements" option, either passed as a command line argument, or as part of a [MySql options file](https://dev.mysql.com/doc/refman/8.0/en/option-files.html).

The "gdpr-replacements" option expects a JSON string with the following format

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

```

Where *formatterType* is one of the following

- **name** - generates a name
- **phoneNumber** - generates a phone number
- **username** - generates a random user name
- **password** - generates a random password
- **email** - generates a random email address
- **date** - generates a date
- **longText** - generates a sentence
- **number** - generates a number
- **randomText** - generates a sentence
- **text** - generates a paragraph
- **uri** - generates a URI
- **clear** - generates an empty string

This will replace the given column's value with Faker output.

You can also save replacements mapping to JSON file and use it with `--gdpr-replacements-file` option.

Use with drush
--------------

[](#use-with-drush)

As this mimicks mysqldump, it can be use with drush, backup\_migrate and any tool that uses mysqldump. Drush example:

```
$ 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'

```

### MySqlOptions file

[](#mysqloptions-file)

You are able to have your gdpr-expressions/replacement options set in a mysql options file file. It is to appear under the `[mysqldump]` section.

So, for example, you might have `/etc/my.cnf` with the following content

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

```

Status and further development
------------------------------

[](#status-and-further-development)

Currently this is a proof of concept to spark a community process. Especially the `--gdpr-expressions` option is neither handy to write for humans, nor does it scale well. Here we might need better options.

Contributors notes
------------------

[](#contributors-notes)

- Note that the project follows [PSR-2](https://www.php-fig.org/psr/psr-2/) for formatting.

###  Health Score

30

—

LowBetter than 64% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity36

Limited adoption so far

Community22

Small or concentrated contributor base

Maturity36

Early-stage or recently created project

 Bus Factor1

Top contributor holds 61.5% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/d85297f7ec0b2d1962fe65451ae0018f4de52c984627dc209e14bddae41238c6?d=identicon)[geek-merlin](/maintainers/geek-merlin)

![](https://www.gravatar.com/avatar/cb5ae52c55e2898d92260abe444abce7bb820a711fc34c8509e6b8aaea5df84e?d=identicon)[geek-andi](/maintainers/geek-andi)

---

Top Contributors

[![bomoko](https://avatars.githubusercontent.com/u/297936?v=4)](https://github.com/bomoko "bomoko (40 commits)")[![geek-merlin](https://avatars.githubusercontent.com/u/15613398?v=4)](https://github.com/geek-merlin "geek-merlin (19 commits)")[![Jancis](https://avatars.githubusercontent.com/u/635571?v=4)](https://github.com/Jancis "Jancis (3 commits)")[![beuss](https://avatars.githubusercontent.com/u/3670731?v=4)](https://github.com/beuss "beuss (2 commits)")[![balintbrews](https://avatars.githubusercontent.com/u/297418?v=4)](https://github.com/balintbrews "balintbrews (1 commits)")

### Embed Badge

![Health badge](/badges/machbarmacher-gdpr-dump/health.svg)

```
[![Health](https://phpackages.com/badges/machbarmacher-gdpr-dump/health.svg)](https://phpackages.com/packages/machbarmacher-gdpr-dump)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
