DATABASES → STACKIT · ARCHITECTURE

Database migration to STACKIT: architecture and compatibility

PostgreSQL, MySQL, SQL Server and Redis-compatible caches each land on a managed STACKIT service, MySQL on MariaDB; DynamoDB and Oracle Database do not, and are redesign decisions. We assessed an AWS data estate with StackToIT: nine units, six of them data stores (an RDS instance each for PostgreSQL, MySQL and SQL Server, an Aurora PostgreSQL cluster, an ElastiCache group and a DynamoDB table) and three for the network. This page shows the target for each engine, the settings every draft changes whatever the engine, and the choices that stay with your architects.

A Multi-AZ PostgreSQL instance, converted

A small estate written for this page and assessed by StackToIT on 4 November 2026. Left: the RDS instance of the input. Right: the PostgreSQL Flex instance the engine wrote (the review comments above the block in the file are left out).

Example inputmain.tf
resource "aws_db_instance" "ledger" {
  identifier              = "ledger-pg"
  engine                  = "postgres"
  engine_version          = "16.4"
  instance_class          = "db.m6g.xlarge"
  allocated_storage       = 300
  multi_az                = true
  username                = "ledger"
  password                = var.db_password
  db_subnet_group_name    = aws_db_subnet_group.data.name
  backup_retention_period = 14
}
STACKIT Terraform by StackToITterraform/data.tf
resource "stackit_postgresflex_instance" "ledger" {
  project_id = var.project_id
  name       = "ledger-pg"
  version    = "16"
  flavor_id  = "4.32-replica"
  storage = {
    class = var.postgresflex_storage_class
    size  = 323
  }
  backup_schedule = "0 2 * * *"
  network = {
    acl          = var.ledger_allowed_cidrs
    access_scope = var.ledger_access_scope == "SNA" ? "SNA" : null
  }
  retention_days = 32
}
  • Multi-AZ becomes a replica flavor

    The 4 vCPU and 16 GiB class with a standby becomes 4.32-replica, 4 vCPU and 32 GiB, the smallest high-availability flavor that covers it in the eu01 catalogue the run read. The draft does not claim how a failover behaves; no STACKIT page the run read states it.

  • Storage rounds up

    300 GiB becomes 323. STACKIT states the size only as gigabytes, so the draft converts at 10^9 bytes per GB and rounds up, never to less than the source.

  • Retention and access change

    14 days of backups become retention_days 32, marked TRANSFORMED. The access list is a variable with no default, because the source is not proven public and the STACKIT endpoint is reached through an access list.

A key-value table, redesigned

From the same run. DynamoDB has no counterpart, so the run classifies the table REDESIGN and drafts one alternative, a MongoDB Flex instance for the tables of the estate.

Example inputmain.tf
resource "aws_dynamodb_table" "carts" {
  name         = "carts"
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "cart_id"

  attribute {
    name = "cart_id"
    type = "S"
  }

  ttl {
    attribute_name = "expires_at"
    enabled        = true
  }
}
STACKIT Terraform by StackToITterraform/data.tf
resource "stackit_mongodbflex_instance" "dynamodb_tables" {
  project_id = var.project_id
  name       = "dynamodb-tables"
  acl        = var.dynamodb_tables_allowed_cidrs
  version    = var.dynamodb_tables_version
  flavor = {
    cpu = var.dynamodb_tables_cpu
    ram = var.dynamodb_tables_ram
  }
  replicas = 3
  storage = {
    class = var.mongodbflex_storage_class
    size  = var.dynamodb_tables_storage_gb
  }
  backup_schedule = "0 2 * * *"
  options = {
    type                       = "Replica"
    point_in_time_window_hours = var.dynamodb_tables_pitr_hours
  }
}
  • An alternative, not an equivalent

    The run says so in its reason: key design, capacity modes and conditional writes do not carry over. PostgreSQL Flex with JSONB columns is the other option.

  • Application work, not data work

    The review lines ask for the data access layer to be rewritten against the MongoDB API, and for the instance to be sized from data volume and request load, since capacity units do not translate.

Engine by engine: target and class

One row per data store of the run, all MEDIUM confidence, plus the Oracle Database system from the Oracle Cloud run of our source comparison.

Source unitSTACKIT target and classTest first
RDS PostgreSQLPostgreSQL Flex · REPLATFORMCompare the installed extensions with the supported-extensions list of PostgreSQL Flex; plan logical replication or a dump window
Aurora PostgreSQL clusterPostgreSQL Flex · REPLATFORMAurora-only features (storage auto-scaling, fast clones, global databases, serverless scaling) have no equivalent
RDS MySQLMariaDB · REPLATFORMSTACKIT has no MySQL product. Run the application test suite against MariaDB: JSON functions, window-function edge cases, authentication plugins
RDS SQL ServerSQLServer Flex (SQL Server 2022) · REPLATFORMSQL Agent jobs, linked servers and CLR assemblies. The SQLServer Flex feature page lists SQL Server Agent as supported, and linked servers, replication and TDE as unsupported
ElastiCache RedisKey Value Store (Valkey) · RECONFIGUREValkey states compatibility with Redis OSS 7.2 and earlier; data files of Redis Community Edition 7.4 and later are not compatible
DynamoDB tableMongoDB Flex or PostgreSQL Flex (JSONB) · REDESIGNRewrite the access layer; keys, capacity modes and conditional writes do not carry over
Oracle Database system (Oracle Cloud run)No STACKIT service · REDESIGN, LOW confidenceDecide between a new engine with conversion and self-managed Oracle under your own licence

