Aplicación Java para copias de seguridad programadas de PostgreSQL usando pg_dump (Sólo Windows)
Las copias de seguridad de bases de datos son una parte esencial del mantenimiento del sistema, asegurando que los datos puedan ser recuperados en caso de fallo.
En este artículo, os mostraré cómo automatizar las copias de seguridad de PostgreSQL utilizando una sencilla aplicación Java.
La aplicación genera un archivo de copia de seguridad con la fecha actual interactuando con la utilidad pg_dump
de PostgreSQL.
Nota
Este enfoque funciona en sistemas Windows y asume la disponibilidad de la herramienta pg_dump.exe
y sus dependencias.
Automatizar las copias de seguridad de PostgreSQL con Java a demanda
- Generar un nombre de archivo: Crea un nombre de archivo con la fecha actual para organizar las copias de seguridad.
- Comprobar la existencia de archivos anteriores: Asegúrate de que no haya archivos duplicados o elimina versiones antiguas.
- Ejecutar pg_dump: Ejecuta el comando
pg_dump
con los parámetros adecuados para crear una copia de seguridad.
Aquí tienes el código Java completo:
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
public class PostgreSQLBackup {
public void backupPGSQL() {
try {
// Define paths and PostgreSQL details
String backupDirPath = "C:\\BACKUPS\\";
String pgDumpPath = "C:\\Program Files\\PostgreSQL\\bin\\pg_dump.exe";
//PostgreSQL variables
String ip = "192.168.1.1";
String user = "postgres";
String database = "yourDatabase";
String password = "yourPassword";
// Generate filename with today’s date
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
String date = dateFormat.format(new Date());
String backupFile = backupDirPath + date + ".backup";
// Ensure the backup directory exists
File backupDir = new File(backupDirPath);
if (!backupDir.exists() && !backupDir.mkdirs()) {
throw new IOException("Could not create backup directory: " + backupDirPath);
}
// Delete any previous backup that might exist
File backup = new File(backupFile);
if (backup.exists()) {
backup.delete();
}
// Configure ProcessBuilder for pg_dump
ProcessBuilder pb = new ProcessBuilder(
pgDumpPath,
"-f", backupFile,
"-F", "c",
"-Z", "9",
"-v",
"-h", ip,
"-U", user,
database
);
pb.environment().put("PGPASSWORD", password);
pb.redirectErrorStream(true);
// Start the process and capture output
Process process = pb.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
try {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} finally {
reader.close();
}
// Wait for process to complete
int exitCode = process.waitFor();
if (exitCode != 0) {
throw new RuntimeException("pg_dump failed with exit code: " + exitCode);
}
System.out.println("Backup completed successfully: " + backupFile);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new PostgreSQLBackup().backupPGSQL();
}
}
Puntos clave
- Reemplaza las variables
ip
,user
,database
ypassword
con los detalles de tu servidor PostgreSQL. - Asegúrate de que
pg_dump.exe
(y los archivos DLL necesarios) estén disponibles enpgDumpPath
o actualiza la ruta para que refleje tu sistema. - La variable de entorno
PGPASSWORD
se utiliza para pasar la contraseña de forma segura apg_dump
. - El archivo de copia de seguridad se guarda en el directorio
backupDirPath
con el formatoyyyyMMdd.backup
. - La salida del proceso se captura e imprime en la consola para su seguimiento.
Automatizar las copias de seguridad de PostgreSQL con Java programadas en un horario
Para ejecutar la copia de seguridad automáticamente todos los días, puedes utilizar un TimerTask
en Java:
import java.util.*;
public class ScheduledBackup {
public static void main(String[] args) {
TimerTask backupTask = new TimerTask() {
@Override
public void run() {
new PostgreSQLBackup().backupPGSQL();
}
};
// Schedule the task to run every 24 hours (at 1:00 AM)
Timer timer = new Timer();
Calendar taskTime = Calendar.getInstance();
taskTime.set(Calendar.HOUR_OF_DAY, 1);
taskTime.set(Calendar.MINUTE, 0);
taskTime.set(Calendar.SECOND, 0);
// Adjust start time if it's already past the initial scheduled time
if (new Date().after(taskTime.getTime())) {
taskTime.add(Calendar.DAY_OF_YEAR, 1);
}
timer.scheduleAtFixedRate(backupTask, taskTime.getTime(), 1000L * 60 * 60 * 24);
System.out.println("Scheduled backup task set for 1:00 AM daily.");
}
}
Notas
- Puedes configurar la hora programada ajustando el valor de
Calendar.HOUR_OF_DAY
. - Para sistemas de producción, considera utilizar planificadores externos como cron en Linux o el Programador de tareas en Windows.
Conclusión
Automatizar las copias de seguridad de PostgreSQL con una aplicación Java proporciona flexibilidad y permite la integración con otras herramientas.
Aunque esta guía se centra en pg_dump
, puedes ampliar la solución para incluir notificaciones, registro y manejo de errores según tus necesidades.
Recuerda siempre proteger las credenciales y los archivos de copia de seguridad para garantizar la seguridad e integridad de tus datos.