VMWARE → STACKIT · DATABASE GUIDE

Migrating databases hosted on VMware VMs to STACKIT

A database on a VMware VM can move in two ways: rehost the whole VM as a STACKIT server with volumes, or move the data into a managed database service. StackToIT drafts the first path for ordinary VMs, hands shared-disk and raw-mapped VMs back to a person, and does not look inside the disks, so which engine runs there and how its data moves are decisions this guide helps you make. The demo is a run of seven database VMs assessed on 4 November 2026.

The VMs the run hands back

Left: the disks of ora19c-01, one node of an Oracle pair with a shared disk, and of rdm-san01, a VM with a raw device mapping, from the vDisk sheet. Right: the part of terraform/README.md that lists what the run left for the architect.

Example inputRVTools_tabvDisk.csv
VM,Disk,Capacity MiB,Raw,Disk Mode,Sharing mode,Thin,Controller,Shared Bus,Disk Path,VM UUID
ora19c-01,Hard disk 1,102400,False,persistent,sharingNone,False,SCSI controller 0,noSharing,[ds-db-01] ora19c-01/ora19c-01_0.vmdk,4202-vm16-0004
ora19c-01,Hard disk 2,512000,False,independent_persistent,sharingMultiWriter,False,SCSI controller 1,virtualSharing,[ds-db-01] ora19c-01/ora19c-01_1.vmdk,4202-vm16-0004
rdm-san01,Hard disk 1,61440,False,persistent,sharingNone,False,SCSI controller 0,noSharing,[ds-db-02] rdm-san01/rdm-san01_0.vmdk,4202-vm16-0007
rdm-san01,Hard disk 2,2097152,True,independent_persistent,sharingNone,False,SCSI controller 1,noSharing,[ds-db-02] rdm-san01/rdm-san01_1.vmdk,4202-vm16-0007
STACKIT Terraform by StackToITterraform/README.md
| Source | Class | Why |
|---|---|---|
| `vm.ora19c-01` | MANUAL_REVIEW / MEDIUM | Shared or multi-writer disks (clusters such as WSFC or Oracle RAC). |
| `vm.ora19c-02` | MANUAL_REVIEW / MEDIUM | Shared or multi-writer disks (clusters such as WSFC or Oracle RAC). |
| `vm.rdm-san01` | MANUAL_REVIEW / MEDIUM | Raw device mapping: the LUN is not part of the VM image, so an image export does not carry its data; it needs a block- or application-level copy to a STACKIT volume. |
  • Shared disk, no automatic draft

    Both Oracle nodes have a disk in multi-writer sharing mode on a shared bus. The run classifies them MANUAL_REVIEW and writes no server for them. A STACKIT data volume attaches to one server at a time, so a shared-disk cluster needs a new design, not a copy.

  • Raw mapping, data outside the image

    The Raw column is True for the second disk of rdm-san01. The run states that the LUN is not part of the VM image, so an export does not carry its data and a block- or application-level copy is needed.

  • Three of nine units

    Nine units were assessed, two networks and seven VMs. Six were drafted as Terraform and three are left for a person.

A PostgreSQL primary, rehosted

Left: the three disks of pg-prod01. Right: the server and the two data volumes of the draft, without the review comments above each block.

Example inputRVTools_tabvDisk.csv
VM,Disk,Capacity MiB,Raw,Disk Mode,Sharing mode,Thin,Controller,Shared Bus,Disk Path,VM UUID
pg-prod01,Hard disk 1,81920,False,persistent,sharingNone,False,SCSI controller 0,noSharing,[ds-db-01] pg-prod01/pg-prod01_0.vmdk,4202-vm16-0001
pg-prod01,Hard disk 2,1048576,False,persistent,sharingNone,False,SCSI controller 1,noSharing,[ds-db-01] pg-prod01/pg-prod01_1.vmdk,4202-vm16-0001
pg-prod01,Hard disk 3,204800,False,persistent,sharingNone,False,SCSI controller 2,noSharing,[ds-db-01] pg-prod01/pg-prod01_2.vmdk,4202-vm16-0001
STACKIT Terraform by StackToITterraform/compute.tf
resource "stackit_server" "vm_pg_prod01" {
  project_id        = var.project_id
  name              = "pg-prod01"
  machine_type      = var.vm_pg_prod01_machine_type
  availability_zone = var.availability_zone
  boot_volume = {
    source_type = "image"
    source_id   = var.vm_pg_prod01_image_id
    size        = 80
  }
  network_interfaces = [stackit_network_interface.vm_pg_prod01_nic1.network_interface_id]
}

