:::
針對查詢「dspace」依關聯性排序顯示文章。依日期排序 顯示所有文章

DSpace新增編輯語系檔功能

布丁布丁吃布丁

DSpace新增編輯語系檔功能

image

實驗版本:DSpace 1.5

DSpace要修改語系檔的時候步驟繁雜,還要考慮編碼的轉換,十分的麻煩。以前我有寫過一個DSpace中文化專用utf-8轉碼程式,但其實那個轉換的功能很陽春、也有些缺陷,不建議再使用。我修改了一下轉碼程式,設計了更完整的編輯介面,並能夠直接在DSpace系統中使用。

我的作法是把原本DSpace那邊僅允許伺服器管理者必須手動修改設定檔的動作,改成用Java檔案管理的方式去建立、修改,跟原本DSpace設計理念有所差別,但是對於初學者來說卻是比較方便的。只是還是要手動重新啟動Tomcat,這個我之後再來寫一個網頁端程式好了。

以下是安裝步驟與使用方法介紹:


安裝檔案

請下載下列檔案,並擺到指定的位置:

  • messages-edit-jspui.zip
    [dspace-source]/dspace/modules/jspui/src/main/webapp/dspace-admin/messages-edit.jsp
    [dspace-source]/dspace/modules/jspui/src/main/webapp/dspace-admin/messages-main.jsp
  • MessagesEditServlet.java
    [dspace-source]/dspace-jspui/dspace-jspui-api/src/main/java/org/dspace/app/webui/servlet/admin/MessagesEditServlet.java
  • util.zip
    [dspace-source]/dspace-api/src/main/java/org/dspace/app/util/FileUtil.java
    [dspace-source]/dspace-api/src/main/java/org/dspace/app/util/EscapeUnescape.java
  • jquery.js (必需要用1.2.6以上版本)
    [dspace-source]/dspace/modules/jspui/src/main/webapp/extension/jquery.js

修改web.xml,增加「messages-edit」路徑

web.xml原本的位置在[dspace-source]/dspace-jspui/dspace-jspui-webapp/src/main/webapp/WEB-INF/web.xml,但是如果您修改過這個檔案了,那麼應該要另外儲存一份修改過得檔案在[dspace-source]/dspace/modules/jspui/src/main/webapp/WEB-INF/web.xml

請在最後一行結尾標籤</web-app>之前加入以下設定:

  <!-- Plugin Messages Editor  -->
  <servlet>
    <servlet-name>edit-messages</servlet-name>
    <servlet-class>org.dspace.app.webui.servlet.admin.MessagesEditServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>edit-messages</servlet-name>
    <url-pattern>/dspace-admin/messages-edit</url-pattern>
  </servlet-mapping>

然後請把web.xml儲存在[dspace-source]/dspace/modules/jspui/src/main/webapp/WEB-INF/web.xml之中。

修改navbar-admin.jsp,增加編輯語系檔的連結

navbar-admin.jsp預設位置在[dspace-source]/dspace-jspui/dspace-jspui-webapp/src/main/webapp/layout/navbar-admin.jsp,修改之後應該另存一份檔案在[dspace-source]/dspace/modules/jspui/src/main/webapp/layout/navbar-admin.jsp。

請找到以下程式碼:

我們增加一段程式碼在它

  <tr class="navigationBarItem">
    <td>
      <img alt="" src="<%= request.getContextPath() %>/image/<%= (currentPage.endsWith("/statistics") ? "arrow-highlight" : "arrow") %>.gif" width="16" height="16"/>
    </td>
    <td nowrap="nowrap" class="navigationBarItem">
      <a href="<%= request.getContextPath() %>/statistics"><fmt:message key="jsp.layout.navbar-admin.statistics"/></a>
    </td>
  </tr>

之後(不要動到原本的程式碼喔),如下:

  <tr class="navigationBarItem">
    <td>
      <img alt="" src="<%= request.getContextPath() %>/image/<%= (currentPage.endsWith("/dspace-admin/messages-edit") ? "arrow-highlight" : "arrow") %>.gif" width="16" height="16"/>
    </td>
    <td nowrap="nowrap" class="navigationBarItem">
      <a href="<%= request.getContextPath() %>/dspace-admin/messages-edit"><fmt:message key="jsp.layout.navbar-admin.editmessages"/></a>
    </td>
  </tr>

修改語系檔

修改您現有的語系檔之前,要先確認您所使用的語系檔為何。您可以在dspace.cfg裡面找到default.language設定。如果設定為default.lanuage = en_US,那麼您所使用的語系檔名為預設的「Messages.properties」,如果不是en_US而是「zh_TW」,那麼檔名應該是「Messages_zh_TW.properties」。由於我是用中文撰寫的,所以現在要加入的語系設定也是中文,故我們以「Messages_zh_TW.properties」作為範例。

語系檔會在[dspace-source]/dspace/modules/jspui/src/main/resources/Messages_zh_TW.properties,請在最後加入以下設定:

jsp.layout.navbar-admin.editmessages = \u7de8\u8f2f\u8a9e\u7cfb\u6a94

jsp.dspace-admin.messages-main.title = \u7de8\u8f2f\u8a9e\u7cfb\u6a94
jsp.dspace-admin.messages-main.heading = \u7de8\u8f2f\u8a9e\u7cfb\u6a94
jsp.dspace-admin.messages-main.submit_saved = \u5df2\u7d93\u5132\u5b58\uff01\u8acb\u91cd\u65b0\u555f\u52d5Tomcat\u7db2\u9801\u4f3a\u670d\u5668\u4ee5\u770b\u5230\u4fee\u6539\u7684\u6210\u679c\u3002
jsp.dspace-admin.messages-main.submit_cancel = \u53d6\u6d88\u7de8\u8f2f
jsp.dspace-admin.messages-main.default.language = \u76ee\u524d\u9810\u8a2d\u7684\u8a9e\u7cfb\u662f\uff1a
jsp.dspace-admin.messages-main.change-default-language = \u5982\u9700\u8981\u8b8a\u66f4\u7cfb\u7d71\u9810\u8a2d\u8a9e\u7cfb\uff0c\u8acb\u4fee\u6539dspace.cfg\u4e2d\u7684default.language\u8a2d\u5b9a\u3002
jsp.dspace-admin.messages-main.edit = \u7de8\u8f2f\u8a9e\u7cfb\u6a94
jsp.dspace-admin.messages-main.create = \u5efa\u7acb\u65b0\u7684\u8a9e\u7cfb\u6a94
jsp.dspace-admin.messages-main.create.source = \u5f9e\u4f86\u6e90\u6a94\u6848\u8907\u88fd
jsp.dspace-admin.messages-main.create.to-file-name = \u5230\u65b0\u7684\u8a9e\u7cfb\u6a94\u540d\u7a31
jsp.dspace-admin.messages-main.lang-collision = \u4e0d\u80fd\u8ddf\u73fe\u6709\u7684\u8a9e\u7cfb\u6a94\u540d\u7a31\u91cd\u8907\uff01
jsp.dspace-admin.messages-main.lang-empty = \u8a9e\u7cfb\u6a94\u540d\u7a31\u4e0d\u80fd\u662f\u7a7a\u503c\uff01
jsp.dspace-admin.messages-main.lang-active = \u73fe\u5728\u4f7f\u7528

