No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de Programación en Bash Shell

Curso de Programación en Bash Shell

Marco Antonio Toscano Freire

Marco Antonio Toscano Freire

Funciones sacar y restaurar respaldos en postgres

41/43
Recursos

Aportes 13

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Hola. He modificado un poco el codigo original del profesos haciendo los siguientes cambios:

  1. Al momento de crear un respaldo si el directorio de Respaldo ingresado por el
    usuario no se encuentra se pregunta al Usuario si desea crear un directorio con
    el nombre inicial ingresado.
  2. En el modulo de Restaurar, cambie el orden de los condicionales ya que este
    orden no era el mas optimo. Si el usuario ingresa un Respaldo a Restaurar que no
    se encuentra el programa igual crea la BD en Postgres inclusive si no utiliza el
    respaldo que por supuesto NO fue encontrado lo cual no deberia suceder.
  3. Tambien agregue lineas de codigo para verificar si el directorio donde estan
    los .bak que es ingresado por el usuario existe. De ser asi entonces se listan
    los archivos .bak que alli se encuentran y de ese modo podemos escoger el .bak
    que deseamos restaurar.
  4. Por ultimo agregue al menu la opcion de listar BD en postgres para asi
    facilmente poder consultar sin tener que ir al terminal.
# ! /bin/bash
# Programa para ejemplificar el uso del Break y Continue
#Arnoldo Alvarez

opcion=0
fechaActual=`date +%Y%m%d`

#Esta es la funcion instalar PostGres
instalar_postgres () {
 echo -e "\nVerificar si tenemos instalado PostGress..."
 sleep 3
 verifyInstall=$(which psql)
 if [ $? -eq 0 ]; then
     echo "PostGres ya se encuentra instalado en el equipo "
 else
      read -s -p "Introduzca password de administrador " password
      read -s -p "Introduzca password a utilizar en PostGres " passwordPostgres
      echo "$password" | sudo -S apt update
      echo "$password" | sudo -S apt-get -y install postgresql postgresql-contrib
      sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD '{$passwordPostgres}';"
      echo "$password" | sudo -S systemctl enable postgresql.service
      echo "$password" | sudo -S systemctl start postgresql.service
 fi

 read -n 1 -s -r -p "Presione [ENTER] para continuar..."

}

#Esta es la funcion desinstalar PostGres
desinstalar_postgres () {
    echo -e "\nVerificando si ya esta Desinstalado Postgres..."
    verifyInstall=$(which psql)
    if [ $? -eq 1 ]; then
        echo " PostGres NO se encuentra instalado en el Equipo "
    else
        read -s -p "Introduzca password de administrador " password
        echo -e "\n"
        echo "$password" | sudo -S systemctl stop postgresql.service
        echo "$password" | sudo -S apt-get -y --purge remove postgresql\*
        echo "$password" | sudo -S rm -r /etc/postgresql
        echo "$password" | sudo -S rm -r /etc/postgresql-common
        echo "$password" | sudo -S rm -r /var/lib/postgresql
        echo "$password" | sudo -S userdel -r postgres
        echo "$password" | sudo -S groupdel postgresql
fi

read -n 1 -s -r -p "Presione [ENTER] para continuar..."

}

#Esta es la funcion Sacar Respaldo
sacar_respaldo () {
echo "Listar las bases de datos..."
sudo -u postgres psql -c "\l"
read -p "Elegir la BD a respaldar: " bddRespaldo
echo -e "\n"
        if [ -d "$1" ]; then
                echo "Establecer permisos directorio"
                echo "$password" | sudo -S chmod 755 $1
                echo "Realizando respaldo..."
                sudo -u postgres pg_dump -Fc $bddRespaldo > "$1/bddRespaldo$fechaActual.bak"
                echo "Respaldo realizado Correctamente en la ubicacion: $1/bddRespaldo$fechaActual.bak"
        else
                echo -e  "\nEl directorio $1 No Existe"
                echo -e "\n"
                read -n1 -p "Desea crear el directorio $1 (s/n)" respbdd
                if [ $respbdd = "s" ]; then
                        sudo mkdir $1
                        echo "$password" | sudo -S chmod 755 $1
                        echo -e "\nRealizando respaldo..."
                        sleep 3
                        sudo -u postgres pg_dump -Fc $bddRespaldo > "$1/bddRespaldo$fechaActual.bak"
                        echo "Respaldo realizado Correctamente en la ubicacion: $1/bddRespaldo$fechaActual.bak"
                else
                        echo -e "\nSaliendo sin realizar Respaldo..."
                        sleep 3
                fi

                fi

read -n 1 -s -r -p "Presione [ENTER] para continuar..."

}

