(5-2) Formas de migrar una tabla SQL grande

Introduccion


Hola a todos! Este es mi primer artículo y lo escribo en nombre de un ingeniero de desarrollo junior en C #. Por lo tanto, no habrá información detallada sobre SQL, solo información práctica y pensamientos para resolver un problema bastante obvio que tuve que enfrentar para los mismos recién llegados que yo.

Primero, describiré la formulación de mi problema como un ejemplo, en el que existe una necesidad real de mover una mesa grande.

Entonces, suponga que tiene un servicio web y una base de datos SQL (MS-SQL) con una tabla de letras html que su servicio envía a los usuarios. Las cartas se almacenan durante varios años y no se pueden eliminar, ya que son necesarias para recopilar estadísticas y análisis. Sin embargo, cada año crece el número de letras, la base de datos crece y el espacio en el servidor SQL se hace más pequeño (en nuestro caso, otro factor fue restaurar la base de datos al sitio de prueba, porque su tiempo aumentó proporcionalmente) y hay que hacer algo con esto. para hacer Afortunadamente, en nuestro caso hay un servidor gratuito con un montón de espacio libre (en realidad, puede que no lo sea, y por supuesto, esta es una solución temporal, pero está más allá del alcance del artículo). Entonces surgió el problema de mover una mesa grande (y decir "grande", me refiero a una mesa realmente grande, todo lo que vi mientras buscaba soluciones similares estaba en la región de 60-100 GB, en nuestro caso la mesa pesaba más de 300 GB).

Consideraremos varias formas de resolver este problema, pero no todas estarán relacionadas con la transferencia del tipo servidor-servidor. A veces puede ser necesario transferir una tabla entre bases de datos dentro del mismo servidor. Además, algunos métodos son puramente teóricos, no los probé todos en la práctica, pero probablemente deberían funcionar.

Método -1. Datos


No importa cuán obvio suene, pero debe saber qué datos va a transferir. Muy a menudo, los datos no se almacenan de la manera más óptima, y ​​también se puede almacenar el exceso de información. Es probable que, en su caso particular, pueda hacerlo sin transferir todos los datos.

En primer lugar, eliminar una columna probablemente puede ayudarlo, pero esta es una operación de bloqueo y no siempre es posible detener un servicio web. Y en Habré hay un artículo en el que se le dice cómo se puede llevar a cabo.

En segundo lugar, no te olvides de la normalización. Quizás se puedan transferir algunos datos al diccionario (en el caso de las letras, no fue posible almacenar los cuerpos de las letras, sino las plantillas con los datos que se insertaron allí), y solo la identificación de estos elementos podría almacenarse en una tabla grande, esto podría liberarle mucho espacio.

Método 0. SELECCIONAR EN


Broma =) Entonces solo puedes ponerte una base. Sin embargo, si estamos hablando del tamaño pequeño de la tabla (entonces, ¿qué está haciendo aquí?), Puede intentar transferir la base de datos utilizando esta instrucción. Además, si tiene una base de prueba, puede realizar un experimento para evaluar el tiempo total de transferencia utilizando este método "en la frente".

Método 1. Copia de seguridad


La forma más "canónica", fue esto lo que se convirtió en la solución a mi problema. Hacemos una copia de seguridad de la base de datos que contiene nuestra tabla, la restauramos en otro servidor y la borramos de todo lo innecesario. Además, si es posible detener el servicio web, puede volver a implementarlo configurando el registro en la tabla transferida y eliminar el antiguo * * (aquí es muy probable que sea necesario escribir consultas con uniones, para este google cómo vincular sql- servidores). Si esto no es posible, arreglamos la identificación de la última letra (para la sincronización), luego necesitaremos eliminar * todas las letras transferidas (continuaremos escribiendo en la tabla anterior).

* Al eliminar un tema separado para la conversación, puede parecer que es mucho más rápido que la transferencia, pero esto no es así y, en el caso general, aconsejo eliminarlo en porciones.

Método 2: MS-SQL Management Studio


Si tiene este estudio, puede intentar usar la herramienta integrada para exportar e importar datos. Personalmente, leí en el desbordamiento de pila que esta cosa colgaba de una mesa de 60 conciertos y no corría ningún riesgo.

Método 3. Partición


Método de frente mejorado. La idea es transferir datos de la manera habitual con un temporizador entre iteraciones. Divide todas las líneas en porciones (por ejemplo, 100k cada una), transfiere la porción (y puede eliminarla de inmediato, pero no está seguro de qué tan segura es), luego se queda dormido y así hasta el final. Es mejor transferir desde el final para que no tenga que sincronizar los datos al final. Obviamente, el método es muy lento, pero de esta manera transferirá todo sin detener el servicio web. Lo más probable es que sea más conveniente implementarlo no con un script SQL, sino con la ayuda de algunos ORM.

Resumen


El proceso de transferir una gran cantidad de datos siempre lleva una cierta cantidad de tiempo, y usted debe estar preparado para esto. No hay una forma mágica de resolver su problema al instante. En cada caso, debe desarrollar sus volúmenes y limitaciones. Si ninguno de los métodos funciona para usted, considere si puede usar alguna combinación de ellos.

Al final, me gustaría agregar 2 puntos importantes.

Cualquier proceso de transferencia / eliminación de filas en SQL se registra en el registro de transacciones para poder revertir todo en caso de error (anteriormente supuse que esto se lleva a cabo solo en el marco de una transacción). Además, el tamaño del registro es incluso un poco más que la cantidad de datos. Asegúrese de tener la cantidad de espacio necesaria o deshabilite el registro, pero esto no es seguro.

Antes de transferir, debe asegurarse de que el archivo de datos y el archivo de registro tengan el tamaño correcto, porque las operaciones de expansión emplean una cantidad considerable de tiempo y las configuran en consecuencia para optimizar la migración.
Gracias a todos los que leen! Estaré encantado de cualquier crítica, comentario y aclaración. Comparta sus formas y técnicas para trabajar con big data, como A menudo, esta es una información muy importante y necesaria que no es tan fácil de encontrar.

Source: https://habr.com/ru/post/es434800/


All Articles