您在這裡

求教DRUPAL資料庫備份問題

river93's 的頭像
river93 在 2007-04-13 (週五) 08:18 發表

請問前輩
有關DRUPAL的備份方式?你們是如何做的?
小弟目前想到的有
1.利用後台備份,直接COPY MYSQL DATA的資料夾
困難:好像在不同電腦用此方法,似乎行不通,有可能遇到硬碟掛掉或重灌時,資料庫將不能使用
2.PHPMYADMIN備份
困難:有檔案大小之限制

聽說還有MYSQLDUMP的方式,但有點複雜,小弟還看不懂
是不是請問一下DRUPAL是否有類似一般部落格匯出和匯入之功能的模組可使用?

還是我用的方法有誤或者有其他改進方式可以精確的備份資料庫,讓它可以重複使用或移接到其他電腦?

請大大幫幫忙解答問題?

我的環境系統如下
WINDOWS XP SP2
使用AppServ Open Project - 2.5.7

經過剛剛實際測試
方法1似乎再同一電腦也是行不通
只是我是讓兩個DRUPAL共存下測試的,一個資料夾為DRUPAL資料庫名為DRUPAL,另一個資料夾為DRUPAL5資料庫名為DRUPAL5
是COPY DRUPAL的資料庫(資料夾內所有檔案)到DRUPAL5資料夾內全部覆蓋,結果失敗!!

我說的方法2也就是PHPmyadmin的備份方法
可是它轉出時是沒有檔案大小之限制,但是導入時,卻有2MB的限制
導致資料庫較大時將無法匯入!是否有改進之方法呢?感謝教導一下

我是使用自己的主機!

請問BIGDUMP的的匯入順序如何
它可用於不同電腦嗎?

小弟剛剛隨便用了Joomla來測試
1.當1次安裝joomla時已phpmyadmin匯出資料庫,在未刪除該資料庫再度匯入,成功
2.新增一些文章時,再度匯出資料庫,利用phpmyadmin刪除資料庫,刪除joomla資料夾,重新安裝joomla後,在以bigdump匯入在杜蕙出的資料庫,失敗!

請問,這樣的作法瑕疵在哪裡,應該如何改進?

小弟再度以phpmyadmin轉入該資料庫時,發生相同錯誤如下

錯誤

SQL 語法:

-- phpMyAdmin SQL Dump
-- version 2.9.0.2
-- http://www.phpmyadmin.net
--
-- 主機: localhost
-- 建立日期: Apr 13, 2007, 06:41 AM
-- 伺服器版本: 5.0.24
-- PHP 版本: 5.1.6
--
-- 資料庫: `joomla`
--
-- --------------------------------------------------------
--
-- 資料表格式: `jos_banner`
--
CREATE TABLE `jos_banner` (
`bid` int( 11 ) NOT NULL AUTO_INCREMENT ,
`cid` int( 11 ) NOT NULL default '0',
`type` varchar( 10 ) NOT NULL default 'banner',
`name` varchar( 50 ) NOT NULL default '',
`imptotal` int( 11 ) NOT NULL default '0',
`impmade` int( 11 ) NOT NULL default '0',
`clicks` int( 11 ) NOT NULL default '0',
`imageurl` varchar( 100 ) NOT NULL default '',
`clickurl` varchar( 200 ) NOT NULL default '',
`date` datetime default NULL ,
`showBanner` tinyint( 1 ) NOT NULL default '0',
`checked_out` tinyint( 1 ) NOT NULL default '0',
`checked_out_time` datetime NOT NULL default '0000-00-00 00:00:00',
`editor` varchar( 50 ) default NULL ,
`custombannercode` text,
PRIMARY KEY ( `bid` ) ,
KEY `viewbanner` ( `showBanner` )
) ENGINE = MYISAM DEFAULT CHARSET = utf8 AUTO_INCREMENT =3;

MySQL 傳回: 說明文件
#1050 - Table 'jos_banner' already exists

那是在我安裝完PHP程式後就有的表格
即使刪除他,其他表依然會有相同情形
直接問好了,請問前輩
當您的資料庫發生嚴重錯誤,或硬碟掛掉時,很幸運的,您剛好有備份在手邊
現在SEVER也安裝完畢,
從安裝開始,您的復元程序為何,事先安裝PHP程式還是先匯入備份?諸如此類的順序,您是如何做的呢?

我也一樣有用appserv測試...
如果是window的備分... 直接copy MySQL/data/ 裡的資料夾...
一個資料夾表示一個資料庫...
這個方式原則上是可行的,我在自己的電腦備份過幾次,都是正常。也有過把整個資料夾copy到Linux上面,最後也run起來了。
差別是在於,copy到Linux後... owner會跑掉,所以要把檔案的owner改過來... 其它就沒有問題。

不能跑的可能,也許是因為MySQL的版本不同吧!
5.x 的資料在4.x版的讀不到(這很正常吧!!),至於4.x版的資料,在5.x版應該是讀得到。
我前幾天才把我的appserv升級(不過是2.4.x版的,還不想更新到PHP 5),實際跑的結果,新的MySQL 5讀得到我舊的4.x版的資料。
我之前測試用而放在資料庫裡的資料... 一個都沒少的可以讓我正常使用。

原來因為appserv太舊... Drupal 一中文化完就掛點,升級完後就正常了。

我建議,使用方法1,用改目錄名稱的方式,比你到目錄下copy所有檔案保險得多。(天知道會不會有隱藏檔或其它漏copy到的)

另外,我曾經拿到過全是裡面檔案資料... 一個資料表至少3個檔案,同一個主檔名。最後我也是把它丟到自己弄的一個目錄下統統開出來。
所以,方式1是絕對可行的.....

方法2... 因為的檔案大小限制... 有點麻煩... 不過會改設定就沒差。
方法3... 實作經驗太少回答不了,不好意思...

我只是一個撰碼員,靠寫程式過活。
自從 Drupal 在 4.7 版的時候知道他的存在,但是後來跳去其它程式語言很久沒回來。
變成 D5 比較熟,D6 知道一點,D7 還在學的狀況…

對了... phpMyAdmin滙出的時候,有選項可以把舊的砍掉,或是update。仔細找找一定可以找得到。
另外也有for舊版mysql的語法選項,總之... 就是慢慢把選項看完(反正都是中文),可以發現很多有用的東西。

不然的話.... 其實喔.... MySQL也有軟體喔!! (昨天爬網偶然發現的)
沒看到要收費... 應該是免費的吧!!
官網下載頁面
有綠色版本(不用安裝解壓縮就能用),可以抓下來試試看。
裡面還強到可以看連線,負載..... 很多功能,我的功力太低,看到也不知道那是幹嘛用的,只知道對分析很有用...

不過缺點是英文的。

我只是一個撰碼員,靠寫程式過活。
自從 Drupal 在 4.7 版的時候知道他的存在,但是後來跳去其它程式語言很久沒回來。
變成 D5 比較熟,D6 知道一點,D7 還在學的狀況…

您實作的經驗真是多!我要慢慢參考一番
相當有幫助
不過我因為有做過後台直接COPY(直接複製資料夾),但是是失敗的
我想請教一下,您重灌的順序如何,是先安裝DRUPAL程式?還是先匯入備份資料庫
還有以下這一段我不是很清楚您的意思

我建議,使用方法1,用改目錄名稱的方式,比你到目錄下copy所有檔案保險得多。(天知道會不會有隱藏檔或其它漏copy到的)

我有測試成功了
我是先安裝DRUPAL後,利用phpmyadmin刪除drupal,在匯入備份下來的資料庫,就成功了
比較不一樣的,就是我是用命令列導入的
即開啟命令提示字元-->輸入:mysql 備份資料庫名稱.sql -u root -p < backup_data.sql
然後會問資料庫使用者密碼,輸入密碼後ㄧ段時間及完成!

謝謝以上前輩們的指導,感謝

直接備份 database 的資料夾,這種方式只能用於相同版本 (有時版本相差不大時也可以) 的 mysql 才行,版本不同的情況下,使用這種備份方法的話,就等著發出擾人的狼嚎吧 ^_^
再說,若是在你備份的同時,有人也正在寫入資料庫呢??這樣子的備份就不太具有什麼意義了。
所以要備份時,還得先將 table 鎖住,不讓他人能夠寫入(但可讀取),然後利用 mysqldump 將資料庫或想備份的資料表給匯出來會較好喲。

我是在 FreeBSD 系統下利用 cron 於每天淩晨 4 點過後,人數較少時進行自動備份,底下是我的 shell script,有需要的人可以參考看看!!

匯出︰backup.sh

