Обновления / миграции баз данных¶
XC_VM использует файловую систему обновления базы данных для управления изменениями схемы между версиями. Обновления базы данных запускаются автоматически при обновлении панели управления и проверке состояния системы и могут быть применены вручную с помощью db:migrate.
Информацию о точке входа в консоль, реестре команд и о том, как зарегистрировать команду, смотрите в CLI Tools & Console Reference.
как это работает¶
-
SQL-файлы для обновлений базы данных хранятся в
/home/xc_vm/migrations/(src/migrations/в репозитории исходных текстов). -
Каждому файлу присваивается имя с префиксом последовательного номера, например:
001_drop_watch_folders_plex_token.sql
002_panel_logs_add_file_env.sql
003_drop_settings_segment_type.sql
-
Применяемые шаги обновления базы данных отслеживаются в таблице базы данных
migrations. Каждый шаг выполняется ровно один раз — если какой-либо шаг уже был применен, он пропускается. Нет пути возврата: миграции выполняются только в прямом направлении, поэтому по возможности поддерживайте их обратную совместимость. -
Обновления базы данных выполняются автоматически:
console.php update post-update— после обновления панелиconsole.php status— во время проверки состояния системы (только для главного сервера)
Основная логика находится в MigrationRunner (src/Core/Database/MigrationRunner.php).
Поток выполнения обновления базы данных¶
[ MigrationRunner::run() — DB update execution ]
│
▼
[ CREATE TABLE IF NOT EXISTS `migrations` ]
│
▼
[ Read all *.sql files from migrations/ ]
│
▼
[ For each file not in `migrations` table: ]
├── Execute SQL statements
├── Record in `migrations` table
└── Output [OK] (recorded) or [FAIL] (not recorded)
Создание нового шага обновления базы данных¶
Когда вам нужно изменить схему базы данных (добавить столбцы, создать таблицы, вставить данные и т.д.), создайте новый SQL-файл для этапа обновления базы данных.
Шаг 1. Выберите имя файла¶
Используйте следующий порядковый номер и описательное название:
Format rules:
- Числовой префикс: 3 цифры, дополненные нулем (например,
006,007) - Разделитель: символ подчеркивания
_ - Название: нижний регистр, подчеркивание, описывающее, что делает шаг обновления
- Добавочный номер:
.sql
Examples:
Шаг 2. Напишите SQL-код¶
Поместите в файл необработанные инструкции SQL. Несколько инструкций разделяются символом ;.
Rules for SQL DB update steps:
- Используйте
IF EXISTS/IF NOT EXISTSчтобы сделать шаги обновления базы данных идемпотентными:
-- Adding a column (safe)
ALTER TABLE `settings` ADD COLUMN IF NOT EXISTS `timezone` VARCHAR(64) DEFAULT 'UTC';
-- Dropping a column (safe)
ALTER TABLE `settings` DROP COLUMN IF EXISTS `old_column`;
-- Creating a table (safe)
CREATE TABLE IF NOT EXISTS `audit_log` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`action` VARCHAR(255) NOT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- Использовать условное значение
INSERTчтобы избежать дублирования:
INSERT INTO `streams_arguments` (argument_key, argument_name, argument_cmd)
SELECT 'my_key', 'My Argument', '-my_flag %s'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `streams_arguments` WHERE argument_key = 'my_key');
-
Не смешивайте DDL и DML, которые зависят друг от друга в одном файле. Если вам нужно добавить столбец и затем заполнить его, используйте два файла шагов обновления базы данных.
-
Комментарии поддерживаются с префиксом
--(они пропускаются во время выполнения).
Idempotency matters because a failed step is not recorded — it prints
[FAIL] <name> (not recorded — will retry on next run)and re-runs on the nextdb:migrate. A non-idempotent step that half-applied before failing will be retried from the top, so every statement must be safe to run again (useIF NOT EXISTS,INSERT ... ON DUPLICATE KEY UPDATE, etc.).
Шаг 3. Поместите файл¶
Скопируйте SQL-файл для шага обновления базы данных в:
💡 В хранилище исходных текстов это значение равно
src/migrations/.
Шаг 4. Подтвердите обновление базы данных¶
Запустите db:migrate, чтобы применить ожидающие обновления БД шаги:
Или через status first-run (также запускает миграции):
Ожидаемый результат:
Если оператор завершается ошибкой, шаг выводит значение [FAIL] и записывается значение нет, поэтому он будет повторен при следующем запуске. Просмотрите SQL, исправьте его и запустите повторно db:migrate.
Применение Миграций вручную¶
Применить все ожидающие .sql файлы из /home/xc_vm/migrations/ без полного обновления системы:
Перенос данных из другой системы¶
Перенести данные из промежуточной базы данных xc_vm_migrate:
Более подробную информацию смотрите в Руководстве по обновлению базы данных.
Связанные файлы¶
| Файл | Роль |
|---|---|
src/migrations/ |
Перенос файлов базы данных .sql |
src/Core/Database/MigrationRunner.php |
Выполняет отложенные миграции, записывает таблицу migrations |
src/console.php |
db:migrate / status / migrate точка входа |