是否可以在 codeigniter 中转储具有更新内容的 mysql 数据库

Is it possible make dump of mysql database with updated content in codeigniter

我打算使用 codeigniter 编写脚本来备份 mysql 数据库。 然而,这是一个棘手的问题。 我应该将所有电子邮件转换为虚拟字母而不是真实的电子邮件信息。 例如,乔恩@gmail.com => aBdsEDd@test.com

因此,新开发者可以使用所有数据,但不能使用真实的电子邮件,因为它们用于真实的个人信息。 但我不确定是否可能。

在这里,我放弃了我的方法,但无法更改当前数据库。

$this->load->dbutil();
$this->load->helper('file');
$this->load->helper('download');

$dumpOption = array(
    'tables'        => array(),   // Array of tables to backup.
    'ignore'        => array(),                     // List of tables to omit from the backup
    'format'        => 'txt',                       // gzip, zip, txt
    'filename'      => 'mybackup.sql',              // File name - NEEDED ONLY WITH ZIP FILES
    'add_drop'      => TRUE,                        // Whether to add DROP TABLE statements to backup file
    'add_insert'    => TRUE,                        // Whether to add INSERT data to backup file
    'newline'       => "\n"                         // Newline character used in backup file
);

if(ENVIRONMENT !== 'production') {
    if ($this->dbutil->database_exists('db'))
    {
        $backup = $this->dbutil->backup($dumpOption);
        try {
            echo 'loading database .....';
            write_file('./mybackup.sql', $backup, 'w+');
            echo 'finish preparing dev data.';
        } catch(Exception $e) {
            printf('Message: ' .$e->getMessage());
        }
    } else {
        echo 'database does not exist.';
    }
}

如果可能的话,你能告诉我吗? 最重要的是转储文件应该有更新的内容,但我们不应该更改原始数据库,更改应该只在转储上。

可能吗? 非常感谢。

严格来说,答案是否定的,你不能以这种方式更改数据的内容,因为备份方法采用表列表并将它们原样转储到文件中。嗯,这正是您对备份解决方案的期望。

但是,您可以创建包含所需替换逻辑的视图。然后你可以使用备份方法来备份视图,而不是表。

否则,您需要在普通查询中编写逻辑或在 php 代码中实现并自行创建转储文件。

尝试像这样更改数据 in-flight 将是“不可取”和“不可能”的混合体。我所做的是首先将数据库克隆到暂存位置,然后 运行 PII 和其他敏感信息的数据清理脚本。然后,您可以使 that 可用于克隆到开发环境。

但是,对于可能在关系中使用的电子邮件地址之类的值或需要唯一的值,您需要格外小心,正如我们通过艰难的方式发现的那样,当您将所有电子邮件更改为 example@example.com 几乎不可能正确测试与该信息相关的任何内容。

对于这样的事情,我建议从真实的电子邮件中派生一封虚拟电子邮件,例如:

UPDATE users
SET email = CONCAT(
  SUBSTRING(MD5(email),1,16),
  '@',
  SUBSTRING(MD5(email),17,16),
  '.com'
);

结果:

foo@bar.com -> f3ada405ce890b6f@8204094deb12d8a8.com
bar@foo.com -> dc8a42aba3651b0b@1f088ef928ff3b1d.com

然而,随着您的数据库的增长,像这样的克隆变得越来越成为一个问题,特别是对于本地开发,因为数据库的大小可能只会随着时间的推移而增长。目前我们的产品数据库接近 300GB,我们的一些开发人员的机器除了满足所有其他要求外无法容纳副本。此外,克隆和清理需要 小时 ,现在每个人都处于远程状态,通过 already-constrained 链接将这些克隆提供给开发人员会带来额外的后勤问题。

最佳 解决方案,特别是对于本地开发人员,是只转储数据库的 schema 并用代表集填充它用于测试的模拟数据。对于 full-blown 测试,我们在 CI/CD 管道环境中维护 full-copy 数据库的清理版本。