# Seafile GC
Seafile 利用存儲去重技術來減少存儲資源的利用。簡單來說,這包含如下兩層含義:
- 不同版本的文件或許會共享一些數據塊。
- 不同的資料庫也或許會共享一些數據塊。
運用這項技術之后,在你刪除一個資料庫時,會導致底層數據塊不會被立即刪除,因此 Seafile 服務器端沒用的數據塊將會增多。
通過運行**垃圾回收**程序,可以清理無用的數據塊,釋放無用數據塊所占用的存儲空間。
垃圾回收程序將會清理如下兩種無用數據塊:
1. 未被資料庫所引用的數據塊即數據塊屬于被刪除的資料庫。
1. 設置了歷史長度限制的資料庫的過期數據塊。
**如果使用社區版服務器,運行垃圾回收程序之前,請先在服務器端停掉 Seafile 程序。這是因為垃圾回收程序,會錯誤的刪除剛剛寫入 Seafile 的新的數據塊。對于專業版,3.1.11 及之后的版本,支持在線垃圾回收即如果使用 MySQL 或 PostgreSQL 數據庫,你不需要暫停 Seafile 程序來進行垃圾回收。**
### 4.1.1 及之后的版本
從社區版 4.1.1 和 專業版 4.1.0開始, 我們改善了垃圾回收的命令參數和執行結果輸出。
### Dry-run 模式
如果僅為了查看有多少垃圾可以回收而不進行刪除操作,用 dry-run 選項:
~~~
seaf-gc.sh --dry-run [repo-id1] [repo-id2] ...
~~~
運行輸出如下所示:
~~~
[03/19/15 19:41:49] seafserv-gc.c(115): GC version 1 repo My Library(ffa57d93)
[03/19/15 19:41:49] gc-core.c(394): GC started. Total block number is 265.
[03/19/15 19:41:49] gc-core.c(75): GC index size is 1024 Byte.
[03/19/15 19:41:49] gc-core.c(408): Populating index.
[03/19/15 19:41:49] gc-core.c(262): Populating index for repo ffa57d93.
[03/19/15 19:41:49] gc-core.c(308): Traversed 5 commits, 265 blocks.
[03/19/15 19:41:49] gc-core.c(440): Scanning unused blocks.
[03/19/15 19:41:49] gc-core.c(472): GC finished. 265 blocks total, about 265 reachable blocks, 0 blocks can be removed.
[03/19/15 19:41:49] seafserv-gc.c(115): GC version 1 repo aa(f3d0a8d0)
[03/19/15 19:41:49] gc-core.c(394): GC started. Total block number is 5.
[03/19/15 19:41:49] gc-core.c(75): GC index size is 1024 Byte.
[03/19/15 19:41:49] gc-core.c(408): Populating index.
[03/19/15 19:41:49] gc-core.c(262): Populating index for repo f3d0a8d0.
[03/19/15 19:41:49] gc-core.c(308): Traversed 8 commits, 5 blocks.
[03/19/15 19:41:49] gc-core.c(264): Populating index for sub-repo 9217622a.
[03/19/15 19:41:49] gc-core.c(308): Traversed 4 commits, 4 blocks.
[03/19/15 19:41:49] gc-core.c(440): Scanning unused blocks.
[03/19/15 19:41:49] gc-core.c(472): GC finished. 5 blocks total, about 9 reachable blocks, 0 blocks can be removed.
[03/19/15 19:41:49] seafserv-gc.c(115): GC version 1 repo test2(e7d26d93)
[03/19/15 19:41:49] gc-core.c(394): GC started. Total block number is 507.
[03/19/15 19:41:49] gc-core.c(75): GC index size is 1024 Byte.
[03/19/15 19:41:49] gc-core.c(408): Populating index.
[03/19/15 19:41:49] gc-core.c(262): Populating index for repo e7d26d93.
[03/19/15 19:41:49] gc-core.c(308): Traversed 577 commits, 507 blocks.
[03/19/15 19:41:49] gc-core.c(440): Scanning unused blocks.
[03/19/15 19:41:49] gc-core.c(472): GC finished. 507 blocks total, about 507 reachable blocks, 0 blocks can be removed.
[03/19/15 19:41:50] seafserv-gc.c(124): === Repos deleted by users ===
[03/19/15 19:41:50] seafserv-gc.c(145): === GC is finished ===
[03/19/15 19:41:50] Following repos have blocks to be removed:
repo-id1
repo-id2
repo-id3
~~~
如果在參數中指定資料庫 ID,則程序只檢查指定的資料庫,否則所有的資料庫將會被檢查。
在程序輸出的結尾,你會看到 "repos have blocks to be removed" 部分,這部分內容會列出含有可回收垃圾塊的資料庫的 ID,后續你可以運行程序不加 --dry-run 選項來回收這些資料庫的垃圾數據塊。
### 刪除垃圾數據塊
運行垃圾回收程序,不加 --dry-run 選項來刪除垃圾數據塊:
~~~
seaf-gc.sh [repo-id1] [repo-id2] ...
~~~
如果在參數中指定資料庫 ID, 則程序只檢查和刪除指定的資料庫。
正如前面所說,有兩種類型的垃圾數據塊可被回收,有時僅刪除第一類無用數據塊(屬于刪除的資料庫)便可達到回收的目的,這種情況下,垃圾回收程序將不會檢查未被刪除的資料庫,加入 “-r” 選項便可實現這個功能:
~~~
seaf-gc.sh -r
~~~
**Seafile 4.1.1 及之后的版本,被用戶刪除的資料庫不會直接從系統中刪除,它們會被轉移到系統管理員界面的**垃圾箱**。垃圾箱中的資料庫,只有在從垃圾箱中清除以后,它們的數據塊才可被回收。**
### 3.1.2 及之后版本
運行垃圾回收程序
~~~
./seaf-gc.sh run
~~~
程序結束之后,運行以下命令,檢查是否誤刪了還在使用的數據塊,如果誤刪,會顯示警告信息。
~~~
./seaf-gc.sh verify
~~~
可以通過 `dry-run` 選項,設置在運行垃圾回收程序前,進行完整性檢查
程序將會顯示 *所有的數據塊數量* 和 *將要被刪除的數據塊數量*
~~~
./seaf-gc.sh dry-run
~~~
如果資料庫已損壞,因為無法判斷數據塊是否還在被其他資料庫使用,所以垃圾回收程序將會停止運行。
可以通過 `force` 選項,強制刪除已損壞資料庫的數據。通過將已損壞資料庫的數據塊標記為“未使用”,來將其刪除。
~~~
./seaf-gc.sh force
~~~
### 3.1.2 及之前版本
運行垃圾回收程序
~~~
cd seafile-server-{version}/seafile
export LD_LIBRARY_PATH=./lib:${LD_LIBRARY_PATH}
./bin/seafserv-gc -c ../../ccnet -d ../../seafile-data
~~~
如果你[源碼編譯安裝 Seafile 服務器](#),僅僅運行
~~~
seafserv-gc -c ../../ccnet -d ../../seafile-data
~~~
當垃圾回收程序結束后,你也可以檢查是否一些有用的數據塊被錯誤的刪除:
~~~
seafserv-gc -c ../../ccnet -d ../../seafile-data --verify
~~~
如果一些有用的數據塊丟失,它將會打印一些警告信息。
如果你想在真正刪除一些數據塊之前,做一些常規檢查,可以使用--dry-run選項
~~~
seafserv-gc -c ../../ccnet -d ../../seafile-data --dry-run
~~~
這將會向你展示數據塊總數量和將被刪除數據塊數量。
如果在服務器端一些庫的元數據被毀壞,垃圾回收程序將會停止處理,因為它無法識別是否一個數據塊被一些毀壞的資料庫所使用。如果你不想保留毀壞庫的數據塊,可以運行垃圾回收程序并使用--ignore-errors或-i選項。
~~~
seafserv-gc -c ../../ccnet -d ../../seafile-data --ignore-errors
~~~
這將會屏蔽毀壞資料庫的數據塊為無用狀態并刪除掉它們。
- 介紹
- 概覽
- Seafile 組件
- 研發路線圖
- 常見問題解答
- 修改日志
- 我要參與
- Linux 下部署 Seafile 服務器
- 部署 Seafile 服務器(使用 SQLite)
- 部署 Seafile 服務器(使用 MySQL)
- Nginx 下配置 Seahub
- Nginx 下啟用 Https
- Apache 下配置 Seahub
- Apache 下啟用 Https
- Seafile LDAP 配置
- 開機啟動 Seafile
- 防火墻設置
- Logrotate 管理系統日志
- 使用 Memcached
- 使用 NAT
- 非根域名下部署 Seahub
- 從 SQLite 遷移至 MySQL
- 安裝常見問題
- 升級
- Windows 下部署 Seafile 服務器
- 下載安裝 Windows 版 Seafile 服務器
- 安裝 Seafile 為 Windows 服務
- 所用端口說明
- 升級
- 從 Windows 遷移到 Linux
- 垃圾回收
- 部署 Seafile 專業版服務器
- 下載安裝 Seafile 專業版服務器
- 從社區版遷移至專業版
- 升級
- Amazon S3 下安裝
- OpenStackSwift 下安裝
- Ceph 下安裝
- 配置選項
- 文件搜索說明
- 集群部署
- 集群中啟用搜索和后臺服務
- NFS 下集群安裝
- 常見問題解答
- 軟件許可協議
- 服務器個性化配置
- ccnet.conf
- seafile.conf
- seahub_settings.py
- 發送郵件提醒
- 個性化郵件提醒
- 用戶管理
- 存儲容量與文件上傳/下載大小限制
- 自定義 Web
- 管理員手冊
- 賬戶管理
- 日志
- 備份與恢復
- Seafile FSCK
- Seafile GC
- WebDAV 和 FUSE 擴展
- WebDAV 擴展
- FUSE 擴展
- 安全選項
- 安全特性
- 日志和審計
- 開發文檔
- 編譯 Seafile
- Linux
- Windows
- Max OS X
- Server
- 開發環境
- 編程規范
- Web API
- Python API
- 數據模型
- 服務器組件
- 同步算法