<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-28 -->
<h2 id="database-recovery" class="position-relative d-flex align-items-center group">
<span>Database Recovery</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="database-recovery"
aria-haspopup="dialog"
aria-label="Share link: Database Recovery">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h2><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden>
<div class="hsm-dialog" role="document">
<div class="hsm-header">
<h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2>
<button type="button" class="hsm-close" aria-label="Close">
<i class="fa-solid fa-xmark"></i>
</button>
</div>
<div class="hsm-body">
<label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label>
<div class="input-group mb-4 hsm-url-group">
<input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" />
<button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy">
<i class="fa-duotone fa-clipboard" aria-hidden="true"></i>
</button>
</div>
<div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div>
<div class="hsm-share-grid">
<a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-twitter me-2"></i>Twitter
</a>
<a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-linkedin me-2"></i>LinkedIn
</a>
<a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-facebook me-2"></i>Facebook
</a>
</div>
</div>
</div>
</div>
<style>
.heading-share-modal {
position: fixed;
inset: 0;
display: flex;
justify-content: center;
align-items: center;
background: rgba(0, 0, 0, 0.6);
z-index: 1050;
padding: 1rem;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
}
.heading-share-modal[hidden] { display: none !important; }
.hsm-dialog {
max-width: 420px;
width: 100%;
background: var(--bs-body-bg, #fff);
color: var(--bs-body-color, #212529);
border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
border-radius: 1rem;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
overflow: hidden;
animation: hsm-fade-in 0.2s ease-out;
}
@keyframes hsm-fade-in {
from { opacity: 0; transform: scale(0.95); }
to { opacity: 1; transform: scale(1); }
}
[data-bs-theme="dark"] .hsm-dialog {
background: #1e293b;
border-color: rgba(255,255,255,0.1);
color: #f8f9fa;
}
.hsm-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 1.5rem;
border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
background: rgba(0,0,0,0.02);
}
[data-bs-theme="dark"] .hsm-header {
background: rgba(255,255,255,0.02);
border-color: rgba(255,255,255,0.1);
}
.hsm-close {
background: transparent;
border: none;
color: inherit;
opacity: 0.5;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
font-size: 1.2rem;
line-height: 1;
transition: opacity 0.2s;
}
.hsm-close:hover {
opacity: 1;
}
.hsm-body {
padding: 1.5rem;
}
.hsm-url-group {
display: flex !important;
align-items: stretch;
}
.hsm-url-group .form-control {
flex: 1;
min-width: 0;
margin: 0;
background: var(--bs-secondary-bg, #f8f9fa);
border-color: var(--bs-border-color, #dee2e6);
border-top-right-radius: 0;
border-bottom-right-radius: 0;
height: 42px;
}
.hsm-url-group .btn {
flex: 0 0 auto;
margin: 0;
margin-left: -1px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
height: 42px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 1.25rem;
z-index: 2;
}
[data-bs-theme="dark"] .hsm-url-group .form-control {
background: #0f172a;
border-color: #334155;
color: #e2e8f0;
}
.hsm-share-grid {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.hsm-share-grid .btn {
display: flex;
align-items: center;
justify-content: center;
font-size: 0.9rem;
padding: 0.6rem;
border-color: var(--bs-border-color);
width: 100%;
}
[data-bs-theme="dark"] .hsm-share-grid .btn {
color: #e2e8f0;
border-color: #475569;
}
[data-bs-theme="dark"] .hsm-share-grid .btn:hover {
background: #334155;
border-color: #cbd5e1;
}
</style>
<script>
(function(){
const modal = document.getElementById('headingShareModal');
if(!modal) return;
const input = modal.querySelector('#headingShareInput');
const copyBtn = modal.querySelector('.hsm-copy');
const twitter = modal.querySelector('#share-twitter');
const linkedin = modal.querySelector('#share-linkedin');
const facebook = modal.querySelector('#share-facebook');
const closeBtn = modal.querySelector('.hsm-close');
let lastFocus=null;
let trapBound=false;
function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; }
function isOpen(){ return !modal.hasAttribute('hidden'); }
function hydrate(id){
const url=buildUrl(id);
input.value=url;
const enc=encodeURIComponent(url);
const text=encodeURIComponent(document.title);
if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`;
if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`;
if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`;
}
function openModal(id){
lastFocus=document.activeElement;
hydrate(id);
if(!isOpen()){
modal.removeAttribute('hidden');
}
requestAnimationFrame(()=>{ input.focus(); });
trapFocus();
}
function closeModal(){
if(!isOpen()) return;
modal.setAttribute('hidden','');
if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus();
}
function copyCurrent(){
try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); }
catch(e){ fallback(); }
}
function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} }
function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); }
function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); }
function bindShareButtons(){
document.querySelectorAll('.h-share').forEach(btn=>{
if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; }
});
}
bindShareButtons();
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', bindShareButtons);
} else {
requestAnimationFrame(bindShareButtons);
}
document.addEventListener('click', function(e){
const shareBtn=e.target.closest && e.target.closest('.h-share');
if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); }
}, true);
document.addEventListener('click', e=>{
if(e.target===modal) closeModal();
if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); }
if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); }
});
document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); });
function trapFocus(){
if(trapBound) return;
trapBound=true;
modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } });
}
if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); });
})();
</script><p>This guide covers all aspects of database recovery for Geode, from automatic crash recovery to manual disaster recovery procedures. Understanding these concepts ensures minimal data loss and rapid service restoration.</p>
<h3 id="overview" class="position-relative d-flex align-items-center group">
<span>Overview</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="overview"
aria-haspopup="dialog"
aria-label="Share link: Overview">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Geode provides multiple recovery mechanisms to handle various failure scenarios:</p>
<table>
<thead>
<tr>
<th>Recovery Type</th>
<th>Use Case</th>
<th>RTO</th>
<th>RPO</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Automatic Crash Recovery</strong></td>
<td>Server restart after crash</td>
<td>Seconds</td>
<td>Zero</td>
</tr>
<tr>
<td><strong>WAL Replay</strong></td>
<td>Incomplete transactions</td>
<td>Seconds</td>
<td>Zero</td>
</tr>
<tr>
<td><strong>Point-in-Time Recovery</strong></td>
<td>Restore to specific timestamp</td>
<td>Minutes</td>
<td>Configurable</td>
</tr>
<tr>
<td><strong>Full Restore</strong></td>
<td>Complete database restoration</td>
<td>Minutes</td>
<td>Last backup</td>
</tr>
<tr>
<td><strong>Disaster Recovery</strong></td>
<td>Site failure, data corruption</td>
<td>Minutes-Hours</td>
<td>Last backup</td>
</tr>
</tbody>
</table>
<p><strong>Key Terms</strong>:</p>
<ul>
<li><strong>RTO</strong> (Recovery Time Objective): Maximum acceptable downtime</li>
<li><strong>RPO</strong> (Recovery Point Objective): Maximum acceptable data loss</li>
</ul>
<h3 id="automatic-crash-recovery" class="position-relative d-flex align-items-center group">
<span>Automatic Crash Recovery</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="automatic-crash-recovery"
aria-haspopup="dialog"
aria-label="Share link: Automatic Crash Recovery">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="how-it-works" class="position-relative d-flex align-items-center group">
<span>How It Works</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="how-it-works"
aria-haspopup="dialog"
aria-label="Share link: How It Works">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Geode uses Write-Ahead Logging (WAL) to ensure durability. When the server restarts after a crash:</p>
<ol>
<li><strong>WAL Analysis</strong>: Scans WAL to identify incomplete transactions</li>
<li><strong>Redo Phase</strong>: Replays committed transactions not yet flushed to disk</li>
<li><strong>Undo Phase</strong>: Rolls back uncommitted transactions</li>
<li><strong>Checkpoint</strong>: Creates recovery checkpoint</li>
</ol>
<h4 id="crash-recovery-process" class="position-relative d-flex align-items-center group">
<span>Crash Recovery Process</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="crash-recovery-process"
aria-haspopup="dialog"
aria-label="Share link: Crash Recovery Process">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-plaintext" data-lang="plaintext"><span class="line"><span class="cl">Server Crash
</span></span><span class="line"><span class="cl"> │
</span></span><span class="line"><span class="cl"> ▼
</span></span><span class="line"><span class="cl">Server Restart
</span></span><span class="line"><span class="cl"> │
</span></span><span class="line"><span class="cl"> ▼
</span></span><span class="line"><span class="cl">┌─────────────────────────────────────┐
</span></span><span class="line"><span class="cl">│ 1. Load last checkpoint │
</span></span><span class="line"><span class="cl">│ 2. Scan WAL from checkpoint LSN │
</span></span><span class="line"><span class="cl">│ 3. Build transaction table │
</span></span><span class="line"><span class="cl">│ 4. Redo committed transactions │
</span></span><span class="line"><span class="cl">│ 5. Undo uncommitted transactions │
</span></span><span class="line"><span class="cl">│ 6. Create new checkpoint │
</span></span><span class="line"><span class="cl">└─────────────────────────────────────┘
</span></span><span class="line"><span class="cl"> │
</span></span><span class="line"><span class="cl"> ▼
</span></span><span class="line"><span class="cl">Server Ready
</span></span></code></pre></div>
<h4 id="verifying-crash-recovery" class="position-relative d-flex align-items-center group">
<span>Verifying Crash Recovery</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="verifying-crash-recovery"
aria-haspopup="dialog"
aria-label="Share link: Verifying Crash Recovery">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>After server restart, verify recovery completed:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Check server logs for recovery messages</span>
</span></span><span class="line"><span class="cl">geode logs --tail <span class="m">100</span> <span class="p">|</span> grep -i recovery
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Expected output:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># [INFO] Starting crash recovery from checkpoint LSN: 12345678</span>
</span></span><span class="line"><span class="cl"><span class="c1"># [INFO] WAL replay: 156 transactions to redo</span>
</span></span><span class="line"><span class="cl"><span class="c1"># [INFO] WAL replay: 3 transactions to undo</span>
</span></span><span class="line"><span class="cl"><span class="c1"># [INFO] Crash recovery completed in 1.2s</span>
</span></span><span class="line"><span class="cl"><span class="c1"># [INFO] Server ready on port 3141</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify database integrity</span>
</span></span><span class="line"><span class="cl">geode verify --data-dir /var/lib/geode/data
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run health check query</span>
</span></span><span class="line"><span class="cl">geode query <span class="s2">"RETURN 1 AS health_check"</span>
</span></span></code></pre></div>
<h4 id="recovery-configuration" class="position-relative d-flex align-items-center group">
<span>Recovery Configuration</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="recovery-configuration"
aria-haspopup="dialog"
aria-label="Share link: Recovery Configuration">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># geode.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">recovery</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># WAL configuration</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wal</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sync_mode: fsync # Options</span><span class="p">:</span><span class="w"> </span><span class="l">none, fsync, fdatasync</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">buffer_size</span><span class="p">:</span><span class="w"> </span><span class="l">16MB</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">segment_size</span><span class="p">:</span><span class="w"> </span><span class="l">64MB</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checkpoint configuration</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checkpoint</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">interval</span><span class="p">:</span><span class="w"> </span><span class="l">5m </span><span class="w"> </span><span class="c"># Checkpoint frequency</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">min_wal_size</span><span class="p">:</span><span class="w"> </span><span class="l">256MB </span><span class="w"> </span><span class="c"># Minimum WAL before checkpoint</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Recovery limits</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max_recovery_time</span><span class="p">:</span><span class="w"> </span><span class="l">10m </span><span class="w"> </span><span class="c"># Abort if recovery exceeds</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">parallel_redo</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span><span class="c"># Parallel transaction replay</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">redo_threads</span><span class="p">:</span><span class="w"> </span><span class="m">4</span><span class="w"> </span><span class="c"># Number of redo threads</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="point-in-time-recovery-pitr" class="position-relative d-flex align-items-center group">
<span>Point-in-Time Recovery (PITR)</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="point-in-time-recovery-pitr"
aria-haspopup="dialog"
aria-label="Share link: Point-in-Time Recovery (PITR)">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>PITR allows restoring the database to any point in time within the retention period.</p>
<h4 id="prerequisites" class="position-relative d-flex align-items-center group">
<span>Prerequisites</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="prerequisites"
aria-haspopup="dialog"
aria-label="Share link: Prerequisites">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ul>
<li>WAL archiving enabled</li>
<li>Periodic full backups</li>
<li>Archived WAL segments</li>
</ul>
<h4 id="enable-wal-archiving" class="position-relative d-flex align-items-center group">
<span>Enable WAL Archiving</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="enable-wal-archiving"
aria-haspopup="dialog"
aria-label="Share link: Enable WAL Archiving">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># geode.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">backup</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wal_archiving</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">archive_path</span><span class="p">:</span><span class="w"> </span><span class="l">/var/lib/geode/wal_archive</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Or use S3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">s3</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">bucket</span><span class="p">:</span><span class="w"> </span><span class="l">geode-wal-archive</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">prefix</span><span class="p">:</span><span class="w"> </span><span class="l">production/wal</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">retention_hours</span><span class="p">:</span><span class="w"> </span><span class="m">168</span><span class="w"> </span><span class="c"># 7 days</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="pitr-restore-procedure" class="position-relative d-flex align-items-center group">
<span>PITR Restore Procedure</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="pitr-restore-procedure"
aria-haspopup="dialog"
aria-label="Share link: PITR Restore Procedure">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Step 1: Stop the Server</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo systemctl stop geode
</span></span></code></pre></div><p><strong>Step 2: Identify Target Time</strong></p>
<p>Determine the point in time to restore to:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># List available recovery points</span>
</span></span><span class="line"><span class="cl">geode backup --dest s3://geode-backups/production --list-recovery-points
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Output:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Recovery Points Available:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ─────────────────────────────────────────────────────────</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Base Backup ID Timestamp Earliest PITR</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 1738012345 2026-01-23 02:00:00 2026-01-23 02:00:00</span>
</span></span><span class="line"><span class="cl"><span class="c1"># WAL Segments: 2026-01-23 02:00:00 to 2026-01-28 10:30:00</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ─────────────────────────────────────────────────────────</span>
</span></span></code></pre></div><p><strong>Step 3: Restore Base Backup</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Create fresh data directory</span>
</span></span><span class="line"><span class="cl">sudo mv /var/lib/geode/data /var/lib/geode/data.old
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Restore base backup</span>
</span></span><span class="line"><span class="cl">geode restore <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --source s3://geode-backups/production <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --backup-id <span class="m">1738012345</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --target /var/lib/geode/data
</span></span></code></pre></div><p><strong>Step 4: Apply WAL to Target Time</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">geode recover <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --data-dir /var/lib/geode/data <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --wal-archive s3://geode-wal-archive/production/wal <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --target-time <span class="s2">"2026-01-28 10:30:00"</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --timezone UTC
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Output:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Starting point-in-time recovery</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Base backup: 1738012345 (2026-01-23 02:00:00)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Target time: 2026-01-28 10:30:00 UTC</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Applying WAL segments:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - segment-0001.wal (2026-01-23 02:05:00 - 2026-01-24 02:00:00)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - segment-0002.wal (2026-01-24 02:00:00 - 2026-01-25 02:00:00)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - segment-0003.wal (2026-01-25 02:00:00 - 2026-01-26 02:00:00)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - segment-0004.wal (2026-01-26 02:00:00 - 2026-01-27 02:00:00)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - segment-0005.wal (2026-01-27 02:00:00 - 2026-01-28 02:00:00)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - segment-0006.wal (2026-01-28 02:00:00 - 2026-01-28 11:00:00)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Stopping at: 2026-01-28 10:30:00 UTC</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Recovery complete</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Transactions applied: 12,456</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Final LSN: 0x1A2B3C4D</span>
</span></span></code></pre></div><p><strong>Step 5: Verify and Start</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Verify data integrity</span>
</span></span><span class="line"><span class="cl">geode verify --data-dir /var/lib/geode/data
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Start server</span>
</span></span><span class="line"><span class="cl">sudo systemctl start geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify recovery</span>
</span></span><span class="line"><span class="cl">geode query <span class="s2">"MATCH (n) RETURN count(n) AS node_count"</span>
</span></span></code></pre></div>
<h4 id="pitr-to-named-recovery-point" class="position-relative d-flex align-items-center group">
<span>PITR to Named Recovery Point</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="pitr-to-named-recovery-point"
aria-haspopup="dialog"
aria-label="Share link: PITR to Named Recovery Point">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>If you created named recovery points:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Recover to named point</span>
</span></span><span class="line"><span class="cl">geode recover <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --data-dir /var/lib/geode/data <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --wal-archive s3://geode-wal-archive/production/wal <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --target-name <span class="s2">"pre-migration-backup"</span>
</span></span></code></pre></div>
<h3 id="full-database-restore" class="position-relative d-flex align-items-center group">
<span>Full Database Restore</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="full-database-restore"
aria-haspopup="dialog"
aria-label="Share link: Full Database Restore">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>For complete database restoration from backup.</p>
<h4 id="standard-restore" class="position-relative d-flex align-items-center group">
<span>Standard Restore</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="standard-restore"
aria-haspopup="dialog"
aria-label="Share link: Standard Restore">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Stop server</span>
</span></span><span class="line"><span class="cl">sudo systemctl stop geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Backup current data (safety)</span>
</span></span><span class="line"><span class="cl">sudo mv /var/lib/geode/data /var/lib/geode/data.backup-<span class="k">$(</span>date +%Y%m%d<span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># List available backups</span>
</span></span><span class="line"><span class="cl">geode backup --dest s3://geode-backups/production --list
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Restore latest backup</span>
</span></span><span class="line"><span class="cl"><span class="nv">LATEST_BACKUP</span><span class="o">=</span><span class="k">$(</span>geode backup --dest s3://geode-backups/production --list --latest --quiet<span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">geode restore <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --source s3://geode-backups/production <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --backup-id <span class="nv">$LATEST_BACKUP</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --target /var/lib/geode/data
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify integrity</span>
</span></span><span class="line"><span class="cl">geode verify --data-dir /var/lib/geode/data
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Start server</span>
</span></span><span class="line"><span class="cl">sudo systemctl start geode
</span></span></code></pre></div>
<h4 id="restore-with-incremental-backups" class="position-relative d-flex align-items-center group">
<span>Restore with Incremental Backups</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="restore-with-incremental-backups"
aria-haspopup="dialog"
aria-label="Share link: Restore with Incremental Backups">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>When using incremental backup strategy:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Restore full backup chain</span>
</span></span><span class="line"><span class="cl">geode restore <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --source s3://geode-backups/production <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --backup-id <span class="m">1738012345</span> <span class="se">\ </span> <span class="c1"># Base full backup</span>
</span></span><span class="line"><span class="cl"> --apply-incrementals <span class="se">\ </span> <span class="c1"># Apply all incremental backups</span>
</span></span><span class="line"><span class="cl"> --target /var/lib/geode/data
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Output:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Restoring base backup 1738012345...</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Applying incremental 1738098745 (2026-01-24)...</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Applying incremental 1738185145 (2026-01-25)...</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Applying incremental 1738271545 (2026-01-26)...</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Applying incremental 1738357945 (2026-01-27)...</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Restore complete</span>
</span></span></code></pre></div>
<h4 id="restore-to-different-location" class="position-relative d-flex align-items-center group">
<span>Restore to Different Location</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="restore-to-different-location"
aria-haspopup="dialog"
aria-label="Share link: Restore to Different Location">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Restore to alternate directory</span>
</span></span><span class="line"><span class="cl">geode restore <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --source s3://geode-backups/production <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --backup-id <span class="m">1738012345</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --target /var/lib/geode/data-restored
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Start with alternate data directory</span>
</span></span><span class="line"><span class="cl">geode serve <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --data-dir /var/lib/geode/data-restored <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --listen 0.0.0.0:3142
</span></span></code></pre></div>
<h3 id="disaster-recovery" class="position-relative d-flex align-items-center group">
<span>Disaster Recovery</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="disaster-recovery"
aria-haspopup="dialog"
aria-label="Share link: Disaster Recovery">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="complete-site-failure" class="position-relative d-flex align-items-center group">
<span>Complete Site Failure</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="complete-site-failure"
aria-haspopup="dialog"
aria-label="Share link: Complete Site Failure">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>When the primary site is unavailable:</p>
<p><strong>Step 1: Provision New Infrastructure</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Deploy new Geode server</span>
</span></span><span class="line"><span class="cl"><span class="c1"># (Use your provisioning tool: Terraform, Ansible, etc.)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Install Geode</span>
</span></span><span class="line"><span class="cl">curl -fsSL https://geodedb.com/install.sh <span class="p">|</span> sudo bash
</span></span></code></pre></div><p><strong>Step 2: Configure Cloud Storage Access</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">AWS_ACCESS_KEY_ID</span><span class="o">=</span><span class="s1">'your-access-key'</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">AWS_SECRET_ACCESS_KEY</span><span class="o">=</span><span class="s1">'your-secret-key'</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">AWS_REGION</span><span class="o">=</span><span class="s1">'us-west-2'</span>
</span></span></code></pre></div><p><strong>Step 3: Restore from Off-Site Backup</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># List available backups</span>
</span></span><span class="line"><span class="cl">geode backup --dest s3://geode-backups/production --list
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Restore latest backup</span>
</span></span><span class="line"><span class="cl">geode restore <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --source s3://geode-backups/production <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --backup-id latest <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --target /var/lib/geode/data
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Apply WAL if PITR is needed</span>
</span></span><span class="line"><span class="cl">geode recover <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --data-dir /var/lib/geode/data <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --wal-archive s3://geode-wal-archive/production/wal <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --target-time <span class="s2">"latest"</span>
</span></span></code></pre></div><p><strong>Step 4: Verify and Start</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Verify data</span>
</span></span><span class="line"><span class="cl">geode verify --data-dir /var/lib/geode/data
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Start server</span>
</span></span><span class="line"><span class="cl">sudo systemctl start geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run comprehensive health check</span>
</span></span><span class="line"><span class="cl">geode query <span class="s2">"MATCH (n) RETURN labels(n) AS label, count(n) AS count"</span>
</span></span></code></pre></div>
<h4 id="data-corruption-recovery" class="position-relative d-flex align-items-center group">
<span>Data Corruption Recovery</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="data-corruption-recovery"
aria-haspopup="dialog"
aria-label="Share link: Data Corruption Recovery">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>If data files are corrupted:</p>
<p><strong>Step 1: Identify Corruption</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Run integrity check</span>
</span></span><span class="line"><span class="cl">geode verify --data-dir /var/lib/geode/data --full
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Output:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Checking nodes.db... ERROR: Checksum mismatch at block 12345</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Checking edges.db... OK</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Checking indexes/... OK</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Verification FAILED: 1 corrupted file(s)</span>
</span></span></code></pre></div><p><strong>Step 2: Attempt Repair</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Try automatic repair (minor corruption)</span>
</span></span><span class="line"><span class="cl">geode repair --data-dir /var/lib/geode/data --auto
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Output:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Repairing nodes.db...</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Block 12345: Reconstructing from WAL</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Block 12345: Repair successful</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Repair complete</span>
</span></span></code></pre></div><p><strong>Step 3: If Repair Fails, Restore from Backup</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Stop server</span>
</span></span><span class="line"><span class="cl">sudo systemctl stop geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Restore from last known good backup</span>
</span></span><span class="line"><span class="cl">geode restore <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --source s3://geode-backups/production <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --backup-id last-verified <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --target /var/lib/geode/data
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Start server</span>
</span></span><span class="line"><span class="cl">sudo systemctl start geode
</span></span></code></pre></div>
<h4 id="accidental-data-deletion-recovery" class="position-relative d-flex align-items-center group">
<span>Accidental Data Deletion Recovery</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="accidental-data-deletion-recovery"
aria-haspopup="dialog"
aria-label="Share link: Accidental Data Deletion Recovery">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>If data was accidentally deleted:</p>
<p><strong>Option 1: Point-in-Time Recovery (Preferred)</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Restore to time before deletion</span>
</span></span><span class="line"><span class="cl">geode recover <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --data-dir /var/lib/geode/data-recovery <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --wal-archive s3://geode-wal-archive/production/wal <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --target-time <span class="s2">"2026-01-28 09:00:00"</span> <span class="c1"># Before deletion at 10:00</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Extract deleted data from recovered instance</span>
</span></span><span class="line"><span class="cl">geode query <span class="s2">"MATCH (n:DeletedLabel) RETURN n"</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --server localhost:3142 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --format json > deleted_data.json
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Re-import to production</span>
</span></span><span class="line"><span class="cl">geode import --file deleted_data.json --server localhost:3141
</span></span></code></pre></div><p><strong>Option 2: Partial Restore</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Export specific data from backup</span>
</span></span><span class="line"><span class="cl">geode backup-extract <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --source s3://geode-backups/production <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --backup-id <span class="m">1738012345</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --query <span class="s2">"MATCH (n:ImportantLabel) RETURN n"</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --output recovered_data.json
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Import to production</span>
</span></span><span class="line"><span class="cl">geode import --file recovered_data.json
</span></span></code></pre></div>
<h3 id="recovery-verification" class="position-relative d-flex align-items-center group">
<span>Recovery Verification</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="recovery-verification"
aria-haspopup="dialog"
aria-label="Share link: Recovery Verification">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="post-recovery-checks" class="position-relative d-flex align-items-center group">
<span>Post-Recovery Checks</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="post-recovery-checks"
aria-haspopup="dialog"
aria-label="Share link: Post-Recovery Checks">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>After any recovery, run these verification steps:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># /usr/local/bin/geode-recovery-verify.sh</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"=== Geode Recovery Verification ==="</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 1. Check server is running</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"1. Checking server status..."</span>
</span></span><span class="line"><span class="cl">systemctl is-active geode <span class="o">||</span> <span class="o">{</span> <span class="nb">echo</span> <span class="s2">"FAILED: Server not running"</span><span class="p">;</span> <span class="nb">exit</span> 1<span class="p">;</span> <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. Verify data integrity</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"2. Verifying data integrity..."</span>
</span></span><span class="line"><span class="cl">geode verify --data-dir /var/lib/geode/data --quick <span class="o">||</span> <span class="o">{</span> <span class="nb">echo</span> <span class="s2">"FAILED: Integrity check failed"</span><span class="p">;</span> <span class="nb">exit</span> 1<span class="p">;</span> <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. Check node count</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"3. Checking node count..."</span>
</span></span><span class="line"><span class="cl"><span class="nv">NODE_COUNT</span><span class="o">=</span><span class="k">$(</span>geode query <span class="s2">"MATCH (n) RETURN count(n)"</span> --format json <span class="p">|</span> jq -r <span class="s1">'.result.rows[0][0]'</span><span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">" Node count: </span><span class="nv">$NODE_COUNT</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. Check relationship count</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"4. Checking relationship count..."</span>
</span></span><span class="line"><span class="cl"><span class="nv">REL_COUNT</span><span class="o">=</span><span class="k">$(</span>geode query <span class="s2">"MATCH ()-[r]->() RETURN count(r)"</span> --format json <span class="p">|</span> jq -r <span class="s1">'.result.rows[0][0]'</span><span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">" Relationship count: </span><span class="nv">$REL_COUNT</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. Test transactions</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"5. Testing transactions..."</span>
</span></span><span class="line"><span class="cl">geode query <span class="s2">"BEGIN; CREATE (:RecoveryTest {ts: datetime()}); ROLLBACK"</span> <span class="o">||</span> <span class="o">{</span> <span class="nb">echo</span> <span class="s2">"FAILED: Transaction test failed"</span><span class="p">;</span> <span class="nb">exit</span> 1<span class="p">;</span> <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 6. Check replication (if cluster)</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"6. Checking cluster status..."</span>
</span></span><span class="line"><span class="cl">geode cluster status 2>/dev/null <span class="o">||</span> <span class="nb">echo</span> <span class="s2">" Single-node mode (no cluster)"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">""</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"=== Recovery Verification PASSED ==="</span>
</span></span></code></pre></div>
<h4 id="data-comparison" class="position-relative d-flex align-items-center group">
<span>Data Comparison</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="data-comparison"
aria-haspopup="dialog"
aria-label="Share link: Data Comparison">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Compare recovered data with expected state:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Export node counts by label</span>
</span></span><span class="line"><span class="cl">geode query <span class="s2">"
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (n)
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN labels(n) AS label, count(n) AS count
</span></span></span><span class="line"><span class="cl"><span class="s2"> ORDER BY label
</span></span></span><span class="line"><span class="cl"><span class="s2">"</span> --format json > current_counts.json
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Compare with expected (from before incident)</span>
</span></span><span class="line"><span class="cl">diff expected_counts.json current_counts.json
</span></span></code></pre></div>
<h3 id="recovery-runbook" class="position-relative d-flex align-items-center group">
<span>Recovery Runbook</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="recovery-runbook"
aria-haspopup="dialog"
aria-label="Share link: Recovery Runbook">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="quick-reference-recovery-decision-tree" class="position-relative d-flex align-items-center group">
<span>Quick Reference: Recovery Decision Tree</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="quick-reference-recovery-decision-tree"
aria-haspopup="dialog"
aria-label="Share link: Quick Reference: Recovery Decision Tree">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-plaintext" data-lang="plaintext"><span class="line"><span class="cl">Server Down?
</span></span><span class="line"><span class="cl"> │
</span></span><span class="line"><span class="cl"> ├── Server crash → Restart server (auto recovery)
</span></span><span class="line"><span class="cl"> │
</span></span><span class="line"><span class="cl"> └── Data issue?
</span></span><span class="line"><span class="cl"> │
</span></span><span class="line"><span class="cl"> ├── Minor corruption → Run geode repair
</span></span><span class="line"><span class="cl"> │
</span></span><span class="line"><span class="cl"> ├── Major corruption → Restore from backup
</span></span><span class="line"><span class="cl"> │
</span></span><span class="line"><span class="cl"> └── Accidental deletion?
</span></span><span class="line"><span class="cl"> │
</span></span><span class="line"><span class="cl"> ├── Need specific time → PITR
</span></span><span class="line"><span class="cl"> │
</span></span><span class="line"><span class="cl"> └── Need latest data → Restore + WAL replay
</span></span></code></pre></div>
<h4 id="emergency-recovery-checklist" class="position-relative d-flex align-items-center group">
<span>Emergency Recovery Checklist</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="emergency-recovery-checklist"
aria-haspopup="dialog"
aria-label="Share link: Emergency Recovery Checklist">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Immediate Actions</strong>:</p>
<ul>
<li><input disabled="" type="checkbox"> Assess the situation (type of failure)</li>
<li><input disabled="" type="checkbox"> Check server logs: <code>geode logs --tail 500</code></li>
<li><input disabled="" type="checkbox"> Preserve evidence: <code>cp -r /var/lib/geode/data /var/lib/geode/data.incident-$(date +%s)</code></li>
<li><input disabled="" type="checkbox"> Notify stakeholders</li>
</ul>
<p><strong>Recovery Actions</strong>:</p>
<ul>
<li><input disabled="" type="checkbox"> Determine recovery strategy (auto, PITR, full restore)</li>
<li><input disabled="" type="checkbox"> Execute recovery procedure</li>
<li><input disabled="" type="checkbox"> Run verification checks</li>
<li><input disabled="" type="checkbox"> Monitor server stability</li>
</ul>
<p><strong>Post-Recovery</strong>:</p>
<ul>
<li><input disabled="" type="checkbox"> Document incident timeline</li>
<li><input disabled="" type="checkbox"> Identify root cause</li>
<li><input disabled="" type="checkbox"> Update runbooks if needed</li>
<li><input disabled="" type="checkbox"> Schedule post-incident review</li>
</ul>
<h3 id="best-practices" class="position-relative d-flex align-items-center group">
<span>Best Practices</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="best-practices"
aria-haspopup="dialog"
aria-label="Share link: Best Practices">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="prevention" class="position-relative d-flex align-items-center group">
<span>Prevention</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="prevention"
aria-haspopup="dialog"
aria-label="Share link: Prevention">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Regular Backups</strong>: Daily incremental, weekly full</li>
<li><strong>WAL Archiving</strong>: Continuous to enable PITR</li>
<li><strong>Monitoring</strong>: Alert on backup failures, disk space</li>
<li><strong>Testing</strong>: Monthly recovery drills</li>
</ol>
<h4 id="configuration-recommendations" class="position-relative d-flex align-items-center group">
<span>Configuration Recommendations</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="configuration-recommendations"
aria-haspopup="dialog"
aria-label="Share link: Configuration Recommendations">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># geode.yaml - Production recovery settings</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">recovery</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wal</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sync_mode</span><span class="p">:</span><span class="w"> </span><span class="l">fsync</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">segment_size</span><span class="p">:</span><span class="w"> </span><span class="l">64MB</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checkpoint</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">interval</span><span class="p">:</span><span class="w"> </span><span class="l">5m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">backup</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wal_archiving</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">retention_hours</span><span class="p">:</span><span class="w"> </span><span class="m">168</span><span class="w"> </span><span class="c"># 7 days</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">schedule</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">full_backup</span><span class="p">:</span><span class="w"> </span><span class="s1">'0 2 * * 0'</span><span class="w"> </span><span class="c"># Weekly Sunday</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">incremental_backup</span><span class="p">:</span><span class="w"> </span><span class="s1">'0 2 * * 1-6'</span><span class="w"> </span><span class="c"># Daily</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">retention_days</span><span class="p">:</span><span class="w"> </span><span class="m">90</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="recovery-time-targets" class="position-relative d-flex align-items-center group">
<span>Recovery Time Targets</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="recovery-time-targets"
aria-haspopup="dialog"
aria-label="Share link: Recovery Time Targets">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><table>
<thead>
<tr>
<th>Scenario</th>
<th>Target RTO</th>
<th>Target RPO</th>
</tr>
</thead>
<tbody>
<tr>
<td>Server crash</td>
<td>< 1 minute</td>
<td>0 (no data loss)</td>
</tr>
<tr>
<td>Minor corruption</td>
<td>< 5 minutes</td>
<td>0</td>
</tr>
<tr>
<td>Full restore</td>
<td>< 15 minutes</td>
<td>Last backup</td>
</tr>
<tr>
<td>PITR</td>
<td>< 30 minutes</td>
<td>Target timestamp</td>
</tr>
<tr>
<td>Disaster recovery</td>
<td>< 1 hour</td>
<td>Last WAL archive</td>
</tr>
</tbody>
</table>
<h3 id="related-documentation" class="position-relative d-flex align-items-center group">
<span>Related Documentation</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="related-documentation"
aria-haspopup="dialog"
aria-label="Share link: Related Documentation">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><strong><a
href="/docs/guides/backup-automation/"
>Backup Automation</a>
</strong> - Automated backup configuration</li>
<li><strong><a
href="/docs/configuration/server-configuration/"
>Server Configuration</a>
</strong> - Server settings</li>
<li><strong><a
href="/docs/guides/troubleshooting/"
>Troubleshooting</a>
</strong> - Common issues and solutions</li>
<li><strong><a
href="/docs/deployment/deployment-patterns/"
>Deployment Patterns</a>
</strong> - High availability setup</li>
<li><strong><a
href="/docs/architecture/distributed-architecture/"
>Distributed Architecture</a>
</strong> - Cluster recovery</li>
</ul>
<h3 id="summary" class="position-relative d-flex align-items-center group">
<span>Summary</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="summary"
aria-haspopup="dialog"
aria-label="Share link: Summary">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Geode provides robust recovery mechanisms:</p>
<ul>
<li><strong>Automatic crash recovery</strong> with WAL ensures zero data loss for committed transactions</li>
<li><strong>Point-in-time recovery</strong> enables restoration to any moment within retention period</li>
<li><strong>Full backup restore</strong> provides complete database reconstruction</li>
<li><strong>Disaster recovery</strong> procedures handle site-wide failures</li>
</ul>
<p><strong>Key Takeaways</strong>:</p>
<ul>
<li>Enable WAL archiving for PITR capability</li>
<li>Test recovery procedures regularly (monthly)</li>
<li>Document and practice recovery runbooks</li>
<li>Monitor backup health continuously</li>
</ul>
<hr>
<p><strong>Last Updated:</strong> January 28, 2026
<strong>Geode Version:</strong> <strong>v0.2.18</strong>+
<strong>Status:</strong> Production Ready</p>
Database Recovery
Complete guide to database recovery procedures for Geode including crash recovery, point-in-time recovery, disaster recovery, and data restoration