Copiar Archivos Grandes usando ESEUtil.exe

Junto con discos duros cada vez más grandes, cuyas capacidades ya se miden en TeraBytes desde hace un buen rato, se está generando cada vez mayor cantidad de información almacenada, sea como Bases de Datos (SQL, Exchange u otros) o como archivos de Discos Duros Virtuales (.VHD), todos los cuales “pesan” varios GB. Un desafío importante es poder realizar el movimiento de estos archivos entre distintos discos duros, a veces ubicados en distintos servidores – muchas veces a través de la red – por distintos motivos: respaldos, mantenimiento, etc.

Esta tarea generalmente consume mucho tiempo dependiendo de varios factores: velocidad de lectura/escritura en disco, uso de CPU de los servidores involucrados, velocidad y congestión de la red, entre otros.  Una forma de disminuir notoriamente el tiempo que dicha copia de información tarda es utilizando una herramienta que viene con Exchange Server, al menos desde la versión 2000: ESEUtil.exe. En mi experiencia, el uso de ESEUtil reduce en un 40% a 50% el tiempo empleado por otras herramientas como Xcopy o RoboCopy.

ESEUtil es una herramienta de línea de comando para verificar, modificar y reparar una base de datos Exchange – las cuales típicamente son de varios GB, pero una de sus opciones permite realizar la copia de archivos usando la siguiente Sintaxis:

esutil.exe /Y Archivo_Origen /DArchivo_Destino

A continuación hay un ejemplo (real) de la copia por red de un archivo de respaldo (.bkf) por red FastEthernet (100Mbps) de 16,5 GB, el cual sólo tardó 1372 segundos = 22 minutos!. Nada mal.. hagan sus propios cálculos 😉

image

Notas:

  • Eseutil no acepta “comodines” (Wildcards) en los nombres de archivos. es decir no puedes pedir copiar c:*.*
  • Es necesario entregar la ruta completa del archivo de origen, como en el ejemplo.
  • No es necesario entregar la ruta del archivo de destino. En este caso el archivo de destino se grabará en el directorio desde donde se está ejecutando el comando y con el mismo nombre de archivo, como en el ejemplo.
  • Hay 2 versiones de ESEUtil, asegúrate de usar la adecuada a tu servidor:
    • Una de 32-bits (Exchange 2003) que generalmente se encuentra en: C:Program FilesExchsrvrBin
    • Una de 32-bits (Exchange 2003) que generalmente se encuentra en: <SystemDrive>:Program FilesMicrosoftExchange ServerBin.

      (Reemplazar SystemDrive por la letra de unidad donde está instalado Exchange)

Preguntas:

  1. ¿Tengo que tener Exchange Server instalado para usar Eseutil?.

    No, no es necesario. Desde un equipo con Exchange Server puedes copiar los archivos eseutil.exe y ese.dll a un directorio en otro servidor y realizar las copias de archivos (u otro mantenimiento a tus bases de datos de Exchange). También puedes invocar a eseutil por red (\ServidorExchangeRutaEseutil)

  2. No creo en la magia ni en la brujería, ¿Cómo funciona realmente esto “por debajo”?

    Simplificando un poco las cosas, el “truco” se consigue al no realizar verificaciones de escritura en el destino de la copia, sólo se realiza una copia “en bruto” de la información. Es el equivalente en TCP a enviar información continuamente y sin esperar por un ACK. Para mayor información puedes leer el artículo (en inglés) Slow Large File Copy Issues que está en las referencias, o dejando un comentario a este post.

  3. OK. ¿Pero si no se hacen verificaciones y estoy realizando una copia por red, cómo puedo estar seguro de que mi archivo de destino es una copia fiel del original?

    En realidad si se realizan verificaciones, pero en otros niveles de la comunicación: Ethernet y TCP al menos 😉

  4. ¿Hay algún impacto en el uso de la red al realizar esta copia de archivos?

    El uso de eseutil hace un uso más intensivo de la red de lo que harían otros programas como Windows Explorer o RoboCopy. La siguiente imagen es un ejemplo del uso de la red al realizar la copia del ejemplo anterior.. es fácil ver cuándo comenzó la copia de archivos 😉

    Para los más observadores, el servidor fuente es un Windows 2003 y el destino un Windows 2008, por lo que el alto uso de red no es producto de las mejoras en TCP/IP de Windows 2008, sino sólo de ESEUtil.

image

 

Referencias:

 

 

Espero que este dato les sea de utilidad.

Consultas y comentarios son siempre bienvenidos.

Gonzalo

3 comentarios sobre “Copiar Archivos Grandes usando ESEUtil.exe”

  1. Hola, sino tengo exchange cómo lo consigo ??

    En C# se podría implementar una utilidad con esa capacidad de rendimiento en la copia ??

    salu2&graz

  2. Hola preguntoncojonero.
    Si no tienes exchange, puedes bajar gratis la versión de evaluación desde: http://technet.microsoft.com/evalcenter

    Por otra parte, en último link de las referencias aparece (en inglés) la lista de funciones a utilizar para conseguir el mismo efecto – y sus links a msdn: CreateFile(), ReadFile() y WriteFile().
    Ojalá pronto podamos ver tu implementación publicada en codeplex 😉

    Saludos y Gracias por leer!

Responder a gbr Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *