filippoangileri/mysqldump-php

MySQL自带mysqldump命令行的PHP版本

v1.0.1 2024-07-11 09:07 UTC

This package is auto-updated.

Last update: 2024-09-11 09:29:51 UTC


README

要求 | 安装 | 入门 | API | 设置 | PDO 设置 | 待办事项 | 许可 | 鸣谢

Build Status Total Downloads Monthly Downloads Daily Downloads Scrutinizer Quality Score Latest Stable Version

这是一个MySQL自带的mysqldump命令行的PHP版本,无需依赖,输出压缩,并提供了合理的默认设置。

MySQLDump-PHP支持备份表结构、数据本身、视图、触发器和事件。

MySQLDump-PHP是唯一支持以下功能的库

  • 以十六进制形式输出二进制大对象。
  • 解析视图依赖关系(使用替代表)。
  • 输出与原始mysqldump进行比较。链接到travis-ci测试系统(从php 5.3到7.3 & hhvm进行测试)
  • 输出存储过程(函数和过程)。
  • 输出事件。
  • 执行扩展插入和/或完整插入。
  • 支持MySQL 5.7的虚拟列。
  • 在插入时忽略错误,如果存在重复键,则忽略错误。
  • 在导出时动态修改数据库中的数据,使用挂钩。
  • 可以直接保存到Google Cloud Storage,通过压缩流包装器(GZIPSTREAM)。
  • 如果没有可用的mysql可执行文件,可以从文件恢复备份。

重要

从版本2.0开始,数据库连接使用标准的DSN,详细说明见 PDO连接字符串

要求

  • PHP 5.3.0或更高版本
  • MySQL 4.1.0或更高版本
  • PDO

安装

使用 Composer

$ composer require filippoangileri/mysqldump-php

使用 Curl 始终下载并解压最新版本

$ curl --silent --location https://api.github.com/repos/ifsnop/mysqldump-php/releases | grep -i tarball_url | head -n 1 | cut -d '"' -f 4 | xargs curl --location --silent | tar xvz

入门

使用 自动加载器/Composer

<?php

use Ifsnop\Mysqldump as IMysqldump;

try {
    $dump = new IMysqldump\Mysqldump('mysql:host=localhost;dbname=testdb', 'username', 'password');
    $dump->start('storage/work/dump.sql');
} catch (\Exception $e) {
    echo 'mysqldump-php error: ' . $e->getMessage();
}

简单的PHP

<?php

    include_once(dirname(__FILE__) . '/mysqldump-php-2.0.0/src/Ifsnop/Mysqldump/Mysqldump.php');
    $dump = new Ifsnop\Mysqldump\Mysqldump('mysql:host=localhost;dbname=testdb', 'username', 'password');
    $dump->start('storage/work/dump.sql');

参考 wiki 以获取一些示例和mysqldump与mysqldump-php备份的比较。

导出时更改值

您可以注册一个可调用的函数,在导出过程中将用于转换值。一个示例用例是从数据库备份中删除敏感数据。

$dumper = new IMysqldump\Mysqldump('mysql:host=localhost;dbname=testdb', 'username', 'password');

$dumper->setTransformTableRowHook(function ($tableName, array $row) {
    if ($tableName === 'customers') {
        $row['social_security_number'] = (string) rand(1000000, 9999999);
    }

    return $row;
});

$dumper->start('storage/work/dump.sql');

获取备份信息

您可以注册一个可调用的函数,在导出过程中将用于报告进度。