#Esta es la funcion Restaurar Respaldo
restaurar_respaldo () {
read -p "Ingresar el directorio donde se encuentran los respaldos   " directorioBackup
if [ -d $directorioBackup ]; then

echo "Listando los archivos de Respaldos..."
sleep 3
ls -la $directorioBackup
read -p "Ingresar el archivo .bak a restaurar:  " respaldoRestaurar
#echo -e "\n"
if [ -f "$directorioBackup/$respaldoRestaurar" ]; then

        read -p "Ingresar nombre BD destino:  " bdDestino
        verifyBdd= $(sudo -u postgres psql -lqt | cut -d \| -f 1 | grep -wq $bdDestino)
        if [ $? -eq 0 ]; then
                  echo "Restaurando en la Base de Datos destino...$bdDestino"
                  sudo -u postgres pg_restore -Fc -d $bdDestino "$directorioBackup/$respaldoRestaurar"
                  echo "Listar Bases de datos..."
                  sudo -u postgres psql -c "\l"
           else
                  echo  "La BD destino no se encuentra..."
                  echo  "Creando Base de Datos destino..."
                  sleep 4
                  sudo -u postgres psql -c "CREATE DATABASE $bdDestino"
                  sudo -u postgres pg_restore -Fc -d $bdDestino "$directorioBackup/$respaldoRestaurar"
                  echo "Listar Bases de datos..."
                  sudo -u postgres psql -c "\l"
          fi

else
        echo "No se encuentra el archivo de Respaldo Ingresado"
        echo "Verifique nuevamente el nombre y vuelva a intentarlo..."
fi
else
        echo "No se encuentra el directorio de Respaldos ingresado..."
        echo "Verifique nuevamente el nombre y vuelva a intentarlo..."
fi

read -n 1 -s -r -p "Presione [ENTER] para continuar..."

}

lista_de_BD(){

echo -e  "\Las Bases de Datos Actuales: "
sudo -u postgres psql -c "\l"
read -n 1 -s -r -p "Presione [ENTER] para continuar..."
}

while :
do
    #Limpiar la pantalla
    clear
    #Desplegar el menu de opciones
    echo "----------------------------------------"
    echo "PGUTIL - Programa de Utilidades PostGres"
    echo "----------------------------------------"
    echo "           MENU PRINCIPAL               "
    echo "----------------------------------------"
    echo "1.Instalar Postgres                     "
    echo "2.Desinstalar Postgres                  "
    echo "3.Hacer un respaldo                     "
    echo "4.Restaurar respaldo                    "
    echo "5.Listar Bases de Datos Actuales        "
    echo "6.Salir                                 " 

    #Leer los datos del Usuario - Capturar  Opcion
    read -n1 -p "Ingrese una opcion [1-5]: " opcion

    #Validar la opcion ingresada
    case $opcion in

        1) instalar_postgres

          #sleep 3
            ;;

        2) desinstalar_postgres

           #sleep 3
            ;;

        3)  echo -e "\n"
            read -p "Indique Directorio: " directorioBackup
            sacar_respaldo $directorioBackup


            ;;

        4)  echo -e "\n"
            #read -p "Indique Directorio de Respaldos " directorioRespaldos
            restaurar_respaldo $directorioRespaldos


            ;;

        5) lista_de_BD
            ;;

        6) echo -e "\nSaliendo del programa...."
            exit 0
            ;;
    esac
done

Lo que mas se agradece es que ya no volveré a escuchar “EL TEMA DE” por un largo tiempo, curso terminado. Como punto adicional y cosa que sinceramente no se si ocurre en platzi, los videos deberían ser revisados con mas rigor ya que el profesor se equivoca algunas ocasiones, sumado a la muletilla que se hace estresante y por ultimo el no explicar bien los comandos, tuve que recurrir a buscar, leer comentarios mirar otros tutoriales para algo que le tomaba al profesor 20 segundos.