#!/bin/sh
if [ -z $1 ];then
echo "You must give me the database name!"
echo "exp: $0 drupal"
exit 1
fi

FOLDER=/home/ruixin/backup_sql
# FOLDER = /你要放置備份檔的所在目錄,需使用絕對路徑。

BACKUP_DAY=`date +%Y%m%d`
BACKUP_FILE=drupal_$BACKUP_DAY
DOLD="+30d"

/usr/local/bin/mysqladmin -uyourname -pyourpassword flush-logs
/usr/local/bin/mysqldump -uyourname -pyourpassword --opt $1 > $FOLDER/$BACKUP_FILE.sql
# 別忘了修改 mysql 的登入使用者帳號與登入密碼哦!
cd $FOLDER
/usr/bin/tar jcvf $BACKUP_FILE.bz2 $BACKUP_FILE.sql
/usr/bin/find $FOLDER -mtime $DOLD -delete
# 這行於 Linux 系統可能會無法正確執行,其目的是刪除已超過 30 天的備份檔。
rm -rf $BACKUP_FILE.sql
cd -

匯入︰restore.sh

#!/bin/sh
check () {
if [ $# -gt 0 ];then
case "$1" in
[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])
if [ $2 ];then
DBF=$2
else
echo "use $0 date database_name. exp: $0 `date +%Y%m%d` drupal"
exit 1
fi
;;
*)
echo "use $0 date database_name. exp: $0 `date +%Y%m%d` drupal"
exit 1
;;
esac
else
echo "Use $0 date database_name. exp: $0 `date +%Y%m%d` drupal"
exit 1
fi
}
check $1 $2
FILE_NAME=drupal_$1
cd /home/ruixin/backup_sql
tar vxjf $FILE_NAME.bz2
mysql -uyourname -pyourpassword $DBF < $FILE_NAME.sql
# 同樣的,別忘了修改 mysql 的登入帳號與登入密碼。
rm -rf $FILE_NAME.sql
cd -

crontab

#minute hour mday month wday command
35 4 * * * /real/path/backup.sh

最後,別忘了將 backup.sh 和 restore.sh 給予執行的權限喲︰

chmod 700 backup.sh restore.sh

有人可能會質疑說將密碼寫出來不是很危險嗎?只要查看一下歷史指令不就全都露了??
其實 history 只記錄在登入系統後的母 shell 所下的指令,所以在 history 是看不到任何與密碼有關的記錄的,而且這兒是利用 crontab 來執行的,而 history 是不會記錄利用 crontab 所執行的任何指令的。

除非自己在玩(或是惡搞),不然應該沒有人會想把資料備份到不同的MySQL版本吧!!(換個角度來看... 這根本不叫作"備份")
因為我測試上的需要,所以要換個appserv的版本來試,但是又不想放棄舊的資料庫裡的資料。所以才會把它們全都copy出來倒進去試看看。
當然不成功的話,還是得灌回原來的系統去把資料叫回來。沒有遇到狀況,老實說我也覺得滿意外的,因為是事後才發現MySQL版本不同。

回答下原po者對於我回應其中一句話。

我建議,使用方法1,用改目錄名稱的方式,比你到目錄下copy所有檔案保險得多。(天知道會不會有隱藏檔或其它漏copy到的)

一個目錄底下可能有隱藏檔,所以copy的時候可能會"漏選",所以直接以移動(或copy)目錄的方式,比較能保證目錄裡的內容都被copy到。
假設.... 今天我備份一個叫作"data"的目錄。今天要還原回之前備份的情形。我會先rename原來的"data"目錄,再把備份的資料夾copy進來。
這個其實不是什麼很特別的技巧,很多地方都可以用到,相信很多人都知道這種作法。
像是Drupal安裝的時候有個table prefix,原來的預設是可以在同一個資料庫放一個以上的Drupal站。當你知道怎麼設定,也可以作為備分的用途,改個prefix設定就可以讓整個站"跳到某個版本"。有時候這種作法很好用,因為rename總是會比copy一堆檔案來得快。

我只是一個撰碼員,靠寫程式過活。
自從 Drupal 在 4.7 版的時候知道他的存在,但是後來跳去其它程式語言很久沒回來。
變成 D5 比較熟,D6 知道一點,D7 還在學的狀況…

我知道您的意思了,原來COPY還有這樣的學問!
感謝您如此詳盡的敘述