DummyDataGenPro

Test data without copying production

Copying the live database into a test environment is the default in a lot of organisations, and it is the single largest avoidable exposure most of them have. This page explains why teams move away from it, what synthetic data genuinely replaces, and what it does not.

Why the copy is a problem

A production copy in test is the same personal data, processed for a different purpose, in the environment with the weakest controls — the one with shared logins, permissive access, older patches and screenshots pasted into tickets. Under UK GDPR that touches purpose limitation (Article 5(1)(b)), data minimisation (Article 5(1)(c)) and the security obligation in Article 32. Cumulative fines across the EU have passed €4.5bn, and "we only used it for testing" has never been a defence.

This is not legal advice. Whether your organisation may do it is a decision for your DPO with sight of your lawful basis. What follows is the engineering side.

Masking is not the same as synthetic

Masking rewrites fields in real records. The record still describes a real person, so re-identification stays possible through everything that was not masked — a postcode with a date of birth, an order history, a rare combination of values. The shape of the data is itself identifying. Synthetic data has no original to re-identify, because no row began with anyone.

What synthetic data does not solve

It will not reproduce the specific malformed records that cause your production incidents. Nothing generated can, because those are artefacts of your history. For that work, a reduced and genuinely anonymised extract with a lawful basis, or a written reproduction of the case, remains the honest answer. Synthetic data replaces the bulk need — volume, shape, joins, locales — which is most of what a test environment actually consumes.

The part most generators get wrong

Test data is only useful if the tables relate to each other the way your schema says they do. Most generators emit each table independently, so every join returns nothing and the data is useless the moment a query has a JOIN in it.

These datasets are generated together and verified afterwards by reading the shipped files: 59 declared foreign keys, 5,669,913 references across the 100k tier, zero dangling. Currency follows locale rather than being picked at random, and no product is priced below its cost. Those numbers come from checking the published files, not from the code that wrote them.

Get some now

Small files download without an account — no signup, no email.

Browse 4,277 ready-made datasets

Eleven domains, including healthcare, financial, ecommerce, HR, education, logistics and telecoms, in CSV, JSONL and Parquet, across eight locales.