webfactory/slimdump

slimdump 是一个帮助您创建大型 MySQL 数据库转储的小工具。

1.16.0 2024-01-18 15:33 UTC

README

Build Status Coverage Status

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[?charset=utf8mb4]

有关更多信息,请参阅 Doctrine 文档

可选参数和命令行开关

no-progress

此选项关闭在 stderr 上打印一些进度信息。在脚本环境中很有用。

示例: slimdump --no-progress {DSN} {config-file}

buffer-size

您还可以指定缓冲区大小,这在您的 max_allowed_packet 较低时在共享环境中可能很有用。通过使用可选的 CLI 选项 buffer-size 来完成此操作。向值添加后缀(KB、MB 或 GB)以提高可读性。

示例: slimdump --buffer-size=16MB {DSN} {config-file}

single-line-insert-statements

如果您有需要导出大量行的表格,并且不打算将导出文件置于版本控制下,您可以考虑将每个INSERT INTO语句写在一行中,而不是每行一行。您可以通过使用命令行参数single-line-insert-statements来实现这一点。这可以显著提高导入速度。

示例:slimdump --single-line-insert-statements {DSN} {配置文件}

输出CSV

此选项启用CSV(逗号分隔值)输出模式。必须指定一个目录的路径,其中将创建.csv文件。文件名称根据表格命名,例如my_table.csv

CSV文件仅包含数据。它不会为视图、触发器或使用schema导出模式导出的表格创建文件。另外,对于空表格也不会创建文件。

由于此输出格式需要为不同的表格写入不同的文件,因此无法重定向stdout输出(如默认MySQL SQL模式中可以执行的操作)。

实验性功能 CSV支持是一个新的、实验性功能。输出格式可能会随时更改。

配置

配置以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" />

  <!--
    View handling:

    A configured <table> may also be a database view. A CREATE VIEW statement will be issued
    in that case, 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 'view-definers' to one of:
        - 'no-definer': Dump view creation statement but remove DEFINER=... clause
        - 'keep-definer': Keep the DEFINER=... clause
    'no-definer' is the default if the 'view-definers'  attribute is omitted.
  -->
  <table name="aggregated_data_view" dump="schema" view-definers="no-definer" />
</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 every tenth user -->
  <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 - 当应用于元素时,它将此列的值替换为静态值或由Faker生成的漂亮的占位符。例如,用静态值替换密码或用听起来真实的占位符替换个人数据(如姓名和姓氏)很有用。

通配符

当然,您可以为表名使用通配符(*代表多个字符,?代表单个字符)。

示例

<?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

  • 确保已安装 Phive
  • 运行 phive install 以安装工具,包括 Box
  • 运行 composer install --no-dev 以确保 vendor/ 文件夹是最新的
  • 运行 tools/box compile 以构建 slimdump.phar

测试

你可以通过调用 vendor/bin/phpunit 来执行 phpunit 测试。

致谢、版权和许可证

此工具由德国波恩的 webfactory GmbH 编写。我们是一家专注于 PHP(主要是 Symfony)的软件开发公司。我们是自动化、DevOps、CI 和 CD 以及开源的大粉丝。

如果你是一位寻求新挑战的开发者,我们很乐意听到你的声音!否则,如果此工具对你有用,请添加 ⭐️。

版权所有 2014-2022 webfactory GmbH,波恩。代码在 MIT 许可证下发布。