2008年2月3日 星期日

Linux 自動 備份 並 刪除 舊的備份檔 教學 適合 CentOS、Fedora、Ubuntu XAMPP

此教學主要是以CentOS 為例並且是安裝XAMPP伺服器套件的環境,不過Ubuntu也是可以。基本上只要是linux都ok。差別址在於"路徑"的問題,因為Ubuntu的路徑比CentOS少一些。
EX:Ubuntu的vsftpd.conf是放在/etc/下
而CentOS的vsftdd.conf則是放在/etc/vsftpd/下
可見Ubuntu在某些資料夾是有些減少與差異的。
只要在做的時候搞清楚就好了。概念都一樣。

備份前的準備。
一、有一個空間放備份檔。(本教學是另外切一顆磁區,並掛載為/back。)
二、瞭解一下怎樣寫shell。其實看本教學應該可以瞭解,要不也可以參考鳥哥的教學。

備份方式分為每週與每日兩種,並且可以自動刪除舊的備份檔。
檔案數量:3支shell檔案。
另外再到/etc/crontab中,寫每日制動執行的程序。
請照以下四個部份看吧。



第一部份
「每日備份mysql中資料庫的資料」
請大家在/back下(你要放備份的資料夾),透過vi或者gedit建立一個檔案名為「mysql_backup_daily.sh」
並編輯以下程式。

#--以下是程式碼-----------------------------------------------------

#!/bin/bash
#===============================================
#程式用途:每日備份mysql的資料庫檔案。
#說明:
#因為我是使用XAMPP架站的。
#所以MySql的資料是放在/opt/lampp/var/mysql。
#
#而此程式目的是備份每天mysql資料夾內的所有資料庫
#並且每個備份檔案都有日期標明。
#
#撰寫完後,再透過/etc/crontab來每日執行備份工作。
#
#
#===============================================
#歷史紀錄
#日期 內容 作者
#2008/2/3 完成第一次的撰寫。每日備份mysql M.K
#
#
# MK http://mkbfb.blogspot.com
#===============================================
#
#設定shell執行路徑,讓此程式在任何地方都可以執行。
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

# 1.設定檔名日期,以及備份檔之後要放的地方。
day=`date +%Y-%m-%d`

# 將/back/backup/daily資料夾設定為basedir變數。
basedir="/back/backup/daily"

# 2.XAMPP的MySQL資料夾位置 ( PATH = /opt/lampp/var/mysql )
# 備份前,我們先停止MySQL的運作
/opt/lampp/lampp stopmysql

# 進入/opt/lampp/var/
cd /opt/lampp/var/

# 在/opt/lampp/var/下,將MySQL打包壓縮備份到之後要放的地方。
tar -zcf "$basedir"/mysql."$day".tar.gz mysql

# 再將MySQL啟動
/opt/lampp/lampp startmysql

exit 0

#--程式碼結束-------------------------------------------------------

這樣這一程式,如果跑起來的時候。會將/opt/lamp/var/中的mysql資料夾,壓縮並備份到/back/backup/daily/底下,並且檔名會是mysql.年-月-日.tar.gz(ex: mysql.2008.02.03.tar.gz)。
以後要救資料或恢復資料庫的話,直接解壓縮並覆蓋回去就好嘍!^^



第二部份
「每週日備份重要的檔案」
請大家/back下(你要放備份的資料夾),透過vi或者gedit建立一個檔案名為「system_backup_weekly.sh」
並編輯以下程式。

#--以下是程式碼-----------------------------------------------------

