Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Clase Respaldo Con Otro Enfoque....
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Clase Respaldo Con Otro Enfoque.... 
 
Aun no está del todo lista. Y es bastante burda.

La idea gira en torno a esto, para hacer respaldos periódicos, manteniendo al menos 3 ( yo usé 5) versiones anteriores de una base de datos SQLite3, decidí que para ello debería cambiar el nombre en una carpeta de respaldo, creando dicha carpeta si fuese necesario.

El formato de nombres es "yyyy-mm-dd" agregándole "_" y un numero de control o versión que está determinado por el máximo nro de respaldos permitidos.  

Conseguir el respaldo mas viejo así es como pelar mandarinas, obtener el nro correcto de versión también.

Pero.... Siempre hay un pero....    Cdate de fechas en este formato "yyyy-mm-dd" no es admitido, cierto que hay formas de hacerlo como por ejemplo ir extrayendo la fecha tramo a tramo con Left y Right, pero es mucho trabajo.

La clase cuenta con 3 propiedades y un método.

Ahhh y falta la clase Restore.

Bueno aquí va el código de la clase BackUp.

' gambas class file

''        Basado en la clase respaldo de Vector
'         Esta clase contiene un método público y
'         3 propiedades publicas, RutaOrigen, RutaDestino y Frecuencia

Property RutaOrigen As String
Property Frecuencia As Integer
Property RutaDestino As String

Private $Frecuencia As Integer             ' Indica si es diario, semanal, mensual o uno extraordinario.
Private $RutaOrigen As String
Private $RutaDestino As String             ' Contiene solo el camino al directorio dode se depositara el respaldo
Private $MaxRespaldos As Integer
Private $Control As Integer                ' Contiene el numero de control de respaldo
Private $NombreArchivo As String           ' Contiene según el avance del proceso el nombre del respaldo mas viejo y luego el mas nuevo
Private $Rutafinal As String               ' Contiene el camino + el nombre el archivo de respaldo
Private $PrimeraRonda As Integer           ' Se trata de una bandera que estará encendida solo mientras mientras MaxRespaldos
                                           ' sea mayor que el total de archivos


Public Sub _new(Frecuencia As Integer, RutaOrigen As String, RutaDestino As String)
  $Frecuencia = Frecuencia
  $RutaOrigen = RutaOrigen
  $RutaDestino = RutaDestino
  $NombreArchivo = File.BaseName($RutaOrigen)
  $MaxRespaldos = 5
End

Private Function Frecuencia_Read() As Integer
  Return $Frecuencia
End

Private Sub Frecuencia_Write(Valor As Integer)
  $Frecuencia = Valor
End

Private Function RutaOrigen_Read() As String
 Return $RutaOrigen
End

Private Sub RutaOrigen_Write(Valor As String)
  $RutaOrigen = Valor
End

Private Function RutaDestino_Read() As String
  Return $RutaDestino
End

Private Sub RutaDestino_Write(Valor As String)
  $RutaDestino = Valor
End

 Public Sub Respaldar()                           ' Único método publico de la clase
  If Existe Then
    If Not $PrimeraRonda Then
      $NombreArchivo = RespaldoMasViejo()
      Kill $RutaDestino &/ $NombreArchivo
    Endif
  Endif
  $RutaFinal = $RutaDestino &/ Construye()
  Wait 0.2
  Copy $RutaOrigen To $RutaFinal
End

Private Sub Existe() As Boolean                    ' Valida que exista un directorio para almacenar los archivos, en caso contrario lo crea
Dim zz As Integer

  If Right$($RutaDestino, 8) <> "Respaldo" Then
    $RutaDestino = $RutaDestino &/ "Respaldo"
    Try Mkdir $RutaDestino
    If Error Then
      zz = Message.Error("No se ha podido crear el directorio de respaldo", "Finalizar")
      Quit
    Endif
    Return False
  Else
    Return True
  Endif
End

