woonoz / slimdump
slimdump 是一个帮助您创建大型 MySQL 数据库转储的小工具。修复版本
Requires
- php: >=5.3.9
- ext-simplexml: *
- doctrine/dbal: ^2.5.2
- fzaninotto/faker: ^1.6
- symfony/console: ^4.0.0 || ^3.0.0 || ^2.8.7
Requires (Dev)
- kherge/box: ^2.6
- phpunit/phpunit: ^4.8
- satooshi/php-coveralls: ^0.6.1
README
slimdump
是一个帮助您创建可配置的大型 MySQL 数据库转储的小工具。它基于一个或多个配置文件。对于您指定的每个表,它可以转储仅模式(CREATE TABLE ...
语句)、完整表数据、无 BLOB 的数据等。
为什么?
我们创建了 slimdump
,因为我们经常需要以方便且可重复的方式转储 MySQL 数据库的部分。此外,当您需要分析来自生产数据库的数据问题时,您可能只想拉取相关数据的一部分,并隐藏个人数据(例如用户名)。
mysqldump
是一个伟大的工具,在处理边缘情况和具有许多开关的情况下可能更加可靠。但没有简单的方法来创建一个简单的配置文件来描述特定的转储类型(例如,您的表的子集),并与同事分享。更不用说转储表并省略 BLOB 类型列。
安装
当 PHP 是您日常编程语言时,您可能已经安装了 Composer。然后您可以将 slimdump
作为 全局包 轻松安装。只需运行 composer global require webfactory/slimdump
。为了将其用作任何其他 Unix 命令,请确保 $COMPOSER_HOME/vendor/bin
在您的 $PATH
中。
当然,您也可以将 slimdump
添加为本地(每个项目)Composer 依赖项。
我们还在为那些不经常使用 PHP 的人提供 slimdump
的 .phar
包。使用该解决方案,您只需安装 PHP 解释器和下载单个存档文件即可使用 slimdump
。您可以帮助我们并为此打开一个拉取请求 :-)!
用法
slimdump
需要转储数据库的 DSN 和一个或多个配置文件
slimdump {DSN} {config-file} [...更多配置文件...]
slimdump
写入到标准输出。如果您想将转储写入文件,只需重定向输出即可
slimdump {DSN} {config-file} > dump.sql
如果您想使用环境变量来指定 DSN,请将第一个参数替换为 -
MYSQL_DSN={DSN} slimdump - {config file(s)}
DSN 必须采用以下格式
mysql://[user[:password]@]host[:port]/dbname
有关进一步说明,请参阅 Doctrine 文档。
您还可以指定缓冲区大小,这对于共享环境中 max_allowed_packet
较低的用户可能很有用。通过使用可选的 cli 选项 buffer-size
来完成此操作。在值后添加后缀(KB、MB 或 GB)以提高可读性。
示例: slimdump --buffer-size=16MB {DSN} {config-file}
配置
配置存储在您的文件系统中的某个位置,格式为 XML。作为好处,您可以将配置添加到您的存储库中,以便与同事共享数据库转储的快速入门。
示例
<?xml version="1.0" ?>
<slimdump>
<!-- Create a full dump (schema + data) of "some_table" -->
<table name="some_table" dump="full" />
<!-- Dump the "media" table, omit BLOB fields. -->
<table name="media" dump="noblob" />
<!-- Dump the "user" table, hide names and email addresses. -->
<table name="user" dump="full">
<column name="username" dump="masked" />
<column name="email" dump="masked" />
<column name="password" dump="replace" replacement="test" />
</table>
<!-- Dump the "document" table but do not pass the "AUTO_INCREMENT" parameter to the SQL query.
Instead start to increment from the beginning -->
<table name="document" dump="full" keep-auto-increment="false" />
<!--
Trigger handling:
By default, CREATE TRIGGER statements will be dumped for all tables, but the "DEFINER=..."
clause will be removed to make it easier to re-import the database e. g. in development
environments.
You can change this by setting 'dump-triggers' to one of:
- 'false' or 'none': Do not dump triggers at all
- 'true' or 'no-definer': Dump trigger creation statement but remove DEFINER=... clause
- 'keep-definer': Keep the DEFINER=... clause
-->
<table name="events" dump="schema" dump-triggers="false" />
</slimdump>
条件
您可能只想选择一些行。在这种情况下,您可以在表上定义一个条件。
<?xml version="1.0" ?>
<slimdump>
<!-- Dump all users whose usernames begin with foo -->
<table name="user" dump="full" condition="`username` LIKE 'foo%'" />
</slimdump>
在此示例中,仅导出以 'foo' 开头的用户名:导出大约百分比的用户的一种简单方法是
<?xml version="1.0" ?>
<slimdump>
<!-- Dump all users whose usernames begin with foo -->
<table name="user" dump="full" condition="id % 10 = 0" />
</slimdump>
这将导出 id 能被十整除的用户,例如,大约是用户行的 1/10(假设 id 是均匀分布的)。
如果您想保持引用完整性,您可能需要配置一个更复杂的条件,如下所示
<?xml version="1.0" ?>
<slimdump>
<!-- Dump all users whose usernames begin with foo -->
<table name="user" dump="full" condition="id IN (SELECT author_id FROM blog_posts UNION SELECT author_id from comments)" />
</slimdump>
在这种情况下,我们仅导出在其他表中引用的用户,例如博客文章或评论的作者。
转储模式
以下模式支持用于 dump
属性
none
- 完全不转储表。如果使用广泛通配符(见下文)并希望排除特定表,则这样做是有意义的。schema
- 仅转储表结构noblob
- 将 BLOB 字段转储为NULL
值full
- 转储整个表masked
- 用 "x" 替换所有字符。在列级别应用时最有意义,例如用于电子邮件地址或用户名。replace
- 当应用于一个
通配符
当然,您可以用于表名通配符(* 表示多个字符,? 表示单个字符)。
示例
<?xml version="1.0" ?>
<slimdump>
<!-- Default: dump all tables -->
<table name="*" dump="full" />
<!-- Dump all tables beginning with "a_" as schema -->
<table name="a_*" dump="schema" />
<!-- Dump "big_blob_table" without blobs -->
<table name="big_blob_table" dump="noblob" />
<!-- Do not dump any tables ending with "_test" -->
<table name="*_test" dump="none" />
</slimdump>
这是一个有效的配置。如果有多个指令匹配特定表名,则将使用最具体的指令。例如,如果您为 blog_* 和 blog_author 提供了定义,则后者将用于您的作者表,无论它们在配置中的顺序如何。
替换
您可能不希望从数据库中使用任何个人数据。因此,slimdump 允许您在列级别替换数据——这是一件伟大的工具,不仅用于遵守通用数据保护条例(GDPR)。
最简单的替换是静态替换
<?xml version="1.0" ?>
<slimdump>
<table name="users" dump="full">
<column name="password" dump="replace" replacement="test" />
</table>
</slimdump>
这会将所有用户的密码值替换为 "test"(明文 - 但当然您应该有某种类型的散列,对吧?)。
为了达到听起来合理的假数据,slimdump 还允许使用 基本的 Faker 格式化程序。您可以使用每个不需要参数和修饰符(如 unique
)的 Faker 格式化程序(使用对象操作符(->
)分隔修饰符,就像在 PHP 中做的那样)。这对于您的表中有一个包含个人信息的列(如电子邮件地址)的唯一约束的表非常有用。
<?xml version="1.0" ?>
<slimdump>
<table name="users" dump="full">
<column name="username" dump="replace" replacement="FAKER_word" />
<column name="password" dump="replace" replacement="test" />
<column name="firstname" dump="replace" replacement="FAKER_firstName" />
<column name="lastname" dump="replace" replacement="FAKER_lastName" />
<column name="email" dump="replace" replacement="FAKER_unique->safeEmail" />
</table>
</slimdump>
其他数据库
目前仅支持 MySQL。但请随意将其移植到您需要的数据库。
开发
构建 Phar
将 Box 下载到项目根目录
curl -LSs https://box-project.github.io/box2/installer.php | php
通过 Composer 安装依赖项
php composer.phar install
开始 Phar 构建
./box.phar build -v
作为 Phar 使用 slimdump
./slimdump.phar {DSN} {config-file}
测试
您可以通过调用 vendor/bin/phpunit
来执行 phpunit 测试。
致谢,版权和许可
此工具由位于波恩的 webfactory GmbH 开始使用 mpdude。
版权 2014-2017 webfactory GmbH,波恩。代码在 MIT 许可证 下发布。