# adyen

Published articles for adyen.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## A Deep Dive into Table partitioning Part 5: Partitioning an environment not individual tables

DevFeed: [A Deep Dive into Table partitioning Part 5: Partitioning an environment not individual tables](<https://devfeed.tech/articles/a-deep-dive-into-table-partitioning-part-5-partitioning-an-environment-not-individual-tables-26252.md>)

Original publisher: [Read original article](<https://medium.com/adyen/a-deep-dive-into-table-partitioning-part-5-partitioning-an-environment-not-individual-tables-a890ca302d86?source=rss----64941d9fbc09---4>)

Author: Adyen

Published: 2026-07-13T09:18:45Z

Content type: article

Language: en

Sources: [Adyen Tech](<https://devfeed.tech/sources/adyen-tech.md>)

Topics: [Databases](<https://devfeed.tech/topics/databases.md>), [PostgreSQL](<https://devfeed.tech/topics/postgresql.md>)

Tags: [adyen](<https://devfeed.tech/tags/adyen.md>), [database](<https://devfeed.tech/tags/database.md>), [deep-dive](<https://devfeed.tech/tags/deep-dive.md>), [partitioning](<https://devfeed.tech/tags/partitioning.md>), [performance](<https://devfeed.tech/tags/performance.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>), [table-partitioning](<https://devfeed.tech/tags/table-partitioning.md>)

### AI overview

This fifth article in a table-partitioning series explains why partitioning must account for an entire relational database environment rather than isolated tables. It discusses lessons from PostgreSQL partitioning, including table locks, partition maintenance, indexes, foreign keys, and the careful use of default partitions.

### Source excerpt

By Derk van Veen, Database Engineer, Adyen If we had known better, this would have been the first blog post about partitioning to publish. The reality is, the first article was published two years and two weeks ago, as I write these opening sentences. So this article will not only give insight into the most important decisions you will have to make when considering your partitioning planning, but as a bonus, it will give some insights into how much it takes to write an article like this. One of my values is sharing knowledge and giving back to the community. I share what I learn and take people along on my journey and investigations into the problems we've faced. For this reason, the previous articles have documented these learnings, and this one is about a lesson we learned a little too late. The Journey so far Up to this point: We've shared the what, why and when to partition in the first blog post. In the second article, we covered how to maintain partitioned tables, as they provide some additional challenges when it comes to adding/removing partitions and managing indexes and foreign keys. Only in the third article did we disclose why we decided to work on our own partitioning framework: the existing partitioning solutions didn't provide us with the tools to minimize locks on tables. Our databases are always up and pressured, and the locks around partitioning were simply impossible to deal with. The key lesson from this article was that the default partition is the root of (almost) all evil regarding table partitioning in PostgreSQL. In the last article, we shared a cool solution to a problem we faced, where the default partition actually became the hero of the story. Yes, default partitions are usually the root of partitioning evil, but they also provide a welcome exception to the rule. Just be very careful with its usage. The Journey Continues... What ingredients can be missing after reading these four articles? You already know all about partitioning tables by

## Adyen vs Stripe for SaaS in 2026: Honest Head-to-Head

DevFeed: [Adyen vs Stripe for SaaS in 2026: Honest Head-to-Head](<https://devfeed.tech/articles/adyen-vs-stripe-for-saas-in-2026-honest-head-to-head-9607.md>)

Original publisher: [Read original article](<https://dodopayments.com/blogs/adyen-vs-stripe-saas/>)

Author: Ayush Agarwal

Published: 2026-06-05T00:00:00Z

Content type: comparison

Language: en

Sources: [Dodo Payments Blog](<https://devfeed.tech/sources/dodo-payments-blog.md>)

Topics: [Software as a service](<https://devfeed.tech/topics/saas.md>), [stripe](<https://devfeed.tech/topics/stripe.md>), [Transactions](<https://devfeed.tech/topics/transactions.md>), [Testing](<https://devfeed.tech/topics/testing.md>)

Tags: [adyen](<https://devfeed.tech/tags/adyen.md>), [apis](<https://devfeed.tech/tags/apis.md>), [billing](<https://devfeed.tech/tags/billing.md>), [comparison](<https://devfeed.tech/tags/comparison.md>), [comparisons](<https://devfeed.tech/tags/comparisons.md>), [compliance](<https://devfeed.tech/tags/compliance.md>), [fees](<https://devfeed.tech/tags/fees.md>), [fraud](<https://devfeed.tech/tags/fraud.md>), [integration](<https://devfeed.tech/tags/integration.md>), [payments](<https://devfeed.tech/tags/payments.md>), [pricing](<https://devfeed.tech/tags/pricing.md>), [saas](<https://devfeed.tech/tags/saas.md>), [stripe](<https://devfeed.tech/tags/stripe.md>), [tax](<https://devfeed.tech/tags/tax.md>), [vs](<https://devfeed.tech/tags/vs.md>)

### AI overview

This comparison examines Adyen and Stripe for SaaS businesses in 2026, covering pricing, merchant-of-record responsibilities, integration complexity, tax and compliance obligations, and fraud liability. It presents Adyen as potentially advantageous at high processing volumes, while Stripe offers transparent, predictable flat-rate pricing.

### Source excerpt

Adyen vs Stripe compared head-to-head for SaaS founders. Real fees, MoR coverage, integration complexity, and where each one actually wins.

## Adyen Review 2026: Pricing, Features, and Alternatives for SaaS Businesses

DevFeed: [Adyen Review 2026: Pricing, Features, and Alternatives for SaaS Businesses](<https://devfeed.tech/articles/adyen-review-2026-enterprise-grade-payments-but-wrong-for-most-saas-9604.md>)

Original publisher: [Read original article](<https://dodopayments.com/blogs/adyen-review-alternative/>)

Author: Joshua D'Costa

Published: 2025-12-20T00:00:00Z

Content type: comparison

Language: en

Sources: [Dodo Payments Blog](<https://devfeed.tech/sources/dodo-payments-blog.md>)

Topics: [Transactions](<https://devfeed.tech/topics/transactions.md>), [Software as a service](<https://devfeed.tech/topics/saas.md>), [dev-tools](<https://devfeed.tech/topics/dev-tools.md>), [SDKs](<https://devfeed.tech/topics/sdks.md>), [Documentation](<https://devfeed.tech/topics/documentation.md>)

Tags: [2026](<https://devfeed.tech/tags/2026.md>), [adyen](<https://devfeed.tech/tags/adyen.md>), [alternatives](<https://devfeed.tech/tags/alternatives.md>), [apis](<https://devfeed.tech/tags/apis.md>), [enterprise](<https://devfeed.tech/tags/enterprise.md>), [fees](<https://devfeed.tech/tags/fees.md>), [integration](<https://devfeed.tech/tags/integration.md>), [pricing](<https://devfeed.tech/tags/pricing.md>), [review](<https://devfeed.tech/tags/review.md>), [saas](<https://devfeed.tech/tags/saas.md>), [sdks](<https://devfeed.tech/tags/sdks.md>)

### AI overview

A review of Adyen's global payment platform, covering its payment acceptance features, pricing, operational capabilities, developer tools, advantages, limitations, and alternatives for SaaS businesses.

### Source excerpt

Adyen's interchange++ pricing wins at enterprise scale but punishes startups. Full review of fees, integration complexity, MoR gaps, and 3 better alternatives under $1M ARR.

## A Deep Dive into Table partitioning Part 5: Partitioning an environment not individual tables

DevFeed: [A Deep Dive into Table partitioning Part 5: Partitioning an environment not individual tables](<https://devfeed.tech/articles/a-deep-dive-into-table-partitioning-part-5-partitioning-an-environment-not-individual-tables-26253.md>)

Original publisher: [Read original article](<https://medium.com/adyen/a-deep-dive-into-table-partitioning-part-5-partitioning-an-environment-not-individual-tables-e25382ae31dc?source=rss----64941d9fbc09---4>)

Author: Adyen

Published: 2025-09-17T10:29:53Z

Content type: article

Language: en

Sources: [Adyen Tech](<https://devfeed.tech/sources/adyen-tech.md>)

Topics: [Databases](<https://devfeed.tech/topics/databases.md>), [PostgreSQL](<https://devfeed.tech/topics/postgresql.md>), [Framework](<https://devfeed.tech/topics/framework.md>)

Tags: [adyen](<https://devfeed.tech/tags/adyen.md>), [database](<https://devfeed.tech/tags/database.md>), [locks](<https://devfeed.tech/tags/locks.md>), [partitioning](<https://devfeed.tech/tags/partitioning.md>), [peformance](<https://devfeed.tech/tags/peformance.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>), [table-partitioning](<https://devfeed.tech/tags/table-partitioning.md>)

### AI overview

The fifth article in a table-partitioning series explains why partitioning must account for relationships among tables in a PostgreSQL database, rather than treating tables as standalone. It also recaps earlier lessons about partition maintenance, minimizing locks, and the careful use of default partitions.

### Source excerpt

By Derk van Veen, Database Engineer, Adyen If we had known better, this would have been the first blog post about partitioning to publish. The reality is, the first article was published two years and two weeks ago, as I write these opening sentences. So this article will not only give insight into the most important decisions you will have to make when considering your partitioning planning, but as a bonus, it will give some insights into how much it takes to write an article like this. One of my values is sharing knowledge and giving back to the community. I share what I learn and take people along on my journey and investigations into the problems we've faced. For this reason, the previous articles have documented these learnings, and this one is about a lesson we learned a little too late. The Journey so far Up to this point: We've shared the what, why and when to partition in the first blog post. In the second article, we covered how to maintain partitioned tables, as they provide some additional challenges when it comes to adding/removing partitions and managing indexes and foreign keys. Only in the third article did we disclose why we decided to work on our own partitioning framework: the existing partitioning solutions didn't provide us with the tools to minimize locks on tables. Our databases are always up and pressured, and the locks around partitioning were simply impossible to deal with. The key lesson from this article was that the default partition is the root of (almost) all evil regarding table partitioning in PostgreSQL. In the last article, we shared a cool solution to a problem we faced, where the default partition actually became the hero of the story. Yes, default partitions are usually the root of partitioning evil, but they also provide a welcome exception to the rule. Just be very careful with its usage. The Journey Continues... What ingredients can be missing after reading these four articles? You already know all about partitioning tables by

## Adyen API Diff Tool

DevFeed: [Adyen API Diff Tool](<https://devfeed.tech/articles/adyen-api-diff-tool-26255.md>)

Original publisher: [Read original article](<https://medium.com/adyen/adyen-api-diff-tool-77402b707023?source=rss----64941d9fbc09---4>)

Author: Adyen

Published: 2025-08-19T08:33:01Z

Content type: article

Language: en

Sources: [Adyen Tech](<https://devfeed.tech/sources/adyen-tech.md>)

Topics: [API](<https://devfeed.tech/topics/api.md>), [Tool](<https://devfeed.tech/topics/tool.md>), [User Experience](<https://devfeed.tech/topics/user-experience.md>), [Developer experience](<https://devfeed.tech/topics/developer-experience.md>), [HTTP](<https://devfeed.tech/topics/http.md>)

Tags: [adyen](<https://devfeed.tech/tags/adyen.md>), [api](<https://devfeed.tech/tags/api.md>), [changelog](<https://devfeed.tech/tags/changelog.md>), [design](<https://devfeed.tech/tags/design.md>), [developer-experience](<https://devfeed.tech/tags/developer-experience.md>), [developers](<https://devfeed.tech/tags/developers.md>), [features](<https://devfeed.tech/tags/features.md>), [http](<https://devfeed.tech/tags/http.md>), [integration](<https://devfeed.tech/tags/integration.md>), [open-api](<https://devfeed.tech/tags/open-api.md>), [tool](<https://devfeed.tech/tags/tool.md>), [versioning](<https://devfeed.tech/tags/versioning.md>)

### AI overview

Adyen introduces an API Diff Tool that helps developers compare API versions, inspect changes by version, endpoint, and HTTP method, identify breaking changes, and navigate to related API reference details.

### Source excerpt

Track new features, recent updates and breaking changes APIs evolve quickly with new features, design changes, and deprecations, making it challenging for consumers to keep up. This impact can be significant: developers might miss valuable improvements, misunderstand the behavior of new features, delay the adoption of critical compliance updates. This is why we have put passion and effort in the Adyen API Diff Tool, a new tool designed to help developers and technical users easily track and compare changes between API versions. Whether you're maintaining an existing integration or building something new, staying on top of API changes is critical. Previously, this information was scattered across various sources like product announcements, documentation, release notes, and GitHub, resulting in a suboptimal user experience. This changes today with our new powerful API Diff Tool. Features Our goal is simple: to make it easy to understand what's changed in the Adyen APIs between any two versions. The Diff Tool includes built-in filters to: Compare API versions View changes by version, endpoint and HTTP method Group changes by endpoint Spot quickly what's new, changed, or removed Focus on Breaking Changes only Labels, colors, and accordions provide a clean and effective way to visualize the changes. It is embedded directly in the API Explorer. From any specific change in the log, you can easily navigate to the relevant API reference or endpoint details. Benefits for Developers and other Users The API Diff Tool is designed to remove uncertainty when working with Adyen APIs. Whether you're integrating for the first time or upgrading to a new version, it is a valuable tool to: Understand what changed: compare any two API versions and see exactly what's been added, removed, or modified. Spot breaking changes early: identify changes that could impact your integration, so you can plan ahead. Evolve faster and safer: stay up-to-date with the latest API releases to integrate the

## A Developer's Guide to HMAC Validation for Adyen Webhooks

DevFeed: [A Developer's Guide to HMAC Validation for Adyen Webhooks](<https://devfeed.tech/articles/a-developer-s-guide-to-hmac-validation-for-adyen-webhooks-26254.md>)

Original publisher: [Read original article](<https://medium.com/adyen/a-developers-guide-to-hmac-validation-for-adyen-webhooks-581dffb454a8?source=rss----64941d9fbc09---4>)

Author: Adyen

Published: 2025-06-16T09:38:43Z

Content type: tutorial

Language: en

Sources: [Adyen Tech](<https://devfeed.tech/sources/adyen-tech.md>)

Topics: [Security](<https://devfeed.tech/topics/security.md>), [integrity](<https://devfeed.tech/topics/integrity.md>), [payload](<https://devfeed.tech/topics/payload.md>), [implementation](<https://devfeed.tech/topics/implementation.md>), [JSON](<https://devfeed.tech/topics/json.md>), [HTTP](<https://devfeed.tech/topics/http.md>), [Testing](<https://devfeed.tech/topics/testing.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>)

Tags: [adyen](<https://devfeed.tech/tags/adyen.md>), [api](<https://devfeed.tech/tags/api.md>), [authentication](<https://devfeed.tech/tags/authentication.md>), [best-practices](<https://devfeed.tech/tags/best-practices.md>), [developer](<https://devfeed.tech/tags/developer.md>), [encryption](<https://devfeed.tech/tags/encryption.md>), [guide](<https://devfeed.tech/tags/guide.md>), [hmac](<https://devfeed.tech/tags/hmac.md>), [http](<https://devfeed.tech/tags/http.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [integration](<https://devfeed.tech/tags/integration.md>), [json](<https://devfeed.tech/tags/json.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [payload](<https://devfeed.tech/tags/payload.md>), [payments](<https://devfeed.tech/tags/payments.md>), [security](<https://devfeed.tech/tags/security.md>), [testing](<https://devfeed.tech/tags/testing.md>), [validation](<https://devfeed.tech/tags/validation.md>), [webhooks](<https://devfeed.tech/tags/webhooks.md>)

### AI overview

This guide explains how Adyen uses HMAC signatures to protect the authenticity and integrity of webhook payloads. It distinguishes payment webhooks, which include the signature in the JSON payload, from other webhooks, which provide it in an HTTP header, and discusses custom validation and Adyen's open-source libraries.

### Source excerpt

By Beppe Catanese, Developer Relations, AdyenImage by authorIntroduction When it comes to payments, security isn't optional -- it's essential. If you're integrating with Adyen, ensuring the incoming webhooks' authenticity and integrity is very important. That's where Hash-based Message Authentication Code (HMAC) plays a critical role in securing your Adyen integration. Image by author Implementing, testing, and troubleshooting HMAC validation can be challenging. This guide explains how HMAC validation works, highlights the challenges, and provides tools and best practices for secure and reliable implementation. HMAC at Adyen All Adyen webhooks use HMAC to ensure the integrity and authenticity of the payloads delivered to your integrations. The HMAC key should be enabled when setting up a new webhook (either in the Customer Area Webhook page or using the Management API). Adyen will use the HMAC key to sign the payload by creating an HMAC signature. You must validate the HMAC signature, delivered with the webhook, using the same HMAC key. Adyen webhooks fall into two main categories, each with its approach to HMAC implementation. Let's explore the two scenarios. 1. Payments Webhooks For payments-related webhooks, the calculation of the signature involves using a subset of fields, and it's embedded directly within the JSON payload under the `additionalData` object: { "live":"false", "notificationItems":[ { "NotificationRequestItem":{ "additionalData":{ "hmacSignature":"+JWKfq4ynALK+FFzGgHnp1jSMQJMBJeb87dlph24sXw=" }, ... } } ] }2. Other Webhooks (Adyen for Platforms, Management) For non-payment webhooks, the signature is calculated using the entire JSON payload. Instead of being included in the payload itself, the signature is provided in the HTTP Header `hmacSignature`: content-length: 1614 content-type: application/json hmacsignature: SMQZFOq3oIdugmf97u9TB+5256jjXgUX3MRjK+RlGNQ=Implementing HMAC Validation Developers have two options for implementing HMAC validation:

## Adyen's AI strategy and applied research engineering

DevFeed: [Adyen's AI strategy and applied research engineering](<https://devfeed.tech/articles/unlocking-value-through-ai-applied-research-engineering-26261.md>)

Original publisher: [Read original article](<https://medium.com/adyen/unlocking-value-through-ai-applied-research-engineering-3dc3997a0bbd?source=rss----64941d9fbc09---4>)

Author: Adyen

Published: 2025-06-05T07:26:51Z

Content type: article

Language: en

Sources: [Adyen Tech](<https://devfeed.tech/sources/adyen-tech.md>)

Topics: [AI Strategy](<https://devfeed.tech/topics/ai-strategy.md>), [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [Finance](<https://devfeed.tech/topics/finance.md>), [Model Context Protocol](<https://devfeed.tech/topics/model-context-protocol.md>)

Tags: [adyen](<https://devfeed.tech/tags/adyen.md>), [ai](<https://devfeed.tech/tags/ai.md>), [ai-strategy](<https://devfeed.tech/tags/ai-strategy.md>), [data-engineering](<https://devfeed.tech/tags/data-engineering.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [payments](<https://devfeed.tech/tags/payments.md>), [research](<https://devfeed.tech/tags/research.md>)

### AI overview

The article describes Adyen's approach to applying AI in fintech, including AI-first productivity tooling and AI products such as Adyen Uplift. It frames applied research engineering as a way to connect AI developments with finance and large-scale production use.

### Source excerpt

Andreu Mora - SVP / Global Head of Engineering Data, Adyen In this day and age, any company -- and especially tech companies -- needs to find a way to adapt and embrace AI. There's zero chance that the world and society won't change because of AI. On one side, we see how AI labs and the scientific community are spearheading the creation of frontier models and on the other side, how companies clearly see the value of AI but are still pinning down how they can apply these new technologies day to day in a meaningful way, for example in critical / large-scale production flows. Initiatives are being created and shipped that propel the technology forward in the right direction (e.g. MCP, A2A), but require network effects, outcome guarantees and other challenges to be solved in order to become a full-fledged reality. The world of fintech, and finance in general will change because of AI, and Adyen is exceptionally positioned -- given our tech-first mindset, scale and high quality data -- to play a primary role in this evolution. We have a great opportunity at being the fintech company that bridges the worlds of AI and finance. ✏ If you are new to Adyen, Adyen is a global financial technology platform, founded in Amsterdam in 2006, that powers end-to-end payments, data insights, and financial products for many of the world's leading businesses -- including Uber, eBay, and LinkedIn. We are a team of 4500 people who operate in 28 offices worldwide, serve customers in over 115 nationalities, and processed more than USD 1.4 trillion in payment volume in 2024 alone, with a steady growth of ~25% YOY. To this end, we are executing on our AI strategy, which roughly is comprised of three pillars: Adapting our ways of working and productivity tooling to be AI-first. We are doing this using AI products that accelerate our delivery and augment the depth of our work. As examples, we are using conference companions, code companions and AI that helps us search and interact with our knowledge

## Data Agent Benchmark for Multi-step Reasoning (DABstep)

DevFeed: [Data Agent Benchmark for Multi-step Reasoning (DABstep)](<https://devfeed.tech/articles/data-agent-benchmark-for-multi-step-reasoning-dabstep-26258.md>)

Original publisher: [Read original article](<https://medium.com/adyen/data-agent-benchmark-for-multi-step-reasoning-dabstep-70e913c339dc?source=rss----64941d9fbc09---4>)

Author: Adyen

Published: 2025-02-05T09:19:27Z

Content type: article

Language: en

Sources: [Adyen Tech](<https://devfeed.tech/sources/adyen-tech.md>)

Topics: [Benchmark](<https://devfeed.tech/topics/benchmark.md>), [Data analysis](<https://devfeed.tech/topics/data-analysis.md>), [LLMs](<https://devfeed.tech/topics/llms.md>), [AI Bots](<https://devfeed.tech/topics/ai-bots.md>)

Tags: [adyen](<https://devfeed.tech/tags/adyen.md>), [agents](<https://devfeed.tech/tags/agents.md>), [ai-models](<https://devfeed.tech/tags/ai-models.md>), [benchmark](<https://devfeed.tech/tags/benchmark.md>), [data](<https://devfeed.tech/tags/data.md>), [data-agents](<https://devfeed.tech/tags/data-agents.md>), [data-analysis](<https://devfeed.tech/tags/data-analysis.md>), [data-science](<https://devfeed.tech/tags/data-science.md>), [genaimodels](<https://devfeed.tech/tags/genaimodels.md>), [hugging-face](<https://devfeed.tech/tags/hugging-face.md>)

### AI overview

Adyen and Hugging Face introduce DABstep, a benchmark with more than 450 data analysis tasks for evaluating language models and AI agents on multi-step reasoning. The article reports that the strongest reasoning-based agents achieved 16% accuracy, indicating that complex real-world data analysis remains difficult for current models.

### Source excerpt

Alex Egg (Adyen), Martin Iglesias (Adyen), Friso Kingma (Adyen), Andreu Mora (Adyen), Leandro Von Werra (HuggingFace), Thomas Wolf (HuggingFace) https://huggingface.co/spaces/adyen/DABstep 👉🏽 You can access DABStep with this link here: https://huggingface.co/spaces/adyen/DABstep Language models are becoming increasingly capable and can solve tasks autonomously as agents. There are many exciting use cases, especially at the intersection of reasoning, code, and data. However, proper evaluation benchmarks on real-world problems are lacking and hinder progress in the field. To tackle this challenge, Adyen and Hugging Face built the Data Agent Benchmark for Multi-step Reasoning (DABstep) together. DABstep consists of over 450 data analysis tasks designed to evaluate the capabilities of state-of-the-art LLMs and AI agents. Our findings reveal that DABstep presents a significant challenge for current AI models, with the most capable Reasoning-based agents achieving only 16% accuracy, highlighting significant progress to be made in the field. DABStep requires AI models to: dive in details of data and be rigorous (no hallucinations) reason over free form text and databases connect with real life use-cases (not just math or code) In this blog post, we'll cover the design and construction of the benchmark, explore evaluation results, and discuss the significant gap between current models and the ability to solve complex data analysis tasks effectively.. Motivation Data analysis is both an art and a science that requires technical skill, domain knowledge and creativity, and thus, it's rarely straightforward. Even seasoned data analysts face challenges like: Simple but time-consuming tasks: The sheer volume of even simple tasks often turns straightforward analysis into hours of repetitive work. Complex context and high cognitive load: Some tasks require analysis to juggle intricate domain-specific knowledge, making them both time-intensive and mentally draining. For example, (1)

## Database corruption in PostgreSQL: our journey to improving our upgrade process

DevFeed: [Database corruption in PostgreSQL: our journey to improving our upgrade process](<https://devfeed.tech/articles/database-corruption-in-postgresql-our-journey-to-improving-our-upgrade-process-26259.md>)

Original publisher: [Read original article](<https://medium.com/adyen/database-corruption-in-postgresql-our-journey-to-improving-our-upgrade-process-d76d39e5b696?source=rss----64941d9fbc09---4>)

Author: Adyen

Published: 2025-01-24T18:42:23Z

Content type: article

Language: en

Sources: [Adyen Tech](<https://devfeed.tech/sources/adyen-tech.md>)

Topics: [PostgreSQL](<https://devfeed.tech/topics/postgresql.md>), [Database](<https://devfeed.tech/topics/database.md>), [upgrade](<https://devfeed.tech/topics/upgrade.md>), [Disk image](<https://devfeed.tech/topics/disk-image.md>), [Transactions](<https://devfeed.tech/topics/transactions.md>)

Tags: [adyen](<https://devfeed.tech/tags/adyen.md>), [backup](<https://devfeed.tech/tags/backup.md>), [clusters](<https://devfeed.tech/tags/clusters.md>), [database-corruption](<https://devfeed.tech/tags/database-corruption.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>), [scale](<https://devfeed.tech/tags/scale.md>), [storage](<https://devfeed.tech/tags/storage.md>), [toast-storage](<https://devfeed.tech/tags/toast-storage.md>), [transactions](<https://devfeed.tech/tags/transactions.md>), [upgrade](<https://devfeed.tech/tags/upgrade.md>)

### AI overview

Adyen engineers describe how corrupted PostgreSQL TOAST data surfaced after a database upgrade from version 9.6 to 13. The corruption affected millions of rows, could not be restored from a pre-upgrade backup, and led to a nearly year-long investigation into data access, detection, and upgrade-process improvements.

### Source excerpt

by Cagri Biroglu & Derk van Veen, Database Engineers, Adyen PostgreSQL is a core component of Adyen's payment platform, enabling high-throughput, low-latency transaction processing on a global scale. Its stability, scalability, and extensibility make it a critical part of our infrastructure, supporting the reliability required for financial operations. A few years ago, we upgraded our PostgreSQL fleet from version 9.6 to 13. Upgrades are always long and tedious, but we prepared well for them, and the upgrade on even the hardest clusters with an extremely high number of TPS(transactions per second) and a size of multiple hundreds of TB(terabytes) went without major difficulties. But a few years later, we suddenly saw occasional errors related to transactions not being visible or invalid x_min or x_max. We tried to analyze the issue but didn't have much time, as transaction wraparound is always just around the corner in this environment. We had some quiet weeks, where no error was seen, and we thought that whatever it was, it was now behind us. We were wrong. TOAST storage The errors became a frequent nuisance, and we had no other option but to figure out what was happening. As it turned out, we had an issue with corrupted TOAST data entered in a table in the two weeks before we did the upgrade from 9.6 to 13 on this table's cluster. After the first analysis, we realized: This corruption affected millions of rows. We couldn't restore this table from a backup before the upgrade. If possible, we want to regain access to our data. We only knew about this corruption because of a clean-up job. It was unclear how many other tables were affected by the same issue. TOAST storage is not something we have understood and mastered yet. Transaction logic on TOAST is even more complicated than transaction logic on main tables. This is the start of a journey that will last almost a year. Background on TOAST storage Let's start with some background on TOAST data, as the corruptions a