1 頁 (共 2 頁)

[教學]MySql 資料快速備份[定時]

發表於 : 2003-09-03 03:48
xpuser
執行環境:Windows 2000 Server
資料庫版本:MySql 4.0.12 (命令列指令mysqldump + mysql)

為了達到定時的效果 會用到工作排程器
首先做出兩個批次執行檔autobackup.bat autorestore.bat
並將兩個批次檔儲存至 %mysql installation path%/bin/ 路徑下
假設phpbb資料庫名稱為phpbb2
1.
autobackup.bat 內容為\r

代碼: 選擇全部

mysqldump -u root -p資料庫密碼 --opt phpbb2 > mybackup.sql
2.
autorestore.bat內容為\r

代碼: 選擇全部

mysql -u root -p資料庫密碼 phpbb2 < mybackup.sql
設定Win2000 上面的工作排程器,將autobackup.bat加入排程,設定 工作排程-每日 每日工作排程-每隔1天 進階-重複執行打勾 每隔1小時直到期間23小時
這樣作業系統每隔小時就會幫你備份一次資料庫,備份間隔依需要自行調整!!
如果要還原資料庫就手動執行autorestore.bat就可以了

附註:--opt 參數意思是--quick --add-drop-table --add-locks --extended-insert --lock-tables 這些複合參數解釋請參考 docs/manual.html#mysqldump

希望各位能夠一起來討論如何將備份檔主檔名設為系統日期加時間,這樣就有時光回溯囉

發表於 : 2003-09-03 22:53
leomak
it very useful, thanks

發表於 : 2003-09-04 00:49
xpuser
如果你是想手動執行批次檔可以加上

@echo off
echo ...準備備份MySql資料庫\r
pause

@echo off
echo ...準備還原MySql資料庫\r
pause

這樣可以讓您確認執行動作

發表於 : 2003-09-04 01:14
freng
自動備份排程如果還用 pause 豈不是還要手動來按啊?
有點行不通,有沒有批次檔是備份整個目錄用的,我想定時
備份整個目錄,如果還有支援遠端Ftp 伺服器的話,那就更棒嘍!

發表於 : 2003-09-04 01:28
xpuser
freng 寫:自動備份排程如果還用 pause 豈不是還要手動來按啊?
有點行不通,有沒有批次檔是備份整個目錄用的,我想定時
備份整個目錄,如果還有支援遠端Ftp 伺服器的話,那就更棒嘍!
不好意思,已修改\r
另外想要備份整個目錄,請用壓縮軟體囉
命令列的winrar叫做rar......

發表於 : 2004-10-24 11:03
cs87668
我的DB備份策略:

我以循環的方式做備份,以一星期為一個週期.
也就是說,我的備份資料夾裡面會有星期一~星期 日的備份檔
而等下次同一天時,則會把七天前備份的覆蓋掉.

例如今天是10/24星期日,備份檔案是 db-bak.Sunday.sql
明天則會自動備份DB,檔名取為db-bak.Monday.sql
於此類推,直到10/31時,會產生db-bak.Sunday.sql,把之前的10/24的備份檔給覆蓋掉.
所以時光回朔其為一週.

這個想法算是對於空間考量而言是蠻不錯的,不只備份DB,以備份HD的角度來說也可以.
而要在Linux/UNIX下做這樣的動作很簡單,只要寫個script以及配合crontab即可.
不過在Win32下就比較麻煩了.

如此,我寫了一個小程式,配合MySQL的mysqldump以及WIn上面的排程,
可以達道上述的效果,也就是回應了樓主的問題"如何將備份檔主檔名設為系統日期加時間"

[Usage]:
auto_mysql_dump.exe <path to mysqldump> <target dir> <DB name> <user> <password>

[Example]:
auto_mysql_dump e:\mysql\bin\mysqldump.exe e:\backup phpbb2 root 123

把上述指令加到工作排程中,每天自動執行一次,我都是設在每天凌晨6:00,那時候站上人最少.

原始碼如下(以BCB 6撰寫):

代碼: 選擇全部

//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <dos.h>
#include <stdlib.h>


#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[]) {

        if ( argc != 6 ) {
                puts("[Usage]:");
                puts("auto_mysql_dump.exe <path to mysqldump> <target dir> <DB name> <user> <password>");
                //puts("");
                puts("[Example]:");
                puts("auto_mysql_dump e:\\\mysql\\\bin\\\mysqldump.exe e:\\\backup phpbb2 root 123");
                //getch();
                return 1;
        }

        struct tm *time_now;
        time_t secs_now;
        char str[16], cmd[256];        

        tzset();
        time(&secs_now);
        time_now = localtime(&secs_now);
        strftime(str, 80,"%A",time_now);
        sprintf(cmd,"%s %s -u%s -p%s --opt > %s\\\%s-%s.sql
",argv[1],argv[3],argv[4],argv[5],argv[2],argv[3],str);
        printf("[Execute]: %s",cmd);

        if ( system(cmd) ) {
          printf("Process is failed.");
          return 1;
        } else
          printf("Process is completed.");

        //getch();
        return 0;
}
//---------------------------------------------------------------------------
[Downlaod]
http://home.kimo.com.tw/cs87668/auto_mysql_dump.exe (以滑鼠按右鍵,另存目標方式下載)
http://home.pchome.com.tw/online/marty2 ... l_dump.exe

