是否可以在 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 数据库的清理版本。
我打算使用 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 数据库的清理版本。