【发布时间】:2021-10-16 18:50:06
【问题描述】:
我经常需要通过删除不必要的 INSERT 语句来将巨大的 db sql 转储(超过 100gb)减少到更易于管理的文件大小。我使用以下脚本来做到这一点。 我担心我的脚本涉及对源文件进行多次迭代,这显然在计算上很昂贵。 有没有办法将我所有的 SED 语句合并为一个,这样源文件只需要处理一次,或者可以以更有效的方式处理?
sed '/INSERT INTO `attendance_log`/d' input.sql | \
sed '/INSERT INTO `analytics_models_log`/d' | \
sed '/INSERT INTO `backup_logs`/d' | \
sed '/INSERT INTO `config_log`/d' | \
sed '/INSERT INTO `course_completion_log`/d' | \
sed '/INSERT INTO `errorlog`/d' | \
sed '/INSERT INTO `log`/d' | \
sed '/INSERT INTO `logstore_standard_log`/d' | \
sed '/INSERT INTO `mnet_log`/d' | \
sed '/INSERT INTO `portfolio_log`/d' | \
sed '/INSERT INTO `portfolio_log`/d' | \
sed '/INSERT INTO `prog_completion_log`/d' | \
sed '/INSERT INTO `local_amosdatasend_log_entry`/d' | \
sed '/INSERT INTO `totara_sync_log`/d' | \
sed '/INSERT INTO `prog_messagelog`/d' | \
sed '/INSERT INTO `stats_daily`/d' | \
sed '/INSERT INTO `course_modules_completion`/d' | \
sed '/INSERT INTO `question_attempt_step_data`/d' | \
sed '/INSERT INTO `scorm_scoes_track`/d' | \
sed '/INSERT INTO `question_attempts`/d' | \
sed '/INSERT INTO `grade_grades_history`/d' | \
sed '/INSERT INTO `task_log`/d' > reduced.sql
这个想法是否朝着正确的方向发展?
cat input.sql | sed '/INSERT INTO `analytics_models_log`/d' | sed '/INSERT INTO `backup_logs`/d' | sed '/INSERT INTO `config_log`/d' | sed '/INSERT INTO `course_completion_log`/d' | sed '/INSERT INTO `errorlog`/d' | sed '/INSERT INTO `log`/d' | sed '/INSERT INTO `logstore_standard_log`/d' | sed '/INSERT INTO `mnet_log`/d' | sed '/INSERT INTO `portfolio_log`/d' | sed '/INSERT INTO `portfolio_log`/d' | sed '/INSERT INTO `prog_completion_log`/d' | sed '/INSERT INTO `local_amosdatasend_log_entry`/d' | sed '/INSERT INTO `totara_sync_log`/d' | sed '/INSERT INTO `prog_messagelog`/d' | sed '/INSERT INTO `stats_daily`/d' | sed '/INSERT INTO `course_modules_completion`/d' | sed '/INSERT INTO `question_attempt_step_data`/d' | sed '/INSERT INTO `scorm_scoes_track`/d' | sed '/INSERT INTO `question_attempts`/d' | sed '/INSERT INTO `grade_grades_history`/d' | sed '/INSERT INTO `task_log`/d' > reduced.sql
【问题讨论】:
-
我猜您已经查看了这些日志的来源并得出结论,无法将记录器配置为不将它们添加到此文件中?下一步将测试答案中提出的
sed、grep和awk解决方案,并选择最快的。我个人也会尝试用 C 编写一个专用的过滤器,以防它比这些更通用的工具更好。无论如何,如果你这样做,请回到这里分享你的观察。这很有趣,可以帮助其他人。 -
摆脱多个子进程(每个
| sed一个)肯定会有助于提高性能,即使这些子进程在源文件中单次通过;单次通过文件可以通过grep、sed -e/-e/-e、sed -f、awk和...处理?下一个问题将是维护要删除的 SQL 命令列表......脚本中的硬编码将比维护要删除的(配置/列表)文件更令人头疼;正如 Renaud Pacalet 所提到的...... 不首先生成(不需要的)INSERT INTO命令可能是一个(更好的)解决方案 -
如果日志文件中除了
INSERT INTO ...之外还有很多其他的SQL 语句,那么首先对其进行过滤以查看它是否提高了性能可能会很有趣。例如,对于sed,我可能会尝试类似/INSERT INTO / {/INSERT INTO attendance_log/d;...}。如果这些模式应该在行首匹配,我肯定会让sed知道:/^INSERT INTO / {/^INSERT INTO attendance_log/d;...}。您能否添加有关您的日志的更多信息(仅限INSERT INTO,行首...)?