¿Cómo maneja la mayoría de los sistemas de bases de datos "populares" (MySQL, Postgres ...) la alteración de tablas en bases de datos de producción en vivo (como agregar, eliminar o cambiar el tipo de columnas)?
Sé que la forma correcta es hacer una copia de seguridad de todo el tiempo de inactividad programado y luego hacer los cambios.
Pero ... ¿algún sistema de base de datos actual admite hacer estas cosas "en línea" sin detener nada? (tal vez solo retrase las consultas que hacen referencia a una columna que se está modificando / eliminando)
¿Y qué sucede cuando solo hago una ALTER TABLE...
en una base de datos en vivo? ¿Todo se detiene cuando esto sucede? ¿Se pueden corromper los datos? etc.
Nuevamente, me refiero principalmente a Postgres o MySQL, ya que estos son los que encuentro.
(Y sí, cada vez que tenía que hacer esto antes de hacerlo "de la manera correcta", respaldando cosas, programando una baja, etc. ... pero solo quiero saber si es posible hacer este tipo y cosas "rápido y sucio "o si hay algún sistema de base de datos que realmente admita cambios de esquema" rápidos, en vivo y sucios ")
Alguien acaba de sugerir el Cambio de esquema en línea para MySQL desde el script de Facebook (con un tutorial aquí y una fuente aquí ) ... parece una buena manera de automatizar un conjunto de formas "hacky" para hacerlo ... ¿alguien lo ha usado alguna vez en algo parecido a la produccion?
fuente
pg_reorg
puede ayudar con los escenarios más difíciles.Respuestas:
Cuando emite un
ALTER TABLE
archivo en PostgreSQL , seACCESS EXCLUSIVE
bloqueará todo lo que incluye todoSELECT
. Sin embargo, este bloqueo puede ser bastante breve si la tabla no requiere reescritura, no es nuevaUNIQUE
,CHECK
o si lasFOREIGN KEY
restricciones necesitan escaneos caros de tabla completa para verificar, etc.En caso de duda, generalmente puede probarlo. Todo DDL en PostgreSQL es transaccional, por lo que está muy bien cancelar un mensaje
ALTER TABLE
si tarda demasiado y comienza a retener otras consultas. Los niveles de bloqueo requeridos por varios comandos están documentados en la página de bloqueo .Algunas operaciones normalmente lentas se pueden acelerar para que sean seguras de realizar sin tiempo de inactividad. Por ejemplo, si tiene una tabla
t
y desea cambiar la columnacustomercode integer NOT NULL
atext
porque el cliente ha decidido que todos los códigos de cliente ahora deben comenzar con unX
, puede escribir:... pero eso bloquearía toda la tabla para la reescritura. Entonces, agregar una columna con a
DEFAULT
. Se puede hacer en un par de pasos para evitar el bloqueo prolongado, pero las aplicaciones deben poder hacer frente a la duplicación temporal:Esto sólo evitará que las escrituras a
t
durante el proceso; el nombre de la cerraduraEXCLUSIVE
es algo engañoso porque excluye todo exceptoSELECT
; elACCESS EXCLUSIVE
modo es el único que excluye absolutamente todo. Ver modos de bloqueo . Existe el riesgo de que esta operación pueda anular el bloqueo debido a la actualización de bloqueo requerida por elALTER TABLE
, pero en el peor de los casos, solo tendrá que volver a hacerlo.Incluso se puede evitar que la cerradura y hacer todo esto en vivo mediante la creación de una función de disparo en
t
que cada vez que unaINSERT
oUPDATE
entra, rellena automáticamentecustomercode_new
desdecustomercode
.También hay herramientas integradas como
CREATE INDEX CONCURRENTLY
y que estánALTER TABLE ... ADD table_constraint_using_index
diseñadas para permitir que los DBA reduzcan las duraciones de bloqueo exclusivas haciendo un trabajo más lento de una manera amigable con la concurrencia.La
pg_reorg
herramienta o su sucesor tambiénpg_repack
se pueden utilizar para algunas operaciones de reestructuración de tablas.fuente
ALTER TABLE t ADD COLUMN i INT
es una operación rápida (generalmente <1 ms) una vez que se adquiere el bloqueo. Sin embargo, la adquisición del bloqueo puede poner en cola las conexiones, por lo que no es "gratis" ... aunque es mucho mejor que lo que tienes que hacer en MySQL. Agregar unaNOT NULL
restricción es más difícil y no para los fieles de corazón.pg_repack
es el sucesor mejorado depg_reorg
.Percona tiene su propia herramienta para realizar cambios de esquema en línea
La herramienta se llama pt-online-schema-change
Implica desencadenantes, así que lea la documentación detenidamente.
Según la documentación, las principales operaciones realizadas son
fuente
Apagar el sistema y hacer todos los cambios a la vez puede ser muy arriesgado. Si algo sale mal, y con frecuencia sucede, no hay un camino fácil de regreso.
Como desarrollador ágil, a veces necesito refactorizar tablas sin ningún tiempo de inactividad, ya que esas tablas se están modificando y leyendo.
El siguiente enfoque tiene bajo riesgo, porque el cambio se realiza en varios pasos de bajo riesgo que son muy fáciles de revertir:
Hemos utilizado este enfoque muchas veces para cambiar grandes tablas de producción en vivo sin tiempo de inactividad, sin ningún problema.
fuente
rollback
si algo sale mal.Sí, muchas bases de datos modernas le permitirán simplemente agregar una columna o cambiar las características de una columna, como agregar o quitar valores anulables.
Si suelta una columna, se perderán datos, pero no hay mucho miedo a la corrupción.
fuente
La herramienta Percona usa disparadores para ayudar a alterarla, y no funciona bien si su mesa ya tiene disparadores existentes. Terminé teniendo que escribir uno que realmente maneje bien los desencadenantes existentes, ya que son súper importantes para nuestra base de datos https://github.com/StirlingMarketingGroup/smg-live-alter
fuente
Para abordar la pregunta sobre qué sucede con una
ALTER TABLE
declaración, depende de la extensión de sus cambios. En casos específicos, si agrega una nueva columna, al menos en MS SQL Server, el motor creará una copia temporal de la tabla, mientras crea la nueva definición de la tabla, y luego inserta los datos allí. Mientras dure el cambio, la tabla sería inaccesible para los usuarios.Un ejemplo de las operaciones específicas para el servidor MSSQL está aquí: http://support.microsoft.com/kb/956176/en-us
Supongo que otros RMDB tienen métodos similares, aunque la implementación exacta sería algo que tendría que verificar con la documentación del proveedor.
fuente