🚚 AWS Database Migration Service (DMS)
Moving to AWS often means migrating existing databases — with minimal downtime so apps stay available.
DMS is a fully managed service for fast, secure database migrations. Supports both same-engine and cross-engine migrations, and keeps the source database running throughout.
🎯 Exam Tip
✅ DMS = Database Migration Service
✅ Migrates databases to AWS or between systems
✅ Source database stays available during migration
✅ Supports homogeneous and heterogeneous migrations
✅ "Database migration" → AWS DMS
🧠 Core Idea
Migrating manually is slow and often means downtime. DMS automates it, migrating securely while the source database stays live the whole time.
⚙️ How DMS Works
1️⃣ Connect to the source database → 2️⃣ Extract the data → 3️⃣ Convert if needed → 4️⃣ Load into the target database.
<div class="infographic-dms">
<style>
.infographic-dms {
--paper: #ffffff;
--ink: #1a1a1a;
--db-color: #2b3245;
--chip-color: #d2691e;
--chip-icon: #2f4a9c;
--line: #8c8c8c;
--accent: #2563eb;
--body-font: 'Inter', -apple-system, sans-serif;
max-width: 900px;
margin: 0 auto;
box-sizing: border-box;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-dms[data-theme="dark"] {
--paper: #121212;
--ink: #e8e6e1;
--line: #9a968c;
}
.infographic-dms * { box-sizing: border-box; }
.infographic-dms .dms-inner { padding: clamp(1.25rem, 5vw, 2rem) clamp(1rem, 4vw, 1.5rem); }
.infographic-dms .dms-controls {
display: flex;
gap: 0.6rem;
margin-bottom: 1.25rem;
}
.infographic-dms .dms-btn {
display: inline-flex;
align-items: center;
gap: 0.4rem;
background: var(--accent);
color: #fff;
border: none;
padding: 0.5rem 1rem;
font: inherit;
font-weight: 600;
font-size: 0.82rem;
cursor: pointer;
}
.infographic-dms .dms-btn.dms-reset {
background: none;
color: var(--ink);
border: 1px solid var(--line);
}
.infographic-dms .dms-btn:disabled { opacity: 0.5; cursor: default; }
.infographic-dms .dms-btn svg { width: 12px; height: 12px; }
.infographic-dms .dms-diagram-wrap {
width: 100%;
aspect-ratio: 16 / 9;
}
.infographic-dms svg.dms-diagram { display: block; width: 100%; height: 100%; }
.infographic-dms .dms-label {
font-size: 34px;
font-weight: 400;
fill: var(--ink);
font-family: var(--body-font);
text-anchor: middle;
}
.infographic-dms .dms-connector {
stroke: var(--line);
stroke-width: 3;
transition: stroke 0.2s, stroke-width 0.2s;
}
.infographic-dms .dms-connector.is-lit {
stroke: var(--accent);
stroke-width: 4.5;
}
.infographic-dms .dms-box {
transition: filter 0.25s, transform 0.25s;
transform-box: fill-box;
transform-origin: center;
}
.infographic-dms .dms-box.is-pulsing {
transform: scale(1.08);
}
.infographic-dms .dms-box.is-pulsing .dms-chip-glow {
filter: drop-shadow(0 0 10px rgba(210,105,30,0.7));
}
.infographic-dms .dms-box.is-pulsing .dms-db-glow {
filter: drop-shadow(0 0 10px rgba(43,50,69,0.5));
}
.infographic-dms .dms-packet {
fill: var(--accent);
opacity: 0;
transition: cx 0.9s ease-in-out, opacity 0.2s;
}
.infographic-dms .dms-packet.is-visible { opacity: 1; }
@media (prefers-reduced-motion: reduce) {
.infographic-dms .dms-packet { transition: opacity 0.2s; }
.infographic-dms .dms-box { transition: none; }
}
</style>
<div class="dms-inner">
<div class="dms-controls">
<button class="dms-btn" id="dmsPlay">
<svg viewBox="0 0 24 24" fill="currentColor"><polygon points="5,3 21,12 5,21"/></svg>
Play
</button>
<button class="dms-btn dms-reset" id="dmsReset">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M3 12a9 9 0 1 1 3 6.7"/><path d="M3 21v-6h6"/></svg>
Reset
</button>
</div>
<div class="dms-diagram-wrap">
<svg class="dms-diagram" viewBox="0 0 1600 900" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid meet">
<defs>
<marker id="dmsArrow" markerWidth="10" markerHeight="10" refX="7" refY="5" orient="auto">
<path d="M0 0 L10 5 L0 10 Z" fill="var(--line)"/>
</marker>
</defs>
<!-- Source DB (Supericons: lucide:database) -->
<g class="dms-box dms-db-glow" id="sourceBox">
<g transform="translate(110,300) scale(10)" fill="none" stroke="var(--db-color)" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round">
<ellipse cx="12" cy="5" rx="9" ry="3"/>
<path d="M3 5V19A9 3 0 0 0 21 19V5"/>
<path d="M3 12A9 3 0 0 0 21 12"/>
</g>
</g>
<text x="230" y="590" class="dms-label">Source DB</text>
<!-- connector 1 -->
<line class="dms-connector" id="lineLeft" x1="370" y1="450" x2="590" y2="450" marker-end="url(#dmsArrow)"/>
<!-- EC2 / DMS chip (Supericons: lucide:cpu, with lucide:database inset) -->
<g class="dms-box dms-chip-glow" id="chipBox">
<g transform="translate(670,330) scale(10)" fill="none" stroke="var(--chip-color)" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 20v2"/><path d="M12 2v2"/><path d="M17 20v2"/><path d="M17 2v2"/>
<path d="M2 12h2"/><path d="M2 17h2"/><path d="M2 7h2"/>
<path d="M20 12h2"/><path d="M20 17h2"/><path d="M20 7h2"/>
<path d="M7 20v2"/><path d="M7 2v2"/>
<rect x="4" y="4" width="16" height="16" rx="2"/>
<rect x="8" y="8" width="8" height="8" rx="1"/>
<g transform="translate(8.6,8.4) scale(0.29)" stroke="var(--chip-icon)" stroke-width="2.4">
<ellipse cx="12" cy="5" rx="9" ry="3"/>
<path d="M3 5V19A9 3 0 0 0 21 19V5"/>
<path d="M3 12A9 3 0 0 0 21 12"/>
</g>
</g>
</g>
<text x="800" y="600" class="dms-label">EC2 instance</text>
<text x="800" y="646" class="dms-label">Running DMS</text>
<!-- connector 2 -->
<line class="dms-connector" id="lineRight" x1="1010" y1="450" x2="1230" y2="450" marker-end="url(#dmsArrow)"/>
<!-- Target DB (Supericons: lucide:database) -->
<g class="dms-box dms-db-glow" id="targetBox">
<g transform="translate(1260,300) scale(10)" fill="none" stroke="var(--db-color)" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round">
<ellipse cx="12" cy="5" rx="9" ry="3"/>
<path d="M3 5V19A9 3 0 0 0 21 19V5"/>
<path d="M3 12A9 3 0 0 0 21 12"/>
</g>
</g>
<text x="1380" y="590" class="dms-label">Target DB</text>
<!-- travelling packet -->
<circle class="dms-packet" id="dmsPacket" cx="370" cy="450" r="11"/>
</svg>
</div>
</div>
<script>
(function () {
var wrapper = document.currentScript.closest('.infographic-dms')
|| document.querySelector('.infographic-dms');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
var playBtn = wrapper.querySelector('#dmsPlay');
var resetBtn = wrapper.querySelector('#dmsReset');
var packet = wrapper.querySelector('#dmsPacket');
var lineLeft = wrapper.querySelector('#lineLeft');
var lineRight = wrapper.querySelector('#lineRight');
var sourceBox = wrapper.querySelector('#sourceBox');
var chipBox = wrapper.querySelector('#chipBox');
var targetBox = wrapper.querySelector('#targetBox');
var allLines = [lineLeft, lineRight];
var allBoxes = [sourceBox, chipBox, targetBox];
var timers = [];
function clearTimers() { timers.forEach(clearTimeout); timers = []; }
function resetState() {
clearTimers();
allLines.forEach(function (l) { l.classList.remove('is-lit'); });
allBoxes.forEach(function (b) { b.classList.remove('is-pulsing'); });
packet.classList.remove('is-visible');
packet.setAttribute('cx', 370);
playBtn.disabled = false;
}
function play() {
resetState();
playBtn.disabled = true;
var d = 900;
// 1: connect / pulse source
sourceBox.classList.add('is-pulsing');
packet.classList.add('is-visible');
timers.push(setTimeout(function () {
sourceBox.classList.remove('is-pulsing');
lineLeft.classList.add('is-lit');
packet.setAttribute('cx', 590);
}, 500));
timers.push(setTimeout(function () {
lineLeft.classList.remove('is-lit');
chipBox.classList.add('is-pulsing');
packet.classList.remove('is-visible');
}, 500 + d));
timers.push(setTimeout(function () {
chipBox.classList.remove('is-pulsing');
lineRight.classList.add('is-lit');
packet.setAttribute('cx', 1010);
packet.classList.add('is-visible');
}, 500 + d + 700));
timers.push(setTimeout(function () {
lineRight.classList.remove('is-lit');
packet.setAttribute('cx', 1230);
}, 500 + d + 700 + 100));
timers.push(setTimeout(function () {
targetBox.classList.add('is-pulsing');
packet.classList.remove('is-visible');
}, 500 + d + 700 + 100 + d));
timers.push(setTimeout(function () {
targetBox.classList.remove('is-pulsing');
playBtn.disabled = false;
}, 500 + d + 700 + 100 + d + 600));
}
playBtn.addEventListener('click', play);
resetBtn.addEventListener('click', resetState);
})();
</script>
</div>💡 Behind the scenes, DMS runs on an AWS-managed replication instance (an EC2 instance) — for the exam, just remember DMS handles the migration for you.
🚀 Minimal Downtime
The source database stays available during migration — apps keep running, users see little to no downtime. Makes DMS ideal for production migrations.
🔄 Types of Migration
1️⃣ Homogeneous
Same engine on both sides — straightforward.
Oracle → Oracle2️⃣ Heterogeneous
Different engines — DMS automatically converts the data to fit the target.
SQL Server → Amazon Aurora✨ Key Features
✅ Fully managed
✅ Secure migrations
✅ Resilient and self-healing
✅ Minimal downtime
✅ Homogeneous + heterogeneous support
✅ Migrates databases into AWS
🎯 Common Use Cases
Migrating on-prem databases to AWS, moving databases between AWS services, upgrading platforms, modernizing legacy databases, switching database engines.
📝 Summary
🚚 DMS = fully managed Database Migration Service
🔄 Extracts from source, loads into target
🖥️ Runs on an AWS-managed replication instance
✅ Source stays available — minimal downtime
🔀 Supports homogeneous (same engine) and heterogeneous (different engine, auto-converted) migrations
🎯 Exam takeaway: "Migrating a database with minimal downtime" → AWS DMS