Blog

Notes from moving and guarding data

Migration deep-dives, and what we learn giving AI agents governed access to production databases — written by the team building DBShifts.

EngineeringOctober 1, 2026·8 min read

Your Database Rows Can Prompt-Inject Your AI Agent

A support ticket that says “ignore previous instructions” is harmless in a table and an attack the moment an agent reads it into its context. Allowlists and masking never look at what the data says.

Read article
ProductOctober 1, 2026

Stopping an AI Agent Should Take One Click, Not a Password Rotation

When an agent starts doing something it shouldn't, the usual off switch is rotating the database password, which stops every other consumer too. A pause should hit one agent, on its next request, and be undoable.

6 min read
ProductOctober 1, 2026

Find Out What a Policy Change Breaks Before Your Agents Do

Tightening an AI agent's access is easy to type and hard to predict. Replaying last week's recorded requests against the new policy turns “what breaks?” from a guess into a list.

6 min read
EngineeringOctober 1, 2026

Your AI Agent Dashboard Should Agree With Your Audit Log

A live view of agent traffic that keeps its own counters will eventually disagree with the audit log, and then nobody trusts either. Ours computes every number from the log itself.

7 min read
EngineeringSeptember 21, 2026

Your MongoDB Read-Only User Can Still Drop the Collection

We created a user with the read role, connected as it, and MongoDB confirmed the role on the live connection. Then it inserted a document and dropped the collection anyway.

6 min read
EngineeringAugust 25, 2026

Your PII Masking Is Decorative If the Column Is Still Filterable

An AI agent never has to read a masked column to steal it. If it can put that column in a WHERE clause, row counts alone reconstruct the value character by character — and every audit line says the system worked.

7 min read
EngineeringAugust 25, 2026

Rate Limits Won't Catch an AI Agent Reading Your Whole Table

An agent re-reading the same 50 rows a thousand times is harmless. One reading 50 new rows a thousand times has taken your table. Every volume dashboard shows them as identical.

6 min read
GuidesJune 12, 2026

Relational to Non-Relational: Moving SQL Data into a Document Model

Tables don't become collections by renaming them. Foreign keys, JOINs, transactions and fixed schemas all need a deliberate translation — here's how to think about each one before you migrate.

9 min read
GuidesJune 7, 2026

Leaving Oracle for PostgreSQL: A Field Guide

License pressure makes the decision; the data model details make the project. NUMBER precision, empty-string NULLs, identifier casing, PL/SQL — what actually changes when you move Oracle workloads to Postgres.

8 min read
ProductMay 30, 2026

Big-Bang, Trickle, or CDC: Choosing Your Migration Strategy

Every database migration is one of three shapes. The right one depends on two numbers: how much downtime you can afford, and how fast your source data changes.

6 min read
ProductMay 16, 2026

Masking PII in Flight: Production Data Without Production Risk

The fastest way to leak customer data is copying production into staging. Masking during migration — not after — closes the window where real PII sits exposed in a lower environment.

6 min read
ProductApril 28, 2026

Rehearse the Migration: Dry Runs, Quarantine, and Rollback

A migration you've only run once — in production, under pressure — is a gamble. The teams that migrate calmly all do the same three things: rehearse, isolate failures, and keep the exit open.

6 min read
EngineeringJune 11, 2026

How We Live-Certified All 49 Database Migration Paths

Seven engines, forty-nine source→target combinations, one rule: a pair isn't supported until a real migration of real data passes row counts and checksums. Here's how our certification harness works.

8 min read
GuidesJune 4, 2026

MySQL to PostgreSQL: The Migration Checklist That Actually Matters

TINYINT(1) booleans, unsigned integers, ENUMs, zero dates, AUTO_INCREMENT sequences — the eight type conversions that decide whether your MySQL → PostgreSQL migration is correct or silently wrong.

7 min read
EngineeringMay 28, 2026

The Hidden Data-Loss Traps in Cross-Engine Migration

An unsigned TINYINT that clips 255 to 127. A VARBINARY that silently keeps one byte. A NUMERIC that rounds through float64. Five real bugs our certification harness caught — all of them silent.

9 min read
ProductMay 20, 2026

Zero-Downtime Migration with Change Data Capture

Bulk-copy a live database and you've copied a moving target. CDC closes the gap: snapshot, stream the changes that happened meanwhile, stay in sync until cutover. Here's the architecture.

7 min read
EngineeringMay 12, 2026

Why Row Counts Aren't Enough: Type-Aware Checksum Validation

Matching row counts prove you moved the right number of rows — not the right rows. How DBShifts hashes every row on both sides of a migration, across engines that can't even agree what a value looks like.

8 min read
GuidesMay 5, 2026

Migrating MongoDB to SQL (and Back) Without Losing Your Schema

Documents don't have a schema — until you need one. How DBShifts infers relational structure from collections, handles Decimal128 and nested documents, and goes the other direction too.

6 min read
GuidesApril 10, 2026

What Is Database Migration? A Plain-English Guide

Database migration is moving data from one database to another — between engines, versions, servers, or clouds — without losing or corrupting it. Here's what it involves, why it's harder than copying files, and how the process actually works.

7 min read