resource "stackit_volume" "vm_pg_prod01_disk2" {
  project_id        = var.project_id
  name              = "pg-prod01-disk2"
  availability_zone = var.availability_zone
  size              = 1024
  performance_class = var.vmware_volume_performance_class
}

resource "stackit_server_volume_attach" "vm_pg_prod01_disk2" {
  project_id = var.project_id
  server_id  = stackit_server.vm_pg_prod01.server_id
  volume_id  = stackit_volume.vm_pg_prod01_disk2.volume_id
}

resource "stackit_volume" "vm_pg_prod01_disk3" {
  project_id        = var.project_id
  name              = "pg-prod01-disk3"
  availability_zone = var.availability_zone
  size              = 200
  performance_class = var.vmware_volume_performance_class
}

resource "stackit_server_volume_attach" "vm_pg_prod01_disk3" {
  project_id = var.project_id
  server_id  = stackit_server.vm_pg_prod01.server_id
  volume_id  = stackit_volume.vm_pg_prod01_disk3.volume_id
}
  • Disks keep their roles

    The 80 GiB system disk becomes the boot volume, the 1 TiB data disk a volume of 1024 GiB, the 200 GiB disk (the write-ahead log in this estate) a volume of 200 GiB. The names are the draft's; the roles are your knowledge of the database.

  • Data is copied later

    Each volume block notes that the data is copied after creation. The run never moves data.

  • Within the volume limits

    The block storage documentation gives data volumes a range of 1 GB to 16 TB each, so a 1 TiB volume fits.

Telling the run how much downtime an application allows

Left: an applications file written for this estate. It names the units of two applications and states RTO, RPO and downtime tolerance as the owners gave them. Right: the rows of migration/waves.csv that show the result. The file is passed with the --applications flag.

Example inputapplications.yaml
applications:
  - id: orders-db
    name: Orders database
    selectors:
      - vm.pg-prod01
      - vm.pg-prod02
    environment: production
    owners:
      business: sales
      technical: dba-team
    business_criticality: critical
    availability:
      rto: 2h
      rpo: 5m
      downtime_tolerance: 30m
  - id: wiki
    name: Team wiki
    selectors:
      - vm.mysql01
    environment: production
    business_criticality: low
    availability:
      downtime_tolerance: 8h
Run outputmigration/waves.csv
wave,wave_state,unit,type,module_call,presence,class,confidence,application,application_status,proposed_group
2,MEMBER,vm.mysql01,vmware_vm,,KNOWN_PRESENT,RECONFIGURE,MEDIUM,wiki,CONFIRMED,
2,MEMBER,vm.ora19c-01,vmware_vm,,KNOWN_PRESENT,MANUAL_REVIEW,MEDIUM,UNASSIGNED,UNASSIGNED,
2,MEMBER,vm.pg-prod01,vmware_vm,,KNOWN_PRESENT,RECONFIGURE,MEDIUM,orders-db,CONFIRMED,
2,MEMBER,vm.pg-prod02,vmware_vm,,KNOWN_PRESENT,RECONFIGURE,MEDIUM,orders-db,CONFIRMED,
  • Only what you name is assigned

    pg-prod01 and pg-prod02 belong to orders-db, mysql01 to wiki. ora19c-01 stays UNASSIGNED because no selector names it.

  • Values are recorded as written

    RTO of 2h, RPO of 5m and downtime tolerance of 30m appear in migration/applications.csv exactly as given. Data classification stays NOT_PROVIDED where the file says nothing.

  • The run does not calculate

    No transfer time or cutover window is derived from these values. They frame the decision you take below.

What the run says about data movement

From migration/data-movement.md of the same run, two lines that matter for every database that lives inside a VM.

Run outputmigration/data-movement.md
StackToIT never moves data. The source holds no database, cache, search domain, warehouse, volume, file share or object store, but it holds servers or virtual machines. Data that lives on the disks of a server or virtual machine is not looked at, so whether data has to move is not assessed.

State: NOT ASSESSED.
  • Not assessed, by design

    A database on a VM disk is just a disk to the run. It lists no database, no size and no mechanism for it.

  • You choose the mechanism

    Size, change rate, downtime tolerated and the consistency the application needs decide between a disk copy, a dump and restore, a backup import or replication.

