none
Error al comprimir un .bak RRS feed

  • Pregunta

  • Estoy intentando comprimir un .bak de mi base de datos que previamente creé, el mismo se crea con exito, pero cuando procedo a comprimirlo indicando la ruta, y la misma ruta pero con la extencion .zip, me dice que hubo un fallo al encontrar la ruta, generandome un zip, pero vacio.

    Mi codigo:

    Ruta = $@"{RutaIndicada.SelectedPath}";
    
                                string NombreCopia = $"Copia de seguridad del {DateTime.Today.Date.ToShortDateString()} a las {DateTime.Now.ToString(@"HH\:mm\:ss")}";
    
                                NombreCopia = NombreCopia.Replace('/', '_');
                                NombreCopia = NombreCopia.Replace(':', '_');
    
                                string ComandoConsulta = $@"BACKUP DATABASE [BDRestaurante] TO  DISK = N'{Ruta}\{NombreCopia}.bak' WITH NOFORMAT, NOINIT,  NAME = N'BDRestaurante-Completa Base de datos Copia de seguridad', SKIP, NOREWIND, NOUNLOAD,  STATS = 10";
    
                                SqlCommand Comando = new SqlCommand(ComandoConsulta, Conexion);
    
                                Conexion.Open();
                                Comando.ExecuteNonQuery();
                                Conexion.Close();
                                
                                ZipFile.CreateFromDirectory($@"{Ruta}\{NombreCopia}", $@"{Ruta}\{NombreCopia}.zip");

    El mensaje de error es el siguiente: "No se puede encontrar una parte de la ruta de acceso 'D:\Copia de seguridad del 15_11_2019 a las 12_11_22'."

    Foto de los directorios creados (el zip vacio):


    tomasgavagnin

    viernes, 15 de noviembre de 2019 15:18

Respuestas

  • Probablemente no sea una buena idea usar la misma ruta para el .zip. Piensa que al hacer el CreateFromDirectory tiene que enumerar los ficheros de ese directorio para irlos añadiendo al .zip uno por uno. Pero en el momento de enumerarlos ya se habrá creado el zip en la carpeta, por lo que inetntará abrir el .zip para añadirlo al .zip. Como el fichero está abierto para escritura en ese momento, no se puede leer (y de hecho no quieres que se lea, no hay que añadir el zip dentro del zip) por lo que da un error.

    Prueba a enviar el zip a otra carpeta distinta. Si es necesario, una vez que haya terminado de crearlo puedes trasladarlo a la carpeta deseada usando File.Move.

    Por cierto, en lugar de comprimer el .bak en un .zip, a lo mejor te interesa añadir un ... WITH COMPRESSION en tu comando de backup, suponiendo que tu versión de SQL Server lo admita. De esa manera, el .bak ya se graba comprimido y te ahorras tener que crear el .zip. En mi experiencia, el .zip queda ligeramente más pequeño que el WITH COMPRESSION, pero a cambio el WITH COMPRESSION es más rápido. Al terminar antes, mantiene la base de datos sobrecargada durante menos tiempo y agrega menos transacciones al final del backup. En un servidor muy ocupado, esto puede haer que resulte ventajoso en comparación con la pequeña ganancia de espacio que consigue el .zip frente al COMPRESSION.

    Ah, y otra cosa: veo que en tu comando has puesto WITH STATS=10. Esto se hace para que vaya informando del progreso según avanza el backup. Pero no has conectado el evento InfoMessage en tu objeto Conexion, por lo que no te sirve para nada que te envíe los stats.
    viernes, 15 de noviembre de 2019 15:44
    Moderador

Todas las respuestas

  • Probablemente no sea una buena idea usar la misma ruta para el .zip. Piensa que al hacer el CreateFromDirectory tiene que enumerar los ficheros de ese directorio para irlos añadiendo al .zip uno por uno. Pero en el momento de enumerarlos ya se habrá creado el zip en la carpeta, por lo que inetntará abrir el .zip para añadirlo al .zip. Como el fichero está abierto para escritura en ese momento, no se puede leer (y de hecho no quieres que se lea, no hay que añadir el zip dentro del zip) por lo que da un error.

    Prueba a enviar el zip a otra carpeta distinta. Si es necesario, una vez que haya terminado de crearlo puedes trasladarlo a la carpeta deseada usando File.Move.

    Por cierto, en lugar de comprimer el .bak en un .zip, a lo mejor te interesa añadir un ... WITH COMPRESSION en tu comando de backup, suponiendo que tu versión de SQL Server lo admita. De esa manera, el .bak ya se graba comprimido y te ahorras tener que crear el .zip. En mi experiencia, el .zip queda ligeramente más pequeño que el WITH COMPRESSION, pero a cambio el WITH COMPRESSION es más rápido. Al terminar antes, mantiene la base de datos sobrecargada durante menos tiempo y agrega menos transacciones al final del backup. En un servidor muy ocupado, esto puede haer que resulte ventajoso en comparación con la pequeña ganancia de espacio que consigue el .zip frente al COMPRESSION.

    Ah, y otra cosa: veo que en tu comando has puesto WITH STATS=10. Esto se hace para que vaya informando del progreso según avanza el backup. Pero no has conectado el evento InfoMessage en tu objeto Conexion, por lo que no te sirve para nada que te envíe los stats.
    viernes, 15 de noviembre de 2019 15:44
    Moderador
  • Me ayudaria mucho el COMPRESSION, pero mi version de SQL no me lo denega. Intentare actualizar la vercion ya que no quiero andar moviendo muchos archivos, ademas de que me deja generado el .bak sin comprimir. Lo del WITH STATS=10 es porque copie y pegue el scrip generado igual que como me lo hizo el SQL

    tomasgavagnin


    • Editado Orion1998 viernes, 15 de noviembre de 2019 16:23
    viernes, 15 de noviembre de 2019 16:22
  • [...] mi version de SQL no me lo deniega. Intentare actualizar la version [...]

    La version minima que se necesita es 2008. Esto no suele ser problema, dudo que tengas una version mas antigua. La dificultad esta en que para usar el COMPRESSION se necesita una edicion Enterprise (o Developer).

    viernes, 15 de noviembre de 2019 16:29
    Moderador
  • Claro, a eso me referia, fue error de redaccion mio. Tengo la edicion SQL express edition 2012

    tomasgavagnin

    sábado, 16 de noviembre de 2019 19:32