Private Function RespaldoMasViejo() As String       ' Extrae si existe el nombre del respaldo mas viejo para su substitución.
Dim larchivos As String[]
Dim nombre As String
  
  larchivos = Dir($RutaDestino).Sort(gb.Ascent)
  nombre = larchivos[0]
  Return nombre
End

Private Function Construye() As String              ' Se encarga de contruir el nombre del nuevo respaldo y maneja una bandera para la primera ronda
  Dim nom As String
  Dim larchivos As String[]
  
  larchivos = Dir($RutaDestino).Sort(gb.Ascent)
  If larchivos.Count < $MaxRespaldos Then
    $Control = larchivos.Count + 1
    $PrimeraRonda = True
  Else
    $PrimeraRonda = False
    $Control = Val(Right$($NombreArchivo, 1))
  Endif
  
  nom = Format$(Now, "yyyy-mm-dd") & "_" & Str($Control)
  
  Return nom
  
End
 


En mi caso tengo un botón en la forma que asigna los valores correspondientes y luego los guarda en un archivo settings personalizado para la aplicación completa incuido el respaldo y otras cosas.

Public Sub Button1_Click()

If Button1.Text = "Respaldo" Then
  libherr.Respaldo1.Frecuencia = ComboBox1.Index
  libherr.Respaldo1.RutaOrigen = Application.Path & "/sgipcDB/sigpc"
  libherr.Respaldo1.RutaDestino = ButtonBox1.Text
  sgipc["Respaldo/Frecuencia"] = libherr.Respaldo1.Frecuencia
  sgipc["Respaldos/RutaOrigen"] = libherr.Respaldo1.RutaOrigen
  sgipc["Respaldos/RutaDestino"] = libherr.Respaldo1.RutaDestino
  sgipc.Save
Endif

End
 


ahora bien, por el momento estoy cansado y algo abrumado por lo siguiente; quiero que el respaldo sea o lo primero que se haga cada vez que le toque o bien lo último que haga en la misma circunstancia.  Lo mas seguro es que se haga al finalizar el día de trabajo, pero es justo lo que nadie quiere.... Pero no quiero andar haciendo maniobras raras para evitar que cada vez el o los usuarios entren se haga un respaldo, misma situación a salir del sistema.... Tengo que pensar en eso aunque cualquier idea será bien recibida, así mismo tengo que preparar la clase Restore, auque esta será mucho mas corta y mas fácil de producir. Solo me preocupa ese asunto del usuario entrando y saliendo...

Saludos

PD.
   Que conste que en mi programa si está indentado....   jajajaja
 



 
ramon_661 - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Clase Respaldo Con Otro Enfoque.... 
 
Encontré una falla en la programación.

Estoy indicando la frecuencia con números del indice directo del combobox, y deben recibir un tratamiento diferente.

Además la frecuencia no se está usando....   Faltaba eso... Mas tarde lo arreglo.

Igual sigo pensando en el asunto de manipular el nombre del archivo para convertirlo en una fecha que Cdate pueda tratar y usar datediff.

Cualquier idea o corrección será bien venida.
 



 
ramon_661 - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Clase Respaldo Con Otro Enfoque.... 
 
Bueno... sin entrar al código, yo repensaría el concepto en sí mismo. Aunque la experiencia dice que cuando uno se adentra mucho en un camino cuesta volver atrás o recomenzar por otra vía, aquí tienes mis sugerencias.

Cosas así hice yo en su día con el viejo VBA y bases de Access... y ninguna, nunca, llegó a funcionar bien. Al final decidí que no es buena idea esa de que el propio programa que maneja los datos sea el que se encargue de las copias ¿por qué?:

-Porque si se hacen al final y el usuario, o el sistema, terminan el programa de manera no prevista, las copias no se hacen.
-Porque si se hacen al principio y la base de datos es muy grande, el tema se puede eternizar.
-Porque si se abre el programa y no se modifica nada, se está "desperdiciando" una copia de ese set de 3 ó 5 que especificas.
-Porque si la copia aborta por algún motivo, no sólo se pueden perder datos, sino que también se pueden dañar y ser irrecuperables las copias (ficheros bloqueados, etc.)