Where each database can land

Database VM in the demoOptions on STACKITWhat to know before you choose
pg-prod01, pg-prod02 (PostgreSQL 15 primary and replica)Rehost as drafted, or PostgreSQL FlexAs of November 2026 the PostgreSQL Flex lifecycle page lists versions 13 to 17 with end-of-life dates, plus 18 without an end-of-life date yet; version 15 runs until November 2027, 16 until November 2028 and 17 until November 2029. A replica set has three nodes. Resizing CPU, memory or storage causes downtime, except growing the storage, and the storage performance class cannot be changed later.
mssql01 (SQL Server 2019)Rehost as drafted, or SQLServer FlexA backup file can be imported from a STACKIT S3 bucket by API or T-SQL; only unencrypted backups are supported. Transactional replication can keep a STACKIT copy current; tables need primary keys.
mysql01 (MySQL 8)Rehost, or MariaDBThe MariaDB page calls the service a drop-in replacement for MySQL. Test your version and features before you rely on that. The VM has a snapshot; the run says only the current state is migrated.
ora19c-01, ora19c-02 (Oracle, shared disk)New design on serversNone of the STACKIT database pages cited for this guide (PostgreSQL Flex, SQLServer Flex, MariaDB) describes an Oracle service. A shared disk cannot be shared between servers on STACKIT block storage. Decide the cluster design with Oracle's own documentation and licence terms.
rdm-san01 (data on a raw LUN)Copy the LUN content to a volumeThe image carries only the VM disks. Use a block- or application-level copy, as the run states.

Statements about STACKIT services come from the documentation pages listed under the sources and may change; check the current pages. StackToIT itself drafts only the rehost path for these VMs.

The migration in order

  1. Find the databases yourself

    The export has VMs, not engines. Use the Annotation column, your CMDB and the DBAs: the run does not detect database software from names or notes.

  2. Pick a target per database

    Rehost keeps engine and version and leaves patching, backup and high availability with you. A managed service takes that work over but needs a supported version and a data move.

  3. Record downtime and recovery values

    Put RTO, RPO and downtime tolerance into an applications file so they travel with the plan, and run the assessment again.

  4. Build the target

    For rehost, fill the variables of the draft: machine type, image ID, volume performance class, network prefixes. For a managed service, create the instance yourself; the draft writes none.

  5. Seed the data

    Examples of general practice: a dump and restore for PostgreSQL, a backup import for SQL Server, or replication to keep the target current until cutover. Rehearse with a copy and time it.

  6. Verify, then cut over

    As general practice, compare row counts and run application checks on the target, switch the connection strings or DNS names, and keep the source VM stopped but intact until the owner signs off. This is general practice, not a run output.

  7. Keep the way back

    Until sign-off the source remains the system of record. Write down how to point applications back to it.

Decisions the architect owns

  • Rehost or managed

    Per database, not per estate. A managed service removes work and adds constraints on version, extensions and access.

  • Version

    Moving to a managed service often means a supported version. As of November 2026, the lifecycle page gives November 2026 as the end of life of PostgreSQL 14 and November 2025 for 13, so do not choose either for a new target; 16 or 17 leave the most time.

  • High availability

    Two VMs with streaming replication, as in this estate, and a three-node replica set are different designs. Decide which you want and test failover.

  • Downtime

    The applications file records what each owner can accept. Choose a seeding method that fits, replication for tight windows, dump and restore where hours are acceptable.

  • Storage class

    The volume performance class is one variable for the estate in the draft. Databases with a log disk may need a different class than file servers.

  • Cluster design

    Shared-disk clusters and raw mappings are the VMs the run hands back. They need a design decision before any copy.

Questions database teams ask

Does StackToIT detect which VMs run a database?

No. It reads the sheets of the export and classifies VMs, templates and port groups. A database VM is rehosted like any other server unless a check fires, such as a shared disk or a raw mapping.

Can I move an Oracle RAC pair to STACKIT as it is?

Not by copying disks. The run classifies such VMs MANUAL_REVIEW, and STACKIT data volumes attach to one server at a time. Treat it as a redesign of the cluster.

Does the run move or measure my data?

No. The data movement file states that StackToIT never moves data, and without a database resource in the source it marks data movement as not assessed. Provisioned disk size is not data size.

How do I record downtime tolerance?

In an applications file passed with --applications. The run copies RTO, RPO and downtime tolerance as written and does not derive anything from 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.