這個是我日常用作備份 MySQL database 的 shell script,因為以前是直接將所有資料庫匯出成一個 sql 檔,當其中一個資料庫有問題時,因為沒問題的資料庫不想有改動,要復原資料很麻煩。今天改了一下,它會用 mysqldump 將所有資料庫匯出成獨立 sql 備份檔,然後用 gzip 壓縮成 .gz 檔案。程式會儲存 5 天的備份,當有新備份時,最舊的備份會自動刪除。
使用方法:
修改 db_user, db_passwd 及 db_host 修改成你的 mysql 登入資料,所使用的用戶權限需要與 mysql root 相同。backup_dir 修改成你希望儲存備份的目錄。
最後只要把程式加入 crontab 排程自動執行即可。
檔案下載: mysql_backup.sh
站大,您的下載網址有誤。
正確應為:
http://www.real-blog.com/wp-content/uploads/mysql_backup.sh
Comment by jaceju — March 21, 2006 @ 2:23 pm
謝謝提醒!
Comment by Sam Tang — March 21, 2006 @ 2:28 pm
[…] MySQL 備份 shell script (tags: Tech Script Backup MySQL) […]
Pingback by -TMA-1- » Blog Archive » links for 2006-03-22 — March 22, 2006 @ 2:02 pm
這個 shell script 很實用感謝站大的分享 ~~
Comment by 4wei — March 25, 2006 @ 5:58 pm
不好意思 請問一下 為什麼
我將 script 加到 排序時 可以建出 資料夾跟 排序過
但資料夾都是空的 備不出資料
但直接執行script 時 可以備出來呀
謝謝
Comment by alex — April 25, 2006 @ 9:18 am
試試將 $MYSQLDUMP 及 $MYSQL 改成你主機上面 mysqldump 及 mysql 的絕對路徑。
Comment by Sam Tang — April 25, 2006 @ 9:56 am
可以了 哇 真是高手
謝謝你的指點 和 無私的分享
Comment by alex — April 26, 2006 @ 1:05 pm
您好:請問要怎麼把備份出來的資料還原呀!?
謝謝囉!
Comment by sidney — July 14, 2006 @ 10:24 am
再補充一下,我要一次全部把資料還原哦!
ps.站長,我把它加入收藏囉!
Comment by sidney — July 14, 2006 @ 10:29 am
sidney, 如果要全部還原,可以下:
mysql your_db -uroot -p
Comment by piano — August 13, 2006 @ 8:22 pm
sorry, 上一則”
Comment by piano — August 13, 2006 @ 8:24 pm
mysql your_db -uroot -p < your_db.sql
Comment by piano — August 13, 2006 @ 8:25 pm
請問這支程式只能在Linux使用嗎?如果是Windows有程式可以像這樣排程備份嗎?謝謝
Comment by tommy — November 1, 2006 @ 2:19 pm
請問站長大大,我想延續第六個問題。
就是您不是使用which mysql來當做mysql絕對路徑嗎,我在console下的確可以抓的到mysql絕對路徑,
可是為何放到crontab就不行呢?
感謝站長的熱心
Comment by Gary — December 3, 2006 @ 10:58 am
try:
chmod 755 mysql_backup.sh
Comment by msted — December 24, 2006 @ 5:28 pm
你好,我將你的程式改寫,結果可以使用,很方便~但是有天我重慣FC4,結果同樣的程式執行,他卻說
『:bad interpreter:沒有此一檔案或目錄』,但是我可以很確定有該檔案,不知道是那邊出問題,希望你能解答~
Comment by Tom — June 29, 2007 @ 5:43 pm
這個 shell script 的第一行是:
#!/bin/sh
這一行告訴系統 /bin/sh 用作解譯 shell script 內的指令,所以要確定你的系統是否有安裝 sh 這個 shell。
Comment by Sam Tang — June 30, 2007 @ 10:49 am
很棒的shell script,
對我有很大的幫助^^
超感謝!
Comment by gage — July 7, 2007 @ 4:56 pm
如何把備份 5 天 改成更多天,謝謝大大!
Comment by youngten — September 5, 2007 @ 9:22 am
將以下一行的 5 改成想要備份的日數:
test -d "$backup_dir/backup.5/" && $RM -rf "$backup_dir/backup.5"
例如 7 天便改成:
test -d "$backup_dir/backup.7/" && $RM -rf "$backup_dir/backup.7"
以及將以下一行修改,例如 7 天,便這樣:
for int in 6 5 4 3 2 1 0
以上改動我沒有測試過,記得測試一下才拿來用喔。
Comment by Sam Tang — September 5, 2007 @ 10:37 am
大大謝謝你的回答,我用你的程式執行,出現以下訊息,不知該如何解決,壓縮有成功 information_schema 資料是空白,再次謝謝!
mysqldump: Got error: 1044: Access denied for user ‘user’@'localhost’ to database ‘information_schema’ when using LOCK TABLES
Comment by youngten — September 5, 2007 @ 11:38 am
resolved
1.我試過備份30天,it works
2.using single transaction could handle this problem
3.thanks
Comment by youngten — September 5, 2007 @ 11:04 pm
1.本以為都OK了,結果用crontab 還是不行,原因應該還是一樣,因為我找不到 mysql log 所以也無法確定,
2.直接RUN不用crontab 到是可以
3.Access denied for user ‘user’@’localhost’ to database ‘information_schema’ when using LOCK TABLES
Comment by youngten — September 6, 2007 @ 2:17 am
看上面的回應:
試試將 $MYSQLDUMP 及 $MYSQL 改成你主機上面 mysqldump 及 mysql 的絕對路徑。
另外,Access denied for use 是 mysql 用戶的權限問題。
Comment by Sam Tang — September 6, 2007 @ 10:11 pm
我的問題跟 14 gary 一樣
請問站長大大,我想延續第六個問題。
就是您不是使用which mysql來當做mysql絕對路徑嗎,我在console下的確可以抓的到mysql絕對路徑,
可是為何放到crontab就不行呢?
感謝站長的熱心
Comment by Gary — December 3, 2006 @ 10:58 am
Comment by youngten — September 7, 2007 @ 7:50 am
想請教一下,關於10樓和12樓討論到備份的問題,可不可以說的再詳細一點,我還是不太懂要如何做,可否用站長所提供sh備份後的資料來做說明,謝謝
Comment by Takuya — December 3, 2007 @ 12:13 pm
假如你的資料庫名稱為 my_database,以下是還原方法:
1. 用 gzip 解壓備份檔,例如 gzip -d my_database.gz
2. 輸入以下指令:
mysql my_database -uroot -p < my_database.sql
然後輸入 mysql 的 root 密碼。
Comment by Sam Tang — December 3, 2007 @ 1:04 pm
crontab 執行這個 shell script時
當您用一般使用者打入
ps -aux
您的密碼就被看光光了
請參考官方的密碼安全設定修改
http://dev.mysql.com/doc/refman/5.1/en/password-security.html
Comment by hodraw — March 20, 2008 @ 11:49 am
例如在 /root 底下
> vi .my.cnf
加入
[client]
host=localhost
user=root
password=password
然後
> chmod 600 .my.cnf
(限制只有 root 能存取)
然後把 mysql_backup.sh 裡面的
db_user=”root”
db_passwd=”"
db_host=”localhost”
這三行移除
all_db=”$($MYSQL -u $db_user -h $db_host -p$db_passwd -Bse ’show databases’)”
改成
all_db=”$($MYSQL -Bse ’show databases’)”
$MYSQLDUMP -u $db_user -h $db_host -p$db_passwd $db | $GZIP -9 > “$backup_dir/backup.0/$time.$db.gz”
改成
$MYSQLDUMP $db | $GZIP -9 > “$backup_dir/backup.0/$time.$db.gz”
這樣就預設就會去讀取 /root/.my.cnf 裡面的host、user、passwd 了
Comment by hodraw — March 20, 2008 @ 12:29 pm
我把程式抓下來直接在 Linux 上執行, 卻發生 common not found 之類的錯誤訊息, 後來我用筆記本開啟原檔案然後再開 vi 貼上, 就可以執行了 …
Comment by rice — March 20, 2008 @ 2:16 pm