Mi consejo: El manejador por excelencia de ficheros es el S.O. déjale a él que se encargue.
¿Cómo? Depende de las condiciones de ejecución y de la frecuencia y volumen de las transacciones en cada sesión de usuario. Si la base esta en un servidor o e máquina local, si esa máquina se enciende o se apaga cada día, si hay concurrencia multi-usuario sobre la base o no, etc. etc. No hay un camino único y concreto, todo depende del proyecto y de su idiosincrasia.

Lo que yo estoy haciendo en la actualidad es una serie "falso-incremental" de copias vía comando rsync en un shell script que es lanzado por el sistema vía cron en determinados momentos del día y la noche. Pero mis bases de datos son MySQL y están ubicadas en servidores 24/7, lo que me da mucho juego para todo eso.

Creo que no te ayudo demasiado pero es mi consejo: Cada cosa para lo que fué diseñada ("es lo suyo", decimos en mi pueblo). Deja tu proyecto que haga lo que tiene que hacer y permite a programas o entornos específicos que se encarguen de la seguridad. Reinventar la rueda es algo que hacemos continuamente y que llena de orgullo cuando lo tienes funcionando... pero no siempre es lo más adecuado ni efectivo.

Saludos
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Clase Respaldo Con Otro Enfoque.... 
 
Es cierto lo que dices.

Pero no deja ser tentador, hacer las cosas embebidas. Lo de usar cron, es muy válido, también lo pensé.

Otra cosa es trabajar con bases de datos de varias decenas de Gigabytes. Pero este es un sistema que como mucho crecerá un par de Megabytes por mes, antes de irme por este lado, hice unas proyecciones de crecimiento y fueron bastante alentadoras.

Ahora bien, para el uso sostenido de sistemas funcionando 24/7 no deja espacio para maniobras, de hecho deberían tener un administrador que entre otras cosas haga los respaldos, al menos de 2 formas diferentes, una serie diaria de tipo incremental y otra periódica total cada tanto (período a definir) de tipo total y separable del sistema.

Te explico mejor para que tengas un escenario mas claro.  Esto forma parte de una aplicación para manejo de iva y procesos conexos, que si bien es cierto que tiene lo suyo, es una aplicación que tiene su espacio entre pequeños comerciantes. Estos no suelen entender bien los procesos fiscales y ni disponen, ni lo desean...  invertir fuertes sumas en sistemas complicados, del tipo a que haces referencia, al contrario, reciben fuertes multas por no estar al día, en diversas áreas de los procesos fiscales. Ej.  Contratan un trabajo con un herrero para hacer un tipo de mobiliario especifico y al terminar, éste les da una factura, el comerciante que regularmente no tiene un grado universitario en derecho tributaria, le paga y se olvida del asunto, luego al final de mes le entrega todas las facturas al contador, pero ya es tarde para hacer la retención de impuesto sobre la renta que podría tener lugar o una retención de iva si se tratara de un contribuyente de tipo pasivo. La aplicación mía le hubiese hecho la tarea, sin problemas y sin multas....  Como ves, no va a crecer mucho, y solo pretende ayudar a emparejar las cosas.

No obstante, para la próxima aplicación que si va a manejar inventario, ventas, compras, operaciones ordinarias como control de alquileres, etc etc. Tu recomendación va por todo el cañón. Incluso hay aplicaciones especializadas que realizan las tareas de respaldo y recuperación, de forma automática, solo hay que darles una vuelta cada tanto.

Sin embargo como dije antes, tienes razón en eso de hacer uno el trabajo para el cual el SO, es el mas idóneo.
 



 
ramon_661 - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Clase Respaldo Con Otro Enfoque.... 
 
Nuestro sistema de copias no tiene nada que ver con el escenario que describes. En la actualidad lo que tenemos son dos réplicas del servidor. Es decir tenemos dos máquinas espejos del servidor principal.

