spatie/db-dumper

导出数据库

3.6.0 2024-04-24 14:54 UTC

README

Latest Version on Packagist run-tests MIT Licensed Total Downloads

本仓库包含一个易于使用的类,用于使用PHP导出数据库。目前支持MySQL、PostgreSQL、SQLite和MongoDB。幕后使用 mysqldumppg_dumpsqlite3mongodump

以下是创建不同驱动程序数据库转储的简单示例

MySQL

Spatie\DbDumper\Databases\MySql::create()
    ->setDbName($databaseName)
    ->setUserName($userName)
    ->setPassword($password)
    ->dumpToFile('dump.sql');

PostgreSQL

Spatie\DbDumper\Databases\PostgreSql::create()
    ->setDbName($databaseName)
    ->setUserName($userName)
    ->setPassword($password)
    ->dumpToFile('dump.sql');

SQLite

Spatie\DbDumper\Databases\Sqlite::create()
    ->setDbName($pathToDatabaseFile)
    ->dumpToFile('dump.sql');

⚠️ 使用 includeTables 选项时,需要SQLite版本3.32.0。

MongoDB

Spatie\DbDumper\Databases\MongoDb::create()
    ->setDbName($databaseName)
    ->setUserName($userName)
    ->setPassword($password)
    ->dumpToFile('dump.gz');

支持我们

我们在创建最佳开源包上投入了大量资源。您可以通过购买我们的付费产品之一来支持我们。

我们非常感谢您从家乡寄来明信片,说明您正在使用我们哪个包。您可以在我们的联系页面上找到我们的地址。我们将所有收到的明信片发布在我们的虚拟明信片墙上

要求

导出MySQL数据库时,应安装mysqldump

导出PostgreSQL数据库时,应安装pg_dump

导出SQLite数据库时,应安装sqlite3

导出MongoDB数据库时,应安装mongodump

为了压缩转储文件,应安装gzip 和/或 bzip2

安装

您可以通过composer安装此包

composer require spatie/db-dumper

用法

这是创建MySql数据库转储的最简单方法

Spatie\DbDumper\Databases\MySql::create()
    ->setDbName($databaseName)
    ->setUserName($userName)
    ->setPassword($password)
    ->dumpToFile('dump.sql');

如果您使用的是PostgreSQL,只需使用该转储程序,大多数方法都可在MySql和PostgreSQL转储程序上找到。

Spatie\DbDumper\Databases\PostgreSql::create()
    ->setDbName($databaseName)
    ->setUserName($userName)
    ->setPassword($password)
    ->dumpToFile('dump.sql');

如果mysqldump(或pg_dump)二进制文件安装在非默认位置,您可以通过使用setDumpBinaryPath()-函数来让包知道

Spatie\DbDumper\Databases\MySql::create()
    ->setDumpBinaryPath('/custom/location')
    ->setDbName($databaseName)
    ->setUserName($userName)
    ->setPassword($password)
    ->dumpToFile('dump.sql');

如果您的应用程序已部署并且您需要更改主机(默认为127.0.0.1),您可以通过添加setHost()-函数来更改主机

Spatie\DbDumper\Databases\MySql::create()
    ->setDbName($databaseName)
    ->setUserName($userName)
    ->setPassword($password)
    ->setHost($host)
    ->dumpToFile('dump.sql');

处理转储中的 AUTO_INCREMENT 值

在创建数据库转储时,您可能需要控制 AUTO_INCREMENT 值的包含。这可能对于避免主键冲突或在不同环境之间传输数据时保持 ID 一致性至关重要。

跳过 AUTO_INCREMENT 值

要跳过转储中表的 AUTO_INCREMENT 值,请使用 skipAutoIncrement 方法。这特别有用,可以防止在将转储导入到另一个数据库时发生冲突,该数据库中可能已经存在那些特定的 AUTO_INCREMENT 值,或者当确切的值无关紧要时。

Spatie\DbDumper\Databases\MySql::create()
    ->setDbName('dbname')
    ->setUserName('username')
    ->setPassword('password')
    ->skipAutoIncrement()
    ->dumpToFile('dump.sql');

在转储中包含 AUTO_INCREMENT 值

默认情况下,AUTO_INCREMENT 值包含在转储中。但是,如果您之前使用了 skipAutoIncrement 方法并且希望确保 AUTO_INCREMENT 值包含在后续转储中,请使用 dontSkipAutoIncrement 方法显式包含它们。

Spatie\DbDumper\Databases\MySql::create()
    ->setDbName('dbname')
    ->setUserName('username')
    ->setPassword('password')
    ->dontSkipAutoIncrement()
    ->dumpToFile('dump.sql');

使用数据库 URL

在某些应用程序或环境中,数据库凭据作为URL而不是单个组件提供。在这种情况下,您可以使用 setDatabaseUrl 方法而不是单个方法。

Spatie\DbDumper\Databases\MySql::create()
    ->setDatabaseUrl($databaseUrl)
    ->dumpToFile('dump.sql');

提供URL时,包将自动解析它并将单个组件提供给适用的转储程序。

例如,如果您提供以下URL mysql://username:password@hostname:3306/dbname,导出程序将使用hostname主机,在端口3306上运行,并使用usernamepassword连接到dbname

导出特定表

