20
.
08
.
2025
18
.
08
.
2025
Postgresql
Software

Tradeoffs of Anonymising Production Data

Michał Łęcicki
Ruby Developer
Tradeoffs of Anonymising Production Data by Michał Łęcicki

At some point, in every Rails project, someone says: 'Hey, our testing dataset is not relevant anymore, maybe we could anonymise production data and use it instead?'. That's when a tough journey begins: ensuring data privacy, updating scripts, and securing infrastructure. Let's explore the challenges you might face if you decide to anonymise your production data.

What even is data anonymisation?

Data anonymisation means stripping your dataset of all Personally Identifiable Information (PII). Under the GDPR, it includes names, addresses, dates, and financial information that can be used to identify a person. Each piece of information has a different level of privacy and security. For example, a credit card number is more sensitive than a company name. But safe to say: if someone steals your anonymised database and can't track original records out of it, you are good. This means you need to provide a certain level of anonymisation. If data is reversible, it's called pseudo-anonymisation. Which is not GDPR compliant, so you'd rather avoid it.

Reasons to anonymise

It all starts with identifying your actual goal.

  • Are some unreproducible bugs happening in production?
  • Do you need to run performance tests on a production-like dataset?
  • Or, you want to test your data migrations without any complications?

The list of reasons can be long, and each project has its unique conditions. Often, data anonymisation is just one of several possible strategies. Taking one step back might help you find simpler alternatives.

For instance, using monitoring tools like New Relic can help with checking performance. Debugging data issues in production is much the same. Using Active Admin or QuickSight for observability can remove the need for an anonymised database. With tools like Active Admin, you can inspect live production data directly in a controlled environment - no need to download or copy it elsewhere**.** Or, dummy-data generators can solve the problem of a low volume of data. Data anonymisation is one of the options, usually not the best one for you. Why consider data anonymisation alternatives? Because of:

The cost of data anonymisation

Data anonymisation is expensive on different levels. Let's reveal them.

First: data security and privacy. You need to make sure anonymised data does not contain any PII. You need to remove all addresses, real names, birthdates, bank accounts, and more from each table with great attention. But consider also less obvious fields: record created_at or updated_at timestamps, links to files, API keys, internal notes, and slugs. If you want truly anonymised data, the script needs to be extremely precise - that's hard to achieve.

Second: extra complexity in your infrastructure. Data anonymisation means copying the real production database. The process must run in the production ecosystem - downloading raw data to anonymise it locally would defeat the entire purpose. It’s a sensitive operation that requires extra care. It also adds another brick to your infrastructure - someone has to maintain it and ensure it stays secure.

Third: maintenance and updates. You have a perfect script and elegant infrastructure to invoke it, but your work is not done. Every update to the data structure requires checking if the script should also be updated! This step might be partially automated with CI, but the anonymisation script is still something to remember after any code changes. Extra effort and a huge risk of mistakes.

Data anonymisation and AI

In the modern era of agentic coding and MCP servers, a new question arises. What if you want to connect AI to your production database to get some insights or solve some problems? Since your trust is limited, you want to anonymise the data first. That's a fair point, but using AI on the anonymised database won't work as well as with real data. Why? Because truly anonymised data is no longer production data. Names, dates, null values, and long text notes are all different.

Want AI to help you fix tricky production bugs? Keep in mind that anonymisation greatly alters the dataset. Bugs can be unreproducible anymore. The same problem applies to insights about your database - anonymised data can behave differently.  But there is good news: you can find details about missing indexes, performance tests, and table structures using other tools. You don’t need a real production database to do this.

Summary

Data anonymisation has always been important. However, in the modern era of data leaks and AI learning from datasets, it is even more significant. Explore other solutions first! Data anonymisation comes with high maintenance costs, a lot of effort, and uneven risks. Treat it as a last resort. And if you choose to do so, be extra careful about its security and maintenance.

Michał Łęcicki
Ruby Developer

Check my Twitter

Check my Linkedin

Did you like it? 

Sign up To VIsuality newsletter

READ ALSO

Bounded Context - DDD in Ruby on Rails

11
.
06
.
2025
Paweł Strzałkowski
Ruby on Rails
Domain-Driven Design
Backend
Tutorial

The origin of Poltrax development - story of POLTRAX (part 2)

11
.
06
.
2025
Stanisław Zawadzki
Ruby on Rails
Startups
Business
Backend

Ruby Meetups in 2022 - Summary

11
.
06
.
2025
Michał Łęcicki
Ruby on Rails
Visuality
Conferences

Repository - DDD in Ruby on Rails

11
.
06
.
2025
Paweł Strzałkowski
Ruby on Rails
Domain-Driven Design
Backend
Tutorial

Example Application - DDD in Ruby on Rails

11
.
06
.
2025
Paweł Strzałkowski
Ruby on Rails
Domain-Driven Design
Backend
Tutorial

How to launch a successful startup - story of POLTRAX (part 1)

11
.
06
.
2025
Michał Piórkowski
Ruby on Rails
Startups
Business

How to use different git emails for different projects

11
.
06
.
2025
Michał Łęcicki
Backend
Tutorial

Aggregate - DDD in Ruby on Rails

11
.
06
.
2025
Paweł Strzałkowski
Ruby on Rails
Domain-Driven Design
Backend
Tutorial

Visuality at wroc_love.rb 2022: It's back and it's good!

11
.
06
.
2025
Patryk Ptasiński
Ruby on Rails
Conferences
Ruby

Our journey to Event Storming

11
.
06
.
2025
Michał Łęcicki
Visuality
Event Storming

Should I use Active Record Callbacks?

11
.
06
.
2025
Mateusz Woźniczka
Ruby on Rails
Backend
Tutorial

How to rescue a transaction to roll back changes?

11
.
06
.
2025
Paweł Strzałkowski
Ruby on Rails
Backend
Ruby
Tutorial

Safe navigation operator '&.' vs '.try' in Rails

11
.
06
.
2025
Mateusz Woźniczka
Ruby on Rails
Backend
Ruby
Tutorial

What does the ||= operator actually mean in Ruby?

11
.
06
.
2025
Mateusz Woźniczka
Ruby on Rails
Backend
Ruby
Tutorial

How to design an entity - DDD in Ruby on Rails

11
.
06
.
2025
Paweł Strzałkowski
Ruby on Rails
Domain-Driven Design
Backend
Tutorial

Entity - DDD in Ruby on Rails

11
.
06
.
2025
Paweł Strzałkowski
Ruby on Rails
Domain-Driven Design
Backend
Tutorial

Should I use instance variables in Rails views?

11
.
06
.
2025
Mateusz Woźniczka
Ruby on Rails
Frontend
Backend
Tutorial

Data Quality in Ruby on Rails

11
.
06
.
2025
Michał Łęcicki
Ruby on Rails
Backend
Software

We started using Event Storming. Here’s why!

11
.
06
.
2025
Mariusz Kozieł
Event Storming
Visuality

First Miłośnicy Ruby Warsaw Meetup

11
.
06
.
2025
Michał Łęcicki
Conferences
Visuality

Should I use Action Filters?

11
.
06
.
2025
Mateusz Woźniczka
Ruby on Rails
Backend
Tutorial

Value Object - DDD in Ruby on Rails

11
.
06
.
2025
Paweł Strzałkowski
Ruby on Rails
Domain-Driven Design
Backend
Tutorial

Introduction to DDD in Ruby on Rails

11
.
06
.
2025
Paweł Strzałkowski
Ruby on Rails
Domain-Driven Design
Backend
Tutorial