jsp.dspace-admin.messages-edit.title = \u7de8\u8f2f\u8a9e\u7cfb\u6a94
jsp.dspace-admin.messages-edit.editing-position = \u60a8\u6b63\u5728\u7de8\u8f2f {0} \u8a9e\u7cfb\u6a94
jsp.dspace-admin.messages-edit.filter.key = \u7d22\u5f15\u540d\u7a31\u5305\u542b
jsp.dspace-admin.messages-edit.filter.or = \u6216
jsp.dspace-admin.messages-edit.filter.and = \u4e26
jsp.dspace-admin.messages-edit.filter.key = \u986f\u793a\u5167\u6587\u5305\u542b
jsp.dspace-admin.messages-edit.filter.do = \u641c\u5c0b
jsp.dspace-admin.messages-edit.filter.reset = \u986f\u793a\u5168\u90e8
jsp.dspace-admin.messages-edit.function.create = \u65b0\u589e\u9805\u76ee
jsp.dspace-admin.messages-edit.function.scroll-to-button = \u79fb\u81f3\u9801\u5c3e
jsp.dspace-admin.messages-edit.function.scroll-to-top = \u56de\u5230\u9801\u9996
jsp.dspace-admin.messages-edit.table.key = \u7d22\u5f15\u540d\u7a31
jsp.dspace-admin.messages-edit.table.value = \u986f\u793a\u5167\u6587
jsp.dspace-admin.messages-edit.js.nowLoading = \u8b80\u53d6\u4e2d\u2026\u2026\u8acb\u7a0d\u5019\u2026\u2026
jsp.dspace-admin.messages-edit.js.deleteButton = \u522a\u9664
jsp.dspace-admin.messages-edit.js.deleteConfirm = \u78ba\u5b9a\u662f\u5426\u8981\u522a\u9664\uff1f
jsp.dspace-admin.messages-edit.js.insertButton = \u63d2\u5165
jsp.dspace-admin.messages-edit.js.moveUpButton = \u2191
jsp.dspace-admin.messages-edit.js.moveDownButton = \u2193
jsp.dspace-admin.messages-edit.js.error.heading = \u767c\u751f\u932f\u8aa4
jsp.dspace-admin.messages-edit.js.error.name = \u932f\u8aa4\u540d\u7a31
jsp.dspace-admin.messages-edit.js.error.message = \u932f\u8aa4\u8a0a\u606f
jsp.dspace-admin.messages-edit.js.error.ValueEmpty = \u4e0d\u80fd\u662f\u7a7a\u767d\uff01
jsp.dspace-admin.messages-edit.js.error.WithSlash = \u4e0d\u80fd\u5305\u542b\uff1a
jsp.dspace-admin.messages-edit.js.error.WithNewLine = \u4e0d\u80fd\u63db\u884c\uff01
jsp.dspace-admin.messages-edit.js.error.CharsetError = \u4e0d\u80fd\u5305\u542b\u975e\u82f1\u6578\u5b57\u7684\u6587\u5b57
jsp.dspace-admin.messages-edit.js.save.KeyEmptyError = \u986f\u793a\u5167\u6587\u300c[0]\u300d\u7f3a\u5c11\u7d22\u5f15\u540d\u7a31\uff01
jsp.dspace-admin.messages-edit.js.save.ValueEncodeError = \u89e3\u78bc\u5230\u300c[0]\u300d\u6642\u767c\u751f\u932f\u8aa4\uff01
jsp.dspace-admin.messages-edit.js.filter.processing = \u641c\u5c0b\u4e2d\uff0c\u8acb\u7a0d\u5019\u3002
jsp.dspace-admin.messages-edit.js.sortConfirm = \u6392\u5e8f\u9700\u8981\u4e00\u6bb5\u6642\u9593\u904b\u7b97\uff0c\u800c\u4e14\u6392\u5e8f\u4e4b\u5f8c\u7684\u7d50\u679c\u7121\u6cd5\u5fa9\u539f\uff0c\u8acb\u554f\u662f\u5426\u8981\u7e7c\u7e8c\uff1f
jsp.dspace-admin.messages-edit.js.filter.not-found = \u641c\u5c0b\u6c92\u6709\u7d50\u679c\u3002
jsp.dspace-admin.messages-edit.encode-demo.heading = \u6e2c\u8a66\u8f49\u78bc\u5668
jsp.dspace-admin.messages-edit.encode-demo.text-to-dspace = \u2190
jsp.dspace-admin.messages-edit.encode-demo.dspace-to-text = \u2192

修改dspace.cfg檔案

dspace.cfg位於[dspace]/config/dspace.cfg

請加入以下設定:

#---------------------------------------------------------------#
#---------------Other Plugin Configuration----------------------#

tomcat.dir = /opt/apache-tomcat-6.0.16/webapps/jspui
dspace.source.dir = /opt/dspace-1.5.0-src-release

上面的tomcat.dir跟dspace.source.dir請更換成您實際上Tomcat伺服器當中擺放DSpace的位置,以及DSpace原始碼的位置。如果您之前照我寫的DSpace安裝法的話,那目錄位置就是這樣沒錯。

重新編譯DSpace

步驟如下:

  1. 移至DSpace原始檔目錄中的dspace目錄。注意底下的[dspace-source]要替換成您DSpace原始碼的目錄。
    [dspace@dspace ~]# cd [dspace-source]/dspace/
  2. 執行mvn package指令
    [dspace@dspace dspace]# mvn package

    如果最後出現BUILD SUCCESSFUL,表示編譯成功。
  3. 移至底下的target/dspace-{您DSpace的版本號}-build.dir/目錄。注意,底下的1.5.0要替換成您DSpace的版本號,或是查查看target砥下的目錄即可。
    [dspace@dspace dspace]# cd target/dspace-1.5.0-build.dir/
  4. 執行ant指令:
    [dspace@dspace dspace-1.5.0-build.dir]# ant -Dconfig=[dspace:]/config/dspace.cfg update
  5. 複製DSpace安裝目錄底下的資料夾到Tomcat的webapps目錄之中。注意,底下的[dspace]要替換成您DSpace的安裝目錄,[tomcat]則是要替換成您Tomcat的安裝目錄。
    [dspace@dspace dspace-1.5.0-build.dir]# cd [dspace]
    [dspace@dspace dspace]# \cp -rf [dspace]/webapps/* [tomcat-6.0.16]/webapps/
  6. 重新啟動Tomcat。
    [dspace@dspace dspace]# cd [tomcat]/bin
    [dspace@dspace bin]# shutdown.sh
    [dspace@dspace bin]# startup.sh

功能說明:首頁

要使用編輯語系檔的功能,使用者必須要是管理者權限(Administrator)登入才行,一般的使用者是沒辦法使用的。

image

  1. 從左邊的導覽列可以進入「編輯語系檔」
  2. 偵測目前使用的語系:系統會取得dspace.cfg裡面的default.language設定,這就是您目前DSpace所使用的語系。
  3. 編輯語系檔:下拉式選單可以選擇您要編輯的語系檔。針對目前使用的語系檔,系統會特別在語系檔名稱後標明「現在使用」。
  4. 建立新的語系檔:您可以選擇一個來源檔案,然後將他複製到新的語系檔當中,再進行編輯動作。

功能說明:編輯頁

image

語系檔通常會高達一千多筆資料,進入編輯頁面的時候需要花一段時間讀取,請耐心等候。

  1. 顯示您現在編輯的語系檔名稱。
  2. 搜尋語系檔功能,當您要修改特定語系設定的時候非常好用。讀取完成之後,就可以按下後面的按鈕。
  3. 測試轉碼器:類似原來DSpace中文化專用utf-8轉碼程式的功能,這邊測試的資料並不會寫入語系檔。
  4. 功能列,包括更新、新增項目(在最後面新增一筆語系設定)、移至頁尾、取消(然後返回首頁)。讀取完成之後,就可以按下更新、新增項目的按鈕。
  5. 讀取中的訊息。有時候因為資料量過大,會導致網頁像是當機一樣,請稍後。
  6. 語系編輯器:
    1. 第一欄是索引名稱,請依照DSpace的設計方式,只輸入英文字(盡量小寫)、用「.」分隔索引名稱的層次,用「-」連接多字元片語。
      如果語系檔開頭使用#,則表示是註解,供系統人員閱讀用。編輯器會自動偵測並改變表現形式,如下圖:
      image
    2. 第二欄是顯示內文,也就是真正顯示在網頁上的資料。雖然可以使用一些簡單的HTML,但是不建議用太過複雜的內容,不然很容易導致語系檔錯誤,無法讀取。
    3. 刪除:刪除此設定,無法復原。
    4. 插入:在此設定之後加入一行設定。
    5. 上移與下移。

終於寫完了。

這樣要編輯DSpace語系檔就簡單多了吧。

接下來來作一個Tomcat重新啟動的功能,省得還要到伺服器端重新啟動DSpace吧。<-- Post Catalog -->

(more...)

DSpace 1.5.1安裝法

布丁布丁吃布丁

DSpace 1.5.1安裝法

image
DSpace在1.4.2之後安裝方法有些改變,也為了補完之前那篇技術文件說明實在不是很清楚,所以我打算重新整理一下DSpace 1.5.1的安裝方法

作業系統:CentOS

本次安裝使用的是CentOS 5.2,可從義守大學的FTP下載:
感謝義守大學,每次要找這種超大型的開放原始碼作業系統,都有你們的陪伴。
至於CentOS的安裝方法,雖然說也夠簡單的了,請參考SmallKen's Blog的CentOS 5 Linux 系統安裝教學,圖文並茂十分易懂。
image
安裝時,有幾點要注意的:
  1. 我是選用圖形介面,也比較好操作。
  2. 磁碟分割方法請見下一節的說明。
  3. 選擇安裝其他套件時,記得要額外勾選安裝PostgreSQL跟Apache、PHP(方便之後安裝phpPgAdmin)喔!
  4. 開放8080連接埠
  5. 建立一個名為「dspace」帳號,或是在安裝完成之後利用useradd指令新增帳號。

CentOS磁碟分割

為了之後便於針對磁碟分割進行映像檔備份,建議把以下特別會使用到的目錄掛載點給予單獨的磁碟分割,並說明建議的分割大小:
  • /dspace:預設DSpace執行程式的安裝位置,裡面也有預設的bitstream數位檔案保存路徑(/dspace/assetstore/),會隨著保存越多檔案而越來越龐大!考慮空間的時候,除了/dspace基本安裝約需要100MB之外,還要把之後典藏的檔案也一併考慮進去,
  • /opt:DSpace的原始檔跟其他環境所需的套件都會擺在這邊,大約最少需要1GB來擺放比較穩定。
當然,如果可以的話,還是給上述的資料夾更多位置比較好。磁碟分割的意義,可以參考鳥哥的Linux私房菜當中的Linux 磁碟與檔案系統管理Linux 硬體偵測與維護(談LVM的部份)

CentOS遠端連線

