druidfi/mysqldump-php

MySQL自带mysqldump命令行的PHP版本

2.0.0-beta1 2023-11-27 07:24 UTC

This package is auto-updated.

Last update: 2024-09-17 07:13:33 UTC


README

Run tests Total Downloads Monthly Downloads Daily Downloads Latest Stable Version

这是MySQL自带的mysqldump命令行的PHP版本。它可以在创建数据库备份之前与数据交互。例如,它可以修改表的内容,因此非常适合匿名化数据。

默认情况下,mysqldump-php支持备份表结构、数据本身、视图、触发器和事件。

mysqldump-php支持以下功能:

  • 以十六进制形式输出二进制大对象
  • 解析视图依赖关系(使用占位符表)
  • 与原始mysqldump输出进行比较
  • 备份存储过程(函数和过程)
  • 备份事件
  • 执行扩展插入和/或完整插入
  • 支持MySQL 5.7的虚拟列
  • 在插入时忽略,类似于REPLACE,但在存在重复键时忽略错误
  • 在导出时动态修改数据库中的数据,使用钩子
  • 可以直接通过压缩流包装器(GZIPSTREAM)将数据保存到Google Cloud存储

要求

安装

使用 Composer 安装

composer require druidfi/mysqldump-php

入门指南

<?php

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

有关一些示例以及mysqldump与mysqldump-php导出之间的比较,请参阅ifsnop/mysqldump-php Wiki

导出时更改值

您可以为导出期间要转换的值注册一个可调用的函数。此用例的一个示例是从数据库备份中删除敏感数据。

$dumper = new \Druidfi\Mysqldump\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 \Druidfi\Mysqldump\Mysqldump('mysql:host=localhost;dbname=testdb', 'username', 'password');

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

特定于表的导出限制

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

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

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

您还可以指定限制为一个数组,其中第一个值是行数,第二个是偏移量

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

$dumper->setTableLimits([
    'users' => [20, 10], //MySql query equivalent "... LIMIT 20 OFFSET 10"
]);

导出设置

可以通过Mysqldump构造函数的第四个参数从默认值更改导出设置

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

所有选项

  • include-tables
    • 仅包括这些表(表名数组),为空时包括所有表。
  • exclude-tables
    • 排除这些表(表名数组),为空时包括所有表,支持正则表达式。
  • include-views
    • 仅包括这些视图(视图名数组),为空时包括所有视图。默认情况下,所有与include-tables数组中命名的视图都包括在内。
  • if-not-exists
    • 仅当不存在同名表时才创建新表。如果表已存在,则不会抛出错误消息。
  • compress
    • 可能的值:Bzip2|Gzip|Gzipstream|None,默认为None
    • 可以使用常量指定:CompressManagerFactory::GZIPCompressManagerFactory::BZIP2CompressManagerFactory::NONE
  • reset-auto-increment
    • 从数据库定义中移除AUTO_INCREMENT选项
    • 与no-data一起使用时很有用,因此当数据库重新创建时,它将从1开始,而不是使用旧值
  • add-drop-database
    • MySQL文档5.7
  • add-drop-table
    • MySQL文档5.7
  • add-drop-triggers
    • MySQL文档5.7
  • add-locks
    • MySQL文档5.7
  • complete-insert
    • MySQL文档5.7
  • databases
    • MySQL文档5.7
  • default-character-set
    • 可能的值:utf8|utf8mb4,默认是utf8
    • utf8是兼容选项,而utf8mb4是用于完全的utf8兼容性
    • 可以使用常量指定:DumpSettings::UTF8DumpSettings::UTF8MB4
    • MySQL文档5.7
  • disable-keys
    • MySQL文档5.7
  • events
    • MySQL文档5.7
  • extended-insert
    • MySQL文档5.7
  • hex-blob
    • MySQL文档5.7
  • insert-ignore
    • MySQL文档5.7
  • lock-tables
    • MySQL文档5.7
  • net_buffer_length
    • MySQL文档5.7
  • no-autocommit
    • 禁用autocommit的选项(更快地插入,没有索引键问题)
    • MySQL文档5.7
  • no-create-info
    • MySQL文档5.7
  • no-data
    • 不为此表(表名数组)导出数据,支持正则表达式,true忽略所有表
    • MySQL文档5.7
  • routines
    • MySQL文档5.7
  • single-transaction
    • MySQL文档5.7
  • skip-comments
    • MySQL文档5.7
  • skip-dump-date
    • MySQL文档5.7
  • skip-triggers
    • MySQL文档5.7
  • skip-tz-utc
    • MySQL文档5.7
  • skip-definer
    • MySQL文档5.7
  • where
    • MySQL文档5.7

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

  • disable-foreign-keys-check
    • MySQL文档5.7

权限

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

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

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

测试

测试脚本使用所有可能的数据类型创建和填充数据库。然后使用 mysqldump-php 和 mysqldump 导出它,并比较输出。只有当输出完全相同,测试才通过。

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

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

测试的本地设置

docker compose up -d --build
docker compose exec php81 /app/tests/scripts/create_users.sh
docker compose exec php81 /app/tests/scripts/create_users.sh db2
docker compose exec php81 /app/tests/scripts/create_users.sh db3
docker compose exec -w /app/tests/scripts php74 ./test.sh
docker compose exec -w /app/tests/scripts php80 ./test.sh
docker compose exec -w /app/tests/scripts php81 ./test.sh
docker compose exec -w /app/tests/scripts php82 ./test.sh
docker compose exec -w /app/tests/scripts php74 ./test.sh db2
docker compose exec -w /app/tests/scripts php80 ./test.sh db2
docker compose exec -w /app/tests/scripts php81 ./test.sh db2
docker compose exec -w /app/tests/scripts php82 ./test.sh db2
docker compose exec -w /app/tests/scripts php74 ./test.sh db3
docker compose exec -w /app/tests/scripts php80 ./test.sh db3
docker compose exec -w /app/tests/scripts php81 ./test.sh db3
docker compose exec -w /app/tests/scripts php82 ./test.sh db3

鸣谢

是从 Diego Torres 的版本分叉的,该版本具有 2020 年的最新更新。适用于 PHP 7.3 及更早版本。 https://github.com/ifsnop/mysqldump-php

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

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

许可证

该项目是开源软件,根据 GPL 许可证 许可。