Довольно базовая тема, т.к. схема как ни крути со временем меняется.
Обычно использую Flyway, т.к. он поддерживает миграции в формате SQL-файлов (чтобы не изучать отдельные синтаксисы, а затем не думать как в них реализовать какой-то особенный синтаксис SQL под миграции) и не поддерживает откат миграций (они идут только вперед: если что-то не так, то делаем новую миграцию).
Основная принципиальная проблема обновлений без остановки работы заключается в том, что какое-то время старый код должен работать с новой схемой БД.
Вторая проблема – длительность операции, когда БД не работает. В некоторых БД в некоторых случаях обновление схемы приводит к простою.
Нашел хороший материал на эту тему для Postgres с примерами SQL-конструкций под различные случаи: