- Add 'System Resource Profile' menu item
- Show resource badge in main menu header (🔋 Tiny, 💡 Small, ⚡ Medium, 🚀 Large, 🏭 Huge)
- Display profile summary during backup/restore execution
- Add profile summary to restore preview screen
- Add 'p' shortcut in database selector to view profile
- Add 'p' shortcut in archive browser to view profile
- Create profile view with system info, settings editor, auto/manual toggle
TUI Integration:
- Menu: Shows system category badge (e.g., '⚡ Medium')
- Database Selector: Press 'p' to view full profile before backup
- Archive Browser: Press 'p' to view full profile before restore
- Backup Execution: Shows resources line with workers/pool
- Restore Execution: Shows resources line with workers/pool
- Restore Preview: Shows system profile summary at top
Version bump: 5.7.1
- Fixed separator line to appear UNDER title instead of after it
- Separator now matches title width for clean alignment
Before: Cluster Restore Progress ━━━━━━━━
After: Cluster Restore Progress
━━━━━━━━━━━━━━━━━━━━━━━━
Fixed:
- Native restore now connects to target database correctly (was connecting to source)
- Sequences now properly exported (fixed type mismatch in information_schema query)
- COPY FROM stdin protocol now properly handled using pgx CopyFrom
- Tool verification skipped when --native flag is used
- Fixed slice bounds panic on short SQL statements
Changes:
- internal/engine/native/manager.go: Create engine with target database for restore
- internal/engine/native/postgresql.go: COPY handling, sequence type casting
- cmd/restore.go: Skip VerifyTools in native mode
- internal/tui/restore_preview.go: Native engine mode bypass
Tested: 100k row backup/restore cycle verified working
NEW FEATURES:
- --native flag for cluster backup creates SQL format (.sql.gz) using pure Go
- --native flag for cluster restore uses pure Go engine for .sql.gz files
- Zero external tool dependencies when using native mode
- Single-binary deployment now possible without pg_dump/pg_restore
CLUSTER BACKUP (--native):
- Creates .sql.gz files instead of .dump files
- Uses pgx wire protocol for data export
- Parallel gzip compression with pgzip
- Automatic fallback with --fallback-tools
CLUSTER RESTORE (--native):
- Restores .sql.gz files using pure Go (pgx CopyFrom)
- No psql or pg_restore required
- Automatic detection: native for .sql.gz, pg_restore for .dump
FILES MODIFIED:
- cmd/backup.go: Added --native and --fallback-tools flags
- cmd/restore.go: Added --native and --fallback-tools flags
- internal/backup/engine.go: Native engine path in BackupCluster()
- internal/restore/engine.go: Added restoreWithNativeEngine()
- NATIVE_ENGINE_SUMMARY.md: Complete rewrite with accurate docs
- CHANGELOG.md: v5.5.0 release notes
CRITICAL FIX:
- Progress only updated after DB completed, not during restore
- For 100GB DB taking 4+ hours, TUI showed 0% the whole time
CHANGES:
- Heartbeat now reports estimated progress every 5s (was 15s text-only)
- Time-based estimation: ~10MB/s throughput, capped at 95%
- TUI shows spinner + elapsed time when byte-level progress unavailable
- Better visual feedback that restore is actively running
- Use 1.2x multiplier for cluster .tar.gz (pre-compressed dumps)
- Use 5x multiplier for single .sql.gz files (was 7x)
- New CheckSystemMemoryWithType() for archive-aware estimation
- 119GB archive now estimates ~143GB instead of ~833GB
- Add native engine support for restore (cmd/native_restore.go)
- Integrate native engine restore into cmd/restore.go with fallback
- Fix CPUWorkloadType to auto-detect CPU if CPUInfo is nil
- Replace standard gzip with pgzip in native_backup.go
- All compression now uses parallel pgzip consistently
Bump version to 5.4.2
- Remove compress/gzip import from internal/backup/engine.go
- Use pgzip.NewReader for parallel decompression in archive verification
- All restore paths now consistently use pgzip for parallel gzip operations
Bump version to 5.4.1
- profile.go only had: conservative, balanced, aggressive, potato
- 'turbo' profile returned ERROR and silently fell back to 'balanced'
- 'balanced' has Jobs=0 which became Jobs=1 after default fallback
- Result: --profile turbo was IGNORED, restore ran single-threaded
Added:
- turbo profile: Jobs=8, ParallelDBs=2
- max-performance profile: Jobs=8, ParallelDBs=4
NOW --profile turbo correctly uses pg_restore --jobs=8
ROOT CAUSE FOUND AND FIXED:
- BuildRestoreCommand() had condition 'if options.Parallel > 1'
- This meant --jobs flag was NEVER added when Parallel was 1 or less
- Changed to 'if options.Parallel > 0' so --jobs is ALWAYS set
- This was THE root cause why restores took 12+ hours instead of ~4 hours
- Now pg_restore --jobs=8 is correctly generated for turbo profile
PROBLEM: User's profile Jobs setting was being overridden in multiple places:
1. restoreSection() for phased restores had NO --jobs flag at all
2. Auto-fallback forced Jobs=1 when PostgreSQL locks couldn't be boosted
3. Auto-fallback forced Jobs=1 on low memory detection
FIX:
- Added --jobs flag to restoreSection() for phased restores
- Removed auto-override of Jobs=1 - now only warns user
- User's profile choice (turbo, performance, etc.) is now respected
- This was causing restores to take 9+ hours instead of ~4 hours
- TUI Settings now persist to .dbbackup.conf file (was only in-memory)
- Native Engine (pure Go) is now the default instead of external tools
- Added FallbackToTools=true for graceful degradation
- Environment variables: USE_NATIVE_ENGINE, FALLBACK_TO_TOOLS
CRITICAL BUG FIX: The --jobs flag and profile Jobs setting were completely
ignored for pg_restore. The code had hardcoded Parallel: 1 instead of using
e.cfg.Jobs, causing all restores to run single-threaded regardless of
configuration.
This fix enables restores to match native pg_restore -j8 performance:
- 12h 38m -> ~4h for 119.5GB cluster backup
- Throughput: 2.7 MB/s -> ~8 MB/s
Affected functions:
- restorePostgreSQLDump()
- restorePostgreSQLDumpWithOwnership()
Now logs parallel_jobs value for visibility. Turbo profile with Jobs: 8
now correctly passes --jobs=8 to pg_restore.
- Update version string to 5.1.14
- Update CHANGELOG with v5.1.10-v5.1.14 features
- Update README with new enterprise features
- Remove development files from repository
- Add sensitive files to .gitignore
- Add 'dbbackup chain' command to visualize backup dependencies
- Display full backup → incremental backup relationships
- Show backup sequence and timeline
- Calculate total chain size and duration
- Detect incomplete chains (incrementals without full backup)
- Support --all flag to show all database chains
- Support --verbose for detailed metadata
- Support --format json for automation
- Provides restore guidance (which backups are needed)
- Warns about orphaned incremental backups
Quick Win #8 from TODO list
- Add 'dbbackup schedule' command to show backup schedules
- Query systemd timers for next run times
- Display last run time and duration
- Show time remaining until next backup
- Support --timer flag to show specific timer
- Support --all flag to show all system timers
- Support --format json for automation
- Automatically filters backup-related timers
- Works with dbbackup-databases, etc-backup, and custom timers
Quick Win #1 from TODO list - verified on production (mysql01)
- Add 'dbbackup catalog prune' subcommand
- Support --missing flag to remove entries for deleted backup files
- Support --older-than duration (90d, 6m, 1y) for retention cleanup
- Support --status flag to remove failed/corrupted entries
- Add --dry-run flag to preview changes without deleting
- Add --database filter for targeted pruning
- Display detailed results with space freed estimates
- Implement PruneAdvanced() in catalog package
- Add parseDuration() helper for flexible time parsing
Quick Win #2 from TODO list
Fixes from Opus code review:
- PostgreSQL: Use native TEXT format for COPY (matches FROM stdin header)
- MySQL: Escape backticks in restore to prevent SQL injection
- MySQL: Add SHOW BINARY LOG STATUS fallback for MySQL 8.0.22+
- Fix duration calculation to accurately track backup time
Updated messaging: We built our own machines - really big step.
🚀 MAJOR RELEASE - Complete Independence from External Tools
This release implements native Go database engines that eliminate
ALL external dependencies (pg_dump, mysqldump, pg_restore, etc.).
Major Changes:
- Native PostgreSQL engine with pgx protocol support
- Native MySQL engine with go-sql-driver implementation
- Advanced data type handling for all database types
- Zero external tool dependencies
- New CLI flags: --native, --fallback-tools, --native-debug
- Comprehensive architecture for future enhancements
Technical Impact:
- Pure Go implementation for all backup operations
- Direct database protocol communication
- Improved performance and reliability
- Simplified deployment with single binary
- Backward compatibility with all existing features
- SEC#1: Removed --password CLI flag (prevents password in ps aux)
- SEC#2: All backup files now created with 0600 permissions
- #4: Fixed directory race conditions in parallel backups
- Added internal/fs/secure.go for secure file operations
- Added internal/exitcode/codes.go for standard exit codes
- Updated CHANGELOG.md with comprehensive release notes
- Pre-extract cluster archive once when listing databases
- Reuse extracted directory for restore (avoids second extraction)
- Add ListDatabasesFromExtractedDir() for fast DB listing from disk
- Automatic cleanup of temp directory after restore
- Performance: 50GB cluster now processes 1x instead of 2x (saves 5-15min)
- Add CopyWithContext to all long-running I/O operations
- Fix restore/extract.go: single DB extraction from cluster
- Fix wal/compression.go: WAL compression/decompression
- Fix restore/engine.go: SQL restore streaming
- Fix backup/engine.go: pg_dump/mysqldump streaming
- Fix cloud/s3.go, azure.go, gcs.go: cloud transfers
- Fix drill/engine.go: DR drill decompression
- All operations now check context every 1MB for responsive cancellation
- Partial files cleaned up on interruption
Version 4.2.4