安裝完CentOS之後,並設定好網路連線,你就可以用遠端操控SSH來連線到CentOS,而不需要待在本機端才能工作囉。
因為以下操作我們都是用指令列進行,並且輔以檔案的上傳,所以我在此介紹兩個好用的管理工具:
  • Pietty:可以以SSHTelnet遠端連線的方便工具,自由軟體、不需要安裝可直接執行。而且在Windows當中把檔案拖曳到連線中的Pietty視窗還可以執行上傳動作!(這好像很多人都不知道)
  • FileZilla Portable:SSH支援類似FTPSFTP檔案傳輸功能,而FileZilla則是專門負責檔案上傳、下載的傳輸工具。自由軟體,Portable版本則免安裝即可執行。

JAVA環境:Java SE Development Kit(JDK)

請以root登入,此時位置在「/root/」當中。將上面的檔案下載到CentOS主機當中,可利用wget指令下載:
[root@dspace ~]# wget http://
或是使用SFTP、Pietty的SCP功能(直接把檔案拖曳到連線中的Pietty視窗)上傳到/root目錄。
這是一個bin壓縮檔,需要執行以解壓縮。首先要利用chmod指令修改權限,再執行該檔案以解壓縮:

[root@dspace ~]# chmod 755 jdk-6u12-linux-i586-rpm.bin
[root@dspace ~]# ./jdk-6u12-linux-i586-rpm.bin

image (執行解壓縮)
image (解壓縮進行中)
image (解壓縮完畢)
解壓縮過程當中會詢問是否要解壓縮,請回答「yes」確定,解壓縮檔案之後的jdk-6u12-linux-i586.rpm會位於該帳號的家目錄中,以root帳號來說就是「/root」。
接下來執行rpm安裝
[root@dspace ~]# rpm -ivh jdk-6u12-linux-i586.rpm

image
如果安裝完成之後,可以檢查看有沒有「/usr/java/jdk1.6.0_12/」目錄,如果有此目錄表示安裝成功。可以利用cd指令來移動目錄看看:
[root@dspace ~]# cd /usr/java/jdk1.6.0_12/

DSpace安裝所需套件1:Maven (Mvn)

接下來的步驟是建立/opt目錄、改變/opt權限為755,切換到/opt目錄,在本機端下載Maven後上傳到/opt目錄,然後利用tar解壓縮Maven。
[root@dspace ~]# mkdir /opt
[root@dspace ~]# chmod 755 /opt
[root@dspace ~]# cd /opt
[root@dspace opt]# tar -zxvf apache-maven-2.0.9-bin.tar.gz

以上步驟完成之後會建立「/opt/apache-maven-2.0.9-bin/」目錄。最後還要修改/etc/profile才算安裝完成,這部份作法留到最後後面的部份再來說明。

DSpace安裝所需套件2:Ant

接下來的步驟類似上一節Maven的作法,一樣是把檔案下載之後上傳到/opt,然後解壓縮。
[root@dspace opt]# cd /opt
[root@dspace opt]# tar -zxvf apache-ant-1.7.1-bin.tar.gz
以上步驟完成之後會建立「/opt/apache-ant-1.7.1-bin/」目錄。一樣的還要修改/etc/profile才算完成。

DSpace伺服器環境:Tomcat

作法同上:
[root@dspace opt]# cd /opt
[root@dspace opt]# tar -zxvf apache-tomcat-6.0.13.tar.gz
然後修改連線編碼為「UTF-8」。
[root@get ~]# vim /opt/apache-tomcat-6.0.13/conf/server.xml

找到下面設定:
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

改為以下設定,利用vim編輯器加入紅字的「URIEncoding="UTF-8」:
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               URIEncoding="UTF-8" />

設定環境變數:/etc/profile

接下來是修改/etc/profile的環境變數,為了體貼不會使用文字編輯器vim的使用者,這節以下一步一步地說明,請照著作吧,但之後的vim編輯器就不寫這麼詳細囉:
  1. 利用vim開啟/etc/profile。如果沒有vim,那也可以用vi。
    [root@dspace opt]# vim /etc/profile
  2. 移動游標,找到「export PATH……」開頭的內文,如下:
    export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
  3. 在該行上方按「a」按鍵,此時進入編輯模式,可以自由編輯該檔案。
  4. 插入以下紅色部份的程式碼,包括在2所指的「export PATH……」後面加入其他環境變數。
    if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
        INPUTRC=/etc/inputrc
    fi
    
    JAVA_OPTS="-Xmx2048M -Xms2048M -Dfile.encoding=UTF-8"
    ANT_HOME=/opt/apache-ant-1.7.1
    JAVA_HOME=/usr/java/jdk1.6.0_12
    CATALINA_HOME=/opt/apache-tomcat-6.0.13
    CLASSPATH=$CATALINA_HOME/common/lib/servlet-api.jar
    PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$ANT_HOME/bin:$PATH:/opt/apache-maven-2.0.9/bin
    export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC ANT_HOME JAVA_HOME CATALINA_HOME CLASSPATH
    
    for i in /etc/profile.d/*.sh ; do
    image
  5. 按「Esc」鍵,結束編輯模式。
  6. 輸入「:」,跳到命令模式。
  7. 輸入「wq」然後按下「enter」鍵,表示儲存並且離開vim編輯器。
  8. 然後利用source指令重新載入/etc/profile。
    [root@dspace opt]# source /etc/profile
這樣就把JAVA環境變數、MAVEN、ANT跟Tomcat一起安裝完了。

PostgreSQL資料庫

如果照著上面CentOS安裝步驟中所說的來作,您現在的CentOS當中應該安裝了PostgreSQL。接下來的步驟則是設定PostgreSQL,以提供DSpace的順利安裝。
  1. 設定PostgreSQL的連線設定,請修改「/var/lib/pgsql/data/pg_hba.conf」
    [root@dspace opt]# vim /var/lib/pgsql/data/pg_hba.conf
    找到檔案「# Put your actual configuration here」以下的設定,把所有「ident sameuser」改成「trust」。原始的設定如下:(注意一下換行的問題)
    # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
    
    # "local" is for Unix domain socket connections only
    local   all         all                               ident sameuser
    # IPv4 local connections:
    host    all         all         127.0.0.1/32          ident sameuser
    # IPv6 local connections:
    host    all         all         ::1/128               ident sameuser
    把method(連線方式)中的「ident sameuser」改成「trust」,修改後如紅字的部份:
    # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
    
    # "local" is for Unix domain socket connections only
    local   all         all                               trust #ident sameuser
    # IPv4 local connections:
    host    all         all         127.0.0.1/32          trust #ident sameuser
    # IPv6 local connections:
    host    all         all         ::1/128               trust #ident sameuser
    然後在檔案最後插入dspace資料庫的連線設定:
    #DSpace
    host    dspace  dspace  127.0.0.1       255.255.255.255 trust
    
    image 
  2. 啟動PostgreSQL
    [root@dspace opt]# /etc/init.d/postgresql start
  3. 在PostgreSQL資料庫中新增「dspace」帳號,系統會提示你輸入dspace帳號的密碼,先假設為「dspacepassword」好了。接著建立資料庫「dspace」:
    [root@dspace opt]# createuser -U postgres -d -A -P dspace
    [root@dspace opt]# createdb -U dspace -E UNICODE dspace
  4. 利用su指令切換到postgres帳號(指CentOS的實體帳號),在PostgreSQL資料庫中新增「dspace」帳號,系統會提示你輸入dspace帳號的密碼,先假設為「dspacepassword」好了。然後輸入「exit」指令脫離su,回到root帳號底下。
    [root@dspace opt]# su postgres
    bash-3.2$ createuser -U postgres -d -A -P dspace
    bash-3.2$ exit
    image
  5. 再用su指令切換到dspace帳號,建立名為「dspace」的資料庫(你也可以改用其他資料庫名稱)。然後再用exit指令脫離su。
    [root@dspace opt]# su dspace
    [dspace@dspace opt]# createdb -U dspace -E UNICODE dspace
    
    [dspace@dspace opt]# exit
    image 
  6. 設定PostgreSQL可連線的位置,請修改「/var/lib/pgsql/data/postgresql.conf」,把「#listen_addresses = "localhost"」的註解「#」拿掉。
    [root@dspace opt]# vim /var/lib/pgsql/data/postgresql.conf
    找到以下文字
    #listen_addresses = "localhost"
    刪除開頭的注解符號「#」,改成以下文字
    listen_addresses = "localhost"

DSpace安裝前設定調整

下載後上傳到/opt目錄,然後解壓縮。
[root@dspace opt]# cd /opt
[root@dspace opt]# tar -zxvf dspace-1.5.1-src-release.tar.gz

vim開啟DSpace的設定檔「/opt/dspace-1.5.1-src-release/dspace/config/dspace.cfg」。
[root@get ~]# vim /opt/dspace-1.5.1-src-release/dspace/config/dspace.cfg

設定項目繁多,但以下幾項是必需要調整的,前面黑色的字是項目名稱(有些被註解符號「#」註解掉了,請取消註解吧),紅色的字是可以調整的值,請跟著一起設定吧
  1. 設定DSpace程式安裝位置為「/dspace」目錄
    dspace.dir = /dspace
  2. DSpace的網址,如果你的hostname是「dspace.lias.nccu.edu.tw」的話,那麼就這樣寫:
    dspace.url = http://dspace.lias.nccu.edu.tw:8080/jspui
    dspace.hostname = dspace.lias.nccu.edu.tw
  3. 設定資料庫連線位置、連接埠跟資料庫名稱:
    db.url = jdbc:postgresql://localhost:5432/dspace
  4. 設定資料庫連線的帳號與密碼,剛剛設定的帳號為「dspace」,密碼假設為「dspacepassword」好了:
    db.username = dspace
    db.password = dspacepassword
  5. 設定mail server(郵件伺服器)的位置,不然沒辦法送出註冊信:
    mail.server=localhost
  6. 設定handle前置代號為你自己單位的代號,這會影響到DSpace每一頁的網址,預設是「123456789」,你可以改成任何你自己想要的英文或數字代號,例如「dspace」的話就是:
    # CNRI Handle prefix
    handle.prefix = dspace
  7. 設定語言選項為「zh_TW」(繁體中文):
    default.locale = zh_TW
    webui.supported.locales = zh_TW, en  #這行要自己加上去
    default.language = zh_TW
最後建立DSpace程式安裝位置「/dspace」目錄,然後設定擁有者為「dspace」。
[root@dspace opt]# mkdir /dspace
[root@dspace opt]# chown dspace:dspace /dspace

DSpace安裝步驟

Step 1. 利用maven建立檔案:移動到DSpace原始程式目錄底下的「dspace」目錄,執行「mvn package」編譯DSpace原始程式。第一次執行「mvn package」指令的時候,會從網路上下載很多需要的元件,大約需要30分鐘才能完成編譯。
[root@dspace ~]# cd /opt/dspace-1.5.1-src-release/dspace/

[root@dspace dspace]# mvn package
image (第一次執行時需要下載很多檔案)

Step 2. 用ant來部屬:接著移動到DSpace原始程式目錄底下的dspace當中的target當中的dspace-1.5.1-build.dir目錄,並執行「ant fresh_install」。這個步驟會把編譯好的檔案移到安裝目錄「/dspace」底下。
[root@dspace ~]# cd /opt/dspace-1.5.1-src-release/dspace/target/dspace-1.5.1-build.dir/
[root@dspace dspace-1.5.1-build.dir]# ant fresh_install

Step 3. 移動JSP網頁檔:複製DSpace安裝目錄裡面的「webapps/jspui」到Tomcat裡面:
[root@dspace ~]# \cp -rf /dspace/webapps/jspui /opt/apache-tomcat-6.0.13/webapps/

Step 4. 建立DSpace管理者帳號:執行DSpace中的「create-administrator」功能,建立登入DSpace系統的帳號,DSpace會要求你輸入e-mail、first name、last name跟password 。
[root@dspace ~]#  /dspace/bin/create-administrator

Step 5. 啟動Tomcat服務
[root@get ~]# /opt/apache-tomcat-6.0.13/bin/startup.sh

以上工作做完之後,就可以用瀏覽器連到DSpace啦,網址是如之前設定的「http://dspace.lias.nccu.edu.tw:8080/jspui」或是「http://localhost:8080/jspui」(如果你是在本機端,那就可以如此查看),如果順利地顯示了DSpace的畫面,那麼就是安裝成功囉。(如下圖)
image

其他功能排程執行

DSpace有些功能是需要定期去執行,才能夠順利運作的。包括搜尋引擎的索引、上傳圖片的縮圖、站內寄信、計算資料總量、清理資料庫等等工作。
在CentOS裡面,請以root或dspace帳號(如果你的dspace帳號能夠執行/dspace裡面的資料的話)執行排程指令
crontab -e

然後插入以下敘述,我附上翻譯的說明:
#時間與指令說明
#分 時 月 日 周 要執行的指令
# 每天早上01:00送出訂閱的e-mail
0 1 * * * /dspace/bin/sub-daily
# 每天早上02:00執行縮圖程式(media filter)
0 2 * * * /dspace/bin/filter-media
# 每天早上03:00確認資料總量
0 3 * * * /dspace/bin/checker -lp
# 每天早上04:00把結果寄給系統管理者
0 4 * * * /dspace/bin/dsrun org.dspace.checker.DailyReportEmailer -c

# 每天早上04:20清理資料庫(這是PostgreSQL的指令)
20 4 * * * vacuumdb --analyze dspace > /dev/null 2>&1

# 每天早上01:00執行統計運算,每天早上02:00產生統計報表
0 1 * * * /dspace/bin/stat-general
0 1 * * * /dspace/bin/stat-monthly
0 2 * * * /dspace/bin/stat-report-general
0 2 * * * /dspace/bin/stat-report-monthly
image 


但是光是安裝完成、可以運作,其實還是不夠的,你還要定期排程執行備份工作,並且有要有還原的機制。
上面的步驟我也自己做了一遍,應該都沒錯了。這篇已經寫得夠長了,有空的話我們再來慢慢聊吧。 (more...)

談DSpace 1.5.1備份機制

布丁布丁吃布丁

談DSpace 1.5.1備份機制

繼前一篇「DSpace 1.5.1安裝法」之後,今天我們來談談DSpace的備份機制,其實1.4.2或1.5.1都可以適用,因為基本架構並沒有差別太多,但本篇則是以1.5.1為主要適用對象。

要備份,就要先知道你要備份什麼東西。DSpace這個系統又區分成很多個部份,重要性不一、檔案大小也都不一定。我建議將備份機制分成這四個部份來看:

  1. DSpace原始程式的備份與還原
  2. DSpace安裝程式(排除掉assetstore)的備份與還原
  3. DSpace安裝程式中的assetstore的備份與還原
  4. DSpace資料庫的備份與還原

以下一一說明他們的功能、位置、備份與還原機制。由於大部分指令都相同,我只會在「DSpace原始程式備份與還原」有比較詳細的說明,其他的部份則挑重點說明而已。

為了方便大家安裝、使用,我先在開頭增加「快速安裝」小節,需要詳細的說明,再看看後面的小節吧。


快速安裝

  1. 下載備份與還原的腳本程式
    SkyDrive空間,zip壓縮檔,6.7KBhttp://0rz.tw/bdpr0
  2. 你可以利用Pietty或SFTP的軟體(如FileZilla)把上面下載的檔案上傳到/root/資料夾當中。
  3. 接下來解壓縮指令為unzip,然後使用chmod將權限改成700,作法大致如下:
    [root@dspace ~]# ls
    DSpace_backup_scripts.zip
    [root@dspace ~]# unzip DSpace_backup_scripts.zip
    Archive:  DSpace_backup_scripts.zip
      inflating: backup_dspace-assetstore.sh
      inflating: backup_dspace-database.sh
      inflating: backup_dspace-src.sh
      inflating: backup_dspace.sh
      inflating: backup_search.sh
      inflating: restore_dspace-database.sh
    [root@dspace ~]# chmod 700 *.sh
    [root@dspace ~]# ll
    總計 60
    -rwx------ 1 root root 2135  3月 19  2009 backup_dspace-assetstore.sh
    -rwx------ 1 root root 1727  3月 19  2009 backup_dspace-database.sh
    -rwx------ 1 root root 2139  3月 19  2009 backup_dspace.sh
    -rwx------ 1 root root 2174  3月 19  2009 backup_dspace-src.sh
    -rwx------ 1 root root 2288  3月 20  2009 backup_search.sh
    -rw-r--r-- 1 root root 7074  3月 19 15:53 DSpace_backup_scripts.zip
    -rwx------ 1 root root 3603  3月 19  2009 restore_dspace-database.sh
  4. 共有六個檔案,功能簡述如下:
    1. backup_dspace-src:備份DSpace原始程式,預設將/opt/dspace-1.5.1-src-release備份到/opt/backup/dspace-src當中
    2. backup_dspace.sh:備份DSpace安裝檔,但排除裡面的assetstore資料夾。預設將/dspace備份到/opt/backup/dspace當中
    3. backup_dspace-assetstore.sh:備份DSpace安裝檔當中的assetstore資料夾。預設將/dspace/assetstore備份到/opt/backup/dspace-assetstore當中
    4. backup_search.sh:尋找備份檔當中指定的檔案,以便於還原
    5. backup_dspace-database.sh:備份DSpace在PostgreSQL資料庫當中的資料。預設備份到/opt/backup/dspace-database當中
    6. restore_dspace-database.sh:還原資料庫資料
  5. 設定自動排程,利用vim編輯器把排程指令加入。時間可以依照實際情況進行修改,詳情請看crontab的資料。大致作法如下:
    [root@dspace ~]$ crontab -e
    ※此時會進入vim的編輯畫面讓您編輯工作!注意到,每項工作都是一行。 
    #DSpace自動備份指令,請插入在文件最後
    #每週一早上3點,執行DSpace原始程式備份
    0 3  *  *  1 /root/backup_dspace-src.sh
    #每週一早上3點30分,執行DSpace安裝程式備份
    30 3  *  *  1 /root/backup_dspace.sh
    #每週一早上4點,執行DSpace的assetstore資料備份
    0 4  *  *  1 /root/backup_dspace-assetstore.sh
    #每週一早上2點30分,執行DSpace原始程式備份
    30 2  *  *  1 /root/backup_dspace-database.sh
    #分 時 日 月 週 |<========指令========>|
  6. 設定PostgreSQL資料自動認證,注意底下設定的資料需要依據你實際的情況自行修改
    [root@dspace /]# vim ~/.pgpass
    ※請用vim編輯器輸入以下資料
    個別是「資料庫位置:資料庫連接埠:資料庫名稱:使用者名稱:使用者密碼」
    localhost:5432:dspace:dspace:dspacepassword [root@dspace /]# chmod 600 ~/.pgpass
  7. 備份的資料夾,預設是在/opt/backup當中,底下依照類型區分成四個子資料夾,各子資料夾底下再依日期建立資料夾,然後底下才是實際的備份檔。四個子資料夾個別是:
    1. dspace-src:DSpace原始程式,預設來自/opt/dspace-1.5.1-src-release
    2. dspace:DSpace安裝程式,預設來自/dspace
    3. dspace-assetstore:DSpace的assetstore資料夾,預設來自/dspace/assetstore
    4. dspace-database:DSpace的資料庫資料,預設來自於PostgreSQL
  8. 要在備份檔當中搜尋特定檔案,請執行backup_search.sh:
    [root@dspace ~]# /root/backup_search.sh
  9. 要還原資料庫資料,請執行restore_dspace-database.sh:
    [root@dspace ~]# /root/restore_dspace-database.sh

DSpace原始程式備份與還原

  • 預設位置:/opt/dspace-1.5.1-src-release
  • 備份位置:/opt/backup/dspace-src/
  • 估計壓縮之後備份檔案大小估計
    完全備份檔案大小:443MB
    最小差異備份檔案大小:16K
  • 重要性:●○○○○ 大約1周備份一次
  • 備份類型:差異備份 (只有上次備份之後變更的檔案才會納入這次備份當中)
功能與重要性說明

DSpace最原始的安裝程式,通常是由「dspace-1.5.1-src-release.tar.gz 」解壓縮而來的資料夾。這是保留了DSpace系統最原始的程式碼。修改DSpace的時候,通常都會修改原始程式,然後再進行「mvn package」等指令進行編譯。在DSpace說明書裡,通常以[dspace-src]代稱。

不過通常我在修改DSpace的時候,都是在Windows環境底下利用Dreamweaver或EmEditor之類的軟體修改、儲存,然後修改完成之後再上傳到伺服器。因此即使伺服器上的原始程式不存在也無所謂,只要重新上傳即可。

另一方面,不採用「完整備份」的理由在於DSpace原始程式在執行「mvn package」編譯之後,會佔用相當大的空間。如果每次都執行完整備份,想必硬碟空間很快就會被佔滿了。故採用差異備份,只有距離上次備份之後修改的檔案才會被納入新的備份檔案當中。

備份腳本程式(script)

接下來我們說明備份的腳本程式。程式內有些設定的部份,請依照你實際的狀況進行修改。

#!/bin/bash
# File Name: backup_dspace-src.sh
# Program:
#       這隻程式將會備份DSpace原始程式
# History:
# 2009/03/18    Pudding First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

#顯示開始訊息
echo '執行DSpace原始程式備份…'

#取得今天日期,格式為「YYYYMMDD」,例如「20090318」
dt=`date +%Y%m%d`

#設定要備份的目標資料夾
target_path='/opt/dspace-1.5.1-src-release'
#設定要排除的目標資料夾(輸入「''」空值表示沒有資料要排除)
exclude_path=''
#設定備份的路徑(實際上會在該路徑底下建立以日期為名稱的資料夾,備份檔案則放在該資>料夾底下)
backup_path='/opt/backup/dspace-src'
#設定備份檔的檔案名稱
backup_filename='dspace-src-'$dt'.tar.gz'
#是否為差異備份?(是則填「true」,否則填「false」)

backup_differential="true"      #true || false
#設定擁有者的名稱
owner_name='dspace'
#設定擁有者的群組
owner_group='dspace'

#取得最新暫存檔的時間,存入變數$time
cd $backup_path
for i in *
do
         last_backup_time=$i
done
#把最新的時間存入變數$last_backup_time
#last_backup_time=$i

#在備份路徑底下建立資料夾,資料夾名稱為今天的日期
mkdir -p $backup_path/$dt

#設定備份的指令:差異更新
if [ "$backup_differential" == "true" ]; then
        cmd_newer="--newer="$last_backup_time
else
        cmd_newer=""
fi

#設定備份的指令:排除備份
if [ "$exclude_path" == "" ]; then
        cmd_exclude=""
else
        cmd_exclude="--exclude="$exclude_path
fi

#備份目標的檔案
tar -zcpvf $backup_path/$dt/$backup_filename $target_path $cmd_newer $cmd_exclude
#修改備份檔的擁有者
chown -R $owner_name:$owner_group $backup_path/$dt
#修改備份檔的權限,只有擁有者才能存取、寫入與執行,其他人則不行
chmod -R 700 $backup_path/$dt

#顯示備份結果相關訊息
echo "=========================================="
echo '備份的目標:'$target_path
echo '備份檔位置:'
du -h -s $backup_path"/"$dt"/"$backup_filename

#顯示結束訊息
echo '備份完成!'

請以root的身份,把這個腳本檔儲存在「/root/backup_dspace-src.sh 」當中,利用chmod將權限設定為700,然後試著執行看看能不能顯示:

[root@dspace ~]# vim /root/backup_dspace-src.sh
※請利用vim編輯器把上面的程式碼加入
[root@dspace ~]# chmod 700 /root/backup_dspace-src.sh
[root@dspace ~]# /root/backup_dspace-src.sh
執行DSpace原始程式備份…
※中間會顯示很多目錄,這是tar在打包與壓縮的檔案清單
==========================================
備份的目標:/opt/dspace-1.5.1-src-release
備份檔位置:
443M       /opt/backup/dspace-src/20090318/dspace-src-20090318.tar.gz
備份完成!
[root@dspace ~]# ll -h /opt/backup/dspace-src/20090318
總計 444M
-rwx------ 1 dspace dspace 443M  3月 18 10:17 dspace-1.5.1-src-release.bak.tar.gz
※如果有看到本日的備份檔案,表示備份完成!
排程自動執行備份

確認腳本程式可以執行之後,我們把這個程式排入自動排程當中。執行「crontab -e」指令,開啟自動排程的列表,並且在最後加入以下排程指令。排程當中的週一或3點都可以照你的意思變更,週的範圍為「0~7」,0或7都表示星期天;小時的範圍則是0~23。

[root@dspace ~]$ crontab -e
※此時會進入vim的編輯畫面讓您編輯工作!注意到,每項工作都是一行。
#每週一早上3點,執行DSpace原始程式備份
0 3  *  *  1 /root/backup_dspace-src.sh
#分 時 日 月 週 |<========指令========>|

如此就安裝完成啦。

備份檔的還原

差異備份雖然能夠節省空間,但缺點是檔案零碎,難以還原。舉例來說,我要備份test.txt的時候,會因為test.txt的修改時間不同,而會加入不同的備份檔當中。今天修改的檔案,只會加入明天的備份檔裡面。如果沒有再更動的話,則之後的備份檔都不會納入這個檔案。

備份時間點 test.txt修改時間 備份檔檔名 test.txt是否加入備份檔中?
3/17 3/16 …/20090317/backup.tar.gz
3/18 3/16 …/20090318/backup.tar.gz
3/19 3/19 …/20090319/backup.tar.gz
3/20 3/19 …/20090320/backup.tar.gz

.因此,還原前的第一步是找尋該檔案存放在哪個備份檔裡面,或著是說,看你要還原的時間點在何時。

我撰寫了一個查詢備份檔的程式,可以在多個備份檔當中,找到具有包含你指定檔名或路徑的備份檔。程式碼如下:

#!/bin/bash
# File Name: backup_search.sh
# Program:
#       找尋具有指定檔名的備份檔
# History:
# 2009/03/18    Pudding First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

#設定備份檔案的根目錄位置
backup_root_path_default='/opt/backup'

#提示使用者輸入根目錄位置,否則自行設定預設值
read -p "請輸入備份檔根目錄的位置(預設為$backup_root_path_default):" backup_root_path
        if [ "$backup_root_path" == "" ];then
                backup_root_path=$backup_root_path_default
        fi

#移動到備份檔案根目錄,顯示有哪些備份檔類型,然後設定其一為預設值
cd $backup_root_path
echo "以下是在備份目錄當中的備份檔類型:"
ls
for d in *dspace*
do
        backup_path_default=$d
        break
done

#提示使用者輸入
read -p "請輸入備份檔的位置(預設為/opt/backup/dspace-src):" backup_path
read -p "請輸入要查詢的檔名:" filename

如果沒有輸入檔名,則結束程式
if [ "$filename" == "" ]; then
       echo "沒有要查詢的檔案,結束程式。"
       exit 0
fi

#設定路徑預設值
if [ "$backup_path" == "" ]; then
        backup_path='/opt/backup/dspace-src'
fi

#顯示訊息
echo "搜尋開始"
echo "====================================="

#要查詢的檔案列表
folder_list=$(ls $backup_path/ | tac)
for folder in $folder_list
do
        file=$(ls $backup_path/$folder/*.tar.gz)
        for f in $file
        do
                getfile=$(tar -zt -f $f | grep $filename)

                getflag="false"
                for g in $getfile
                do
                        if [ $g != "" ]; then
                                getflag="true"
                                break
                        fi
                done
                if [ "$getflag" == "true" ]; then
                        echo "[備份檔中有目標檔案:"$f"]";
                        for g in $getfile
                        do
                                echo $g
                        done
                fi
        done
done

#顯示訊息
echo "====================================="
echo "搜尋完畢"

使用方法,請直接執行之後,程式會詢問你要查詢的備份檔路徑以及你要查詢的檔名,然後稍等一下,他就會把找到的資料回報再畫面上囉,日期最新的會優先搜尋。以查詢「dspace.cfg」為例,操作過程如下,如果已經找到你要的檔案,那麼你隨時可以按「Ctrl + c」來中斷搜尋過程。

[root@dspace ~]# /root/backup_search.sh
請輸入備份檔的位置(預設為/opt/backup/dspace-src):/opt/backup/dspace-src 
請輸入要查詢的檔名:dspace.cfg 
搜尋開始
=====================================
[備份檔中有目標檔案:/opt/backup/dspace-src/20090318/dspace-1.5.1-src-release.bak.tar.gz]
opt/dspace-1.5.1-src-release/dspace/config/dspace.cfg~
opt/dspace-1.5.1-src-release/dspace/config/dspace.cfg
opt/dspace-1.5.1-src-release/dspace/target/dspace-1.5.1-build.dir/config/dspace.cfg
opt/dspace-1.5.1-src-release/dspace/target/archive-tmp/dspace.cfg.766468355.filtered
[備份檔中有目標檔案:/opt/backup/dspace-src/20090317/dspace-1.5.1-src-release.bak.tar.gz]
opt/dspace-1.5.1-src-release/dspace/config/dspace.cfg
opt/dspace-1.5.1-src-release/dspace/target/dspace-1.5.1-build.dir/config/dspace.cfg
opt/dspace-1.5.1-src-release/dspace/target/archive-tmp/dspace.cfg.766468355.filtered
=====================================
搜尋完畢
[root@dspace ~]#

找到那些備份檔,然後你可以估算一下要還原到多久之前的檔案,並利用tar指令來解壓縮,然後用cp指令覆蓋過去。 如果不熟悉Bash指令的操作,也可以用圖形介面來操作啦。指令的操作過程大致如下:

移動到有備份檔的目錄底下 
[root@dspace ~]# cd /opt/backup/dspace-src/20090317/
以tar解壓縮,解壓縮完畢之後,在該資料夾底下會建立opt目錄,也就是存放備份檔的目錄 
[root@dspace 20090317]# tar -zxf dspace-1.5.1-src-release.bak.tar.gz
移動到備份檔案裡面 
[root@dspace 20090317]# cd opt/dspace-1.5.1-src-release/dspace/config/
利用ls指令,查看是否有「dspace.cfg」 
[root@dspace config]# ls
controlled-vocabularies  item-submission.xml
crosswalks               log4j-console.properties
dc2mods.cfg              log4j-handle-plugin.properties
default.context.xml      log4j.properties
default.license          log4j.xml
dspace.cfg               Message_zh_TW_TLH.properties
dspace.cfg~              news-side.html
dstat.cfg                news-top.html
dstat.map                news-xmlui.xml
emails                   oaicat.properties
input-forms.dtd          registries
input-forms.xml          xmlui.dtd
item-submission.dtd      xmlui.xconf
利用cp指令複製dspace.cfg到現在程式的位置底下 
[root@dspace config]# cp -r dspace.cfg /opt/dspace-1.5.1-src-release/dspace/config/
cp:是否覆寫 ‘/opt/dspace-1.5.1-src-release/dspace/config/dspace.cfg’? y
移動到剛剛的備份檔目錄當中 
[root@dspace config]# cd /opt/backup/dspace-src/20090317/
利用rm指令刪除已經使用完畢的opt目錄 
[root@dspace 20090317]# rm -rf opt

DSpace安裝程式(排除掉assetstore)的備份與還原

  • 預設位置:/dspace (排除/dspace/assetstore)
  • 備份位置:/opt/backup/dspace/
  • 估計壓縮之後備份檔案大小:
    完整備份:123M
    最小差異備份:69K
  • 重要性:●●○○○ 大約1周備份一次
  • 備份類型:差異備份 (只有上次備份之後變更的檔案才會納入這次備份當中)
功能與重要性說明

DSpace在經過mvn package與ant fresh_install等安裝步驟之後,預設會安裝到「/dspace」目錄底下,你可以在原始程式的[dspace-src]/dspace/config/dspace.cfg修改這個路徑。通常在DSpace的說明書裡面,會以[dspace]代稱。這裡的資料會影響到DSpace系統的設定與運作,特別是/dspace/config裡面的設定資料。

由於DSpace安裝程式基本上也是從原始程式編譯而來,也就是說有原始程式的話,安裝程式相對上也不需要太過重複備份。因此我們採用的是差異備份,只有距離上次備份之後變更的檔案,才會被納入這次的備份檔當中。

值得一提的是/dspace/assetstore的部份需要另外處理,因為這是DSpace中典藏的數位檔案資料預設位置,不僅重要、也會佔去許多空間,下一節會有更詳細的說明。

備份腳本程式、自動排程與還原

大致上與DSpace原始程式的備份方法差不多,但是要考慮到排除/dspace/assetstore路徑底下的資料。如果你的備份路徑有所修改的話,請依照程式中的註解來修改實際的設定:

#!/bin/bash
# File Name: backup_dspace.sh
# Program:
#       這隻程式將會備份DSpace安裝程式(排除assetstore)
# History:
# 2009/03/19    Pudding First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

#顯示開始訊息
echo '執行DSpace安裝程式備份(排除assetstore)…'

#取得今天日期,格式為「YYYYMMDD」,例如「20090318」
dt=`date +%Y%m%d`

#設定要備份的目標資料夾
target_path='/dspace'
#設定要排除的目標資料夾(輸入「''」空值表示沒有資料要排除)
exclude_path=$target_path'/assetstore'
#設定備份的路徑(實際上會在該路徑底下建立以日期為名稱的資料夾,備份檔案則放在該資>料夾底下)
backup_path='/opt/backup/dspace'
#設定備份檔的檔案名稱
backup_filename='dspace-'$dt'.tar.gz'
#是否為差異備份?(是則填「true」,否則填「false」)backup_differential="true"      #true || false
#設定擁有者的名稱
owner_name='dspace'
#設定擁有者的群組
owner_group='dspace'

#取得最新暫存檔的時間,存入變數$last_backup_time
cd $backup_path
for i in *
do
         last_backup_time=$i
done

#在備份路徑底下建立資料夾,資料夾名稱為今天的日期
mkdir -p $backup_path/$dt

#設定備份的指令:差異更新
if [ "$backup_differential" == "true" ]; then
        cmd_newer="--newer="$last_backup_time
else
        cmd_newer=""
fi

#設定備份的指令:排除備份
if [ "$exclude_path" == "" ]; then
        cmd_exclude=""
else
        cmd_exclude="--exclude="$exclude_path
fi

#備份目標的檔案
tar -zcpvf $backup_path/$dt/$backup_filename $target_path $cmd_newer $cmd_exclude
#修改備份檔的擁有者
chown -R $owner_name:$owner_group $backup_path/$dt
#修改備份檔的權限,只有擁有者才能存取、寫入與執行,其他人則不行
chmod -R 700 $backup_path/$dt

#顯示備份結果相關訊息
echo "=========================================="
echo '備份的目標:'$target_path
echo '備份檔位置:'
du -h -s $backup_path"/"$dt"/"$backup_filename

#顯示結束訊息
echo '備份完成!'

跟之前的作法一樣,請以root的身份,把這個腳本檔儲存在「/root/backup_dspace.sh 」當中,利用chmod將權限設定為700,然後利用crontab -e指令加入自動排程中吧。

[root@dspace ~]$ vim /root/backup_dspace.sh
※請把上面的程式碼插入backup_dspace.sh檔案中吧!
[root@dspace ~]$ crontab -e
※此時會進入vim的編輯畫面讓您編輯工作!注意到,每項工作都是一行。
#每週一早上3點30分,執行DSpace安裝程式備份
30 3  *  *  1 /root/backup_dspace.sh
#分 時 日 月 週 |<========指令========>|

還原方法也都跟之前相同,請利用backup_search.sh來找到保存之前檔案的備份檔吧。 


DSpace安裝程式中的assetstore的備份與還原

  • 預設位置:/dspace/assetstore
  • 備份位置:/opt/backup/dspace-assetstore/
  • 估計壓縮之後備份檔案大小:
    最大備份檔大小:端看你系統當中的資料量
    最小差異備份檔案大小:4K
  • 重要性:●●●○○ 大約3天備份一次
  • 備份類型:差異備份 (只有上次備份之後變更的檔案才會納入這次備份當中)
功能與重要性說明

DSpace當中的assetstore是存放使用者上傳資料到DSpace系統當中的實體資料資料夾。是的,你所上傳的那些圖片、影片都不會存在資料庫,而是存在這個資料夾當中。預設會安裝到「/dspace/assetstore」目錄底下,你可以在原始程式的[dspace-src]/dspace/config/dspace.cfg修改這個路徑。

assetstore資料跟資料庫的東西一樣重要、無可取代!只是變動的頻率不大。當身為機構典藏系統的DSpace運作時間一久,assetstore資料夾將會大的跟怪物一樣,因此在此我們採用差異備份策略,並縮短備份的執行時間。如果你覺得很assetstore很重要,又有足夠的空間可以做完整備份,你也可以修改備份腳本程式裡面的設定以執行完整備份。

備份腳本程式、自動排程與還原

備份腳本檔跟之前的一樣,如果你的備份路徑有所修改的話,請依照程式中的註解來修改實際的設定:

#!/bin/bash
# File Name: backup_dspace-assetstore.sh
# Program:
#       這隻程式將會備份DSpace中的assetstore
# History:
# 2009/03/19    Pudding First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

#顯示開始訊息
echo '執行DSpace的assetstore資料備份…'

#取得今天日期,格式為「YYYYMMDD」,例如「20090318」
dt=`date +%Y%m%d`

#設定要備份的目標資料夾
target_path='/dspace/assetstore'
#設定要排除的目標資料夾(輸入「''」空值表示沒有資料要排除)
exclude_path=''
#設定備份的路徑(實際上會在該路徑底下建立以日期為名稱的資料夾,備份檔案則放在該資>料夾底下)
backup_path='/opt/backup/dspace-assetstore'
#設定備份檔的檔案名稱
backup_filename='dspace-assetstore-'$dt'.tar.gz'
#是否為差異備份?(是則填「true」,否則填「false」)backup_differential="true"      #true || false
#設定擁有者的名稱
owner_name='dspace'
#設定擁有者的群組
owner_group='dspace'

#取得最新暫存檔的時間,存入變數$last_backup_time
cd $backup_path
for i in *
do
         last_backup_time=$i
done

#在備份路徑底下建立資料夾,資料夾名稱為今天的日期
mkdir -p $backup_path/$dt

#設定備份的指令:差異更新
if [ "$backup_differential" == "true" ]; then
        cmd_newer="--newer="$last_backup_time
else
        cmd_newer=""
fi

#設定備份的指令:排除備份
if [ "$exclude_path" == "" ]; then
        cmd_exclude=""
else
        cmd_exclude="--exclude="$exclude_path
fi

#備份目標的檔案
tar -zcpvf $backup_path/$dt/$backup_filename $target_path $cmd_newer $cmd_exclude
#修改備份檔的擁有者
chown -R $owner_name:$owner_group $backup_path/$dt
#修改備份檔的權限,只有擁有者才能存取、寫入與執行,其他人則不行
chmod -R 700 $backup_path/$dt

#顯示備份結果相關訊息
echo "=========================================="
echo '備份的目標:'$target_path
echo '備份檔位置:'
du -h -s $backup_path"/"$dt"/"$backup_filename

#顯示結束訊息
echo '備份完成!'

跟之前的作法一樣,請以root的身份,把這個腳本檔儲存在「/root/backup_dspace-assetstore.sh 」當中,利用chmod將權限設定為700,然後利用crontab -e指令加入自動排程中吧。

[root@dspace ~]$ vim /root/backup_dspace-assetstore.sh
※請把上面的程式碼插入backup_dspace-assetstore.sh檔案中吧! 
[root@dspace ~]$ crontab -e
※此時會進入vim的編輯畫面讓您編輯工作!注意到,每項工作都是一行。
#每週一早上4點,執行DSpace的assetstore資料備份
0 4  *  *  1 /root/backup_dspace-assetstore.sh
#分 時 日 月 週 |<========指令========>|

還原方法也都跟之前相同,請利用backup_search.sh來找到保存之前檔案的備份檔吧。


DSpace資料庫的備份與還原

  • 預設位置:從PostgreSQL資料庫當中匯出
    ※實體檔案在PostgreSQL預設安裝位置/var/lib/pgsql/data/base/當中,但不同電腦的PostgreSQL並不能用這些檔案來作匯出匯入,要實際執行匯出匯入指令才行!
  • 備份位置:/opt/backup/dspace-database/
  • 估計壓縮之後備份檔案大小估計:
    最小備份檔案:32K
  • 重要性:●●●●● 大約每天備份一次
  • 備份類型:完整備份 (每一份備份檔都能夠完整還原)
功能與重要性說明

DSpace系統使用資料庫,預設是使用PostgreSQL,我們這邊介紹的也是針對PostgreSQL的備份與還原方法。資料庫的資料變更頻率非常高,同樣的也是無可取代的珍貴資料,建議每天備份一次。DSpace在PostgreSQL中的資料幾乎都是文字資料,因此壓縮之後的檔案大小也應該可以接受。有個參考數據是,某教育部計畫的DSpace塞了12萬多筆item之後,每次資料庫完整備份大小約40MB。至於實體的檔案則是保存在[dspace]/assetstore當中,資料庫只有儲存實體檔案的相關資訊與位置等資料,而不是真正佔吃空間的部份。

備份腳本程式(script)

這次的備份腳本跟之前不同,由於資料來源是要從PostgreSQL資料庫當中匯出,所以作法有些改變。另外程式內有些設定的部份,請依照你實際的狀況進行修改。

有一個部份必需要特別說明,PostgreSQL可以把資料庫匯出成為sql或tar打包檔,但是根據我自己的測試,只有匯出成tar打包檔才能正確地再度匯入以還原資料庫。故以下的程式當中我們是把資料庫的資料匯出成為tar檔,再進行壓縮的動作。而還原的時候我們也是以tar打包檔的狀態還原,請看下一節的程式碼說明吧。

#!/bin/bash
# File Name: backup_dspace-database.sh
# Program:
#       這隻程式將會備份DSpace的資料庫
# History:
# 2009/03/19    Pudding First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

#顯示開始訊息
echo '執行DSpace資料庫備份…'

#取得今天日期,格式為「YYYYMMDD」,例如「20090318」
dt=`date +%Y%m%d`

#設定要備份的資料庫名稱
database_name='dspace'
#設定資料庫的擁有者
database_owner='dspace'
#設定備份的路徑(實際上會在該路徑底下建立以日期為名稱的資料夾,備份檔案則放在該資>料夾底下)
backup_path='/opt/backup/dspace-database'
#設定備份檔的檔案名稱
backup_filename='dspace-database-'$dt'.gz'
#設定擁有者的名稱
owner_name='dspace'
#設定擁有者的群組
owner_group='dspace'

#匯出的打包檔檔名 
database_tar=$(echo $backup_filename | sed s/".gz"/""/g)

#在備份路徑底下建立資料夾,資料夾名稱為今天的日期
mkdir -p $backup_path/$dt
#移動到備份資料夾
cd $backup_path/$dt

#資料庫匯出,重整資料庫,然後壓縮
pg_dump $database_name -U $database_owner | gzip > $backup_filename

#修改備份檔的擁有者
chown -R $owner_name:$owner_group $backup_path/$dt
#修改備份檔的權限,只有擁有者才能存取、寫入與執行,其他人則不行
chmod -R 700 $backup_path/$dt

#顯示備份結果相關訊息
echo '備份目標資料庫:'$database_name
echo '備份檔位置:'
du -h -s $backup_path"/"$dt"/"$backup_filename

#顯示結束訊息
echo '備份完成!'

請以root的身份,把這個腳本檔儲存在「/root/backup_dspace-database.sh 」當中,利用chmod將權限設定為700,然後試著執行看看能不能顯示:

[root@dspace ~]# vim backup_dspace-database.sh
※請利用vim編輯器把上面的程式碼加入
[root@dspace ~]# chmod 700 /root/backup_dspace-database.sh
[root@dspace ~]# /root/backup_dspace-database.sh
執行DSpace資料庫備份…
備份目標資料庫:dspace
備份檔位置:
32K     /opt/backup/dspace-database/20090319/dspace-database-20090319.tar.gz
備份完成!
[root@dspace ~]# ll -h /opt/backup/dspace-database/20090319
總計 32K
-rwx------ 1 dspace dspace 27K  3月 19 06:33 dspace-database-20090319.tar.gz
※如果有看到本日的備份檔案,表示備份完成!
設定PostgreSQL自動認證功能

如果你的PostgreSQL連線設定(/var/lib/pgsql/data/pg_hba.conf)中連線類型不是trust,那麼在執行上面的備份指令時,系統會提示你輸入密碼。

[root@dspace ~]# /root/backup_dspace-database.sh
執行DSpace資料庫備份…
密碼:
※出現「密碼:」的時候,你要手動輸入資料庫密碼才行 
==========================================
備份目標資料庫:dspace
備份檔位置:
32K     /opt/backup/dspace-database/20090319/dspace-database-20090319.tar.gz
備份完成!

為了能讓自動備份的時候順利進行,免去輸入密碼的困擾,我們要在使用者家目錄底下新增.pgpass檔案,輸入自動認證的資料。作法如下:

[root@dspace /]# vim ~/.pgpass
※請用vim編輯器輸入以下資料,個別是「資料庫位置:資料庫連接埠:資料庫名稱:使用者名稱:使用者密碼」 localhost:5432:dspace:dspace:dspacepassword
[root@dspace /]# chmod 600 ~/.pgpass
※修改權限才能生效! 

詳細的作法,可以參考我寫的另外一篇說明「PostgreSQL連線設定與DSpace資料庫備份設定」。

排程自動執行備份

自動排程的設定沒有差別,大致上設定如下:

[root@dspace ~]$ crontab -e
※此時會進入vim的編輯畫面讓您編輯工作!注意到,每項工作都是一行。
#每週一早上2點30分,執行DSpace原始程式備份
30 2  *  *  1 /root/backup_dspace-database.sh
#分 時 日 月 週 |<========指令========>|
備份檔的還原

資料庫的備份檔案,要用資料庫的匯出指令來還原,我寫了一份還原的腳本程式。你需要指定備份檔的位置、日期、檔名、資料庫名稱、資料庫使用者。內容如下:

#!/bin/bash
# File Name: restore_dspace-database.sh
# Program:
#       這隻程式將會還原PostgreSQL資料庫的資料
# History:
# 2009/03/19    Pudding First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

#提示使用者輸入備份檔的位置
read -p "請輸入備份檔的位置(預設為/opt/backup/dspace-database):" backup_path
	#設定備份檔位置的預設值
	if [ "$backup_path" == "" ]; then
	        backup_path='/opt/backup/dspace-database'
	fi

#顯示該備份檔位置底下,有哪些日期,並將預設值設為最新的日期
echo "(該備份檔位置底下有以下日期的資料:)"
ls $backup_path
backup_dates=$(ls $backup_path | tac)
for d in $backup_dates
do
	backup_date_default=$d
	break
done

#提示使用者輸入備份檔的日期
read -p "請輸入備份檔的日期(格式為YYYYMMDD,預設為$backup_date_default):" backup_date
	#設定預設備份檔的日期
	if [ "$backup_date" == "" ]; then
	        backup_date=$backup_date_default
	fi

#顯示該路徑底下有哪些備份檔案,並取得預設備份檔的檔名
echo "(該日期的備份檔位置底下有以下備份檔的資料:)"
ls $backup_path"/"$backup_date
cd $backup_path"/"$backup_date
backup_files=$(ls *.gz)
for f in $backup_files
do
	backup_filename_default=$f
	break
done

#提示使用者輸入預設檔名
read -p "請輸入備份檔的檔名(預設為$backup_filename_default):" backup_filename
	#設定備份檔的預設值
	if [ "$backup_filename" == "" ]; then
		backup_filename=$backup_filename_default
	fi

#提示使用者輸入資料庫相關資訊
read -p "請輸入要還原的資料庫名稱(預設是dspace):" database_name
read -p "請輸入要還原的資料庫擁有者(預設是dspace):" database_owner

#設定預設值
if [ "$database_name" == "" ]; then
        database_name='dspace'
fi
if [ "$database_owner" == "" ]; then
        database_owner='dspace'
fi

#提示使用者是否要先備份資料庫
read -p "是否要先備份資料庫?(y或是n,預設是y)" backup_before
if [ "$backup_before" == "" ]; then
        backup_before='y'
fi
database_tar=$(echo $backup_filename | sed s/".gz"/""/g)

#如果要先做備份的話,則執行以下指令
if [ "$backup_before" == "y" ]; then
	read -p "資料庫備份的腳本檔案是?(預設是/root/backup_dspace-database.sh)" backup_script
	if [ "$backup_script" == "" ]; then
		backup_script="/root/backup_dspace-database.sh"
	fi
	$backup_script
fi

#提示確認還原
echo "還原目標資料庫:"$database_name
echo '來源的備份檔:'$backup_path"/"$backup_date"/"$backup_filename

echo "請確認上面訊息是否正確,還原資料庫將會覆蓋現有資料庫的所有資料!"
read -p "如要繼續,請輸入yes:" restore_check

if [ "$restore_check" != "yes" ]; then
        echo "取消還原!"
        exit 0
fi

#顯示開始訊息
echo '=========================================='
echo '執行DSpace資料庫還原作業…'

#移動到備份檔所在位置
cd $backup_path"/"$backup_date

is_targz=$(echo "$backup_filename" | grep ".tar.gz")
if [ "$is_targz" == "" ]; then
	#gz式匯入法
	echo "以psql還原……"
	gunzip -c $backup_filename | psql $database_name -U $database_owner
else
	#tar.gz式pg_restore法
	echo "以pg_restore還原……"
	#解壓縮檔案
	tar -zxf $backup_filename
	#匯入PostgreSQL
	pg_restore -c -d $database_name -U $database_owner -W $database_tar
	#移除剛剛解壓縮的備份檔
	rm -f $database_tar
fi


#重整PostgreSQL
echo "重整PostgreSQL…"
psql -c ANALYZE -U $database_owner

#顯示備份結果相關訊息
echo '=========================================='
echo '還原目標資料庫:'$database_name
echo '來源的備份檔:'$backup_path"/"$backup_date"/"$backup_filename

#顯示結束訊息
echo '還原完成!'

請利用vim編輯器把以上程式碼加入/root/restore_dspace-database.sh。執行資料庫還原腳本程式,程式會提醒你輸入相關的資訊。還原資料庫需要多多注意,進行還原的時候會覆蓋原有資料庫的資料!實際操作的情況如下:

[root@dspace ~]# /root/restore_dspace-database.sh
請輸入備份檔的位置(預設為/opt/backup/dspace-database):
(該備份檔位置底下有以下日期的資料:)
20090318  20090319
請輸入備份檔的日期(格式為YYYYMMDD,預設為20090319):
(該日期的備份檔位置底下有以下備份檔的資料:)
dspace-database-20090319.tar  dspace-database-20090319.tar.gz
請輸入備份檔的檔名(預設為dspace-database-20090319.tar.gz):
請輸入要還原的資料庫名稱(預設是dspace):
請輸入要還原的資料庫擁有者(預設是dspace):
是否要先備份資料庫?(y或是n,預設是y)
資料庫備份的腳本檔案是?(預設是/root/backup_dspace-database.sh)
執行DSpace資料庫備份:
==========================================
備份目標資料庫:dspace
備份檔位置:
32K     /opt/backup/dspace-database/20090319/dspace-database-20090319.tar.gz
備份完成!
==========================================
還原目標資料庫:dspace
來源的備份檔:/opt/backup/dspace-database/20090319/dspace-database-20090319.tar.gz
請確認上面訊息是否正確,還原資料庫將會覆蓋現有資料庫的所有資料!
如要繼續,請輸入yes:yes
==========================================
執行DSpace資料庫還原作業…
密碼:
※如果出現提示,此處需要輸入資料庫密碼!
pg_restore: [壓縮器(db)] PROCESSING TOC時發生錯誤:
pg_restore: [壓縮器(db)] TOC記錄5有錯誤;2615 2200 SCHEMA public postgres
pg_restore: [壓縮器(db)] could not execute query: 錯誤:  必須是schema public的擁有者
    Command was: DROP SCHEMA public;
pg_restore: [壓縮器(db)] could not execute query: 錯誤:  schema "public"已經存在
    Command was: CREATE SCHEMA public;
pg_restore: [壓縮器(db)] TOC記錄1949有錯誤;0 0 COMMENT SCHEMA public postgres
pg_restore: [壓縮器(db)] could not execute query: 錯誤:  必須是schema public的擁有者
    Command was: COMMENT ON SCHEMA public IS 'Standard public schema';
pg_restore: WARNING:  無法取消任何權限
pg_restore: WARNING:  無法取消任何權限
pg_restore: WARNING:  未被賦予任何權限
pg_restore: WARNING:  未被賦予任何權限
警告,還原時忽略錯誤:3
※還原的時候出現以上錯誤,這是很正常的!
重整PostgreSQL…
WARNING:  忽略"pg_authid" -- 只有資料表或資料庫擁有者能進行分析
WARNING:  忽略"pg_tablespace" -- 只有資料表或資料庫擁有者能進行分析
WARNING:  忽略"pg_pltemplate" -- 只有資料表或資料庫擁有者能進行分析
WARNING:  忽略"pg_shdepend" -- 只有資料表或資料庫擁有者能進行分析
WARNING:  忽略"pg_auth_members" -- 只有資料表或資料庫擁有者能進行分析
WARNING:  忽略"pg_database" -- 只有資料表或資料庫擁有者能進行分析
ANALYZE
※分析的時候出現以上錯誤,這也是很正常的! 
==========================================
還原目標資料庫:dspace
來源的備份檔:/opt/backup/dspace-database/20090319/dspace-database-20090319.tar.gz
還原完成!
[root@dspace ~]#

後記

終於把整個備份機制都好好地重整一遍了。光這一篇就寫了兩天……好累……不過也多虧寫這一篇,改進了很多原來我在伺服器上撰寫的不友善程式碼。

寫到最後連後記都不知道要寫什麼了……我越來越習慣Linux的Bash Shell操作,算是好事吧。

後來又加了快速安裝的章節,也發現自己少了一大部分沒有撰寫,然後又為backup_search.sh增加了一些功能……

希望這一篇會對使用DSpace的機構單位有所幫助!加油!<-- Post Catalog -->

(more...)