使用数组

Spatie\DbDumper\Databases\MySql::create()
    ->setDbName($databaseName)
    ->setUserName($userName)
    ->setPassword($password)
    ->includeTables(['table1', 'table2', 'table3'])
    ->dumpToFile('dump.sql');

使用字符串

Spatie\DbDumper\Databases\MySql::create()
    ->setDbName($databaseName)
    ->setUserName($userName)
    ->setPassword($password)
    ->includeTables('table1, table2, table3')
    ->dumpToFile('dump.sql');

不要在MySQL服务的一些旧版本中使用column_statics表。

要使用mysqldump命令中的"--column-statistics=0"选项,可以使用doNotUseColumnStatistics()方法。

如果您已安装mysqldump 8,它默认查询information_schema数据库中的column_statics表。在MySQL(服务)的一些旧版本(如5.7)中,此表不存在。因此,在mysqldump执行过程中可能会出现异常。为了避免这种情况,您可以使用doNotUseColumnStatistics()方法。

Spatie\DbDumper\Databases\MySql::create()
    ->setDbName($databaseName)
    ->setUserName($userName)
    ->setPassword($password)
    ->doNotUseColumnStatistics()
    ->dumpToFile('dump.sql');

排除导出表

您可以通过使用数组来排除导出表

Spatie\DbDumper\Databases\MySql::create()
    ->setDbName($databaseName)
    ->setUserName($userName)
    ->setPassword($password)
    ->excludeTables(['table1', 'table2', 'table3'])
    ->dumpToFile('dump.sql');

或使用字符串

Spatie\DbDumper\Databases\MySql::create()
    ->setDbName($databaseName)
    ->setUserName($userName)
    ->setPassword($password)
    ->excludeTables('table1, table2, table3')
    ->dumpToFile('dump.sql');

不要写入创建每个导出表的CREATE TABLE语句

您可以使用doNotCreateTables防止写入创建语句。

$dumpCommand = MySql::create()
    ->setDbName('dbname')
    ->setUserName('username')
    ->setPassword('password')
    ->doNotCreateTables()
    ->getDumpCommand('dump.sql', 'credentials.txt');

不要写入行数据

您可以使用doNotDumpData防止写入行数据。

$dumpCommand = MySql::create()
    ->setDbName('dbname')
    ->setUserName('username')
    ->setPassword('password')
    ->doNotDumpData()
    ->getDumpCommand('dump.sql', 'credentials.txt');

添加额外选项

如果您想将任意选项添加到导出命令中,可以使用addExtraOption

$dumpCommand = MySql::create()
    ->setDbName('dbname')
    ->setUserName('username')
    ->setPassword('password')
    ->addExtraOption('--xml')
    ->getDumpCommand('dump.sql', 'credentials.txt');

如果您正在使用MySQL,您可以使用--databases作为额外选项来设置数据库名称。这在与--add-drop-database mysqldump选项(见mysqldump文档)一起使用时特别有用)。

$dumpCommand = MySql::create()
    ->setUserName('username')
    ->setPassword('password')
    ->addExtraOption('--databases dbname')
    ->addExtraOption('--add-drop-database')
    ->getDumpCommand('dump.sql', 'credentials.txt');

使用MySQL,您还可以使用--all-databases额外选项。当您想要备份指定MySQL连接中的所有数据库时,这很有用。

$dumpCommand = MySql::create()
    ->setUserName('username')
    ->setPassword('password')
    ->addExtraOption('--all-databases')
    ->getDumpCommand('dump.sql', 'credentials.txt');

请注意,使用->addExtraOption('--databases dbname')->addExtraOption('--all-databases')将覆盖之前->setDbName()调用设置的数据库名称。

使用压缩

如果您希望输出文件被压缩,可以使用压缩器类。

有两种内置压缩器

  • GzipCompressor - 这将使用gzip压缩您的数据库导出。在使用此功能之前,请确保您的系统已安装gzip。
  • Bzip2Compressor - 这将使用bzip2压缩您的数据库导出。在使用此功能之前,请确保您的系统已安装bzip2。
$dumpCommand = MySql::create()
    ->setDbName('dbname')
    ->setUserName('username')
    ->setPassword('password')
    ->useCompressor(new GzipCompressor()) // or `new Bzip2Compressor()`
    ->dumpToFile('dump.sql.gz');

创建自己的压缩器

您可以通过实现Compressor接口来创建自己的压缩器。下面是这个接口的示例:

namespace Spatie\DbDumper\Compressors;

interface Compressor
{
    public function useCommand(): string;

    public function useExtension(): string;
}

useCommand应该简单地返回数据库导出将被泵送的压缩命令。以下是GzipCompression的实现。

namespace Spatie\DbDumper\Compressors;

class GzipCompressor implements Compressor
{
    public function useCommand(): string
    {
        return 'gzip';
    }

    public function useExtension(): string
    {
        return 'gz';
    }
}

测试

$ composer test

变更日志

有关最近更改的更多信息,请参阅变更日志

贡献

有关详细信息,请参阅贡献指南

安全漏洞

有关如何报告安全漏洞,请参阅我们的安全策略

鸣谢

初始PostgreSQL支持由Adriano Machado提供。SQLite支持由Peter Matseykanets提供。

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件