#!/bin/bash
#========================================================
#程式用途:每週日備份系統檔與重要的檔案。
#說明:
#1.先把重要的檔案COPY到備份的資料夾後,
#2.再將這些重要的資料與服務備份起來。
#3.最後刪除COPY的資料,只留下備份檔。
#
# 重要資料與服務包含有:
# 1.使用者資料 userinfo (/home/底下的資料)
# 2.FTP的設定 vsftp (/etc/vsftpd/底下的設定)
# 3.ssh的設定 ssh (/etc/ssh/底下的設定)
# 4.www網頁內容 www (xampp放網頁的資料夾)
# /opt/lampp/htdocs/
# 5.xampp的設定 xampp (/opt/lampp/底下重要的設定)
# 6.sysconfig sysconfig(/etc/sysconfig/底下重要的設定)
# 7.rc.local開機設定 (/etc/rc.d/rc.local)
# 8.crontab例行程式設定 (/etc/crontab)
#
#以上,在M.K的server環境中,是M.K認為重要的檔案。
#若您自己有其他重要的,就加上吧。^^
#
#最後再將此程式加入/etc/crontab,並設定每週日執行
#
#=======================================================
#歷史紀錄
#日期 內容 作者
#2008/2/3 第一次完成 M.K
#
#
#
# M.K http://mkbfb.blogspot.com
#=======================================================
#設定shell執行路徑,讓此程式在任何地方都可以執行。
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
LANG=C;export LANG
LC_ALL=C;export LC_ALL

#設定路徑變數來備份
# 變數basedir等於/back/backup/weekly這個資料夾。
basedir=/back/backup/weekly

#建立備份用的資料夾
mkdir $basedir/userinfo
mkdir $basedir/vsftp
mkdir $basedir/ssh
mkdir $basedir/www
mkdir $basedir/xampp
mkdir $basedir/sysconfig
mkdir $basedir/rc.d
mkdir $basedir/crontab

#設定各個變數路徑
#設定變數userinfod等於/back/backup/weekly/userinfo以下依此類推。
userinfod=$basedir/userinfo
vsftpd=$basedir/vsftp
sshd=$basedir/ssh
www=$basedir/www
xampp=$basedir/xampp
sysconfig=$basedir/sysconfig
rc=$basedir/rc.d
crontab=$basedir/crontab

#1.系統的相關服務,主要服務有:
#(1)vsftpd:
#(2)xampp:
#(3)www網頁內容:
#(4)xampp設定檔