Classes and tests are the run's own, taken from assessment.json. As of November 2026, the MariaDB page of STACKIT states that version 10.6 is deprecated and scheduled for decommissioning on 1 July 2027, and asks for 10.11 or newer by that date.

What the draft changes on every instance

SettingIn the sourceIn the draft
Network placementPrivate subnets through a subnet groupAn endpoint of its own, limited by an access list from a variable with no default; the subnet group is recorded as not carried
Administrator passwordSet in the TerraformNot copied. STACKIT generates it, the draft exposes it as a sensitive output, and clients get the new value before cutover
Backup retention7 or 14 days; not set on the Aurora clusterPostgreSQL Flex: 32 days, SQLServer Flex: 30 days. MariaDB has no setting: STACKIT takes a backup every 4 hours and keeps it 14 days, and its backup page describes no point-in-time restore
Point-in-time recoveryRDS transaction logs, restore to any point in the windowPostgreSQL Flex restores a backup or a point in time into a new instance (a clone), with no in-place restore; the run says the granularity is not stated, so test a restore at the latest point you need
Storageallocated_storage in GiBRounded up in GB; for MariaDB and Valkey the plan defines the storage or nodes, not an attribute
DeletionA final snapshot on delete (skip_final_snapshot left at its default, false)No final-snapshot setting: the run asks a person to decide how a last copy is kept. The PostgreSQL Flex overview warns that deleting an instance without instance protection causes immediate, permanent data loss

Rows are drawn from the not-carried, recovery and ledger comments in terraform/data.tf, with the MariaDB backup cadence and the PostgreSQL Flex clone behaviour checked against the STACKIT documentation listed below.

How the data moves

The run lists six stateful units in migration/data-movement.md. For each it states that no method is chosen, because size, tolerated downtime and consistency are not in the source.

  1. Choose a method per unit

    For PostgreSQL the plan holds typed steps for dump and restore, logical replication, or a tool of your own. For SQL Server the handover describes a native backup of each database on RDS, a copy of the .bak files into a STACKIT bucket and an import into SQLServer Flex; the SQLServer Flex feature page says a restore goes only to a new database.

  2. Rehearse and time it

    A preflight step closes open checks (versions, extensions, roles, network); a rehearsal moves a copy into a scratch database and records timings. The freeze window comes from those timings.

  3. Freeze, sync, reconcile

    Writers are stopped, a final sync runs, and counts, checksums and one application query are compared. The result is a recorded GO or NO-GO. On NO-GO the clients still point at the untouched source.

  4. Switch the connection

    Clients change host, port, database name and credentials. Where no resource of the source references a database, the plan notes that the applications are outside the source and their owners list them.

  5. Keep the way back

    Cleanup steps wait for the rollback decision. After them the way back is the final snapshot of the source, and the plan marks the decommission of the database as not reversible.

Decisions the architect owns

  • Engine for MySQL and Redis estates

    MariaDB for MySQL, Valkey for Redis: a compatibility test decides, not the class.

  • Document or relational for DynamoDB

    MongoDB Flex or PostgreSQL Flex with JSONB; both rewrite the access layer.

  • Exposure of each endpoint

    Access-list CIDRs, or a Network Area scope where your account has it.

  • High availability level

    Single node or replica flavor, from the recovery objectives, not from the source class alone.

  • Oracle Database

    A new engine with conversion, or self-managed Oracle under your own licence.

  • Data-movement method and window

    One open decision in decisions.json covers all six stateful units, with one member per unit; answer it unit by unit.

  • SQL Server licence

    The run records that the STACKIT pages it read state no licence terms for SQLServer Flex; settle licence-included or own licence in the contract.

Questions database teams ask

Does MySQL move to MariaDB without changes?

Not always. STACKIT has no MySQL product, so MySQL 8 schemas usually work on MariaDB, but JSON functions, window-function edge cases and authentication plugins must be tested before cutover.

Can we restore a SQL Server .bak file into SQLServer Flex?

The run's plan for the SQL Server unit is built on that: a native backup of each database on RDS, the .bak files copied into a STACKIT bucket, then an import into a SQLServer Flex instance, rehearsed first on a scratch instance. The feature page states that a restore goes only to a new database, never over an existing one. The .bak carries no logins, jobs or linked servers; the preflight finds them and a person re-creates them.

Do database passwords carry over?

No. The draft does not copy source passwords. STACKIT generates the credentials, and the application owners receive the new values before the connection is switched.

Is Aurora a separate migration path?

The run maps an Aurora PostgreSQL cluster to PostgreSQL Flex like any PostgreSQL. Aurora-only features have no equivalent; the reason of the unit names them.

Sources

Your next move: STACKIT.

Tell us about your estate. We show you what StackToIT delivers for it: target architecture, Terraform artifacts and a structured migration plan.