[注意事項]
我的程式對於程式參數並沒有做嚴謹的check,所以使用上請注意參數位置以及值是否正確.
當然程式還有改進的空間,不過我人在當兵,等等就收假了. 之後的問題等放假後再討論了.

[免責條款]
1.本文(程式)雖已力求正確,然而無法保證所有操作或設定都可以順利的在您的系統上面進行,您必須依照自己的環境做適當的調整。倘若您依照本文件的說明而使你的系統發生任何問題或資料的損失,作者都將不負任何責任。
2. 此程式以及文章可以任意散佈,不過必須完整且無修改的情況下散布. 當然這包含了免責條款

Re: [教學]MySql 資料快速備份[定時]

發表於 : 2005-08-25 03:12
風凌正
xpuser 寫:希望各位能夠一起來討論如何將備份檔主檔名設為系統日期加時間,這樣就有時光回溯囉
參考:
http://blog.yam.com/emisjerry/archives/23407.html
mysqldump雖不支援Windows環境變數(或者有特殊的使用方法?),但可在批次檔以複製或更名的方式達到效果。

Re: [教學]MySql 資料快速備份[定時]

發表於 : 2006-10-14 12:31
cj_kuo
xpuser 寫:希望各位能夠一起來討論如何將備份檔主檔名設為系統日期加時間,這樣就有時光回溯囉
Mmm....

這有需要討論嗎?寫個 VBScript 就可以解決了...

參考下面的代碼:

代碼: 選擇全部

Dim FineName
Set objShell = CreateObject("WScript.Shell")

' Preparing Year Part
FileName = CStr(Year(Now))

' Preparing Month Part
if Len(CStr(Month(Now))) = 1 then
 FileName = FileName + "0" + CStr(Month(Now))
else
 FileName = FileName + CStr(Month(Now))
end if

' Preparing Day Part
if Len(CStr(Month(Now))) = 1 then
 FileName = FileName + "0" + CStr(Day(Now))
else
 FileName = FileName + CStr(Day(Now))
end if

objShell.Run "cmd /c  mysqldump -u root -p資料庫密碼 --opt phpbb2 > mybackup_" + FileName + ".sql"

把上面的代碼存成一個檔案,名稱叫 Backup.vbs。(不要弄錯副檔名)
並將檔案儲存至 %mysql installation path%/bin/ 路徑下。

然後,把檔案加到工作排程器中。設定好執行時間就可以了。

另外,應該有人會歸毛到說... 可不可以把時間也加進去。所以,請參考下面的代碼,自行加到 VBScript 中就可以了。(弄清楚放的位置)

代碼: 選擇全部

' Preparing Time Part
 FileName = FileName + "_" + CStr(Hour(Now)) + CStr(Minute(Now)) + CStr(Second(Now))

Kuo...

PS: 有問題再說吧...

發表於 : 2006-10-14 13:55
進藤光
有問題的~這篇只能用在 Windows... Orz
如果 MySQL Administrator 能自動備份,就不用這麼麻煩了~ Orz

發表於 : 2006-10-14 18:06
chiouss
進藤光 寫:有問題的~這篇只能用在 Windows... Orz
如果 MySQL Administrator 能自動備份,就不用這麼麻煩了~ Orz
你的 MacOS X 總有 cron 可以用吧?也有 shell script 吧?你可以自己寫一個 XD

要不然就不要用 MySQL,資料庫又不是只有這一家...

發表於 : 2006-10-15 00:08
cj_kuo
進藤光 寫:有問題的~這篇只能用在 Windows... Orz
如果 MySQL Administrator 能自動備份,就不用這麼麻煩了~ Orz
Mmm...

你也可以考慮把 Web Server 與 Database Server 分裝在二台機器上。Database Server 用 Windows XP + MySQL 就可以使用這個 Solution 了。

如果你希望 Database Sever 可以自動做備份,那可以考慮裝一台 Microsoft
Windows 2003 Server + M$ SQL Server 2005. 這樣就可以利用現成的介面
(Enterprise Manager) 來設定自動備份了。不過,這要花不少銀兩就是了...


Kuo...

發表於 : 2006-10-15 02:32
進藤光
看樣子兩位站長一點也不了解我~~嗚....

這篇是我寫的: 【[教學] 使用微軟 MS SQL Server 2000 架設 phpBB2】 http://phpbb-tw.net/phpbb/viewtopic.php?t=38030

