spatie/db-dumper
PHP database dump utility supporting MySQL, MariaDB, PostgreSQL, SQLite, and MongoDB. Wraps native tools (mysqldump, mariadb-dump, pg_dump, sqlite3, mongodump) with a simple fluent API to export databases to SQL or gz files.
Installation:
composer require spatie/db-dumper
Ensure system dependencies (mysqldump, pg_dump, sqlite3, mongodump, gzip, or bzip2) are installed based on your database type.
First Use Case: Dump a MySQL database to a file:
use Spatie\DbDumper\Databases\MySql;
MySql::create()
->setDbName(env('DB_DATABASE'))
->setUserName(env('DB_USERNAME'))
->setPassword(env('DB_PASSWORD'))
->dumpToFile(storage_path('app/dump.sql'));
Spatie\DbDumper\Databases\* for your database type (e.g., MySql, PostgreSql).Spatie\DbDumper\Compressors\* for compression options.Basic Dump:
$dumper = MySql::create()
->setDbName($dbName)
->setUserName($user)
->setPassword($password)
->dumpToFile($outputPath);
Selective Dumping:
->includeTables(['users', 'products'])
->excludeTables(['logs'])
->excludeTablesData(['sessions'])
Advanced Options:
->skipAutoIncrement()
->addExtraOption('--xml')
Compression:
use Spatie\DbDumper\Compressors\GzipCompressor;
$dumper->useCompressor(new GzipCompressor())
->dumpToFile('dump.sql.gz');
.env for credentials:
->setDatabaseUrl(env('DATABASE_URL'))
// app/Console/Commands/DumpDatabase.php
public function handle() {
MySql::create()
->setDbName(config('database.connections.mysql.database'))
->setUserName(config('database.connections.mysql.username'))
->setPassword(config('database.connections.mysql.password'))
->dumpToFile(storage_path('dumps/database_' . now()->format('Y-m-d') . '.sql'));
}
app/Console/Kernel.php):
protected function schedule(Schedule $schedule) {
$schedule->command('db:dump')->daily();
}
Missing System Dependencies:
mysqldump, pg_dump, etc., are installed and in PATH. Custom paths can be set via:
->setDumpBinaryPath('/custom/path/to/mysqldump')
gzip/bzip2:
sudo apt-get install gzip bzip2 # Ubuntu/Debian
Auto-Increment Conflicts:
AUTO_INCREMENT (skipAutoIncrement()) may cause ID gaps on import. Use doNotSkipAutoIncrement() to retain values.Column Statistics Errors (MySQL < 8):
column_statistics in information_schema. Use:
->doNotUseColumnStatistics()
File Permissions:
storage/app/) is writable by the web server user.Large Dumps:
getDumpCommand() to inspect the generated CLI command:
$command = MySql::create()
->setDbName('test')
->getDumpCommand('dump.sql', 'credentials.txt');
// Outputs: mysqldump --user=... --password=... test > dump.sql
->dumpToFile('dump.sql', ['log' => 'dump.log']);
Custom Compressors:
Implement the Compressor interface for new formats:
class ZipCompressor implements Compressor {
public function useCommand(): string { return 'zip'; }
public function useExtension(): string { return 'zip'; }
}
Pre/Post-Dump Hooks: Extend the dumper class to add logic before/after dumping:
class CustomDumper extends MySql {
public function dumpToFile($path) {
// Pre-dump logic
parent::dumpToFile($path);
// Post-dump logic
}
}
Database URL Parsing:
Override parseDatabaseUrl() to support custom URL formats.
Partial Dumps:
Combine includeTables() and excludeTablesData() for schema-only or data-only dumps:
->includeTables(['users'])
->excludeTablesData(['users']) // Schema only
->doNotCreateTables() // Data only
Remote Hosts: Specify non-local hosts:
->setHost('db.example.com')
MongoDB Quirks:
MongoDB dumps use .gz by default. Ensure your MongoDB user has backup privileges.
Testing: Use SQLite for lightweight tests:
Sqlite::create()
->setDbName(storage_path('test.db'))
->dumpToFile('test_dump.sql');
How can I help you explore Laravel packages today?