artemyurov/laravel-incremental-db-sync 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

artemyurov/laravel-incremental-db-sync

Composer 安装命令:

composer require artemyurov/laravel-incremental-db-sync

包简介

Laravel package for incremental database synchronization from remote servers via SSH tunnel

README 文档

README

Laravel package for incremental PostgreSQL database synchronization from remote servers via SSH tunnel.

Supports incremental sync, full refresh (DROP + CREATE), automatic backups, foreign key dependency resolution, and self-referencing table handling.

Requirements

  • PHP 8.2+
  • Laravel 10, 11, 12, or 13
  • PostgreSQL
  • pg_dump and psql CLI tools available on the local machine
  • artemyurov/laravel-autossh-tunnel for SSH tunnel management

Installation

composer require artemyurov/laravel-incremental-db-sync --dev

Publish the configuration file:

php artisan vendor:publish --tag=db-sync-config

Configuration

The configuration file config/db-sync.php defines sync connections:

return [
    'default' => env('DB_SYNC_CONNECTION', 'production'),
    'batch_size' => env('DB_SYNC_BATCH_SIZE', 10000),

    'backup' => [
        'path' => env('DB_SYNC_BACKUP_PATH', storage_path('app/db-sync/backups')),
        'keep_last' => env('DB_SYNC_BACKUP_KEEP_LAST', 5),
    ],

    'connections' => [
        'production' => [
            'tunnel' => env('DB_SYNC_TUNNEL', 'remote_db'),
            'source' => [
                'driver' => 'pgsql',
                'database' => env('DB_SYNC_REMOTE_DATABASE'),
                'username' => env('DB_SYNC_REMOTE_USERNAME'),
                'password' => env('DB_SYNC_REMOTE_PASSWORD'),
            ],
            'target' => env('DB_SYNC_TARGET_CONNECTION', 'pgsql'),
            'excluded_tables' => [
                'telescope_entries',
                'sessions',
                'cache',
                'jobs',
            ],
        ],
    ],
];

Each connection defines:

Key Description
tunnel SSH tunnel name from config/tunnel.php (laravel-autossh-tunnel)
source Remote database credentials (driver, database, username, password)
target Local database connection name from config/database.php
excluded_tables Tables to skip during synchronization

You can define multiple connections (e.g. production, staging) and switch between them using the --sync-connection option.

Commands

db-sync:pull — Incremental Synchronization

Analyzes differences between remote and local databases, then applies only the changes (DELETE + UPSERT).

php artisan db-sync:pull

Features:

  • Compares record counts and updated_at timestamps to detect changes
  • Automatically rebuilds tables with changed structure
  • Reconciles indexes and constraints to match remote (see Index/constraint reconciliation below)
  • Resolves foreign key dependencies for correct sync order
  • CASCADE RECHECK: re-syncs child tables after parent deletions
  • Syncs views and resets sequences

Index/constraint reconciliation. pull's structure detection compares columns only, so index/constraint changes (including renames) would otherwise be invisible. Each run performs a dedicated reconciliation pass: it compares indexes and constraints of every table (by name) between remote and local and brings local in line — constraint-aware (PRIMARY KEY / UNIQUE / EXCLUSION via ALTER TABLE, plain indexes via CREATE/DROP INDEX), applying all drops before all creates so renamed objects don't collide. Excluded tables are skipped. Removed objects are reported afterwards. Note: pull never drops local-only tables (it preserves work in progress), but it does drop indexes/constraints that exist locally and not on remote — including a locally-added index from a not-yet-pushed migration. DDL is owned by migrations; this pass only keeps index/constraint metadata in sync.

Options:

Option Description
--sync-connection= Connection name from config (default: production)
--tables= Sync only specified tables (comma-separated)
--exclude= Exclude specified tables (comma-separated)
--views= Sync only specified views (comma-separated)
--include-excluded Include normally excluded tables
--analyze-only Only show analysis, don't sync
--dry-run Show plan without executing
--skip-backup Skip automatic backup
--skip-sequences Skip sequence reset
--batch-size= Records per batch (overrides config db-sync.batch_size / DB_SYNC_BATCH_SIZE, default 10000)
--memory-limit=-1 Memory limit in MB
--force Skip confirmation prompt

db-sync:clone — Full Clone

Drops all tables and recreates them from the remote server. Use this for a clean start.

php artisan db-sync:clone