La primera está en la misma ubicación que el servidor y se replica tres veces al día: Media hora antes del horario laboral, media hora después, a mediodía y otra vez por la noche, por si alguien ha hecho horas extras.

La segunda exactamente lo mismo, pero en una ubicación distinta. De hecho en otra ciudad.

Si el primer servidor falla, se supone que el segundo entra en marcha inmediatamente.

Si eso también falla (porque el router falle), entra en marcha un segundo router de otra compañía telefónica distinta que garantice que el servicio no se interrumpe.

Si aún así falla (por fallo eléctrico de la ubicación, por ejemplo), Los programas buscan en el servidor de la otra ciudad de manera automática.

Aparte de eso hay una serie de copias comprimidas nocturnas que se guardan durante siete días, la última de las cuales se guarda durante cuatro semanas. La última de las semanales se guarda durante un mes y la última de las mensuales, o sea, la anual, se guarda indefinidamente.

Llega a ser un lío si tienes en cuenta que también tenemos otro servidor en los EE.UU que contiene las páginas web y sus bases de datos correspondientes. Esas bases y páginas se replican por la noche en el servidor principal y así los ficheros de copia se incorporan al sistema general de copias.

Tenemos el sistema aún a medio implantar, que el tercer servidor es de muy reciente aparición. Pero con un poco de suerte todo funcionará perfecto para el inicio del Otoño.

Saludos.
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Clase Respaldo Con Otro Enfoque.... 
 
Imaginate como será de simple si es que se puede decir de ese modo, que no creo que la base de datos vaya a crecer mas allá de 2 MiB por mes....  Es decir, leeeeeeentoooooo...   jajajaja, así que con eso que hice están mas que cubiertos por algunos años.

No así, lo que podría llamarse "estructura de negocio", recuerda que se trata de iva y procesos conexos, que puede cambiar de un momento a otro sin previo aviso, tanto a nivel reportes, como de avisos al usuario. Todo eso debido al ente recaudador.

El siguiente paso y ya mas serio, será un administrativo de mayor amplitud que acabe ("Eso espero") con hegemonía de un par de sistemas chiste, que simplemente fueron rescritos de turbo pascal a delphi y sus archivos de bases de datos jerarquicas, recreadas en MSSQL.   Ya te imaginarás ese desastre que han hecho con la teoría relacional y con las bondades de SQL....  Aunque sea de Micros....... que en el peor de los casos es un milagro de la ingienería de software, que esas cosas funcionen.....

Pero que puede pedirse de gente que te dice dibujame la pantalla y te hago el programa?????   Y no es broma....
 



 
ramon_661 - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Clase Respaldo Con Otro Enfoque.... 
 
Citar:

Pero que puede pedirse de gente que te dice dibujame la pantalla y te hago el programa?????   Y no es broma....

         

¡Y yo teniendo pánico a los que te sacan una ficha de cartulina y dicen "No... si nosotros lo que queremos es tener esta ficha en la pantalla, nada más..."

Suicidas, eso es lo que son esos pantalla-creators...   
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Clase Respaldo Con Otro Enfoque.... 
 
shordi escribió: [Ver mensaje]
Al final decidí que no es buena idea esa de que el propio programa que maneja los datos sea el que se encargue de las copias


+1
 



 
tercoIDE - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Como Saber Que Objeto Tiene El Enfoque aristicol General 12 Viernes, 20 May 2011, 21:37 Ver último mensaje
Ronny
No hay nuevos mensajes Ayuda Para Completar Codigo De Respaldo De... kexxya Bases de Datos 1 Jueves, 02 Junio 2011, 14:54 Ver último mensaje
shordi
No hay nuevos mensajes Respaldo Base De Datos Mysql Haseo Bases de Datos 2 Lunes, 30 Enero 2012, 13:04 Ver último mensaje
tururu
No hay nuevos mensajes Clase Respaldo (clase Básica) v3ctor Aplicaciones/Fragmentos de Código 0 Sabado, 17 Octobre 2015, 23:56 Ver último mensaje
v3ctor
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron