元々は 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" #12時間
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."
二、データの復元#
私自身のブログは、Alibaba Cloud ECS サーバーに構築されており、ウェブサイト環境をインストールするためにlnmp ワンクリックインストールパッケージを使用することが一般的です。したがって、以下の手順は一定の制限があるかもしれませんので、参考にしてください。具体的な手順は以下の通りです。
ステップ 1:lnmp vhost add
コマンドを使用してドメインを追加します。通常、www
を含むドメインとwww
を含まないドメインの両方を追加し、www
ドメインをメインとします。また、データベース名は前回と同じにすることをお勧めします。これにより、多くの手間が省けます。
** ステップ 2:** ドメインのフォルダーで、以下のコマンドを使用して 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 //不要なファイルを削除
** ステップ 3:** ブラウザでドメインを入力し、ページの指示に従って Typecho ブログをインストールします。HTTPS、HSTS、CDN などの関連するデプロイ操作を行うことをお勧めします。
** ステップ 4:** 以前にバックアップしたファイルの圧縮ファイルを解凍し、その中のdatabase.sql
を VPS にアップロードし、次のコマンドを実行して元の Typecho バックエンドの設定と記事データをインポートします。
mysql -u ユーザー名 -p パスワード データベース名 < database.sql // 例:mysql -u root -p 123456 DATA < database.sql
このステップで、基本的には復元が成功したと言えます。残りの作業は、可能性のあるさまざまな問題を解決することです。問題がなければ、それ以上の処理は必要ありません。
** 追加情報:** バックアップしたファイルを定期的にサーバーからクラウドストレージに自動的に同期するには、データ Rclone 定期同期を参考にしてください。