$dumper->setInfoHook(function($object, $info) {
    if ($object === 'table') {
        echo $info['name'], $info['rowCount'];
    });

表特定导出条件

您可以注册针对特定表的 'where' 子句,以限制每个表的数据。这些将覆盖默认的 where 导出设置

$dumper = new IMysqldump\Mysqldump('mysql:host=localhost;dbname=testdb', 'username', 'password');

$dumper->setTableWheres(array(
    'users' => 'date_registered > NOW() - INTERVAL 3 MONTH AND deleted=0',
    'logs' => 'date_logged > NOW() - INTERVAL 1 DAY',
    'posts' => 'isLive=1'
));

表特定导出限制

您可以注册针对特定表的 'limits',以限制每个表的返回行数

$dumper = new IMysqldump\Mysqldump('mysql:host=localhost;dbname=testdb', 'username', 'password');

$dumper->setTableLimits(array(
    'users' => 300,
    'logs' => 50,
    'posts' => 10
));

构造函数和默认参数

/**
 * Constructor of Mysqldump. Note that in the case of an SQLite database
 * connection, the filename must be in the $db parameter.
 *
 * @param string $dsn        PDO DSN connection string
 * @param string $user       SQL account username
 * @param string $pass       SQL account password
 * @param array  $dumpSettings SQL database settings
 * @param array  $pdoSettings  PDO configured attributes
 */
public function __construct(
    $dsn = '',
    $user = '',
    $pass = '',
    $dumpSettings = array(),
    $pdoSettings = array()
)

$dumpSettingsDefault = array(
    'include-tables' => array(),
    'exclude-tables' => array(),
    'compress' => Mysqldump::NONE,
    'init_commands' => array(),
    'no-data' => array(),
    'if-not-exists' => false,
    'reset-auto-increment' => false,
    'add-drop-database' => false,
    'add-drop-table' => false,
    'add-drop-trigger' => true,
    'add-locks' => true,
    'complete-insert' => false,
    'databases' => false,
    'default-character-set' => Mysqldump::UTF8,
    'disable-keys' => true,
    'extended-insert' => true,
    'events' => false,
    'hex-blob' => true, /* faster than escaped content */
    'insert-ignore' => false,
    'net_buffer_length' => self::MAXLINESIZE,
    'no-autocommit' => true,
    'no-create-db' => false,
    'no-create-info' => false,
    'lock-tables' => true,
    'replace' => false,
    'routines' => false,
    'single-transaction' => true,
    'skip-triggers' => false,
    'skip-tz-utc' => false,
    'skip-comments' => false,
    'skip-dump-date' => false,
    'skip-definer' => false,
    'where' => '',
    /* deprecated */
    'disable-foreign-keys-check' => true
);

$pdoSettingsDefaults = array(
    PDO::ATTR_PERSISTENT => true,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false
);

// missing settings in constructor will be replaced by default options
$this->_pdoSettings = self::array_replace_recursive($pdoSettingsDefault, $pdoSettings);
$this->_dumpSettings = self::array_replace_recursive($dumpSettingsDefault, $dumpSettings);

导出设置

以下选项现在是默认启用的,并且无法禁用它们,因为它们应该始终使用。

PDO设置

错误

要转储数据库,您需要以下权限

  • SELECT
    • 为了转储表结构和数据。
  • SHOW VIEW
    • 如果任何数据库有视图,否则您将收到错误。
  • TRIGGER
    • 如果任何表有一个或多个触发器。
  • LOCK TABLES
    • 如果启用了“锁定表”选项。

使用 SHOW GRANTS FOR user@host; 来了解用户拥有的权限。有关更多信息,请参阅以下链接

要获取MySQL数据库架构的备份,需要哪些最小权限?

测试

当前用于测试的代码是一个丑陋的修补程序。可能还有许多更好的方式使用PHPUnit来完成,所以欢迎提交PR。测试脚本会创建并使用所有可能的数据类型填充数据库。然后它使用mysqldump-php和mysqldump导出数据库,并比较输出。只有当它们完全相同,测试才通过。在这次提交之后,一些测试开始使用phpunit执行。

如果MySQL服务器不支持某些测试,则跳过一些测试。

有几项测试仅比较原始SQL代码和mysqldump-php生成的SQL代码,因为mysqldump中不可用一些选项。

错误(来自mysqldump,而不是mysqldump-php)

这个错误报告之后,引入了一个新的错误。即使使用hex-blob选项,如果值是空的,也会附加_binary。

回滚

mysqldump-php不与php 5.2向后兼容,因为我们使用了命名空间。但是,如果需要,它可以轻易地修复。

待办事项

编写更多测试,也测试mariadb。

贡献

将所有代码格式化为PHP-FIG标准。 https://www.php-fig.org/

许可

本项目是开源软件,许可协议为GPL许可

致谢

经过8年多,原始源代码中几乎没有什么剩下,但

最初基于2009年James Elliott的脚本。 https://code.google.com/archive/p/db-mysqldump/

由Michael J. Calkins修改和扩展。 https://github.com/clouddueling

目前由Diego Torres维护、开发和改进。 https://github.com/ifsnop