Local-only tables. clone mirrors the remote schema, so tables that exist locally but not on remote (e.g. leftovers from an interrupted run, or a renamed table whose old index name lingers) must be removed first — otherwise their index and constraint names collide with recreated tables (SQLSTATE[42P07] ... already exists). Such local-only tables are listed in the plan (with row counts) alongside the tables to refresh, and are dropped as part of the single confirmation prompt (no separate question). Pass --keep-local-tables to keep them (only safe when their names don't clash with remote objects).

Options:

Option Description
--sync-connection= Connection name from config
--tables= Refresh only specified tables (comma-separated)
--exclude= Exclude specified tables (comma-separated)
--views= Refresh only specified views (comma-separated)
--include-excluded Include normally excluded tables
--dry-run Show plan without executing
--skip-views Skip view synchronization
--skip-backup Skip automatic backup
--skip-sync-data Refresh structure only, no data
--keep-local-tables Do not drop local-only tables (tables not present on remote)
--batch-size= Records per batch (overrides config db-sync.batch_size / DB_SYNC_BATCH_SIZE, default 10000)
--memory-limit=-1 Memory limit in MB
--force Skip confirmation prompt (and drop local-only tables without asking)

db-sync:restore — Restore from Backup

Restore local database from a previously created backup.

# List available backups
php artisan db-sync:restore --list

# Interactive backup selection
php artisan db-sync:restore

# Restore specific backup file
php artisan db-sync:restore backup_2025-01-15_120000.sql.gz

Options:

Option Description
--sync-connection= Connection name from config
--list Only show available backups
--force Skip confirmation prompt

How It Works

Incremental Sync (db-sync:pull)

  1. Opens SSH tunnel to the remote server
  2. Creates a local backup
  3. Analyzes each table: compares row counts, max IDs, and updated_at timestamps
  4. Detects tables with changed structure (columns added/removed/modified)
  5. Rebuilds changed tables (DROP + CREATE + import data)
  6. Reconciles indexes/constraints to match remote (constraint-aware; all drops then all creates)
  7. For unchanged structure: runs DELETE phase (removes records missing from remote), then UPSERT phase (inserts new / updates modified records)
  8. CASCADE RECHECK: if parent table had deletions, re-checks child tables
  9. Syncs views and resets auto-increment sequences

Full Clone (db-sync:clone)

  1. Opens SSH tunnel to the remote server
  2. Shows the refresh plan, including local-only tables (not on remote) to be dropped, and asks for a single confirmation
  3. Creates a local backup
  4. Drops local-only tables (skipped with --keep-local-tables)
  5. Dumps schema from remote using pg_dump
  6. Drops all local tables and recreates from dump
  7. Copies data from remote with keyset pagination (by primary key) + bulk INSERT; a failed batch falls back to row-by-row inserts. Tables without a primary key are skipped (they cannot be paginated or de-duplicated reliably) and reported at the end.
  8. Resets sequences

Foreign Key Handling

The package builds a dependency graph from foreign key constraints and uses topological sorting to determine the correct order for:

  • Inserts: parent tables first (parents-first order)
  • Deletes: child tables first (children-first order)

Self-referencing tables (e.g. categories with parent_id) are handled via recursive CTEs.

Architecture

The package uses an adapter pattern for database operations:

DatabaseAdapterInterface
└── PgsqlAdapter          # PostgreSQL implementation

Key services:

Service Responsibility
DependencyGraph FK dependency analysis, topological sorting
DataSyncer Batch INSERT/UPSERT/DELETE operations
SchemaManager Schema dump/restore, structure comparison
BackupManager Backup creation, restore, cleanup

Docker & DDEV

This package requires SSH tunnels to work. For Docker and DDEV setup (SSH agent forwarding, autossh installation), see the Docker & DDEV section in laravel-autossh-tunnel documentation.

Add postgresql-client to your Dockerfile for schema operations (pg_dump, psql).

Important: The pg_dump version must be >= the PostgreSQL server version. Debian base images ship with older versions (e.g. Bookworm includes PG 15), so you may need the official PostgreSQL APT repository:

# If the Debian pg_dump version matches your server — this is enough:
RUN apt-get update && apt-get install -y postgresql-client

# If the server is newer (e.g. PG 18 on Bookworm) — add the pgdg repository:
RUN curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc -o /usr/share/keyrings/pgdg.asc \
    && echo "deb [signed-by=/usr/share/keyrings/pgdg.asc] http://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" \
       > /etc/apt/sources.list.d/pgdg.list \
    && apt-get update && apt-get install -y --no-install-recommends postgresql-client-18

Adding Database Drivers

To support a new database (e.g. MySQL), implement DatabaseAdapterInterface and register it in BaseDbSyncCommand::resolveAdapter().

License

MIT

artemyurov/laravel-incremental-db-sync 适用场景与选型建议

artemyurov/laravel-incremental-db-sync 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 39 次下载、GitHub Stars 达 2, 最近一次更新时间为 2026 年 02 月 12 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「database」 「sync」 「postgresql」 「backup」 「laravel」 「restore」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 artemyurov/laravel-incremental-db-sync 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 artemyurov/laravel-incremental-db-sync 我们能提供哪些服务?
定制开发 / 二次开发

基于 artemyurov/laravel-incremental-db-sync 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 39
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 2
  • 点击次数: 24
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 2
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-02-12