<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-15 -->
<h2 id="backup-and-recovery" class="position-relative d-flex align-items-center group">
<span>Backup and 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="backup-and-recovery"
aria-haspopup="dialog"
aria-label="Share link: Backup and 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>Database backup and recovery are critical operations for protecting your Geode graph data against hardware failures, software bugs, human errors, and disaster scenarios. Geode provides enterprise-grade backup capabilities designed for production workloads with minimal performance impact and point-in-time recovery guarantees.</p>
<h3 id="introduction-to-geode-backup" class="position-relative d-flex align-items-center group">
<span>Introduction to Geode Backup</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="introduction-to-geode-backup"
aria-haspopup="dialog"
aria-label="Share link: Introduction to Geode Backup">
<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 implements a comprehensive backup strategy that balances data protection, performance, and operational simplicity. The system supports multiple backup methods, each optimized for different scenarios and recovery time objectives (RTO) and recovery point objectives (RPO).</p>
<p>Key characteristics of Geode’s backup system include transactional consistency through MVCC (Multi-Version Concurrency Control), incremental backup support via the Write-Ahead Log (WAL), online backup operations with zero downtime, point-in-time recovery capabilities, and automatic verification of backup integrity.</p>
<p>The backup architecture integrates deeply with Geode’s storage engine, ensuring that backups capture a consistent snapshot of the graph database state without blocking concurrent read or write operations.</p>
<h3 id="backup-methods" class="position-relative d-flex align-items-center group">
<span>Backup Methods</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="backup-methods"
aria-haspopup="dialog"
aria-label="Share link: Backup Methods">
<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="full-database-backup" class="position-relative d-flex align-items-center group">
<span>Full Database Backup</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-backup"
aria-haspopup="dialog"
aria-label="Share link: Full Database Backup">
<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>Full backups capture the complete state of your Geode database at a specific point in time. This method creates a self-contained backup that can be restored independently without requiring any other backup files.</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 a full backup</span>
</span></span><span class="line"><span class="cl">geode backup create --type<span class="o">=</span>full --output<span class="o">=</span>/backups/geode-full-<span class="k">$(</span>date +%Y%m%d<span class="k">)</span>.tar.gz
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># With compression</span>
</span></span><span class="line"><span class="cl">geode backup create --type<span class="o">=</span>full --compress<span class="o">=</span>zstd --output<span class="o">=</span>/backups/geode-full.tar.zst
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify backup integrity</span>
</span></span><span class="line"><span class="cl">geode backup verify /backups/geode-full-20260124.tar.gz
</span></span></code></pre></div><p>Full backups are ideal for establishing baseline backups, disaster recovery scenarios, migrating databases between environments, and creating development or testing databases from production snapshots.</p>
<h4 id="incremental-backup" class="position-relative d-flex align-items-center group">
<span>Incremental Backup</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="incremental-backup"
aria-haspopup="dialog"
aria-label="Share link: Incremental Backup">
<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>Incremental backups capture only the changes made since the last backup, significantly reducing backup time and storage requirements for active databases.</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 incremental backup</span>
</span></span><span class="line"><span class="cl">geode backup create --type<span class="o">=</span>incremental --base<span class="o">=</span>/backups/geode-full.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --output<span class="o">=</span>/backups/geode-incr-<span class="k">$(</span>date +%Y%m%d-%H%M%S<span class="k">)</span>.tar.gz
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Chain multiple incrementals</span>
</span></span><span class="line"><span class="cl">geode backup create --type<span class="o">=</span>incremental <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --base<span class="o">=</span>/backups/geode-full.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --previous<span class="o">=</span>/backups/geode-incr-20260124-120000.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --output<span class="o">=</span>/backups/geode-incr-20260124-180000.tar.gz
</span></span></code></pre></div><p>Geode’s incremental backups leverage the Write-Ahead Log (WAL) to identify changed data efficiently, enabling frequent backups with minimal overhead.</p>
<h4 id="continuous-archiving-with-wal" class="position-relative d-flex align-items-center group">
<span>Continuous Archiving with WAL</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="continuous-archiving-with-wal"
aria-haspopup="dialog"
aria-label="Share link: Continuous Archiving with WAL">
<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>For databases requiring minimal data loss in disaster scenarios, Geode supports continuous WAL archiving, providing near-zero RPO.</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"># Enable WAL archiving</span>
</span></span><span class="line"><span class="cl">geode config <span class="nb">set</span> wal.archive.enabled<span class="o">=</span><span class="nb">true</span>
</span></span><span class="line"><span class="cl">geode config <span class="nb">set</span> wal.archive.directory<span class="o">=</span>/wal-archive
</span></span><span class="line"><span class="cl">geode config <span class="nb">set</span> wal.archive.compression<span class="o">=</span>zstd
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Restore with WAL replay</span>
</span></span><span class="line"><span class="cl">geode restore --backup<span class="o">=</span>/backups/geode-full.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --wal-archive<span class="o">=</span>/wal-archive <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --recovery-target-time<span class="o">=</span><span class="s2">"2026-01-24 14:30:00"</span>
</span></span></code></pre></div><p>WAL archiving enables point-in-time recovery to any moment between backups, supports streaming replication for standby servers, and provides audit trails for compliance requirements.</p>
<h3 id="backup-strategies" class="position-relative d-flex align-items-center group">
<span>Backup Strategies</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="backup-strategies"
aria-haspopup="dialog"
aria-label="Share link: Backup Strategies">
<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="production-backup-schedule" class="position-relative d-flex align-items-center group">
<span>Production Backup Schedule</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="production-backup-schedule"
aria-haspopup="dialog"
aria-label="Share link: Production Backup Schedule">
<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>A comprehensive backup strategy combines multiple backup types to balance protection and resource utilization:</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"># Daily full backup (off-peak hours)</span>
</span></span><span class="line"><span class="cl"><span class="m">0</span> <span class="m">2</span> * * * /usr/local/bin/geode backup create --type<span class="o">=</span>full <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --output<span class="o">=</span>/backups/daily/geode-<span class="k">$(</span>date +<span class="se">\%</span>Y<span class="se">\%</span>m<span class="se">\%</span>d<span class="k">)</span>.tar.gz
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Hourly incremental backups</span>
</span></span><span class="line"><span class="cl"><span class="m">0</span> * * * * /usr/local/bin/geode backup create --type<span class="o">=</span>incremental <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --base<span class="o">=</span>/backups/daily/geode-latest.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --output<span class="o">=</span>/backups/hourly/geode-<span class="k">$(</span>date +<span class="se">\%</span>Y<span class="se">\%</span>m<span class="se">\%</span>d-<span class="se">\%</span>H00<span class="k">)</span>.tar.gz
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Continuous WAL archiving</span>
</span></span><span class="line"><span class="cl">*/5 * * * * /usr/local/bin/geode wal archive --compress<span class="o">=</span>zstd
</span></span></code></pre></div>
<h4 id="retention-policies" class="position-relative d-flex align-items-center group">
<span>Retention Policies</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="retention-policies"
aria-haspopup="dialog"
aria-label="Share link: Retention Policies">
<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>Implement retention policies to manage backup storage costs while maintaining adequate recovery options:</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"># Configure retention policy</span>
</span></span><span class="line"><span class="cl">geode backup retention <span class="nb">set</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --full-daily<span class="o">=</span><span class="m">7</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --full-weekly<span class="o">=</span><span class="m">4</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --full-monthly<span class="o">=</span><span class="m">12</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --incremental-hours<span class="o">=</span><span class="m">168</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Automated cleanup</span>
</span></span><span class="line"><span class="cl">geode backup cleanup --apply-retention --dry-run<span class="o">=</span><span class="nb">false</span>
</span></span></code></pre></div><p>Typical retention strategies include daily full backups for 7 days, weekly backups for 4 weeks, monthly backups for 12 months, and hourly incrementals for 7 days.</p>
<h3 id="recovery-procedures" class="position-relative d-flex align-items-center group">
<span>Recovery Procedures</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-procedures"
aria-haspopup="dialog"
aria-label="Share link: Recovery Procedures">
<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="basic-recovery" class="position-relative d-flex align-items-center group">
<span>Basic 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="basic-recovery"
aria-haspopup="dialog"
aria-label="Share link: Basic 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>Restore from a full backup to recover your database to a known good 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"># Stop the database</span>
</span></span><span class="line"><span class="cl">geode stop
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Restore from backup</span>
</span></span><span class="line"><span class="cl">geode restore --backup<span class="o">=</span>/backups/geode-full-20260124.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --target-directory<span class="o">=</span>/var/lib/geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify restored data</span>
</span></span><span class="line"><span class="cl">geode verify --full-scan<span class="o">=</span><span class="nb">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Start the database</span>
</span></span><span class="line"><span class="cl">geode start
</span></span></code></pre></div>
<h4 id="point-in-time-recovery" class="position-relative d-flex align-items-center group">
<span>Point-in-Time 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="point-in-time-recovery"
aria-haspopup="dialog"
aria-label="Share link: Point-in-Time 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>Recover your database to a specific moment using base backup and WAL archives:</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 base backup</span>
</span></span><span class="line"><span class="cl">geode restore --backup<span class="o">=</span>/backups/geode-full-20260124.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --target-directory<span class="o">=</span>/var/lib/geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Apply WAL archives up to target time</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> --wal-archive<span class="o">=</span>/wal-archive <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --recovery-target-time<span class="o">=</span><span class="s2">"2026-01-24 14:30:00"</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --recovery-target-inclusive<span class="o">=</span><span class="nb">false</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify recovery point</span>
</span></span><span class="line"><span class="cl">geode query --execute <span class="s2">"SELECT current_timestamp()"</span> --format<span class="o">=</span>table
</span></span></code></pre></div><p>This technique is invaluable for recovering from logical errors like accidental data deletion, rolling back failed migrations or updates, and investigating database state at specific times for auditing.</p>
<h4 id="incremental-restore" class="position-relative d-flex align-items-center group">
<span>Incremental 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="incremental-restore"
aria-haspopup="dialog"
aria-label="Share link: Incremental 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><p>When restoring from incremental backups, apply them in chronological order:</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 base backup</span>
</span></span><span class="line"><span class="cl">geode restore --backup<span class="o">=</span>/backups/geode-full-20260120.tar.gz
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Apply incremental backups in order</span>
</span></span><span class="line"><span class="cl">geode restore --backup<span class="o">=</span>/backups/geode-incr-20260121.tar.gz --incremental
</span></span><span class="line"><span class="cl">geode restore --backup<span class="o">=</span>/backups/geode-incr-20260122.tar.gz --incremental
</span></span><span class="line"><span class="cl">geode restore --backup<span class="o">=</span>/backups/geode-incr-20260123.tar.gz --incremental
</span></span><span class="line"><span class="cl">geode restore --backup<span class="o">=</span>/backups/geode-incr-20260124.tar.gz --incremental
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Automated incremental chain restore</span>
</span></span><span class="line"><span class="cl">geode restore --backup<span class="o">=</span>/backups/geode-full-20260120.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --apply-incrementals<span class="o">=</span>/backups/incrementals/ <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --recovery-target<span class="o">=</span>latest
</span></span></code></pre></div>
<h3 id="online-backup-operations" class="position-relative d-flex align-items-center group">
<span>Online Backup Operations</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="online-backup-operations"
aria-haspopup="dialog"
aria-label="Share link: Online Backup Operations">
<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’s MVCC architecture enables consistent backups without blocking database operations:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">backup</span><span class="w"> </span><span class="py">status</span><span class="w"> </span><span class="py">during</span><span class="w"> </span><span class="py">backup</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SELECT</span><span class="w"> </span><span class="py">backup_id</span><span class="p">,</span><span class="w"> </span><span class="py">start_time</span><span class="p">,</span><span class="w"> </span><span class="py">progress_percent</span><span class="p">,</span><span class="w"> </span><span class="py">estimated_completion</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">FROM</span><span class="w"> </span><span class="py">system</span><span class="err">.</span><span class="py">active_backups</span><span class="err">;</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="err">--</span><span class="w"> </span><span class="py">Monitor</span><span class="w"> </span><span class="py">backup</span><span class="w"> </span><span class="py">impact</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">PROFILE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SELECT</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="err">*</span><span class="p">)</span><span class="w"> </span><span class="py">FROM</span><span class="w"> </span><span class="p">(</span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">n</span><span class="p">)</span><span class="w"> </span><span class="py">RETURN</span><span class="w"> </span><span class="py">n</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>Online backups maintain ACID guarantees, support concurrent transactions during backup operations, use snapshot isolation for consistency, and minimize performance impact through efficient I/O scheduling.</p>
<h3 id="disaster-recovery-planning" class="position-relative d-flex align-items-center group">
<span>Disaster Recovery Planning</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-planning"
aria-haspopup="dialog"
aria-label="Share link: Disaster Recovery Planning">
<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="multi-region-backup-strategy" class="position-relative d-flex align-items-center group">
<span>Multi-Region Backup Strategy</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="multi-region-backup-strategy"
aria-haspopup="dialog"
aria-label="Share link: Multi-Region Backup Strategy">
<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>Distribute backups across geographic regions for disaster resilience:</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"># Local backup</span>
</span></span><span class="line"><span class="cl">geode backup create --type<span class="o">=</span>full --output<span class="o">=</span>/local/backups/geode-full.tar.gz
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Replicate to remote regions</span>
</span></span><span class="line"><span class="cl">aws s3 sync /local/backups/ s3://geode-backups-us-east-1/ --region us-east-1
</span></span><span class="line"><span class="cl">aws s3 sync /local/backups/ s3://geode-backups-eu-west-1/ --region eu-west-1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Cloud-native backup</span>
</span></span><span class="line"><span class="cl">geode backup create --type<span class="o">=</span>full <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --output<span class="o">=</span>s3://geode-backups/geode-full-<span class="k">$(</span>date +%Y%m%d<span class="k">)</span>.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --storage-class<span class="o">=</span>GLACIER_IR
</span></span></code></pre></div>
<h4 id="recovery-time-objectives" class="position-relative d-flex align-items-center group">
<span>Recovery Time Objectives</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-objectives"
aria-haspopup="dialog"
aria-label="Share link: Recovery Time Objectives">
<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>Optimize backup strategies for your recovery time requirements:</p>
<ul>
<li>RTO < 15 minutes: Maintain hot standby with streaming replication</li>
<li>RTO < 1 hour: Keep recent backups on fast local storage</li>
<li>RTO < 4 hours: Use cloud storage with standard retrieval</li>
<li>RTO < 24 hours: Archive to cold storage tiers</li>
</ul>
<h4 id="testing-recovery-procedures" class="position-relative d-flex align-items-center group">
<span>Testing Recovery Procedures</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="testing-recovery-procedures"
aria-haspopup="dialog"
aria-label="Share link: Testing Recovery Procedures">
<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>Regularly test backup recovery to ensure reliability:</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"># Automated recovery testing</span>
</span></span><span class="line"><span class="cl"><span class="c1">#!/bin/bash</span>
</span></span><span class="line"><span class="cl"><span class="nv">BACKUP_FILE</span><span class="o">=</span><span class="s2">"/backups/geode-full-</span><span class="k">$(</span>date +%Y%m%d<span class="k">)</span><span class="s2">.tar.gz"</span>
</span></span><span class="line"><span class="cl"><span class="nv">TEST_DIR</span><span class="o">=</span><span class="s2">"/tmp/geode-recovery-test"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Create test environment</span>
</span></span><span class="line"><span class="cl">mkdir -p <span class="nv">$TEST_DIR</span>
</span></span><span class="line"><span class="cl">geode restore --backup<span class="o">=</span><span class="nv">$BACKUP_FILE</span> --target-directory<span class="o">=</span><span class="nv">$TEST_DIR</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify restored database</span>
</span></span><span class="line"><span class="cl">geode --data-dir<span class="o">=</span><span class="nv">$TEST_DIR</span> verify --full-scan<span class="o">=</span><span class="nb">true</span>
</span></span><span class="line"><span class="cl">geode --data-dir<span class="o">=</span><span class="nv">$TEST_DIR</span> query --execute <span class="s2">"SELECT COUNT(*) FROM graph_nodes"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Cleanup</span>
</span></span><span class="line"><span class="cl">rm -rf <span class="nv">$TEST_DIR</span>
</span></span></code></pre></div>
<h3 id="backup-performance-optimization" class="position-relative d-flex align-items-center group">
<span>Backup Performance Optimization</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="backup-performance-optimization"
aria-haspopup="dialog"
aria-label="Share link: Backup Performance Optimization">
<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="parallel-backup-operations" class="position-relative d-flex align-items-center group">
<span>Parallel Backup Operations</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="parallel-backup-operations"
aria-haspopup="dialog"
aria-label="Share link: Parallel Backup Operations">
<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>Leverage multiple CPU cores for faster backups:</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"># Parallel compression</span>
</span></span><span class="line"><span class="cl">geode backup create --type<span class="o">=</span>full <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --output<span class="o">=</span>/backups/geode-full.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --compress<span class="o">=</span>zstd <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --compress-threads<span class="o">=</span><span class="m">8</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --parallel-workers<span class="o">=</span><span class="m">4</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Benchmark backup performance</span>
</span></span><span class="line"><span class="cl"><span class="nb">time</span> geode backup create --type<span class="o">=</span>full <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --output<span class="o">=</span>/dev/null <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --compress<span class="o">=</span>none <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --parallel-workers<span class="o">=</span><span class="m">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">time</span> geode backup create --type<span class="o">=</span>full <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --output<span class="o">=</span>/dev/null <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --compress<span class="o">=</span>zstd <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --parallel-workers<span class="o">=</span><span class="m">8</span>
</span></span></code></pre></div>
<h4 id="io-throttling" class="position-relative d-flex align-items-center group">
<span>I/O Throttling</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="io-throttling"
aria-haspopup="dialog"
aria-label="Share link: I/O Throttling">
<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>Limit backup I/O impact on production workloads:</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"># Rate-limited backup</span>
</span></span><span class="line"><span class="cl">geode backup create --type<span class="o">=</span>full <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --output<span class="o">=</span>/backups/geode-full.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --io-limit<span class="o">=</span>100MB/s <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --priority<span class="o">=</span>low
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Adaptive throttling based on load</span>
</span></span><span class="line"><span class="cl">geode backup create --type<span class="o">=</span>full <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --output<span class="o">=</span>/backups/geode-full.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --adaptive-throttling<span class="o">=</span><span class="nb">true</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --max-cpu-percent<span class="o">=</span><span class="m">20</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --max-io-percent<span class="o">=</span><span class="m">30</span>
</span></span></code></pre></div>
<h3 id="backup-verification-and-integrity" class="position-relative d-flex align-items-center group">
<span>Backup Verification and Integrity</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="backup-verification-and-integrity"
aria-haspopup="dialog"
aria-label="Share link: Backup Verification and Integrity">
<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="automated-verification" class="position-relative d-flex align-items-center group">
<span>Automated 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="automated-verification"
aria-haspopup="dialog"
aria-label="Share link: Automated 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>
</h4><p>Ensure backup integrity with automated checks:</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 backup checksums</span>
</span></span><span class="line"><span class="cl">geode backup verify /backups/geode-full.tar.gz --verify-checksums
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Test restore in isolated environment</span>
</span></span><span class="line"><span class="cl">geode backup verify /backups/geode-full.tar.gz --test-restore
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify data integrity after restore</span>
</span></span><span class="line"><span class="cl">geode backup verify /backups/geode-full.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --test-restore <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --verify-queries<span class="o">=</span>/etc/geode/verify-queries.gql
</span></span></code></pre></div><p>Example verification queries:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Verify</span><span class="w"> </span><span class="py">node</span><span class="w"> </span><span class="py">counts</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SELECT</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="err">*</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">node_count</span><span class="w"> </span><span class="py">FROM</span><span class="w"> </span><span class="p">(</span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">n</span><span class="p">)</span><span class="w"> </span><span class="py">RETURN</span><span class="w"> </span><span class="py">n</span><span class="p">)</span><span class="err">;</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="err">--</span><span class="w"> </span><span class="py">Verify</span><span class="w"> </span><span class="py">relationship</span><span class="w"> </span><span class="py">integrity</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SELECT</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="err">*</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">edge_count</span><span class="w"> </span><span class="py">FROM</span><span class="w"> </span><span class="p">(</span><span class="py">MATCH</span><span class="w"> </span><span class="p">()</span><span class="err">-</span><span class="p">[</span><span class="py">r</span><span class="p">]</span><span class="err">-></span><span class="p">()</span><span class="w"> </span><span class="py">RETURN</span><span class="w"> </span><span class="py">r</span><span class="p">)</span><span class="err">;</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="err">--</span><span class="w"> </span><span class="py">Verify</span><span class="w"> </span><span class="py">critical</span><span class="w"> </span><span class="py">data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">role</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">admin</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="py">u</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">admin_count</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<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><ol>
<li><strong>Backup Schedule</strong>: Implement a 3-2-1 backup strategy (3 copies, 2 different media types, 1 offsite)</li>
<li><strong>Encryption</strong>: Encrypt backups containing sensitive data using strong encryption algorithms</li>
<li><strong>Monitoring</strong>: Monitor backup success rates, backup sizes, and backup duration trends</li>
<li><strong>Documentation</strong>: Document recovery procedures and maintain runbooks for disaster scenarios</li>
<li><strong>Testing</strong>: Test recovery procedures quarterly and after major system changes</li>
<li><strong>Automation</strong>: Automate backup processes to eliminate human error and ensure consistency</li>
<li><strong>Validation</strong>: Validate backup integrity immediately after creation</li>
<li><strong>Retention</strong>: Balance retention requirements with storage costs and compliance needs</li>
</ol>
<h3 id="troubleshooting" class="position-relative d-flex align-items-center group">
<span>Troubleshooting</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="troubleshooting"
aria-haspopup="dialog"
aria-label="Share link: Troubleshooting">
<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="backup-failures" class="position-relative d-flex align-items-center group">
<span>Backup Failures</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="backup-failures"
aria-haspopup="dialog"
aria-label="Share link: Backup Failures">
<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>Common backup issues and solutions:</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"># Insufficient disk space</span>
</span></span><span class="line"><span class="cl">geode backup create --type<span class="o">=</span>full <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --output<span class="o">=</span>/backups/geode-full.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --compress<span class="o">=</span>zstd <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --compress-level<span class="o">=</span><span class="m">9</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Network timeouts for cloud backups</span>
</span></span><span class="line"><span class="cl">geode backup create --type<span class="o">=</span>full <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --output<span class="o">=</span>s3://bucket/backup.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --retry-attempts<span class="o">=</span><span class="m">5</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --timeout<span class="o">=</span><span class="m">3600</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Check backup logs</span>
</span></span><span class="line"><span class="cl">geode logs --filter<span class="o">=</span>backup --level<span class="o">=</span>error --tail<span class="o">=</span><span class="m">100</span>
</span></span></code></pre></div>
<h4 id="recovery-issues" class="position-relative d-flex align-items-center group">
<span>Recovery Issues</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-issues"
aria-haspopup="dialog"
aria-label="Share link: Recovery Issues">
<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"># Corrupted backup file</span>
</span></span><span class="line"><span class="cl">geode backup verify /backups/geode-full.tar.gz --repair
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># WAL archive gaps</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> --wal-archive<span class="o">=</span>/wal-archive <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --recovery-target-time<span class="o">=</span><span class="s2">"2026-01-24 14:30:00"</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --skip-missing-wal<span class="o">=</span><span class="nb">true</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --recovery-target-inclusive<span class="o">=</span><span class="nb">false</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Version compatibility</span>
</span></span><span class="line"><span class="cl">geode restore --backup<span class="o">=</span>/backups/geode-full.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --source-version<span class="o">=</span>0.1.2 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --target-version<span class="o">=</span>0.2.18 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --migrate-schema<span class="o">=</span><span class="nb">true</span>
</span></span></code></pre></div>
<h3 id="advanced-backup-patterns" class="position-relative d-flex align-items-center group">
<span>Advanced Backup Patterns</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="advanced-backup-patterns"
aria-haspopup="dialog"
aria-label="Share link: Advanced Backup Patterns">
<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="application-consistent-backups" class="position-relative d-flex align-items-center group">
<span>Application-Consistent 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="application-consistent-backups"
aria-haspopup="dialog"
aria-label="Share link: Application-Consistent 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>Ensure application consistency during backups by coordinating with application state:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># application_consistent_backup.py</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">create_application_consistent_backup</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Step 1: Quiesce application writes</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">app</span><span class="o">.</span><span class="n">pause_writes</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Step 2: Flush pending transactions</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">tx</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">tx</span><span class="o">.</span><span class="n">begin</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">tx</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"CALL dbms.checkpoint()"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Step 3: Create backup</span>
</span></span><span class="line"><span class="cl"> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'geode'</span><span class="p">,</span> <span class="s1">'backup'</span><span class="p">,</span> <span class="s1">'create'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'--type=full'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'--output=/backups/app-consistent.tar.gz'</span>
</span></span><span class="line"><span class="cl"> <span class="p">],</span> <span class="n">check</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Step 4: Resume application writes</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">app</span><span class="o">.</span><span class="n">resume_writes</span><span class="p">()</span>
</span></span></code></pre></div>
<h4 id="backup-cataloging" class="position-relative d-flex align-items-center group">
<span>Backup Cataloging</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="backup-cataloging"
aria-haspopup="dialog"
aria-label="Share link: Backup Cataloging">
<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>Maintain backup metadata for efficient management:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">-- backup_catalog schema
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">backup_catalog</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">backup_id</span><span class="w"> </span><span class="nb">SERIAL</span><span class="w"> </span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">backup_type</span><span class="w"> </span><span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">20</span><span class="p">),</span><span class="w"> </span><span class="c1">-- full, incremental, differential
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="n">backup_path</span><span class="w"> </span><span class="nb">TEXT</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">created_at</span><span class="w"> </span><span class="k">TIMESTAMP</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">size_bytes</span><span class="w"> </span><span class="nb">BIGINT</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">compressed_size_bytes</span><span class="w"> </span><span class="nb">BIGINT</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">checksum</span><span class="w"> </span><span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">64</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">encryption_enabled</span><span class="w"> </span><span class="nb">BOOLEAN</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">retention_until</span><span class="w"> </span><span class="k">TIMESTAMP</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">parent_backup_id</span><span class="w"> </span><span class="nb">INTEGER</span><span class="w"> </span><span class="k">REFERENCES</span><span class="w"> </span><span class="n">backup_catalog</span><span class="p">(</span><span class="n">backup_id</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">20</span><span class="p">),</span><span class="w"> </span><span class="c1">-- completed, failed, in_progress
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="n">metadata</span><span class="w"> </span><span class="n">JSONB</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">);</span><span class="w">
</span></span></span></code></pre></div><p>Track backups programmatically:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">register_backup</span><span class="p">(</span><span class="n">backup_path</span><span class="p">,</span> <span class="n">backup_type</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">size</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">getsize</span><span class="p">(</span><span class="n">backup_path</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">checksum</span> <span class="o">=</span> <span class="n">calculate_sha256</span><span class="p">(</span><span class="n">backup_path</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">cursor</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> INSERT INTO backup_catalog
</span></span></span><span class="line"><span class="cl"><span class="s2"> (backup_type, backup_path, created_at, size_bytes, checksum, status)
</span></span></span><span class="line"><span class="cl"><span class="s2"> VALUES (</span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">, NOW(), </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">, 'completed')
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURNING backup_id
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">(</span><span class="n">backup_type</span><span class="p">,</span> <span class="n">backup_path</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">checksum</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">cursor</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
</span></span></code></pre></div>
<h4 id="backup-compliance-reporting" class="position-relative d-flex align-items-center group">
<span>Backup Compliance Reporting</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="backup-compliance-reporting"
aria-haspopup="dialog"
aria-label="Share link: Backup Compliance Reporting">
<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>Generate compliance reports for auditors:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">generate_backup_compliance_report</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Generate monthly backup compliance report"""</span>
</span></span><span class="line"><span class="cl"> <span class="n">report</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'period'</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y-%m'</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'metrics'</span><span class="p">:</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Daily backup success rate</span>
</span></span><span class="line"><span class="cl"> <span class="n">cursor</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> SELECT
</span></span></span><span class="line"><span class="cl"><span class="s2"> DATE(created_at) as backup_date,
</span></span></span><span class="line"><span class="cl"><span class="s2"> COUNT(*) FILTER (WHERE status = 'completed') as successful,
</span></span></span><span class="line"><span class="cl"><span class="s2"> COUNT(*) FILTER (WHERE status = 'failed') as failed
</span></span></span><span class="line"><span class="cl"><span class="s2"> FROM backup_catalog
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE created_at > NOW() - INTERVAL '30 days'
</span></span></span><span class="line"><span class="cl"><span class="s2"> GROUP BY DATE(created_at)
</span></span></span><span class="line"><span class="cl"><span class="s2"> ORDER BY backup_date
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">report</span><span class="p">[</span><span class="s1">'daily_backups'</span><span class="p">]</span> <span class="o">=</span> <span class="n">cursor</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Verify backups exist for all required days</span>
</span></span><span class="line"><span class="cl"> <span class="n">cursor</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> SELECT COUNT(DISTINCT DATE(created_at))
</span></span></span><span class="line"><span class="cl"><span class="s2"> FROM backup_catalog
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE created_at > NOW() - INTERVAL '30 days'
</span></span></span><span class="line"><span class="cl"><span class="s2"> AND status = 'completed'
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">days_with_backups</span> <span class="o">=</span> <span class="n">cursor</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="n">report</span><span class="p">[</span><span class="s1">'metrics'</span><span class="p">][</span><span class="s1">'backup_coverage'</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">days_with_backups</span><span class="si">}</span><span class="s2">/30 days"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Average backup size and duration</span>
</span></span><span class="line"><span class="cl"> <span class="n">cursor</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> SELECT
</span></span></span><span class="line"><span class="cl"><span class="s2"> AVG(size_bytes) as avg_size,
</span></span></span><span class="line"><span class="cl"><span class="s2"> AVG(EXTRACT(EPOCH FROM (completed_at - started_at))) as avg_duration
</span></span></span><span class="line"><span class="cl"><span class="s2"> FROM backup_catalog
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE created_at > NOW() - INTERVAL '30 days'
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">stats</span> <span class="o">=</span> <span class="n">cursor</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="n">report</span><span class="p">[</span><span class="s1">'metrics'</span><span class="p">][</span><span class="s1">'avg_backup_size_gb'</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">stats</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">/</span> <span class="mf">1e9</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl"> <span class="n">report</span><span class="p">[</span><span class="s1">'metrics'</span><span class="p">][</span><span class="s1">'avg_duration_minutes'</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">stats</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">/</span> <span class="mi">60</span><span class="si">:</span><span class="s2">.1f</span><span class="si">}</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">report</span>
</span></span></code></pre></div>
<h4 id="incremental-forever-strategy" class="position-relative d-flex align-items-center group">
<span>Incremental Forever Strategy</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="incremental-forever-strategy"
aria-haspopup="dialog"
aria-label="Share link: Incremental Forever Strategy">
<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>Implement “incremental forever” backup approach:</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"># incremental_forever.sh</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">BACKUP_DIR</span><span class="o">=</span>/backups/incremental-forever
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Create synthetic full backup weekly by merging incrementals</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="k">$(</span>date +%u<span class="k">)</span> -eq <span class="m">7</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">"Creating synthetic full backup..."</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Get all incrementals from past week</span>
</span></span><span class="line"><span class="cl"> <span class="nv">INCREMENTALS</span><span class="o">=</span><span class="k">$(</span>find <span class="nv">$BACKUP_DIR</span> -name <span class="s2">"incr-*.tar.gz"</span> -mtime -7 <span class="p">|</span> sort<span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Merge into synthetic full</span>
</span></span><span class="line"><span class="cl"> geode backup merge <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --incrementals <span class="nv">$INCREMENTALS</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --output <span class="nv">$BACKUP_DIR</span>/synthetic-full-<span class="k">$(</span>date +%Y%m%d<span class="k">)</span>.tar.gz
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Delete old incrementals</span>
</span></span><span class="line"><span class="cl"> find <span class="nv">$BACKUP_DIR</span> -name <span class="s2">"incr-*.tar.gz"</span> -mtime +7 -delete
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Always create incremental</span>
</span></span><span class="line"><span class="cl">geode backup create --type<span class="o">=</span>incremental <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --base<span class="o">=</span><span class="nv">$BACKUP_DIR</span>/synthetic-full-latest.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --output<span class="o">=</span><span class="nv">$BACKUP_DIR</span>/incr-<span class="k">$(</span>date +%Y%m%d-%H%M%S<span class="k">)</span>.tar.gz
</span></span></code></pre></div><p>Benefits: Reduces backup window, optimizes storage, simplifies retention management.</p>
<h3 id="disaster-recovery-scenarios" class="position-relative d-flex align-items-center group">
<span>Disaster Recovery Scenarios</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-scenarios"
aria-haspopup="dialog"
aria-label="Share link: Disaster Recovery Scenarios">
<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-data-center-loss" class="position-relative d-flex align-items-center group">
<span>Complete Data Center Loss</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-data-center-loss"
aria-haspopup="dialog"
aria-label="Share link: Complete Data Center Loss">
<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>Recover from total data center failure:</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"># disaster_recovery_full.sh</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">DR_REGION</span><span class="o">=</span><span class="s2">"us-west-2"</span>
</span></span><span class="line"><span class="cl"><span class="nv">PRIMARY_REGION</span><span class="o">=</span><span class="s2">"us-east-1"</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">"Initiating disaster recovery for complete DC loss..."</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 1. Provision infrastructure in DR region</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> terraform/dr-region
</span></span><span class="line"><span class="cl">terraform apply -auto-approve -var<span class="o">=</span><span class="s2">"region=</span><span class="nv">$DR_REGION</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. Retrieve latest backup from off-site storage</span>
</span></span><span class="line"><span class="cl">aws s3 cp <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> <span class="s2">"s3://geode-backups-</span><span class="nv">$PRIMARY_REGION</span><span class="s2">/latest-full.tar.gz"</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> /tmp/recovery-backup.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --region <span class="nv">$PRIMARY_REGION</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. Deploy Geode instances</span>
</span></span><span class="line"><span class="cl"><span class="nv">DR_INSTANCES</span><span class="o">=</span><span class="k">$(</span>terraform output -json instance_ips <span class="p">|</span> jq -r <span class="s1">'.[]'</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. Restore to all instances in parallel</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> instance in <span class="nv">$DR_INSTANCES</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl"> <span class="o">(</span>
</span></span><span class="line"><span class="cl"> scp /tmp/recovery-backup.tar.gz geode@<span class="nv">$instance</span>:/tmp/
</span></span><span class="line"><span class="cl"> ssh geode@<span class="nv">$instance</span> <span class="s2">"geode restore --backup=/tmp/recovery-backup.tar.gz"</span>
</span></span><span class="line"><span class="cl"> <span class="o">)</span> <span class="p">&</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span><span class="line"><span class="cl"><span class="nb">wait</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. Verify data integrity</span>
</span></span><span class="line"><span class="cl">geode shell --host <span class="nv">$DR_INSTANCES</span><span class="o">[</span>0<span class="o">]</span> -c <span class="s2">"
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (n) RETURN COUNT(n) AS node_count;
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH ()-[r]->() RETURN COUNT(r) AS rel_count;
</span></span></span><span class="line"><span class="cl"><span class="s2">"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 6. Update DNS for failover</span>
</span></span><span class="line"><span class="cl">aws route53 change-resource-record-sets <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --hosted-zone-id Z123456 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --change-batch file://dns-failover.json
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"DR complete. Database active in </span><span class="nv">$DR_REGION</span><span class="s2">"</span>
</span></span></code></pre></div>
<h4 id="ransomware-recovery" class="position-relative d-flex align-items-center group">
<span>Ransomware 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="ransomware-recovery"
aria-haspopup="dialog"
aria-label="Share link: Ransomware 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>Recover from ransomware attack:</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"># Detect ransomware early</span>
</span></span><span class="line"><span class="cl">geode backup verify /backups/geode-full-20260124.tar.gz
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># If current data is compromised, restore to pre-attack state</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> --backup<span class="o">=</span>/backups/geode-full-20260122.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --recovery-target-time<span class="o">=</span><span class="s2">"2026-01-22 23:59:59"</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --verify-integrity<span class="o">=</span><span class="nb">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Apply WAL up to attack time (discard compromised transactions)</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> --wal-archive<span class="o">=</span>s3://wal-archive/ <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --recovery-target-time<span class="o">=</span><span class="s2">"2026-01-22 23:55:00"</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --skip-corrupted-wal<span class="o">=</span><span class="nb">true</span>
</span></span></code></pre></div>
<h4 id="logical-data-corruption" class="position-relative d-flex align-items-center group">
<span>Logical Data Corruption</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="logical-data-corruption"
aria-haspopup="dialog"
aria-label="Share link: Logical Data Corruption">
<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>Recover from application bug that corrupted data:</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"># Identify when corruption occurred</span>
</span></span><span class="line"><span class="cl">geode query -c <span class="s2">"
</span></span></span><span class="line"><span class="cl"><span class="s2"> SELECT MIN(modified_at) as corruption_start
</span></span></span><span class="line"><span class="cl"><span class="s2"> FROM audit_log
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE data_integrity_check = false
</span></span></span><span class="line"><span class="cl"><span class="s2">"</span> > /tmp/corruption_time.txt
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Restore to point before corruption</span>
</span></span><span class="line"><span class="cl"><span class="nv">RECOVERY_TIME</span><span class="o">=</span><span class="k">$(</span>cat /tmp/corruption_time.txt <span class="p">|</span> awk <span class="s1">'{print $1}'</span><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> --backup<span class="o">=</span>/backups/closest-backup-before-corruption.tar.gz
</span></span><span class="line"><span class="cl">
</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> --wal-archive<span class="o">=</span>/wal-archive <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --recovery-target-time<span class="o">=</span><span class="s2">"</span><span class="nv">$RECOVERY_TIME</span><span class="s2">"</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --recovery-target-inclusive<span class="o">=</span><span class="nb">false</span>
</span></span></code></pre></div>
<h3 id="backup-best-practices-summary" class="position-relative d-flex align-items-center group">
<span>Backup Best Practices 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="backup-best-practices-summary"
aria-haspopup="dialog"
aria-label="Share link: Backup Best Practices 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><ol>
<li><strong>Implement 3-2-1 rule</strong>: 3 copies, 2 different media, 1 off-site</li>
<li><strong>Test restores quarterly</strong>: Ensure backups actually work</li>
<li><strong>Monitor backup health</strong>: Automate checks for freshness and integrity</li>
<li><strong>Encrypt backups</strong>: Protect sensitive data at rest</li>
<li><strong>Document procedures</strong>: Maintain runbooks for disaster recovery</li>
<li><strong>Automate everything</strong>: Eliminate human error</li>
<li><strong>Verify after creation</strong>: Check checksums and test-restore samples</li>
<li><strong>Set retention policies</strong>: Balance compliance needs with storage costs</li>
<li><strong>Separate backup credentials</strong>: Don’t use same account as production</li>
<li><strong>Practice disaster recovery</strong>: Regular drills ensure team readiness</li>
</ol>
<h3 id="related-topics" class="position-relative d-flex align-items-center group">
<span>Related Topics</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-topics"
aria-haspopup="dialog"
aria-label="Share link: Related Topics">
<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><a
href="/tags/server/"
>Server Configuration</a>
- Server settings for backup operations</li>
<li><a
href="/tags/monitoring/"
>Monitoring</a>
- Backup monitoring and alerting</li>
<li><a
href="/tags/encryption/"
>Encryption</a>
- Backup encryption and access control</li>
</ul>
<h3 id="further-reading" class="position-relative d-flex align-items-center group">
<span>Further Reading</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="further-reading"
aria-haspopup="dialog"
aria-label="Share link: Further Reading">
<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><a
href="/docs/guides/backup-automation/"
>Backup Automation Guide</a>
- Detailed backup procedures</li>
<li><a
href="/docs/deployment/deployment-patterns/"
>Deployment Patterns</a>
- Production deployment strategies</li>
</ul>
Related Articles
Docs
9 min
Backup Procedures
Comprehensive backup procedures for Geode including full backups, incremental backups, S3 cloud storage, point-in-time recovery, and automated backup …
Docs
6 min
Deployment and Integration Guide
Deploy Geode with Docker Compose or Kubernetes, configure Vault/MinIO/Prometheus/Grafana, set up S3 backups and CDC/webhooks, and integrate client …
Guides
18 min
Data Export Guide
Comprehensive guide to exporting data from Geode to various formats
Guides
18 min
Backup and Restore Guide
Comprehensive guide to backing up and restoring Geode databases
Docs
9 min
Database Recovery
Complete guide to database recovery procedures for Geode including crash recovery, point-in-time recovery, disaster recovery, and data restoration