# dbbackup# dbbackup Professional database backup and restore utility for PostgreSQL, MySQL, and MariaDB with support for large databases and cluster operations.Database backup utility for PostgreSQL and MySQL with support for large databases. ## Overview## Recent Changes (November 2025) `dbbackup` is a production-ready database backup tool designed for reliability, performance, and ease of use. It provides both interactive and command-line interfaces for single database backups, cluster-wide operations, and disaster recovery scenarios.### 🎯 ETA Estimation for Long Operations - Real-time progress tracking with time estimates ### Key Features- Shows elapsed time and estimated time remaining - Format: "X/Y (Z%) | Elapsed: 25m | ETA: ~40m remaining" - **Multi-Database Support**: PostgreSQL, MySQL, and MariaDB- Particularly useful for 2+ hour cluster backups - **Backup Modes**: Single database, sample data, and full cluster- Works with both CLI and TUI modes - **Restore Operations**: Single database and full cluster restore with safety checks - **Performance**: Automatic CPU detection, parallel processing, and streaming compression### πŸ” Authentication Detection & Smart Guidance - **Large Database Handling**: Optimized for databases from gigabytes to terabytes- Detects OS user vs DB user mismatches - **Interactive Interface**: Full-featured terminal UI with real-time progress tracking- Identifies PostgreSQL authentication methods (peer/ident/md5) - **Cross-Platform**: Pre-compiled binaries for Linux, macOS, FreeBSD, OpenBSD, NetBSD- Shows helpful error messages with 4 solutions before connection attempt - **Production Ready**: Comprehensive error handling, logging, and safety checks- Auto-loads passwords from `~/.pgpass` file - Prevents confusing TLS/authentication errors in TUI mode ## Installation- Works across all Linux distributions ### Pre-compiled Binaries### πŸ—„οΈ MariaDB Support - MariaDB now selectable as separate database type in interactive mode Download the appropriate binary for your platform:- Press Enter to cycle: PostgreSQL β†’ MySQL β†’ MariaDB - Stored as distinct type in configuration ```bash # Linux (x86_64)### 🎨 UI Improvements curl -L https://git.uuxo.net/uuxo/dbbackup/raw/branch/main/bin/dbbackup_linux_amd64 -o dbbackup- Conservative terminal colors for better compatibility chmod +x dbbackup- Fixed operation history navigation (arrow keys, viewport scrolling) - Clean plain text display without styling artifacts # Linux (ARM64)- 15-item viewport with scroll indicators curl -L https://git.uuxo.net/uuxo/dbbackup/raw/branch/main/bin/dbbackup_linux_arm64 -o dbbackup chmod +x dbbackup### Large Database Handling - Streaming compression reduces memory usage by ~90% # macOS (Intel)- Native pgx v5 driver reduces memory by ~48% compared to lib/pq curl -L https://git.uuxo.net/uuxo/dbbackup/raw/branch/main/bin/dbbackup_darwin_amd64 -o dbbackup- Automatic format selection based on database size chmod +x dbbackup- Per-database timeout configuration (default: 240 minutes) - Parallel compression support via pigz when available # macOS (Apple Silicon) curl -L https://git.uuxo.net/uuxo/dbbackup/raw/branch/main/bin/dbbackup_darwin_arm64 -o dbbackup### Memory Usage chmod +x dbbackup | Database Size | Memory Usage | # FreeBSD, OpenBSD, NetBSD - see bin/ directory for other platforms|---------------|--------------| ```| 10GB | ~850MB | | 25GB | ~920MB | ### Build from Source| 50GB | ~940MB | | 100GB+ | <1GB | Requirements: Go 1.19 or later ### Progress Tracking ```bash git clone https://git.uuxo.net/uuxo/dbbackup.git- Real-time progress indicators cd dbbackup- Step-by-step operation tracking go build -o dbbackup- Structured logging with timestamps ```- Operation history ## Quick Start## Features ### Interactive Mode (Recommended)- PostgreSQL and MySQL support - Single database, sample, and cluster backup modes The interactive terminal interface provides guided backup and restore operations:- CPU detection and parallel job optimization - Interactive terminal interface ```bash- Cross-platform binaries (Linux, macOS, Windows, BSD) # PostgreSQL (requires peer authentication)- SSL/TLS support sudo -u postgres ./dbbackup interactive- Configurable compression levels # MySQL/MariaDB## Installation ./dbbackup interactive --db-type mysql --user root --password ```### Pre-compiled Binaries ### Command Line InterfaceDownload the binary for your platform: ```bash```bash # Single database backup# Linux (Intel/AMD) ./dbbackup backup single myapp_productioncurl -L https://git.uuxo.net/uuxo/dbbackup/raw/branch/main/bin/dbbackup_linux_amd64 -o dbbackup chmod +x dbbackup # Full cluster backup (PostgreSQL only) ./dbbackup backup cluster# macOS (Intel) curl -L https://git.uuxo.net/uuxo/dbbackup/raw/branch/main/bin/dbbackup_darwin_amd64 -o dbbackup # Restore from backupchmod +x dbbackup ./dbbackup restore single /path/to/backup.dump --target myapp_production # macOS (Apple Silicon) # Cluster restore with safety checkscurl -L https://git.uuxo.net/uuxo/dbbackup/raw/branch/main/bin/dbbackup_darwin_arm64 -o dbbackup ./dbbackup restore cluster /path/to/cluster_backup.tar.gz --confirmchmod +x dbbackup `````` ## Usage### Build from Source ### Backup Operations```bash git clone https://git.uuxo.net/uuxo/dbbackup.git #### Single Database Backupcd dbbackup go build -o dbbackup main.go ```bash``` ./dbbackup backup single [options] ## Usage Options: --host string Database host (default "localhost")### Interactive Mode --port int Database port (default 5432 for PostgreSQL, 3306 for MySQL) --user string Database user (default "postgres")```bash --password string Database password# PostgreSQL - must match OS user for peer authentication --backup-dir string Backup directory (default "/var/lib/pgsql/db_backups")sudo -u postgres dbbackup interactive --compression int Compression level 0-9 (default 6) --db-type string Database type: postgres, mysql, mariadb (default "postgres")# Or specify user explicitly --insecure Disable SSL/TLSsudo -u postgres dbbackup interactive --user postgres ``` # MySQL/MariaDB Example:dbbackup interactive --db-type mysql --user root ```bash``` ./dbbackup backup single production_db \ --host db.example.com \Interactive mode provides menu navigation with arrow keys and automatic status updates. --user backup_user \ --password \**Authentication Note:** For PostgreSQL with peer authentication, run as the postgres user to avoid connection errors. --compression 9 \ --backup-dir /mnt/backups### Command Line ``` ```bash #### Cluster Backup (PostgreSQL)# Single database backup dbbackup backup single myapp_db Backs up all databases in a PostgreSQL cluster including roles and tablespaces: # Sample backup (10% of data) ```bashdbbackup backup sample myapp_db --sample-ratio 10 ./dbbackup backup cluster [options] # Full cluster backup (PostgreSQL) Options:dbbackup backup cluster --max-cores int Maximum CPU cores to use (default: auto-detect) --cpu-workload string Workload type: cpu-intensive, io-intensive, balanced (default "balanced")# With custom settings --jobs int Number of parallel jobs (default: auto-detect)dbbackup backup single myapp_db \ ``` --host db.example.com \ --port 5432 \ Example: --user backup_user \ ```bash --ssl-mode require sudo -u postgres ./dbbackup backup cluster \``` --compression 3 \ --max-cores 16 \### System Commands --cpu-workload cpu-intensive ``````bash # Check connection status #### Sample Backupdbbackup status Create backups with reduced data for testing/development:# Run preflight checks dbbackup preflight ```bash ./dbbackup backup sample [options]# List databases and backups dbbackup list Options: --sample-strategy string Strategy: ratio, percent, count (default "ratio")# Show CPU information --sample-value float Sample value based on strategy (default 10)dbbackup cpu `````` Examples:## Configuration ```bash # Keep 10% of rows### Command Line Flags ./dbbackup backup sample myapp_db --sample-strategy percent --sample-value 10 | Flag | Description | Default | # Keep 1 in 100 rows|------|-------------|---------| ./dbbackup backup sample myapp_db --sample-strategy ratio --sample-value 100| `--host` | Database host | `localhost` | | `--port` | Database port | `5432` (PostgreSQL), `3306` (MySQL) | # Keep 10,000 rows per table| `--user` | Database user | `postgres` | ./dbbackup backup sample myapp_db --sample-strategy count --sample-value 10000| `--database` | Database name | `postgres` | ```| `-d`, `--db-type` | Database type | `postgres` | | `--ssl-mode` | SSL mode | `prefer` | ### Restore Operations| `--jobs` | Parallel jobs | Auto-detected | | `--dump-jobs` | Parallel dump jobs | Auto-detected | #### Single Database Restore| `--compression` | Compression level (0-9) | `6` | | `--backup-dir` | Backup directory | `/var/lib/pgsql/db_backups` | ```bash ./dbbackup restore single [options]### PostgreSQL Options:#### Authentication Methods --target string Target database name (required) --create Create database if it doesn't existPostgreSQL uses different authentication methods depending on your system configuration: --clean Drop and recreate database before restore --jobs int Number of parallel restore jobs (default 4)**Peer Authentication (most common on Linux):** ``````bash # Must run as postgres user Example:sudo -u postgres dbbackup backup cluster ```bash ./dbbackup restore single /backups/myapp_20250111.dump \# If you see this error: "Ident authentication failed for user postgres" --target myapp_restored \# Use one of these solutions: --create \``` --jobs 8 ```**Solution 1: Use matching OS user (recommended)** ```bash #### Cluster Restore (PostgreSQL)sudo -u postgres dbbackup status --user postgres ``` Restore an entire PostgreSQL cluster from backup: **Solution 2: Configure ~/.pgpass file** ```bash```bash ./dbbackup restore cluster [options]echo "localhost:5432:*:postgres:your_password" > ~/.pgpass chmod 0600 ~/.pgpass Options:dbbackup status --user postgres --confirm Confirm and execute restore (required for safety)``` --dry-run Show what would be done without executing --force Skip safety checks**Solution 3: Set PGPASSWORD environment variable** --jobs int Number of parallel decompression jobs (default: auto)```bash ```export PGPASSWORD=your_password dbbackup status --user postgres Example:``` ```bash sudo -u postgres ./dbbackup restore cluster /backups/cluster_20250111.tar.gz --confirm**Solution 4: Use --password flag** ``````bash dbbackup status --user postgres --password your_password **Safety Features:**``` - Pre-restore validation of archive integrity - Disk space checks#### SSL Configuration - Verification of required tools (psql, pg_restore, tar, gzip) - Automatic detection and cleanup of existing databases (interactive mode)SSL modes: `disable`, `prefer`, `require`, `verify-ca`, `verify-full` - Progress tracking with ETA estimation Cluster operations (backup/restore/verify) are PostgreSQL-only. ### Disaster Recovery ### MySQL / MariaDB For complete disaster recovery scenarios, use the included script: Set `--db-type mysql` or `--db-type mariadb`: ```bash```bash sudo ./disaster_recovery_test.shdbbackup backup single mydb \ ``` --db-type mysql \ --host 127.0.0.1 \ This script performs: --user backup_user \ 1. Full cluster backup with maximum performance --password **** 2. Documentation of current state``` 3. Controlled destruction of all user databases (with confirmation) 4. Complete cluster restorationMySQL backups are created as `.sql.gz` files. 5. Verification of database integrity ### Environment Variables **Warning:** This is a destructive operation. Only use in test environments or genuine disaster recovery scenarios. ```bash ## Configuration# Database export PG_HOST=localhost ### PostgreSQL Authenticationexport PG_PORT=5432 export PG_USER=postgres PostgreSQL authentication varies by system configuration. The tool automatically detects issues and provides solutions.export PGPASSWORD=secret export MYSQL_HOST=localhost #### Peer/Ident Authentication (Default on Linux)export MYSQL_PWD=secret Run as the PostgreSQL system user:# Backup export BACKUP_DIR=/var/backups ```bashexport COMPRESS_LEVEL=6 sudo -u postgres ./dbbackup backup clusterexport CLUSTER_TIMEOUT_MIN=240 # Cluster timeout in minutes ``` # Swap file management (Linux + root only) #### Password Authenticationexport AUTO_SWAP=false export SWAP_FILE_SIZE_GB=8 Option 1 - Using .pgpass file (recommended for automation):export SWAP_FILE_PATH=/tmp/dbbackup_swap ```bash``` echo "localhost:5432:*:postgres:password" > ~/.pgpass chmod 0600 ~/.pgpass## Architecture ./dbbackup backup single mydb --user postgres `````` dbbackup/ Option 2 - Environment variable:β”œβ”€β”€ cmd/ # CLI commands ```bashβ”œβ”€β”€ internal/ export PGPASSWORD=your_passwordβ”‚ β”œβ”€β”€ config/ # Configuration ./dbbackup backup single mydb --user postgresβ”‚ β”œβ”€β”€ database/ # Database drivers ```β”‚ β”œβ”€β”€ backup/ # Backup engine β”‚ β”œβ”€β”€ cpu/ # CPU detection Option 3 - Command line flag:β”‚ β”œβ”€β”€ logger/ # Logging ```bashβ”‚ β”œβ”€β”€ progress/ # Progress indicators ./dbbackup backup single mydb --user postgres --password your_passwordβ”‚ └── tui/ # Terminal UI ```└── bin/ # Binaries ``` ### MySQL/MariaDB Authentication ### Supported Platforms ```bash # Command lineLinux (amd64, arm64, armv7), macOS (amd64, arm64), Windows (amd64, arm64), FreeBSD, OpenBSD, NetBSD ./dbbackup backup single mydb --db-type mysql --user root --password your_password ## Performance # Environment variable export MYSQL_PWD=your_password### CPU Detection ./dbbackup backup single mydb --db-type mysql --user root The tool detects CPU configuration and adjusts parallelism automatically: # Configuration file cat > ~/.my.cnf << EOF```bash [client]dbbackup cpu user=backup_user``` password=your_password host=localhost### Large Database Handling EOF chmod 0600 ~/.my.cnfStreaming architecture maintains constant memory usage regardless of database size. Databases >5GB automatically use plain format. Parallel compression via pigz is used when available. ``` ### Memory Usage Notes ### Environment Variables - Small databases (<1GB): ~500MB ```bash- Medium databases (1-10GB): ~800MB # PostgreSQL- Large databases (10-50GB): ~900MB export PG_HOST=localhost- Huge databases (50GB+): ~1GB export PG_PORT=5432 export PG_USER=postgres## Troubleshooting export PGPASSWORD=password ### Connection Issues # MySQL/MariaDB export MYSQL_HOST=localhost**Authentication Errors (PostgreSQL):** export MYSQL_PORT=3306 export MYSQL_USER=rootIf you see: `FATAL: Peer authentication failed for user "postgres"` or `FATAL: Ident authentication failed` export MYSQL_PWD=password The tool will automatically show you 4 solutions: # General1. Run as matching OS user: `sudo -u postgres dbbackup` export BACKUP_DIR=/var/backups/databases2. Configure ~/.pgpass file (recommended for automation) export COMPRESS_LEVEL=63. Set PGPASSWORD environment variable export CLUSTER_TIMEOUT_MIN=2404. Use --password flag ``` **Test connection:** ## Performance```bash dbbackup status ### CPU Optimization # Disable SSL The tool automatically detects CPU configuration and optimizes parallel operations:dbbackup status --insecure ```bash# Use postgres user (Linux) ./dbbackup cpusudo -u postgres dbbackup status `````` Manual override:### Out of Memory Issues ```bash ./dbbackup backup cluster --max-cores 32 --jobs 32 --cpu-workload cpu-intensiveCheck kernel logs for OOM events: ``````bash dmesg | grep -i oom ### Memory Usagefree -h ``` Streaming architecture maintains constant memory usage: Enable swap file management (Linux + root): | Database Size | Memory Usage |```bash |---------------|--------------|export AUTO_SWAP=true | 1-10 GB | ~800 MB |export SWAP_FILE_SIZE_GB=8 | 10-50 GB | ~900 MB |sudo dbbackup backup cluster | 50-100 GB | ~950 MB |``` | 100+ GB | <1 GB | Or manually add swap: ### Large Database Support```bash sudo fallocate -l 8G /swapfile - Databases >5GB automatically use optimized plain format with streaming compressionsudo chmod 600 /swapfile - Parallel compression via pigz (if available) for maximum throughputsudo mkswap /swapfile - Per-database timeout configuration (default: 4 hours)sudo swapon /swapfile - Automatic format selection based on size``` ## System Commands### Debug Mode ```bash```bash # Check database connection and configurationdbbackup backup single mydb --debug ./dbbackup status``` # Run pre-flight checks before backup## Documentation ./dbbackup preflight - [AUTHENTICATION_PLAN.md](AUTHENTICATION_PLAN.md) - Authentication handling across distributions # List available databases- [PROGRESS_IMPLEMENTATION.md](PROGRESS_IMPLEMENTATION.md) - ETA estimation implementation ./dbbackup list- [HUGE_DATABASE_QUICK_START.md](HUGE_DATABASE_QUICK_START.md) - Quick start for large databases - [LARGE_DATABASE_OPTIMIZATION_PLAN.md](LARGE_DATABASE_OPTIMIZATION_PLAN.md) - Optimization details # Display CPU information- [PRIORITY2_PGX_INTEGRATION.md](PRIORITY2_PGX_INTEGRATION.md) - pgx v5 integration ./dbbackup cpu ## License # Show version information ./dbbackup versionMIT License ``` ## Repository ## Troubleshooting https://git.uuxo.net/uuxo/dbbackup ### Connection Issues Test connectivity: ```bash ./dbbackup status ``` For PostgreSQL peer authentication errors: ```bash sudo -u postgres ./dbbackup status ``` For SSL/TLS issues: ```bash ./dbbackup status --insecure ``` ### Out of Memory If experiencing memory issues with very large databases: 1. Check available memory: ```bash free -h dmesg | grep -i oom ``` 2. Add swap space: ```bash sudo fallocate -l 16G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile ``` 3. Reduce parallelism: ```bash ./dbbackup backup cluster --jobs 4 --dump-jobs 4 ``` ### Debug Mode Enable detailed logging: ```bash ./dbbackup backup single mydb --debug ``` ### Common Error Messages **"Ident authentication failed"** - Run as matching OS user or configure password authentication **"Permission denied"** - Check database user privileges or run with appropriate system user **"Disk space check failed"** - Ensure sufficient space in backup directory (4x archive size recommended) **"Archive validation failed"** - Backup file may be corrupted or incomplete ## Building All Platform Binaries To build binaries for all supported platforms: ```bash ./build_all.sh ``` Binaries will be created in the `bin/` directory. ## Project Structure ``` dbbackup/ β”œβ”€β”€ main.go # Application entry point β”œβ”€β”€ cmd/ # CLI command implementations β”œβ”€β”€ internal/ β”‚ β”œβ”€β”€ backup/ # Backup engine β”‚ β”œβ”€β”€ restore/ # Restore engine with safety checks β”‚ β”œβ”€β”€ config/ # Configuration management β”‚ β”œβ”€β”€ database/ # Database drivers (PostgreSQL, MySQL) β”‚ β”œβ”€β”€ cpu/ # CPU detection and optimization β”‚ β”œβ”€β”€ logger/ # Structured logging β”‚ β”œβ”€β”€ progress/ # Progress tracking and ETA estimation β”‚ └── tui/ # Interactive terminal interface β”œβ”€β”€ bin/ # Pre-compiled binaries β”œβ”€β”€ disaster_recovery_test.sh # Disaster recovery testing script └── build_all.sh # Multi-platform build script ``` ## Requirements ### System Requirements - Linux, macOS, FreeBSD, OpenBSD, or NetBSD - 1 GB RAM minimum (2 GB recommended for large databases) - Sufficient disk space for backups (typically 30-50% of database size) ### Software Requirements #### PostgreSQL - PostgreSQL client tools (psql, pg_dump, pg_dumpall, pg_restore) - PostgreSQL 10 or later recommended #### MySQL/MariaDB - MySQL/MariaDB client tools (mysql, mysqldump) - MySQL 5.7+ or MariaDB 10.3+ recommended #### Optional - pigz (for parallel compression) - pv (for progress monitoring) ## Best Practices 1. **Test Restores Regularly** - Verify backups can be restored successfully 2. **Monitor Disk Space** - Ensure adequate space for backup operations 3. **Use Compression** - Balance between speed and space (level 3-6 recommended) 4. **Automate Backups** - Schedule regular backups via cron or systemd timers 5. **Secure Credentials** - Use .pgpass or .my.cnf files with proper permissions (0600) 6. **Version Control** - Keep multiple backup versions for point-in-time recovery 7. **Off-Site Storage** - Copy backups to remote storage for disaster recovery 8. **Document Procedures** - Maintain runbooks for restore operations ## Support For issues, questions, or contributions: - Repository: https://git.uuxo.net/uuxo/dbbackup - Report issues via the repository issue tracker ## License MIT License - see repository for details