我以前就是用 Windows NT/2000 來架站,寫那篇的時候是用 Win2003 server。要我寫 .bat 檔,絕對比寫 script 還要強~包括連判斷式通通寫進去,一次搞定~ XD :mrgreen:

只不過這篇主題並沒有寫 Windows,世界上難道只有 Windows 能架站嗎?XD

由於 XOOPS 只能用 MySQL,我也只好把 MS SQL 給扔掉了,要不然肯定會用 SQL 2005 來架資料庫!

至於自動備份,最新的 MySQL Administrator 仍舊無法正常備份出 UTF-8,自動備份出來的全都是亂碼!會寫資料庫的公司,竟然連自動備份也不會寫... 真是 OOXX... Orz

很無奈的我也只能用 cron + mysqldump 來定時備份!
能用就好?錯!備份出來的資料不夠完整,檔案 size 就是比 MySQL Administrator 手動備份小,害我還要不定期手動備份!
另外我極度討厭用 .bat 與 script,當然寫成 .php 也是一樣可惡!請參考這篇:

http://bbs.bnw.com.tw/Conference/viewto ... =3388#3388

發表於 : 2006-10-15 03:39
chiouss
進藤光 寫:看樣子兩位站長一點也不了解我~~嗚....
兩位站長?很抱歉,我不是站長,我只是玩家 :P
我的站就是只有我一個人而已...
由於 XOOPS 只能用 MySQL,我也只好把 MS SQL 給扔掉了,要不然肯定會用 SQL 2005 來架資料庫!
MS SQL 2005? 這東西目前拿來和 PHP 配合還有一些問題就是了 :Q
至於自動備份,最新的 MySQL Administrator 仍舊無法正常備份出 UTF-8,自動備份出來的全都是亂碼!會寫資料庫的公司,竟然連自動備份也不會寫... 真是 OOXX... Orz
你可以寫信過去用力的幹譙他們 :P
但是我剛剛去抓來用,備份出來的 sql 是正確的,所以應該是 Mac 版 or 你設定上的問題
很無奈的我也只能用 cron + mysqldump 來定時備份!
能用就好?錯!備份出來的資料不夠完整,檔案 size 就是比 MySQL Administrator 手動備份小,害我還要不定期手動備份!
這就是你語法的問題了,敝校用 PHP + MySQL 的機器不算少,通通都是用 cron + mysqldump 備份的,也沒聽說過有資料不完整的問題 :P

發表於 : 2006-10-16 00:36
進藤光
沒關係,大站小站,都是站長,我的討論區也很冷清、很小啊~ Orz
chiouss 寫:你可以寫信過去用力的幹譙他們 :P
但是我剛剛去抓來用,備份出來的 sql 是正確的,所以應該是 Mac 版 or 你設定上的問題
很無奈的我也只能用 cron + mysqldump 來定時備份!
能用就好?錯!備份出來的資料不夠完整,檔案 size 就是比 MySQL Administrator 手動備份小,害我還要不定期手動備份!
這就是你語法的問題了,敝校用 PHP + MySQL 的機器不算少,通通都是用 cron + mysqldump 備份的,也沒聽說過有資料不完整的問題 :P
已經在他們的 Bug Report 寫去幹譙這件事了,不過沒得到良好的回應... Orz
老實說 MSSQL 2000 就有這個問題,拖了很久我自己才終於想到這個解決問題的關鍵點,因此爛 SQL 2005 有問題,一點也不令人意外!在解決問題之前,我猜想還是得靠 ODBC 再轉換一次!透過 ODBC 抓取 SQL 只會讓速度更慢而已。

但是~~我自己雖然終於解決了 SQL 2000 的問題,後來卻全部放棄不用~嘿嘿嘿~~ XD :mrgreen:
我也有在 Windows Server 2003 上面安裝 MySQL 4,不過問題一堆~直接放棄比較快!

可否請教你的 mysqldump 備份參數是如何使用的呢?我寫得比較簡單:

代碼: 選擇全部

mysqldump --databases phpBB -u root --password=bnw > phpBB.sql

發表於 : 2006-10-16 00:52
chiouss
進藤光 寫:可否請教你的 mysqldump 備份參數是如何使用的呢?我寫得比較簡單:

代碼: 選擇全部

mysqldump --databases phpBB -u root --password=bnw > phpBB.sql
我之前這樣做有發生過 dump 出來沒有內容的問題 XD
根據 MySQL Administrator 給我的啟示,應該是 table 沒有 lock 的話 mysqldump 會出問題這樣,你可以參考一下 MySQL Administrator 說明檔裡面關於 backup 的介紹並且對照 Reference Manual 裡面寫的 mysqldump 參數來試試,最保險的方法應該是

代碼: 選擇全部

--lock-all-tables
:P