因此,我在备份服务器上匿名化数据的解决方案.sql
如下,我们将 MySQL 数据库的备份存储在文件中:
创建了一个脚本,将.sql
文件从备份服务器复制到我的本地工作站,自动将其导入我的数据库服务器,直接匿名化敏感数据,将数据库导出到另一个.sql
文件,删除原始文件.sql
并删除数据库。因此我最终得到了一个匿名.sql
文件。但是,我希望通过直接重写原始.sql
文件中的值来使其更快。
您觉得呢?最简单的方法是什么?还是我的解决方案已经是最好的了?我考虑过以sed
某种方式使用命令,但我现在不知道如何告诉脚本要替换什么、在哪里替换、替换多少次以及用什么替换。:/
答案1
使用 Mysql 可以轻松地将数据导出和导入为 csv。
因此,也许可以使用循环中的简单 shell 命令来操作数据。这比解析 sql 容易得多。
就像下面这个简单的例子一样:
for row in $(cat test.csv);
col1 = (echo $row | cut -d ',' -f 1);
col2 = (echo $row | cut -d ',' -f 2);
col3 = "Value to change"
echo "$col1,$col2,$col3" >> outpu.csv
done
答案2
需要考虑的事项:
- 您“访问磁盘”的次数是多少?写入转储文件或 .csv 会因为访问磁盘而产生一些成本。有时,解决方法是将步骤“管道化”在一起。
UPDATE
到位会检查所有事务内容;这会导致额外的点击。所以,也许UPDATEing
不是最好的方法。CREATE TABLE
并DROP TABLE
需要花费一些精力,但并不像读取或写入整个表格那么多。
我会考虑以下内容(如果它适合您的情况):
CREATE DATABASE AnonDB ...;
USE AnonDB;
CREATE TABLE t1 LIKE RealDB.t1;
INSERT INTO t1
SELECT id, ok_data, Anonymizer(sensitive_data), ...
FROM RealDB.t1;
... t2 ...
etc.
笔记...
DROP RealDB
最后需要吗?- 您需要该功能
Anonymizer
。 - 一切都是手动的(转换哪个表;哪些列;等等)。
- 没有 CSV 或
sed
。
答案3
最后,您的所有答案都很好,但并没有提高性能并减少为开发人员提供匿名数据库所需的时间。首先这是我的 bash 脚本:
#!/bin/bash
if [ -z "$1" ]; then
echo ""
echo "No anonymization PHP file present."
echo "Please create first a project specific anonymization PHP file!"
echo ""
exit
fi
if [ -z "$2" ]; then
echo ""
echo "You have not specified where the backup SQL files are located"
echo "Example: /backup/daily-raid/websites/projectnumberone/sqldump/"
echo ""
exit
fi
phpconfig=$1
route=$2
file=$(ssh backup "ls -t $route | head -1 && exit")
dbname=$(echo $file | head -c -11)
dbslug=$(echo $dbname | sed -e "s/-/_/g")
createdb="create database $dbslug"
dropdb="drop table $dbslug"
scp backup:$route$file /home/sysadmin/dumps
mysql -u root -e "$dropdb"
mysql -u root -e "$createdb"
mysql -u root $dbslug < /home/sysadmin/dumps/$file
rm -rf /home/sysadmin/dumps/$file
php $phpconfig $dbslug
exit
请忽略本地数据库服务器 root 没有密码的事实。
该 PHP 文件基于这些 GitHub 项目:
只需创建一个知道哪些数据需要匿名化的 php 文件,bash 脚本就会运行它。当然,您需要在本地工作站和 MySQL 服务器上安装 PHP。