Fix: Enable --clean flag for cluster restore to handle existing tables

This commit is contained in:
2025-11-07 10:46:27 +00:00
parent fb5d5d7b90
commit 281934be38
3 changed files with 7 additions and 3 deletions

BIN
dbbackup

Binary file not shown.

Binary file not shown.

View File

@ -339,6 +339,7 @@ func (e *Engine) RestoreCluster(ctx context.Context, archivePath string) error {
successCount := 0 successCount := 0
failCount := 0 failCount := 0
var failedDBs []string
for i, entry := range entries { for i, entry := range entries {
if entry.IsDir() { if entry.IsDir() {
@ -354,11 +355,13 @@ func (e *Engine) RestoreCluster(ctx context.Context, archivePath string) error {
// Create database first if it doesn't exist // Create database first if it doesn't exist
if err := e.ensureDatabaseExists(ctx, dbName); err != nil { if err := e.ensureDatabaseExists(ctx, dbName); err != nil {
e.log.Warn("Could not ensure database exists", "name", dbName, "error", err) e.log.Warn("Could not ensure database exists", "name", dbName, "error", err)
// Continue anyway - pg_restore can create it // Continue anyway - pg_restore might handle it
} }
if err := e.restorePostgreSQLDump(ctx, dumpFile, dbName, false, false); err != nil { // Restore with clean flag to drop existing objects
if err := e.restorePostgreSQLDump(ctx, dumpFile, dbName, false, true); err != nil {
e.log.Error("Failed to restore database", "name", dbName, "error", err) e.log.Error("Failed to restore database", "name", dbName, "error", err)
failedDBs = append(failedDBs, fmt.Sprintf("%s: %v", dbName, err))
failCount++ failCount++
continue continue
} }
@ -367,9 +370,10 @@ func (e *Engine) RestoreCluster(ctx context.Context, archivePath string) error {
} }
if failCount > 0 { if failCount > 0 {
failedList := strings.Join(failedDBs, "; ")
e.progress.Fail(fmt.Sprintf("Cluster restore completed with errors: %d succeeded, %d failed", successCount, failCount)) e.progress.Fail(fmt.Sprintf("Cluster restore completed with errors: %d succeeded, %d failed", successCount, failCount))
operation.Complete(fmt.Sprintf("Partial restore: %d succeeded, %d failed", successCount, failCount)) operation.Complete(fmt.Sprintf("Partial restore: %d succeeded, %d failed", successCount, failCount))
return fmt.Errorf("cluster restore completed with %d failures", failCount) return fmt.Errorf("cluster restore completed with %d failures: %s", failCount, failedList)
} }
e.progress.Complete(fmt.Sprintf("Cluster restored successfully: %d databases", successCount)) e.progress.Complete(fmt.Sprintf("Cluster restored successfully: %d databases", successCount))