记武汉疫情期间的一次数据库和翻译记忆库的数据恢复 (二)

记武汉疫情期间的一次数据库和翻译记忆库的数据恢复 (二)

本文目的为未来自己或他人进行翻译记忆库数据恢复做参考,会保留技术细节,但其中涉及到很多客户的具体信息以免信息泄露尽量都已隐去, 截图部分都是在自己环境模拟的截图,不是客户真实情况截图

因为众所周知的原因,武汉地区从十二月底左右进入全面封锁状态,企业也同时停工停产,终于在全国医生护士的努力和全国人民的支持,五一前武汉各个企事业单位逐步恢复了生产,然而得知了一个不幸的消息,武汉的某单位由于疫情放假,服务器完全处于无人看管状态,复工时经检测翻译服务器Groupshare无法连接和开启,客户IT检查由于疫情期间无人看管服务器机房,发生多次空调断电,服务器过热,死机关机情况,现在服务器上的SQL Server也已经无法启动,不知道具体损坏到什么程度,向我寻求帮助。

再这样一个全民动员的大环境下我当然不能拒绝,本来我其实可以不需要管这件事情的,但是考虑到客户和企业的难处,再加上是国难的原因,我实在是不能推脱,尽我所能帮助恢复吧。

前篇地址
https://editor.csdn.net/md/?articleId=105916435

前面我完成了Groupshare系统的结构恢复,接下来从现有的数据库表中恢复数据

从translation_units_1 (数字有很多个)
中导出的CSV结构大致如下
在这里插入图片描述首先解决一些问题

  1. IT把所有translation_units_x 导出到了一个巨大的CSV中
  2. 数据结构不严谨,有的行有错乱,可能是缺列或者逗号导致两列合在了一起
  3. MS的Excel默认是ANSI处理,这种CSV必须要用UTF-8

第一个问题 数据量大,就得使用支持大文件编辑的工具,我使用Emeditor
第二个问题 就要在这种大文本编辑器中使用正则表达式处理
建立标准行规则,符合规则的行删除掉
总结剩余行不符合规则的原因
建立修复规则
在新文件中应用修复规则
重复使用标准行规则将符合规则的行删除掉
直到所有行复合标准行规则

流程大概如下:

Created with Raphaël 2.2.0开始建立标准行规则符合规则的行删除掉是否有行剩余总结剩余行不符合规则的原因建立修复规则在新文件中应用修复规则结束yesno

RAW数据的结构性修复好了接下来
参照TMX 1.4b标准(这里使用TMX因为TMX还算简单xliff标准更复杂)
https://www.gala-global.org/tmx-14b
bpteptph 的定义

bpt 表示TAG的开始 含有属性i和x

<bpt i="1" x="1"/>

ept表示TAG的结束 含有属性i 并且和前面的bpti属性值一致

<bpt i="1"/>

ph表示占位符TAG 含有属性x

<ph x="1"/>

按此规则对RAW 数据进行清理
bpt 搜索
<Tag><Type>Start</Type><Anchor>(\d+)</Anchor><AlignmentAnchor>\d+</AlignmentAnchor><TagID>.*?</TagID>.*?</Tag>
替换为
<bpt i="$1" x="$1"/>

ept 搜索
<Tag><Type>End</Type><Anchor>(\d+)</Anchor><AlignmentAnchor>\d+</AlignmentAnchor>.*?</Tag>
替换为
<ept i="$1" />

ph 搜索
<Tag><Type>Standalone</Type><Anchor>(\d+)</Anchor><AlignmentAnchor>\d+</AlignmentAnchor><TagID>.*?</TagID>.*?</Tag>
替换为
<ph x="$1" />

然后再加上句子中锁定的部分
在这里插入图片描述

<Tag><Type>LockedContent</Type><Anchor>(\d+)</Anchor><AlignmentAnchor>\d+</AlignmentAnchor><TagID>.*?</TagID><TextEquivalent>(.*?)</TextEquivalent>.*?</Tag>
替换为
<bpt i="$1" type="x - LockedContent1" x="$1" />$2<ept i=""$1""/>

最后清理掉一些无用的XML例如

<Text>   <Value>

作为TMX TUV的部分

TMX 和HTML非常类似根节点tmxheaderbody, 其中body下包含一个或多个 tu最小单元结构

<tmx>
	<header>
	...
	</header>
	<body>
		<tu></tu>
		<tu></tu>
		...
	<body>
</tmx>

参考 https://www.gala-global.org/tmx-14b#tu 定义的最小单元结构即:

<tu >
	<tuv xml:lang="pt-PT">
		<seg>Departamento de Prevenção e Fiscalização;</seg>
	</tuv>
	<tuv xml:lang="zh-CN">
		<seg>预防和稽查部;</seg>
	</tuv>
</tu>

最后关于如何将数据写出来,最开始想要设计一个或多个标记位
例如Translation_Unit_x的x发生变化就新建一个文件写出,但是时间紧任务重之前清理结构也花了不少时间和经历,因此决定直接使用StreamWriterAppend模式, 性能可能会差一些,但是我认为很多时候要寻找一种代码编写时间和性能的平衡(我遇到的很多时候都是很紧急的任务),有些时候在一个文件里上下读写操作一遍完成多个任务不如完成一个任务就序列化写入硬盘 然后再读取进行下一任务,这么做虽然性能低但是反倒不容易BUG,还好追寻和控制,现代的计算机对于我的任务基本都性能过剩,所以先不考虑性能问题

所以先把tu都写出来
然后读取文件添加文件头和header以及body结束部分

代码开源:
https://github.com/Dark-20001/GroupshareDBTM2TMX/

这样就完成了真正的翻译记忆库数据的恢复
选择一些tmx文件尤其是大文件,导入本地翻译记忆库,OK

接下来这些数据就可以导入到之前准备好的服务器了。

最后总结此次数据恢复:

  1. 数据库备份非常重要,一定要经常或建立规则自动备份 例如https://blog.csdn.net/yilianzj/article/details/46773329 规则很简单

  2. 客户IT的配合非常重要,但是客户IT是DB专业人员,可能没法完全理解和记住你给出的规则,他的执行结果也需要再次检查

  3. 面对问题是沉着冷静,指出解决方法做出计划并执行,随时更新执行进度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章