Necesito sincronizar una tabla grande ~ 500 millones de filas sin una clave principal entre SQL Server y MySQL. La tabla solo tiene un índice compuesto no agrupado agrupado.
Tengo una conexión ODBC entre los servidores, pero una importación de ~ 8 millones de filas tomó alrededor de 45 minutos, por lo que creo que una importación más grande sería irrazonable ya que pueden producirse interrupciones en cualquier momento. No puedo cambiar la estructura de la tabla existente, puedo agregar otras tablas. Después de una lectura adicional, offset / fetch no es una opción para tablas grandes. "Seleccionar ... donde x entre ... y ..." no es una opción ya que no tengo una clave única.
¿Cómo puedo exportar la tabla en lotes que están garantizados para contener todas las filas? Mi problema es que, dado que la clave agrupada no es única, ordenar después de que no garantice que las filas físicas tengan el mismo orden entre consultas consecutivas y ordenar después de que todas las columnas tomarían demasiado tiempo. ¿Y cómo recomendaría migrar los lotes a través de archivos ODBC o CSV?
fuente
Respuestas:
Suponiendo que no tiene actualizaciones o eliminaciones en la tabla de origen, puede probar lo siguiente:
1. Haga una copia de la tabla existente utilizando la sintaxis CTAS (para SQLServer es
SELECT * into source_table_copy FROM source_table
). Dicha operación es muy rápida incluso para mesas enormes.2. Agregue un
after insert
disparador en elsource_table
que se copien los nuevos registrossource_table_copy
.3. Ahora, cuando todos los registros nuevos
source_table
entrensource_table_copy
también, y puede mover datos de la tabla copiada a Mysql en lotes. Por ejemplo, si tiene un enlace entre 2 servidores, todo se puede hacer dentro del cuerpo del procedimiento almacenado TSQL.Por ejemplo, un fragmento de código que mueve hasta 20 registros al nuevo servidor podría verse como
También es posible usar CURSOR para leer datos y luego eliminar con
where current of
cláusula.** Idealmente, debe evitar que las aplicaciones inserten datos en el
source_table
paso 1. Si es absolutamente imposible, utilizaré unafter insert
desencadenador que se agrega justo antes del paso 1 y se elimina inmediatamente después de hacerlo, lo que copia los datos en otra tabla que pueda luego fusionarse consource_table_copy
.fuente