larikmc / yii2-db-backup
Low-load MySQL/MariaDB backup module for Yii2 with async web trigger and console worker.
Package info
github.com/larikmc/yii2-db-backup
Type:yii2-extension
pkg:composer/larikmc/yii2-db-backup
Requires
- php: >=7.4
- yiisoft/yii2: ^2.0.45
This package is auto-updated.
Last update: 2026-03-16 10:31:08 UTC
README
Переиспользуемый модуль бэкапа MySQL/MariaDB для Yii2:
- запуск из web (
POST /dbbackup/backup/start) - выполнение в фоне через console worker
- щадящий dump (
--single-transaction --quick --skip-lock-tables) .sql.gz, checksum, manifest, lock от параллельного запуска, ротация
Установка
Добавьте пакет в composer.json проекта (path repo или git):
{
"repositories": [
{
"type": "path",
"url": "extensions/yii2-db-backup"
}
],
"require": {
"larikmc/yii2-db-backup": "*"
}
}
Затем:
composer update larikmc/yii2-db-backup
Конфигурация
Подключите модуль в web и console приложениях под ID dbbackup.
Готовая вставка для backend/config/main.php
<?php $params = array_merge( require __DIR__ . '/../../common/config/params.php', require __DIR__ . '/../../common/config/params-local.php', require __DIR__ . '/params.php', require __DIR__ . '/params-local.php' ); $defaultDumpBinary = DIRECTORY_SEPARATOR === '\\' ? 'D:\\OpenServer646\\modules\\MariaDB-11.8\\bin\\mysqldump.exe' : ''; $dumpBinary = getenv('DBBACKUP_DUMP_BINARY') ?: $defaultDumpBinary; $config = [ // ... 'modules' => [ // ... 'dbbackup' => [ 'class' => larikmc\yii2dbbackup\Module::class, 'controllerNamespace' => 'larikmc\\yii2dbbackup\\web\\controllers', 'backupDir' => '@runtime/backups/db', 'dumpBinary' => $dumpBinary, 'retentionDays' => 14, 'minFreeSpaceGb' => 2, 'maxConcurrent' => 1, 'accessRole' => '@', 'consoleRoute' => 'dbbackup/backup/run', 'autoCreateTable' => true, ], ], 'components' => [ // ... 'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ 'db-backup/<action:\w+>' => 'dbbackup/backup/<action>', ], ], ], ]; return $config;
Готовая вставка для console/config/main.php
<?php $params = array_merge( require __DIR__ . '/../../common/config/params.php', require __DIR__ . '/../../common/config/params-local.php', require __DIR__ . '/params.php', require __DIR__ . '/params-local.php' ); $defaultDumpBinary = DIRECTORY_SEPARATOR === '\\' ? 'D:\\OpenServer646\\modules\\MariaDB-11.8\\bin\\mysqldump.exe' : ''; $dumpBinary = getenv('DBBACKUP_DUMP_BINARY') ?: $defaultDumpBinary; return [ 'id' => 'app-console', 'basePath' => dirname(__DIR__), 'bootstrap' => ['log'], 'controllerNamespace' => 'console\\controllers', 'modules' => [ 'dbbackup' => [ 'class' => larikmc\yii2dbbackup\Module::class, 'controllerNamespace' => 'larikmc\\yii2dbbackup\\console\\controllers', 'backupDir' => '@runtime/backups/db', 'dumpBinary' => $dumpBinary, 'retentionDays' => 14, 'minFreeSpaceGb' => 2, 'maxConcurrent' => 1, 'consoleRoute' => 'dbbackup/backup/run', 'autoCreateTable' => true, ], ], 'params' => $params, ];
Пример backend (web)
'modules' => [ 'dbbackup' => [ 'class' => larikmc\yii2dbbackup\Module::class, 'controllerNamespace' => 'larikmc\\yii2dbbackup\\web\\controllers', 'backupDir' => '@runtime/backups/db', 'dumpBinary' => '', // путь к mariadb-dump/mysqldump, если нужен явный 'retentionDays' => 14, 'minFreeSpaceGb' => 2, 'maxConcurrent' => 1, 'accessRole' => '@', 'consoleRoute' => 'dbbackup/backup/run', 'autoCreateTable' => true, ], ],
Пример console
'modules' => [ 'dbbackup' => [ 'class' => larikmc\yii2dbbackup\Module::class, 'controllerNamespace' => 'larikmc\\yii2dbbackup\\console\\controllers', 'backupDir' => '@runtime/backups/db', 'dumpBinary' => '', 'retentionDays' => 14, 'minFreeSpaceGb' => 2, 'maxConcurrent' => 1, 'consoleRoute' => 'dbbackup/backup/run', 'autoCreateTable' => true, ], ],
Разные dumpBinary для локалки и прода
$defaultDumpBinary = DIRECTORY_SEPARATOR === '\\' ? 'D:\\OpenServer646\\modules\\MariaDB-11.8\\bin\\mysqldump.exe' : ''; $dumpBinary = getenv('DBBACKUP_DUMP_BINARY') ?: $defaultDumpBinary;
И в модуле:
'dumpBinary' => $dumpBinary,
Хранилище (таблица backup_job)
По умолчанию таблица создается автоматически при первом запуске (autoCreateTable = true).
Если хотите управлять схемой только через миграции:
- отключите автосоздание:
'autoCreateTable' => false - примените миграцию
larikmc\yii2dbbackup\migrations\m260216_000001_create_backup_job_table
API
GET /dbbackup/backup/index— встроенная web-страница управленияPOST /dbbackup/backup/start— создать и запустить задачуGET /dbbackup/backup/status?id=...— статус одной задачиGET /dbbackup/backup/list?limit=50— список задачGET /dbbackup/backup/download?id=...— скачать.sql.gzPOST /dbbackup/backup/delete?id=...— удалить задачу и файл
index отдает HTML-страницу, download отдает файл, служебные endpoints возвращают JSON.
Ссылка в админке (готовый HTML)
Если админка одинаковая на всех проектах, можно вставить ссылку прямо в шаблон меню.
Вариант 1: простая ссылка
<a href="<?= \yii\helpers\Url::to(['/dbbackup/backup/index']) ?>">Бэкап БД</a>
Вариант 2: под ваш sidebar-стиль (полный блок с submenu)
<li class="sz-nav__item">
<a href="<?= \yii\helpers\Url::to(['/dbbackup/backup/index']) ?>" class="sz-nav__link">
<span class="material-symbols-rounded">backup</span>
<span class="sz-nav__label">Бэкап БД</span>
</a>
<ul class="sz-submenu">
<li class="sz-submenu__item"><span class="sz-submenu__title">Бэкап БД</span></li>
</ul>
</li>
Если хотите URL вида /admin/db-backup/index
Добавьте правило в urlManager backend:
'rules' => [ 'db-backup/<action:\w+>' => 'dbbackup/backup/<action>', ]
Тогда ссылка будет:
<a href="<?= \yii\helpers\Url::to(['/db-backup/index']) ?>">Бэкап БД</a>
Примечания
- Для Linux используются
nice/ionice(если доступны). - Если
gzipbinary отсутствует, включается fallback: dump в.sqlи потоковое сжатие черезzlib. - Имя файла включает домен:
example_com_YYYYmmdd_HHMMSS_jN.sql.gz. - Лог конкретной задачи пишется в
@runtime/logs/db-backup-{jobId}.log.