Chiloh

Chiloh Wei

一个尝试理解世界,理解自己的人
jike
twitter

Typecho 博客腳本備份與恢復

原本使用的是 Hexo 博客,但由於靜態博客設備間遷移比較麻煩,且數據備份不太方便,因此選換用成現在的 Mysql + Typecho 動態博客。這篇文章記錄了我使用腳本備份該博客相關數據,以及 Mysql 數據恢復的操作過程,也算是一種記錄和分享吧。

一、腳本備份#

該腳本是在網上搜索到的Typecho 網站數據備份腳本,我本人對該腳本做了少量修改,修改了命名規則與備份週期,同時為了方便,也將該腳本加入到了 Crontab 裡進行定期自動備份。如果博客更新不是很頻繁,也可以省掉該步驟使用人工手動備份。腳本代碼和使用方法如下:

用法:#

上傳腳本至 VPS,執行./backup_typecho.sh /path/to/yoursite.com/即可開始備份,其中/path/to/yoursite.com為博客程序安裝位置。備份結果放在/var/backups/typecho/yoursite.com/目錄下(該目錄可自定義)。

另外使用時注意給/var/backups/目錄添加寫入權限;如果需要添加 Crontab 自動備份,切換到/etc/目錄下並編輯crontab加入定時任務。例如:0 23 * * 6 root sudo /path/backup.sh /path/to/yoursite.com/,則表示每週六晚 11 點定時執行該腳本,其中/path/backup.sh為腳本存放位置,/path/to/yoursite.com/為博客站點根目錄(博客程序安裝位置)。

#設置備份目錄
backup_dir="/var/backups/typecho/"
function print_help(){
	echo 'Usage: $shell dir_to_typecho'
}

function die(){
	test -z "$1" || echo "$1"
	exit 1
}

function parse_db(){
	config_file=$2
	db_key=$1
	cat "$config_file" | grep -A 6 '$db' | grep '=>' | grep "$db_key" | awk -F "'" '{print $4}'
}


if [ "$#" -lt "1" ] 
then
	print_help
	exit 1
fi
te_dir="$1"
backup_dir="$backup_dir`basename "$te_dir"`"

#判斷備份時間是否過頻
min_time="43200" #12H
flag="/tmp/last_backup_typecho_`echo $te_dir | md5sum | awk '{print $1}'`"
last_backup="0"
test -f $flag && last_backup="`ls -l --time-style=+%s "$flag" | awk '{print $6}'`"
delta_time=$(expr "`date +%s`" - "$last_backup")

test "$delta_time" -lt "$min_time" && die "Time from last backup is less then $min_time, skip this time"


#初始化變量
te_config="$te_dir/config.inc.php"
te_usr_dir="$te_dir/usr"

#初始化環境
test -f "$te_config" || die "Can not find config file: $te_config"
test -d "$backup_dir" || mkdir -p "$backup_dir" || die "Can not create backup dir"

db_host=$(parse_db 'host' "$te_config")
db_port=$(parse_db 'port' "$te_config")
db_user=$(parse_db 'user' "$te_config")
db_pass=$(parse_db 'password' "$te_config")
db_name=$(parse_db 'database' "$te_config")

#備份數據庫
echo "Found database config: host=$db_host, port=$db_port, user=$db_user, pass=**** and database=$db_name"
echo 'Try to dump database....'
dump_target='/tmp/database.sql';
test -f "$dump_target" && rm "$dump_target"
mysqldump -h"$db_host" -P"$db_port" -u"$db_user" -p"$db_pass" "$db_name" > "$dump_target"
echo 'Dump done.'

#備份usr目錄
echo "Try to tar usr dir..."
tar_target="/tmp/user.tar.gz"
test -f "$tar_target" && rm "$tar_target"
tar czvf "$tar_target" "$te_usr_dir"
echo "Tar done."

echo "Try to pack..."
md5sum "$dump_target" > "$dump_target.md5sum"
md5sum "$tar_target" > "$tar_target.md5sum"
backup_file="$backup_dir/`basename "$te_dir"`.`date +%Y%m%d`.tar.gz"
tar czvf "$backup_file" "$dump_target" "$dump_target.md5sum" "$tar_target" "$tar_target.md5sum"

#清理臨時文件
rm $tar_target
rm "$tar_target.md5sum"
rm $dump_target
rm "$dump_target.md5sum"

touch "$flag"
echo "Backup to $backup_file done."

二、數據恢復#

由於我本人博客搭建在阿里雲 ECS 伺服器上,習慣使用lnmp 一鍵安裝包來安裝網站環境,因此下面的方法可能具有一定局限性,請參考使用。具體步驟如下:

** 第一步:** 使用lnmp vhost add命令來添加域名,通常我會添加帶www的和不帶www的,並以www域名為主;且數據庫名最好跟之前一樣,可省去很多麻煩;

** 第二步:** 在該域名文件夾下,使用下面命令來下載、安裝、啟用 Typecho 博客程序,可參考便宜 VPS+LAMP 搭建 + 博客一鍵安裝教程這篇文章;

wget https://typecho.org/downloads/1.1-17.10.30-release.tar.gz //下載typecho程序壓縮包
tar -zvxf 1.1-17.10.30-release.tar.gz //解壓typecho程序壓縮包
mv build/* . //移動解壓出來的build文件夾裡的內容到域名根目錄下
rm -rf build 1.1-17.10.30-release.tar.gz //刪除無用的文件

** 第三步:** 在瀏覽器輸入域名,根據頁面提示安裝 Typecho 博客;建議做好 HTTPS、HSTS、CDN 等相關部署操作;

** 第四步:** 將之前備份的文件壓縮包解壓,將其中的database.sql上傳到 VPS,然後執行下面的命令即可導入原 typecho 後台設置及文章數據。

mysql -u 用戶名 -p 密碼 數據庫名 < database.sql // 例如:mysql -u root -p 123456 DATA < database.sql

到了這一步,基本上就算是恢復成功了,剩下的就是解決其中可能遇到的雜七雜八的問題,如果沒問題就不需要做太多處理了。

** 補充:** 想要將備份好的文件,定期從伺服器自動同步到雲盤,可以參考:數據 Rclone 定期同步

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。