Creo que se podría explicar mejor los comandos, pero parece que el tema no pasaba por ahi, sino que el tema era que el tema era otro tema

Basta de decir " EL TEMA DE "

Cuando la complejidad del script va en aumento, les recomiendo utilizar sus variables de la siguiente forma ${nombre_variable}, ya que así sabemos visualmente cuál es el nombre de la variable.

Ejemplo:

cp $directorio_respaldo/bak_file.txt /home/bak/
cp ${directorio_respaldo}/bak_file.txt /home/bak/

Al menos, bajo mi punto de vista, es más entendible a primera vista.

Felicidades si llegaste hasta aquí, has terminado el curso!

Me surge una duda: ¿Por qué utilizar una variable para verificar si psql esta instalado? No sería el mismo resultado que:

which psql | if  [ $? -eq 0 ] ; then ...
	# comando a ejecutar
fi 

Acá he encontrado la diferencia entre usar backtick y $() para asignación de variables en los scripts

https://unix.stackexchange.com/questions/27428/what-does-backquote-backtick-mean-in-commands

Y al parecer no hay diferencia como tal, se llaman command substitution y además de permitirnos asignar valores a variables, también nos permite hacer anidado de comandos

https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html

Mi aporte

# !/bin/bash
# Programa que permite manejar las utilidades de Postgres

opcion=0
fechaActual=`date +%Y%m%d`

#Funciòn para instalar Postgres
instalar_Postgres () {
  clear
  echo "Verificando instalación de Postgres..."
  verifyInstall=$(which psql)
  if [ $? -eq 0 ]; then
    echo -e "\nPostgres ya se encuentra instalado en el equipo"
  else
    #Cuando se piden datos con read y se quiere usal salto de linea se usa $ y comillas simples
    read -s -p $'\nIngresar contraseña de sudo: ' pwdSudo
    read -s -p $'\nIngresar contraseña a ultilizar en Postgres: ' pwdPsql
    #Ejecutar comandos
    echo "$pwdSudo" | sudo -S apt update
    echo "$pwdSudo" | sudo -S apt-get -y install postgresql postgresql-contrib
    #Cambio de clave del usuario en Postgres
    sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD '{$pwdPsql}';"
    #Habilitar e iniciar servicio Postgres
    echo "$pwdSudo" | sudo -S systemctl enable postgresql.service
    echo "$pwdSudo" | sudo -S systemctl star postgresql.service
  fi
  #Solicitar que presionen una tecla para continuar
  read -n1 -s -r -p $'\nPresione [ENTER] para continuar'
}

#Función para Desinstalar Postgres
desinstalar_Postgres () {
  clear
  echo "Iniciando proceso para Desinstalar Postgres..."
  read -s -p $'\nIngresar contraseña de sudo: ' pwdSudo
  echo -e "\n"
  echo "$pwdSudo" | sudo -S systemctl stop postgresql.service
  #Puede requerir este comando pero debe saber que versión tiene instalado
  #echo "$pwdSudo" | sudo -S pg_dropcluster --stop 14 main
  echo "$pwdSudo" | sudo -S apt-get -y --purge remove postgresql\*
  echo "$pwdSudo" | sudo -S rm -r /etc/postgresql
  echo "$pwdSudo" | sudo -S rm -r /etc/postgresql-common
  echo "$pwdSudo" | sudo -S rm -r /var/lib/postgresql
  echo "$pwdSudo" | sudo -S userdel -r postgres
  echo "$pwdSudo" | sudo -S groupdel postgresql
  read -n1 -s -r -p $'\nPresione [ENTER] para continuar'
}

