是否可以在转储期间更改行的内容?
Is it possible to change content of rows during a dump?
我想在愚蠢的过程中更改某些行的内容以进行匿名处理。 (例如:name/address/etc。)
这甚至可能吗?如果可能,有人知道如何做到这一点吗?
我要转储的数据库的简化版本:
|ID|NAME |ADDRESS |JOB |
|0 |Elizabeth |address 1 |Dentist |
|1 |Lionel |address 2 |Baker |
我想要像这样随机化一些东西:
|ID|NAME |ADDRESS |JOB |
|0 |Charles |another address 1 |Dentist |
|1 |Peter |another address 2 |Baker |
所以,基本上,我想 "randomize" 一些专栏,而其他的则保持原样。
是的,来自 mysqldump
的转储是一个普通的文本文件。存在用于修改这些文件的常规 Linux 实用程序,例如 tr
、sed
和 awk
,您可以使用您喜欢的编辑器手动编辑它。
在您的情况下,要匿名化数据,sed
应该就足够了。确定一个模式,然后用 ******
代替完全匿名。如果你想用真实的数据替换,例如John Smith,您可以使用 awk
来搜索和替换,或者用您选择的语言自己滚动。
我敢肯定,如果您提供了转储中的样本记录,并得到了预期的结果,我们或许可以提供一个完整的工作示例。
我最终通过编写一个 bash 脚本来解决这个问题,该脚本的目标是创建一个临时数据库,在上面使用转储文件,这样就可以直接使用一些基本的 SQL 请求来编辑数据.
完成此步骤后,脚本将在删除之前转储这个新数据库。
这就是我做的过程:
通过使用 gzip 压缩一点来转储实际数据库(对大型数据库非常有用):
mysqldump -h ${HOST} -u ${USER} -p${PASSWORD} | gzip >
正在创建临时数据库:
mysql -e "CREATE DATABASE IF NOT EXISTS temp" -h ${HOST} -u ${USER} -p${PASSWORD}
在新数据库上应用转储:
gunzip < | mysql -h ${HOST} -u ${USER} -p${PASSWORD} "temp"
更新新数据库(在这个例子中,我使用 soundex 来匿名化数据作为一个更简单的例子,但是你也可以通过创建另一个包含真实姓名的数据库并随机选择一些来影响真实值在其中更新这个:
mysql -e "UPDATE individu SET NAME=SOUNDEX(NAME)" "temp"
将临时数据库转储到 "real one" :
mysqldump -h ${HOST} -u ${USER} -p${PASSWORD} "temp" | gzip >
最后删除临时数据库:
mysql -e "DROP DATABASE IF EXISTS anom" -h ${HOST} -u ${USER} -p${PASSWORD} "temp"
注意:可能不是最优方案,但很符合我的预期,如果你有更好的方案,请写在下面:)
我想在愚蠢的过程中更改某些行的内容以进行匿名处理。 (例如:name/address/etc。)
这甚至可能吗?如果可能,有人知道如何做到这一点吗?
我要转储的数据库的简化版本:
|ID|NAME |ADDRESS |JOB |
|0 |Elizabeth |address 1 |Dentist |
|1 |Lionel |address 2 |Baker |
我想要像这样随机化一些东西:
|ID|NAME |ADDRESS |JOB |
|0 |Charles |another address 1 |Dentist |
|1 |Peter |another address 2 |Baker |
所以,基本上,我想 "randomize" 一些专栏,而其他的则保持原样。
是的,来自 mysqldump
的转储是一个普通的文本文件。存在用于修改这些文件的常规 Linux 实用程序,例如 tr
、sed
和 awk
,您可以使用您喜欢的编辑器手动编辑它。
在您的情况下,要匿名化数据,sed
应该就足够了。确定一个模式,然后用 ******
代替完全匿名。如果你想用真实的数据替换,例如John Smith,您可以使用 awk
来搜索和替换,或者用您选择的语言自己滚动。
我敢肯定,如果您提供了转储中的样本记录,并得到了预期的结果,我们或许可以提供一个完整的工作示例。
我最终通过编写一个 bash 脚本来解决这个问题,该脚本的目标是创建一个临时数据库,在上面使用转储文件,这样就可以直接使用一些基本的 SQL 请求来编辑数据.
完成此步骤后,脚本将在删除之前转储这个新数据库。
这就是我做的过程:
通过使用 gzip 压缩一点来转储实际数据库(对大型数据库非常有用):
mysqldump -h ${HOST} -u ${USER} -p${PASSWORD} | gzip >
正在创建临时数据库:
mysql -e "CREATE DATABASE IF NOT EXISTS temp" -h ${HOST} -u ${USER} -p${PASSWORD}
在新数据库上应用转储:
gunzip < | mysql -h ${HOST} -u ${USER} -p${PASSWORD} "temp"
更新新数据库(在这个例子中,我使用 soundex 来匿名化数据作为一个更简单的例子,但是你也可以通过创建另一个包含真实姓名的数据库并随机选择一些来影响真实值在其中更新这个:
mysql -e "UPDATE individu SET NAME=SOUNDEX(NAME)" "temp"
将临时数据库转储到 "real one" :
mysqldump -h ${HOST} -u ${USER} -p${PASSWORD} "temp" | gzip >
最后删除临时数据库:
mysql -e "DROP DATABASE IF EXISTS anom" -h ${HOST} -u ${USER} -p${PASSWORD} "temp"
注意:可能不是最优方案,但很符合我的预期,如果你有更好的方案,请写在下面:)