在 subversion 中,如何從目前版本的主記憶體儲庫創建從儲存庫?
我有一個巨大的 subversion 儲存庫,並想創建一個從儲存庫用於實時備份。
但是,我不想將修訂歷史重播到從屬設備中,因為由於我的儲存庫的大小,這實際上需要幾天時間。我已經有了常用的基礎設施,例如鉤子腳本和兩個服務於主記憶體儲庫和即將成為從儲存庫的 Web 伺服器。
我該怎麼做呢?
Subversion 能夠支持一個或多個從屬儲存庫,您可以使用鉤子腳本進行同步,也可以使用為您執行 svnsync 的 cron 作業。當您創建一個從儲存庫時,該過程包括創建一個只有修訂版 0 的儲存庫,然後您將所有從主庫的送出重播到該從庫。根據您的頻寬和儲存庫的大小,這可能需要很長時間。
有一種更快的方法可以做到這一點。它涉及將目前主伺服器複製到新位置,然後執行一些技巧將其變成從伺服器。我將把自動或實時同步的實際實現留給你。
在這個答案中,我們假設:
- 儲存庫的名稱是“repo”
- 主伺服器可通過文件系統訪問
- 從伺服器可通過https://slave.example.org/repo訪問
我在 20+ GB 的 subversion 儲存庫中多次使用這種方法,我還通過複製以這種方式創建的從屬伺服器成功恢復了幾次損壞的主伺服器,回到主伺服器。
我們將複製 master 並將其傳輸到遠端伺服器,在您的儲存庫所在的目錄中執行以下操作:
svnadmin hotcopy repo repo_bak tar -cjf repo_bak.tar.bz repo_bak scp repo_bak.tar.bz user@slave.example.org:/path/
hotcopy 命令允許您安全地複制目前正在使用的儲存庫並使其保持一致。
在從伺服器上解壓縮 tarball 以及所有這些……
我們假設在從屬伺服器上,您正在執行一個配置為以通常方式為儲存庫提供服務的 Web 伺服器。此外,它需要鉤子腳本來阻止除同步帳戶之外的任何帳戶送出,出於顯而易見的原因,我們希望儲存庫完全相同。同樣,如何做到這一點超出了這個答案的範圍。
我們在主記憶體儲庫上執行以下所有命令。
將主記憶體儲庫綁定到從儲存庫:
svn propset svn:sync-from-url --revprop -r 0 file:///example/path/repo https://slave.example.org/repo
找出從儲存庫的修訂版,這還將為您提供下面需要的 UUID:
svn info https://slave.example.org/repo
在以下命令中使用您在上面找到的修訂版:
svn propset svn:sync-last-merged-rev --revprop -r 0 REVISION_OF_SLAVE https://slave.example.org/repo
我們需要使用上面找到的 UUID 添加到主記憶體儲庫:
svn propset svn:sync-from-uuid --revprop -r 0 UUID_OF_SLAVE https://slave.example.com/repo
如果一切順利,您現在可以成功同步從站:
svnsync sync https://slave.example.org/repo