# 1.1 系統的 vsftpd 伺服器的僅有的設定檔喔!
# 將/etc/vsftpd/下的設定檔複製到變數資料夾$vsftpd。
# 以下依此類推。
cp -a /etc/vsftpd/* $vsftpd


# 1.2 系統的 sshd 伺服器的設定檔案!
cp -a /etc/ssh/* $sshd

# 1.3 系統的 www 網頁內容檔案!
cp -a /opt/lampp/htdocs/47 $www
cp -a /opt/lampp/htdocs/drupal-5.6 $www

# 1.4 系統的 xampp 設定檔案!
cp -a /opt/lampp/etc $xampp
cp -a /opt/lampp/phpmyadmin $xampp
cp -a /opt/lampp/phpsqliteadmin $xampp

# 1.5 其他需要備份的資料或設定檔
cp -a /etc/sysconfig/* $sysconfig
cp -a /etc/rc.d/rc.local $rc
cp -a /etc/crontab $crontab


sleep 10s
sync;sync

# ==============================================================
# 2. 主機的重要資料
# (1) 使用者的資訊,重點在 /etc/passwd, shadow, group。
cp -a /etc/group $userinfod
cp -a /etc/passwd $userinfod
cp -a /etc/shadow $userinfod

#將使用者的家目錄/home打包起來(注意:在這裡沒有壓縮唷)。
#並省略home/lost+found這個資料夾。
cd /
tar -pcf $userinfod/home.tar /home --exclude home/lost+found

sleep 10s
sync;sync

# ==============================================================
# 3. 將主機的重資料壓縮。並將檔案加上日期。
#設定日期變數day
day=`date +%Y-%m-%d`

#到變數basedir,也就是/back/backup/weekly這個資料夾。
#將複製好的所有檔案打包並壓縮。
cd $basedir
tar -zpcf sys_backup_weekly."$day".tar.gz * --exclude sys_backup_weekly."$day".tar.gz


#刪除剛剛所有複製過來的資料,只留下,以節省空間。
rm -rf $basedir/userinfo
rm -rf $basedir/vsftp
rm -rf $basedir/ssh
rm -rf $basedir/www
rm -rf $basedir/xampp
rm -rf $basedir/sysconfig
rm -rf $basedir/rc.d
rm -rf $basedir/crontab

sleep 10s
sync;sync

exit 0

#--程式碼結束-------------------------------------------------------

這一程式,如果執行的時候。會將程式碼中有列出的資料夾與檔案,壓縮並備份到/back/backup/weekly/底下,並且檔名會是sys_backup_weekly.年-月-日.tar.gz(ex: sys_backup_weekly.2008.02.03.tar.gz)。
以後要救資料或恢復資料庫的話,直接解壓縮並覆蓋回去就好嘍!^^



第三部份
「自動刪除舊的備份檔」

請大家再/back下(你要放備份的資料夾),透過vi或者gedit建立一個檔案名為「del_old_backupfile.sh」
並編輯以下程式。

#--以下是程式碼-----------------------------------------------------

#!bin/bash
#==========================================
#程式用途:刪除舊的備份檔。
#說明:
#因為我們的備份有分「每週系統備份」與「每日mysql備份」。
#所以要刪除的備份檔,分為每日與每週兩部份:
#
#1.刪除十天前,每日舊的mysql備份檔。
# mysql備份檔案放在/back/backup/daily/下
# ex:檔名為mysql.2008-02-03.tar.gz
# mysql. 年 -月-日.tar.gz
#
#2.刪除三週前,每週舊的統備份檔。
# 系統備份檔案放在/back/backup/weekly/下
# ex:檔名為backupweekly.2008-02-03.tar.gz
# backupweekly. 年 -月-日.tar.gz
#
#
#===========================================
#
#日期 內容 作者
#2008/2/3 第一次完成 M.K
#
#
#
# MK http://mkbfb.blogspot.com
#===========================================
#設定shell執行路徑,讓此程式在任何地方都可以執行。
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

#1.刪除十天前,的舊每日備份檔
date10=`date --date='10 days ago' +%Y-%m-%d`

rm -rf /back/backup/daily/mysql."$date10".tar.gz


#2.刪除21天前,的舊每週備份檔
date21=`date --date='21 days ago' +%Y-%m-%d`

rm -rf /back/backup/weekly/sys_backup_weekly."$date21".tar.gz

exit 0

#--程式碼結束-------------------------------------------------------

以上的日期大家可以是自己的情況而定,若你的備份空間夠大,就放久一點ㄅ^^。
比如:
我要改成自動刪除一個月前的備份檔案。
以刪除每日備份的例子,將數字改成你要的天數就可以了。
date10=`date --date='10 days ago' +%Y-%m-%d`
rm -rf /back/backup/daily/mysql."$date10".tar.gz

修改成
date30=`date --date='30 days ago' +%Y-%m-%d`
rm -rf /back/backup/daily/mysql."$date30".tar.gz


以上三支檔案都寫好了後,怎樣那他順利自動執行呢。
這時請看第四部份嘍。



第四部份
「將以上三支檔案寫入/etc/crontab裡,
讓備份程式例行運作」


請用vi或者gedit,編輯/etc/crontab這支檔案。
並加入以下程式碼。就可以了。


#--以下是程式碼-----------------------------------------------------

#buckup shell script auto run
30 3 * * 0 root /back/system_backup_weekly.sh
30 2 * * * root /back/mysql_backup_daily.sh

#delect old backupfiles
35 3 * * * root /back/del_old_backup_file.sh

#--程式碼結束-------------------------------------------------------

此程式的意思是
1.每星期日的凌晨03:30使用root執行/back/system_backup_weekly.sh這支檔案。(所以就會每一星期備份系統檔案一次。)
2.每天的凌晨02:30使用root執行/back/mysql_backup_daily.sh這支檔案。(所以就會每一天備份mysql資料)
3.每天凌晨3:35自動刪除10天前的mysql資料與三禮拜(21天)前的系統備份檔。


參考資料:鳥哥的linux私房菜-淺談備份策略教學

沒有留言: