Senior
37
Hoe zou je een complexe migratie uitvoeren (het toevoegen van een verplichte kolom aan een tabel met 300 miljoen records) via Liquibase?
Bedrijven waar gevraagd werd
Ecom.tech
Antwoord van AI
sobes.tech AI
Добавление обязательной (NOT NULL) колонки в таблицу с 300 млн записей — задача, требующая аккуратного подхода, чтобы не заблокировать таблицу и не вызвать долгие простои.
Подход через Liquibase можно разбить на несколько шагов:
-
Добавить новую колонку как NULLABLE
- Это быстро, не блокирует таблицу.
- В Liquibase:
<addColumn>с атрибутом nullable="true".
-
Заполнить колонку значениями по умолчанию или вычисленными
- Сделать это пакетно, чтобы не перегружать базу.
- Можно использовать скрипты или отдельные изменения в Liquibase с
<update>.
-
Проверить, что все записи заполнены
- Убедиться, что нет NULL.
-
Изменить колонку на NOT NULL
- В Liquibase:
<modifyDataType>или<addNotNullConstraint>. - Это может занять время, но теперь без NULL.
- В Liquibase:
-
Добавить индекс или ограничения, если нужно
Пример changelog Liquibase:
<changeSet id="1" author="me">
<addColumn tableName="big_table">
<column name="new_column" type="varchar(255)" nullable="true"/>
</addColumn>
</changeSet>
<changeSet id="2" author="me">
<update tableName="big_table">
<column name="new_column" value="default_value"/>
</update>
</changeSet>
<changeSet id="3" author="me">
<addNotNullConstraint tableName="big_table" columnName="new_column" columnDataType="varchar(255)"/>
</changeSet>
Если база поддерживает, можно использовать онлайн-миграции (например, PostgreSQL с ALTER TABLE ... ALTER COLUMN SET NOT NULL после заполнения), либо использовать инструменты для онлайн-миграций (gh-ost, pt-online-schema-change для MySQL).
Важно:
- Делать миграцию в часы низкой нагрузки.
- Тестировать на копии базы.
- Делать бэкапы перед изменениями.