Tengo una base de datos de producción muy grande y una base de datos de entorno de prueba muy grande en SQL Server 2008R2. Ambas bases de datos tienen una estructura de tabla similar pero diferentes usuarios / inicios de sesión / permisos / roles.
Necesito actualizar solo unas pocas tablas de la base de datos de prueba periódicamente desde la producción, aproximadamente una vez al mes.
La forma actual en que planeo hacer esto es
- Use la utilidad BCP para exportar las tablas que necesito de Producción.
- Copie el archivo de exportación bcp en el servidor de prueba
- Deshabilite índices y restricciones en todas las tablas que estoy actualizando en Prueba
- Truncar las tablas de la base de datos de prueba
- Vuelva a cargar los datos en las tablas de la base de datos de prueba con BCP
- reconstruir índices y volver a habilitar restricciones en Prueba
Todo esto parece demasiado complicado para una tarea tan pequeña. También parece que generaría mucho rehacer (en el t-log) ¿Hay una mejor manera de hacer esto?
Otra forma en que pensé hacer esto es restaurar una copia de seguridad de Producción en el entorno de prueba, pero el problema que tengo es que una copia de seguridad completa sería bastante grande y no necesito actualizar todas las tablas, solo unas pocas. -y también los usuarios y la seguridad en la base de datos de producción es diferente de la prueba. Eso sería sobrescrito por la configuración de seguridad en la base de datos de producción si restauro toda la base de datos.
fuente
Respuestas:
Existen 2 métodos que se adaptarán a sus necesidades:
(Nota: si la clave externa hace referencia a las tablas, entonces no podrá usarlas
TRUNCATE
. Debe eliminarlas en fragmentos . Alternativamente, puede eliminar todos los índices + claves externas y cargar datos y luego volver a crearlos).BCP OUT e BULK INSERT INTO en la base de datos de destino .
Habilite Trace Flag 610: inserciones mínimamente registradas en tablas indexadas.
-
Método 2: SSIS: mi método preferido en este caso.
Referencia: La Guía de rendimiento de carga de datos y mi respuesta para - Insertar en la tabla seleccionar * de la tabla vs inserción masiva
fuente
No es necesario hacer copias de seguridad y restauraciones, ni llamar / coordinar procesos externos (es decir, BCP), ni siquiera meterse con SSIS (muy potente, muy bueno, pero si puedo evitarlo, ciertamente lo haré :). Puede manejar todo esto desde la comodidad de T-SQL, en un procedimiento almacenado que puede programar a través del Agente SQL, o un script que ejecuta una vez al mes (aunque tenerlo en un proceso y programación es menos trabajo a largo plazo correr). ¿Cómo? Al usar SQLCLR para acceder a la
SqlBulkCopy
Clase en .NET, ya que es esencialmente BCP sin todo el alboroto de llamar a BCP. Puede codificar esto usted mismo: no hay una configuración súper complicada ni nada como elSqlBulkCopy
La clase se encarga de casi todo por usted (puede establecer el tamaño del lote, disparar o no disparadores, etc.). O, si no desea meterse con la compilación y la implementación de un ensamblaje, puede usar un procedimiento almacenado SQLCLR precompilado como DB_BulkCopy, que es parte de la biblioteca SQL # SQLCLR (de la que soy autor, pero esta almacenada procedimiento está en la versión gratuita). Describo esto con más detalle, incluido un ejemplo de uso de DB_BulkCopy , en la siguiente respuesta:Importar datos de una base de datos a otro script
Si no está claro dónde colocar esto en su plan actual, haría lo siguiente:
EXEC
de DB_BulkCopy o como se llame si el código usted mismo, que solo mueve los datos desde el punto A al punto B.Además, debe señalarse que
SqlBulkCopy
y DB_BulkCopy :ACTUALIZACIÓN sobre operaciones mínimamente registradas a través de SqlBulkCopy
Es posible obtener operaciones mínimamente registradas, pero debe saber:
[tempdb]
y luego realizará la inserción ordenada en el destino. Por lo tanto, se incurre en una carga adicional, tanto en términos de E / S física a tempdb (datos y archivos de registro) como de la operación de clasificación (debido a loORDER BY
que se requiere para obtener las operaciones mínimamente registradas)fuente