2009-06-04 22 views
5

Tengo un gran archivo SQL que no cabe en la memoria y debe ejecutarse contra Microsoft SQL Server 2008. Parece que la herramienta sqlcmd.exe siempre la carga primero en la memoria, lo que en este caso es imposible. ¿Algunas ideas?¿Cómo ejecutar un archivo SQL de 3GB (Microsoft SQL Server)?

Desafortunadamente, no puedo dividir el script porque es generado por la excelente comparación de datos SQL de Red Gate. Todo el guión es una gran transacción y quiero dejarlo así. Nunca pensé que tener un script gigantesco es inusual porque tener una gran cantidad de datos es común en el mundo de la base de datos. El script tiene 3gb de tamaño.

+2

¿El archivo SQL no cabe en la memoria? ¿¿¿De Verdad??? – Rockcoder

+1

¿Cuál es el tamaño exacto? – NinethSense

+1

¿Qué tan grande es el archivo?!?!?!?!?!? – OneSHOT

Respuesta

1

¿Qué/quién creó el script SQL? Obtenga lo que creó el archivo para dividir el script en fragmentos lógicos, por transacción o enunciado (según cómo esté estructurado el archivo). Si la fuente no puede hacer esto, entonces crea un script para dividir el archivo lógicamente.

1

Si es tan grande, el script es demasiado complejo o repetitivo. En cualquier caso, como otros han sugerido, lo único sensato es dividirlo en fragmentos manejables.

¿Se trata de un ejercicio único o de un evento regular?

1

He tenido este problema antes donde el script tenía una enorme cadena XML que se estaba utilizando con OpenXML. El SQL real era bastante mínimo, actualizando algunos valores en una tabla.

Terminé insertando los datos (en fragmentos) en una tabla temporal hasta que se almacenó toda la información que estaba en el XML. Luego ejecuté mi declaración de actualización.

añadió más tarde después de más datos consiguieron colocado:

Es posible que desee seleccionar trozos grandes en la herramienta y tienen comparar los datos de SQL generar los scripts en trozos. De esa forma obtienes las transacciones. Puede seleccionar secciones grandes simplemente resaltando un rango y presionando la barra espaciadora.

3

RedGate's SQL Compare tiene una opción para ejecutar las instrucciones directamente, en lugar de generar un script SQL y ejecutarlo más tarde. ¿Hay alguna razón por la que esto no funcione? En otras palabras, ¿hay alguna razón por la que requiera un script SQL y no pueda usar la funcionalidad de "sincronizar ahora" de la aplicación?

+0

Ese es un buen punto (Redgate fabrica algunos productos increíbles) pero es posible que no tenga acceso de actualización en su entorno. Esa es la posición en la que estoy. Necesito generar scripts y pasarlos a los DBA para que se ejecuten. – wcm

+0

Touche. En ese caso, ¿es necesario actualizar cada tabla en una sola transacción? ¿Puedes dividir la operación en 3-4 scripts diferentes, es decir, ejecutar la herramienta Red Gate solo en 1/4 de tus tablas cada vez (seleccionando las tablas para equilibrar el tamaño de cada script)? Aunque esta no es una transacción pura para toda su actualización, cada pieza es una transacción, por lo que sus datos no se dejarán en un estado "dañado" si falla una secuencia de comandos, e incluso podría solicitar que los DBA los ejecuten simultáneamente durante una ventana de mantenimiento, por lo que los usuarios no verán datos parcialmente actualizados. – SqlRyan

+0

Podría hacer el argumento de que el DBA podría ejecutar SQL Data compare para él. La pregunta para mí es si SQL Data Compare se encontrará con el mismo problema. Quiero decir, Redgate no solo ejecuta el script de la misma forma que Management Studio ejecuta el script. No digo que no lo intentes.Es una buena idea – wcm

0

1-800-Redgate-apoyo .....

o

  • ruptura escritura de transacción en archivos más pequeños
  • base de datos de conjunto en el modo de usuario único
  • fullbackup de la base de datos
  • ejecuta cada archivo de script más pequeño; Si se produce un fallo: restaurar la copia de seguridad, fijar la escritura, vuelve a intentarlo
  • de vuelta de modo de usuario único, todo hecho
1

me encontré con este problema hace unos meses. Genero scripts de sincronización con SQLDataCompare de forma semanal y mensual para varias de nuestras bases de datos de catálogos y son rutinariamente más grandes que 500MB. Mi solución fue escribir un VBscript que corta la secuencia de comandos de actualización en 50 a 1000 lotes de comandos. El problema con este enfoque es perder la capacidad de deshacer todos los cambios si algo se rompe en la mitad de la actualización de la base de datos.

0

USO comando sqlcmd

Ejemplo sqlcmd -S miServidor \ instanceName -i C: \ MyScript.sql

0

La manera en que yo entiendo, SSMS es de 32 bits por lo que no puede cargar más de una secuencia de comandos 1.5-2 GB. Puede ejecutar el script en SQLCMD.exe, pero luego puede tener problemas debido al tamaño de la transacción: SqlCmd mantendrá una transacción completa en la memoria. Entonces, lo que puede hacer en SQL Data Compare es ir a las opciones y usar "transacciones divididas", lo que puede ayudar.

SQL Data Compare también hará actualizaciones parciales a BLOBs, lo que resolverá el problema de "enorme BLOB".

Esto, por supuesto, si se basa en la última versión de Data Compare. Algunas versiones pueden no tener estas características.

Otra opción puede ser utilizar SQL Compare para crear un script de esquema en una carpeta, luego use SDC para sincronizar los datos en esa carpeta. Luego tiene un archivo para cada tabla en lugar de un archivo masivo.

Espero que esto ayude.

Cuestiones relacionadas