druidfi / mysqldump-php
MySQL自带mysqldump命令行的PHP版本
Requires
- php: ^8.1
- composer-runtime-api: ^2
- ext-pdo: *
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-17 07:13:33 UTC
README
这是MySQL自带的mysqldump命令行的PHP版本。它可以在创建数据库备份之前与数据交互。例如,它可以修改表的内容,因此非常适合匿名化数据。
默认情况下,mysqldump-php
支持备份表结构、数据本身、视图、触发器和事件。
mysqldump-php
支持以下功能:
- 以十六进制形式输出二进制大对象
- 解析视图依赖关系(使用占位符表)
- 与原始mysqldump输出进行比较
- 备份存储过程(函数和过程)
- 备份事件
- 执行扩展插入和/或完整插入
- 支持MySQL 5.7的虚拟列
- 在插入时忽略,类似于REPLACE,但在存在重复键时忽略错误
- 在导出时动态修改数据库中的数据,使用钩子
- 可以直接通过压缩流包装器(GZIPSTREAM)将数据保存到Google Cloud存储
要求
- PHP 7.4或8.x,带有PDO - 查看支持的版本
- MySQL 5.7或更高版本(兼容MariaDB)
安装
使用 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::GZIP
、CompressManagerFactory::BZIP2
或CompressManagerFactory::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::UTF8
或DumpSettings::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 许可证 许可。