The Go Code for dump and restore
The entire Go code with fake variables.
1. The Code
package main
import (
"fmt"
"os"
"os/exec"
)
// Declare variables
var (
pg_admin_path = "/Applications/pgAdmin4.app/Contents/SharedSupport/"
pg_dump = pg_admin_path + "pg_dump"
pg_restore = pg_admin_path + "pg_restore"
pg_psql = pg_admin_path + "psql"
source_ip = "94.237.x.1"
source_db = "tenant1"
source_usr = "t1"
source_pw = "password"
target_ip = "94.237.x.2"
target_db = "tenant2"
target_usr = "t2"
target_pw = "password"
postgres_pw = "super_password"
)
func main() {
create_file()
create_user()
create_db()
dump_source()
restore_target()
switch_owner()
if source_usr != target_usr && source_ip != target_ip {
fmt.Println("New database - New owner for everyhing")
switch_owner_everything()
}
}
// Create a dump file.
func create_file() {
fmt.Println("1. create file " + "dump.custom")
dump, err := os.Create("dump.custom")
if err != nil {
fmt.Println("ERROR")
fmt.Println(err.Error())
return
}
defer dump.Close()
err = dump.Chmod(0600)
if err != nil {
fmt.Println("## Error setting file permissions:", err.Error())
}
}
// Create the target database user.
func create_user() {
fmt.Println("2. create user " + target_usr)
cmd := exec.Command(pg_psql,
"--host", target_ip,
"--port", "5432",
"--username", "postgres",
"--command", fmt.Sprintf("CREATE USER %s WITH PASSWORD '%s';", target_usr, target_pw))
cmd.Env = append(os.Environ(), fmt.Sprintf("PGPASSWORD=%s", postgres_pw))
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
fmt.Println(err.Error())
}
}
// Create the target database.
func create_db() {
fmt.Println("3. create database " + target_db)
cmd := exec.Command(
pg_psql,
"--host", target_ip,
"--port", "5432",
"--username", "postgres",
"--command", fmt.Sprintf("CREATE DATABASE \"%s\"", target_db))
cmd.Env = append(os.Environ(), fmt.Sprintf("PGPASSWORD=%s", postgres_pw))
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
fmt.Println(err.Error())
}
}
// Command to execute pg_dump
func dump_source() {
fmt.Println("4. Dump the old database (It may take VERY long time. Stay tuned...) " + source_db)
cmd := exec.Command(
pg_dump,
"--host", source_ip,
"--port", "5432",
"--username", source_usr,
"--dbname", source_db,
"--format", "custom",
"--verbose",
"--file", "dump.custom",
)
cmd.Env = append(os.Environ(), fmt.Sprintf("PGPASSWORD=%s", source_pw))
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("## Backup completed successfully")
}
}
// Command to execute pg_restore to restore the dump file
func restore_target() {
fmt.Println("5. Restore the database (It may take VERY long time. Stay tuned...) " + target_db)
cmd := exec.Command(
pg_restore,
"--host", target_ip,
"--port", "5432",
"--username", "postgres",
"--dbname", target_db,
"--verbose",
"/Users/mats/go/dump_orig/main/dump.custom",
)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Env = append(os.Environ(), fmt.Sprintf("PGPASSWORD=%s", postgres_pw))
// Execute the command
err := cmd.Run()
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Restoration completed successfully")
}
}
// Switch back to the original owner of the restored database.
func switch_owner() {
fmt.Println("6. Change to original owner of database " + target_db)
cmd := exec.Command(pg_psql,
"--host", target_ip,
"--port", "5432",
"--username", "postgres",
"--command", fmt.Sprintf("ALTER DATABASE \"%s\" OWNER TO %s;", target_db, target_usr))
cmd.Env = append(os.Environ(), fmt.Sprintf("PGPASSWORD=%s", postgres_pw))
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Switch to original database owner successfully")
}
}
// Change user for tables, views, functions, etc...
func switch_owner_everything() {
fmt.Printf("7. Change owner of the entire database (tables, views, functions, etc")
cmd := exec.Command(
"sh", "-c",
fmt.Sprintf(
"%s --host %s --port 5432 --dbname %s --username postgres --command 'REASSIGN OWNED BY %s TO %s;'",
pg_psql, target_ip, target_db, source_usr, target_usr,
),
)
cmd.Env = append(os.Environ(), fmt.Sprintf("PGPASSWORD=%s", postgres_pw))
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
err := cmd.Run()
if err != nil {
fmt.Println("Error executing command:", err)
} else {
fmt.Println("Ownership everywhere reassigned successfully")
}
}