#Función para hacer Backups
sacar_Backup () {
  clear
  echo "Listar las BDD"
  sudo -u postgres psql -c "\l"
  read -p $'\nElegir la base de datos a respaldar: ' bddBackup
  echo -e "\n"
  if [ -d "$1" ]; then
    echo "Establecer permisos al directorio"
    echo "$pwdSudo" | sudo -S chmod 755 $1
    echo -e "\nRealizando Backup..."
    sudo -u postgres pg_dump -Fc $bddBackup > "$1/bddBackup$fechaActual.bak"
    echo -e "\nBackup realizado Correctamente!"
  else
    echo "El directorio $1 no existe..."
    echo -e "\n"
    read -n1 -p "Desea crear el directorio $1? (s/n)" respuestaDir
    if [ respuestaDir = "s" ]; then
      sudo mkdir $1
      echo "$pwdSudo" | sudo -S chmod 755 $1
      echo -e "\nRealizando Backup..."
      sudo -u postgres pg_dump -Fc $bddBackup > "$1/bddBackup$fechaActual.bak"
      echo -e "\nBackup realizado Correctamente!"
    else
      echo -e "\nSaliendo sin realizar Backup..."
    fi
  fi
  read -n1 -s -r -p $'\nPresione [ENTER] para continuar'
}

