談DSpace 1.5.1備份機制
繼前一篇「DSpace 1.5.1安裝法」之後,今天我們來談談DSpace的備份機制,其實1.4.2或1.5.1都可以適用,因為基本架構並沒有差別太多,但本篇則是以1.5.1為主要適用對象。
要備份,就要先知道你要備份什麼東西。DSpace這個系統又區分成很多個部份,重要性不一、檔案大小也都不一定。我建議將備份機制分成這四個部份來看:
- DSpace原始程式的備份與還原
- DSpace安裝程式(排除掉assetstore)的備份與還原
- DSpace安裝程式中的assetstore的備份與還原
- DSpace資料庫的備份與還原
以下一一說明他們的功能、位置、備份與還原機制。由於大部分指令都相同,我只會在「DSpace原始程式備份與還原」有比較詳細的說明,其他的部份則挑重點說明而已。
為了方便大家安裝、使用,我先在開頭增加「快速安裝」小節,需要詳細的說明,再看看後面的小節吧。
快速安裝
- 下載備份與還原的腳本程式
SkyDrive空間,zip壓縮檔,6.7KB,http://0rz.tw/bdpr0 - 你可以利用Pietty或SFTP的軟體(如FileZilla)把上面下載的檔案上傳到/root/資料夾當中。
- 接下來解壓縮指令為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
- 共有六個檔案,功能簡述如下:
- backup_dspace-src:備份DSpace原始程式,預設將/opt/dspace-1.5.1-src-release備份到/opt/backup/dspace-src當中
- backup_dspace.sh:備份DSpace安裝檔,但排除裡面的assetstore資料夾。預設將/dspace備份到/opt/backup/dspace當中
- backup_dspace-assetstore.sh:備份DSpace安裝檔當中的assetstore資料夾。預設將/dspace/assetstore備份到/opt/backup/dspace-assetstore當中
- backup_search.sh:尋找備份檔當中指定的檔案,以便於還原
- backup_dspace-database.sh:備份DSpace在PostgreSQL資料庫當中的資料。預設備份到/opt/backup/dspace-database當中
- restore_dspace-database.sh:還原資料庫資料
- 設定自動排程,利用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 #分 時 日 月 週 |<========指令========>|
- 設定PostgreSQL資料自動認證,注意底下設定的資料需要依據你實際的情況自行修改:
[root@dspace /]# vim ~/.pgpass ※請用vim編輯器輸入以下資料
個別是「資料庫位置:資料庫連接埠:資料庫名稱:使用者名稱:使用者密碼」
localhost:5432:dspace:dspace:dspacepassword [root@dspace /]# chmod 600 ~/.pgpass - 備份的資料夾,預設是在/opt/backup當中,底下依照類型區分成四個子資料夾,各子資料夾底下再依日期建立資料夾,然後底下才是實際的備份檔。四個子資料夾個別是:
- dspace-src:DSpace原始程式,預設來自/opt/dspace-1.5.1-src-release
- dspace:DSpace安裝程式,預設來自/dspace
- dspace-assetstore:DSpace的assetstore資料夾,預設來自/dspace/assetstore
- dspace-database:DSpace的資料庫資料,預設來自於PostgreSQL
- 要在備份檔當中搜尋特定檔案,請執行backup_search.sh:
[root@dspace ~]# /root/backup_search.sh
- 要還原資料庫資料,請執行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 -->
三個字
回覆刪除超
詳
細
又增加「快速安裝」的說明
回覆刪除然後修正一些部份的錯誤
總算是弄完了,WLW統計字數8619……好多orz
為配合同步鏡像功能,修改了PostgreSQL的備份與還原設定。
回覆刪除作者已經移除這則留言。
回覆刪除您好 目前我們中心的系統也是Dspace建立的 但因為年代久遠急需要備份
回覆刪除可否在開放備份壓縮包下載呢 感激不盡
作者已經移除這則留言。
回覆刪除To 李柏鋒:
回覆刪除DSpace_backup_scripts.zip 檔案重新上傳
Box: https://app.box.com/s/goydo2abm2rdq9o21hvrj8d7cqulehsa
Google Drive: https://drive.google.com/file/d/0B3_qgRmbvvZ1NTNmSzRpdmRtdTA/view?usp=sharing
Evernote: https://www.evernote.com/shard/s4/nl/308055/740b07cf-b795-4858-a522-b291a59a8403?title=DSpace_backup_scripts.zip
OneDrive: http://1drv.ms/1YMh3mu
Mega: https://mega.nz/#!p0AzTKpB!fUNiuwWkPQguyRCG39yMDxVUbg69ndRDz-qufgaAfJY
但不一定適用,可能因為DSpace版本不同,資料庫不同而無法使用。
舉例來說,現在臺大機構典藏的版本是用MySQL,可是我這個版本是給PostgreSQL使用的
請不要期待它可以正常運作喔。
非常感謝 我是在台大工作沒錯 不過我們是用PostgreSQL
回覆刪除To 李柏鋒,
回覆刪除好,祝你順利。
不過 通通備份完之後 發現檔案都只有4K呢 這樣應該是失敗的吧^^"
回覆刪除To 李柏鋒,
回覆刪除看一下4K是什麼東西就可以知道了吧?
作者已經移除這則留言。
回覆刪除作者已經移除這則留言。
回覆刪除試了很久..無法解壓縮...哈
回覆刪除好吧,你自求多福吧。
回覆刪除