記武漢疫情期間的一次數據庫和翻譯記憶庫的數據恢復 (二)
本文目的爲未來自己或他人進行翻譯記憶庫數據恢復做參考,會保留技術細節,但其中涉及到很多客戶的具體信息以免信息泄露儘量都已隱去, 截圖部分都是在自己環境模擬的截圖,不是客戶真實情況截圖
因爲衆所周知的原因,武漢地區從十二月底左右進入全面封鎖狀態,企業也同時停工停產,終於在全國醫生護士的努力和全國人民的支持,五一前武漢各個企事業單位逐步恢復了生產,然而得知了一個不幸的消息,武漢的某單位由於疫情放假,服務器完全處於無人看管狀態,復工時經檢測翻譯服務器Groupshare無法連接和開啓,客戶IT檢查由於疫情期間無人看管服務器機房,發生多次空調斷電,服務器過熱,死機關機情況,現在服務器上的SQL Server也已經無法啓動,不知道具體損壞到什麼程度,向我尋求幫助。
再這樣一個全民動員的大環境下我當然不能拒絕,本來我其實可以不需要管這件事情的,但是考慮到客戶和企業的難處,再加上是國難的原因,我實在是不能推脫,盡我所能幫助恢復吧。
前篇地址
https://editor.csdn.net/md/?articleId=105916435
前面我完成了Groupshare系統的結構恢復,接下來從現有的數據庫表中恢復數據
從translation_units_1 (數字有很多個)
中導出的CSV結構大致如下
首先解決一些問題
- IT把所有translation_units_x 導出到了一個巨大的CSV中
- 數據結構不嚴謹,有的行有錯亂,可能是缺列或者逗號導致兩列合在了一起
- MS的Excel默認是ANSI處理,這種CSV必須要用UTF-8
第一個問題 數據量大,就得使用支持大文件編輯的工具,我使用Emeditor
第二個問題 就要在這種大文本編輯器中使用正則表達式處理
建立標準行規則,符合規則的行刪除掉
總結剩餘行不符合規則的原因
建立修復規則
在新文件中應用修復規則
重複使用標準行規則將符合規則的行刪除掉
直到所有行復合標準行規則
流程大概如下:
RAW數據的結構性修復好了接下來
參照TMX 1.4b標準(這裏使用TMX因爲TMX還算簡單xliff標準更復雜)
https://www.gala-global.org/tmx-14b
中bpt
, ept
, ph
的定義
bpt
表示TAG的開始 含有屬性i和x
<bpt i="1" x="1"/>
ept
表示TAG的結束 含有屬性i 並且和前面的bpt
的i
屬性值一致
<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非常類似根節點tmx
下header
和body
, 其中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發生變化就新建一個文件寫出,但是時間緊任務重之前清理結構也花了不少時間和經歷,因此決定直接使用StreamWriter
的Append
模式, 性能可能會差一些,但是我認爲很多時候要尋找一種代碼編寫時間和性能的平衡(我遇到的很多時候都是很緊急的任務),有些時候在一個文件裏上下讀寫操作一遍完成多個任務不如完成一個任務就序列化寫入硬盤 然後再讀取進行下一任務,這麼做雖然性能低但是反倒不容易BUG,還好追尋和控制,現代的計算機對於我的任務基本都性能過剩,所以先不考慮性能問題
所以先把tu都寫出來
然後讀取文件添加文件頭和header
以及body
結束部分
代碼開源:
https://github.com/Dark-20001/GroupshareDBTM2TMX/
這樣就完成了真正的翻譯記憶庫數據的恢復
選擇一些tmx文件尤其是大文件,導入本地翻譯記憶庫,OK
接下來這些數據就可以導入到之前準備好的服務器了。
最後總結此次數據恢復:
-
數據庫備份非常重要,一定要經常或建立規則自動備份 例如https://blog.csdn.net/yilianzj/article/details/46773329 規則很簡單
-
客戶IT的配合非常重要,但是客戶IT是DB專業人員,可能沒法完全理解和記住你給出的規則,他的執行結果也需要再次檢查
-
面對問題是沉着冷靜,指出解決方法做出計劃並執行,隨時更新執行進度