#Función para Restaurar Backups
restaurar_Backup () {
  echo "Listar Backups"
  ls -1 $1/*.bak
  read -p "Elegir el Backup a Restaurar: " backupRestore
  read -p $'\nIngrese el nombre de la BDD destino: ' bddDestino
  #Verificar si la BDD existe!
  verifyBdd=$(sudo -u postgres psql -lqt | cut -d \| -f 1 | grep -wq $bddDestino)
  if [ $? -eq 0 ]; then
    echo "Restaurando en la BDD destino: $bddDestino"
  else
    sudo -u postgres psql -c "create database $bddDestino"
  fi
  #Verificar si el respaldo que se va restaurar existe
  if [ -f "$1/$backupRestore" ]; then
    echo "Restaurando Backup..."
    sudo -u postgres pg_restore -Fc -d $bddDestino "$1/$backupRestore"
    echo -e "\nListar la BDD"
    sudo -u postgres psql -c "\l"
  else
    echo -e "\nEl Backup $backupRestore no existe!"
  fi
  read -n1 -s -r -p $'\nPresione [ENTER] para continuar'
}

while :
do
  #Limpiar la pantalla
  clear
  #Desplegar el menú de opciones
  echo "_________________________________________"
  echo "PGUTIL - Programa de Utilidad de Postgres"
  echo "_________________________________________"
  echo "              MENÚ PRINCIPAL             "
  echo "_________________________________________"
  echo "1. Instalar Postgres"
  echo "2. Desinstalar Postgres"
  echo "3. Hacer un Backup"
  echo "4. Restaurar un Backup"
  echo "5. Salir"

#Leer los datos del usuario - capturar información
  read -n1 -p "Ingrese una opción [1-5]: " opcion

#Validar la opción ingresada
  case $opcion in
    1)
      instalar_Postgres
      ;;
    2) 
      desinstalar_Postgres
      ;;
    3)
      clear
      read -p "Indique el Directorio de Backups: " directorioBackup
      sacar_Backup $directorioBackup
      ;;
    4)
      clear
      read -p "Ingrese el Directorio donde se encuentran los Backups: " directorioRestaurar
      restaurar_Backup $directorioRestaurar
      ;;
    5)
      echo -e "\n\nSalir del Programa..."
      exit 0
      ;;
  esac
done
Crear funciones en Bash para \*\*sacar\*\* y \*\*restaurar respaldos\*\* de una base de datos PostgreSQL es muy útil para automatizar tareas de mantenimiento. Aquí te muestro cómo definir dos funciones: una para hacer respaldos y otra para restaurarlos. \### Requisitos: \- Asegúrate de tener instalado el cliente de PostgreSQL (`psql` y `pg\_dump`). \- La base de datos debe ser accesible (credenciales y permisos correctos). \### 1. \*\*Función para hacer respaldos:\*\* Para hacer un respaldo de una base de datos en PostgreSQL, puedes usar el comando `pg\_dump`. Aquí te dejo una función en Bash que permite realizar un respaldo: ```bash hacer\_respaldo() { local DB\_NAME=$1 local BACKUP\_DIR=$2 local DATE=$(date +'%Y%m%d\_%H%M%S') local BACKUP\_FILE="$BACKUP\_DIR/$DB\_NAME-$DATE.sql" if \[ -z "$DB\_NAME" ] || \[ -z "$BACKUP\_DIR" ]; then echo "Uso: hacer\_respaldo nombre\_base\_datos directorio\_respaldo" return 1 fi echo "Realizando respaldo de la base de datos '$DB\_NAME' en '$BACKUP\_FILE'..." pg\_dump -U postgres -F c -b -v -f "$BACKUP\_FILE" "$DB\_NAME" if \[ $? -eq 0 ]; then echo "Respaldo completado: $BACKUP\_FILE" else echo "Error al realizar el respaldo." return 1 fi } \# Ejemplo de uso: \# hacer\_respaldo "mi\_base\_de\_datos" "/ruta/donde/guardar/respaldo" ``` \#### Descripción: \- `pg\_dump -U postgres -F c -b -v -f archivo nombre\_base`: \- `-U postgres`: El usuario de PostgreSQL. \- `-F c`: Formato personalizado. \- `-b`: Incluir datos binarios. \- `-v`: Modo verboso (para ver más detalles del progreso). \- `-f archivo`: Archivo de salida donde se guardará el respaldo. \### 2. \*\*Función para restaurar un respaldo:\*\* Para restaurar una base de datos desde un archivo de respaldo, puedes usar el comando `pg\_restore`. Aquí te muestro una función para restaurar el respaldo: ```bash restaurar\_respaldo() { local DB\_NAME=$1 local BACKUP\_FILE=$2 if \[ -z "$DB\_NAME" ] || \[ -z "$BACKUP\_FILE" ]; then echo "Uso: restaurar\_respaldo nombre\_base\_datos archivo\_respaldo" return 1 fi echo "Restaurando base de datos '$DB\_NAME' desde '$BACKUP\_FILE'..." \# Si la base de datos ya existe, se debe eliminar y crear nuevamente psql -U postgres -c "DROP DATABASE IF EXISTS $DB\_NAME;" psql -U postgres -c "CREATE DATABASE $DB\_NAME;" \# Restaurar el respaldo pg\_restore -U postgres -d "$DB\_NAME" -v "$BACKUP\_FILE" if \[ $? -eq 0 ]; then echo "Restauración completada." else echo "Error al restaurar la base de datos." return 1 fi } \# Ejemplo de uso: \# restaurar\_respaldo "mi\_base\_de\_datos" "/ruta/al/archivo\_respaldo.sql" ``` \#### Descripción: \- `psql -U postgres -c "DROP DATABASE IF EXISTS nombre\_base;"`: Elimina la base de datos si existe. \- `psql -U postgres -c "CREATE DATABASE nombre\_base;"`: Crea una nueva base de datos. \- `pg\_restore -U postgres -d nombre\_base archivo\_respaldo`: Restaura la base de datos desde el archivo de respaldo. \### 3. \*\*Ejemplo de uso conjunto:\*\* Supón que tienes una base de datos llamada `mi\_base\_de\_datos` y deseas hacer un respaldo y luego restaurarlo. \#### Hacer el respaldo: ```bash hacer\_respaldo "mi\_base\_de\_datos" "/ruta/donde/guardar/respaldo" ``` \#### Restaurar el respaldo: ```bash restaurar\_respaldo "mi\_base\_de\_datos" "/ruta/donde/guardar/respaldo/mi\_base\_de\_datos-20240921\_123456.sql" ``` \### Consideraciones: \- \*\*Autenticación\*\*: Si estás ejecutando estos comandos desde un script, puedes configurar las variables de entorno para evitar que te pida la contraseña cada vez. Usa un archivo `.pgpass` o variables como `PGPASSWORD`: ```bash export PGPASSWORD="mi\_contraseña" ``` \- \*\*Usuarios y permisos\*\*: Asegúrate de que el usuario tenga los permisos necesarios para crear y eliminar bases de datos. Estas funciones automatizan el proceso de respaldo y restauración de bases de datos en PostgreSQL mediante Bash.

¿Cuál es la diferencia entre usar backtick en vez de $() para guardar valores en una variable?

#!/bin/bash
# Este script muestra uso de funciones
# Autor: Julian Lamadrid, jlamadrid, litocruz

# Variables
opcion=0
fechaActual=`date +%Y%m%d`

# funciones
instalar_postgres () {
  echo "Verificar Instalacion postgres.."
  verifypostgres=$(wich psql)
#  if [ which psql 1>2 2>/dev/null ]; then
  if [ $? -eq 0 ]; then
    echo -e "Psgress ya se encuentra instalado"
  else
    read -s -p "Ingresar contraseña ROOT: "password
    read -s -p "Ingresar contraseña postgres: "passwordpostgres
    echo "$password" | sudo -S apt update
    echo "$password" | sudo -S apt install postgresql postgresql-contrib
    sudo -u postgres psql -C "ALTER USER postgres WITH PASSWORD '{$passwordpostgres}';"
    echo "$password" | sudo -S systemctl enable postgresql.service
    echo "$password" | sudo -S systemctl start postgresql.service
  fi
  read -n 1 -s -r -p "PRESIONE [ENTER] para continuar..."

}
desinstalar_postgres () {
  echo "Desinstalando postgres.."
  read -s -p "Ingresar contraseña ROOT: "password
  echo "$password" | sudo -S systemctl stop postgresql.service
  echo "$password" | sudo -S apt -y remove --purge postgresql\*
  echo "$password" | sudo -S rm -r /etc/postgresql
  echo "$password" | sudo -S rm -r /etc/postgresql-common
  echo "$password" | sudo -S rm -r /var/lib/postgresql
  echo "$password" | sudo -S userdel -r postgres
  echo "$password" | sudo -S groupdel postgresql
  read -n 1 -s -r -p "PRESIONE [ENTER] para continuar..."
}
sacar_respaldo () {
  echo "Listar bases de datos postgres"
  sudo -u postgres psql -c "\l"
  read -p "Elegir la base de datos a respaldar" DBdump
  echo -e "\n"
  if [ -d "$1" ]; then
    echo "Establecer permisos de directorio"
    read -p -s "Ingresar contraseña ROOT: "password
    echo "$password" | sudo -S chmod 755 $1
    echo "sacando respaldo.."
    sudo -u postgres pg_dump -Fc $DBdump > "$1/$DBdump$fechaActual.bak"
    echo "Respaldo realizado en $1/$DBdump$fechaActual.bak"
  else
    read -p -n 1 "El directorio $1 no existe, desea crearlo s/n?" crerdirectorio
    if [ $crerdirectorio = "s" ]; then
      mkdir $1
      [ $? -eq 0 ] && echo "Directorio creado con exito. Vuelva a ingresar para realizar respaldo" || echo "error %?"
    fi
  fi
  read -n 1 -s -r -p "PRESIONE [ENTER] para continuar..."

}
restaurar_respaldo () {
  echo "Listar respaldos"
  ls -la $1
  read -p "Elegir el respaldo a restaurar: " respaldoRestaurar
  echo -e "\n"
  echo "Listar bases de datos postgres"
  sudo -u postgres psql -c "\l"
  read -p "Elegir la base de datos a respaldar" DBdump
  echo -e "\n"
  echo "restaurando respaldo.."
  sudo -u postgres pg_restore -Fc -d $DBdump "$1/$respaldoRpestaurar"
  read -n 1 -s -r -p "PRESIONE [ENTER] para continuar..."
}

while :
do
  #Limpiar pantalla
  clear
  #Desplegar menu opciones
  echo "-----------------------------------------"
  echo "PGUTIL - Programa de utilidad de Postgres"
  echo "-----------------------------------------"
  echo "             MENU PRINCIPAL              "
  echo "1. Instalar Postgres"
  echo "2. Desinstalar Postgres"
  echo "3. Sacar un Respaldo"
  echo "4. Restaurar un Respaldo"
  echo "5. Exit"

  # Leer los datos del usuario - capturar info
  read -n1 -p "Ingrese opcion del [1-5]: " opcion
  echo -e "\n"
  #Validar opcion ingresada
  case $opcion in
    1)
      instalar_postgres
      ;;
    2)
      desinstalar_postgres
      ;;
    3)
      read -p "Directorio Backup: " directoriobackup
      sacar_respaldo $directoriobackup
      ;;
    4)
      read -p "Directorio Respaldo: " directoriorespaldo
      restaurar_respaldo $directoriorespaldo
      ;;
    5)
      echo -e "\nSaliendo..."
      exit 0
      ;;
  esac
done

Muy potente