书接上回,对于 Docker 类应用比较好备份,但是对于 Typecho 这种传统 php+数据库的就要废点脑子了
备份 Typecho 网站主要分为两个核心部分:网站文件和 MariaDB 数据库
网站文件
我的 Caddy 配置文件如下:
www.juniortree.com {
root * /var/www/typecho
encode gzip zstd
php_fastcgi unix//run/php/php8.2-fpm.sock
file_server
}
也就是只要备份 /var/www/typecho
这个文件夹即可
数据库
使用 mariadb-dump
命令行工具,一般操作如下:
mariadb-dump -u [数据库用户名] -p[数据库密码] [数据库名称] > [备份文件名].sql
要是忘记了数据库名字可以去 Typecho 的配置文件里面找,配置文件名叫 config.inc.php
:
先直接用命令行测试一下:
mariadb-dump -h localhost -P 3306 -u typecho -p'你的密码' typecho > typecho_backup_$(date +%Y%m%d).sql
成功的话会在当前目录下生成一个 .sql
文件,这个就是数据库的备份文件,在本地可以使用一些 SQL 工具查看
更进一步 - 定时任务
我拜托 Gemini 给我写了一个脚本:
#!/bin/bash
# --- 配置部分 ---
# Typecho 网站根目录
SITE_ROOT="/var/www/typecho"
# MariaDB 数据库信息
DB_NAME="typecho"
DB_USER="typecho"
DB_PASS="填写你自己的密码" # 警告:在脚本中硬编码密码存在安全风险!
DB_HOST="localhost"
DB_PORT="3306"
# 备份文件存放目录(请确保该目录存在且可写)
BACKUP_DIR="/home/typecho_backup" # 或者你喜欢的其他路径,例如 /home/user/backups
# 备份文件名时间戳
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# --- 脚本逻辑 ---
echo "开始 Typecho 备份流程..."
# 1. 如果备份目录不存在则创建
mkdir -p "${BACKUP_DIR}"
if [ ! -d "${BACKUP_DIR}" ]; then
echo "错误:无法创建备份目录 ${BACKUP_DIR},请检查权限。"
exit 1
fi
# 2. 定义备份文件名
DB_DUMP_FILE="${BACKUP_DIR}/db_${DB_NAME}_${TIMESTAMP}.sql"
FINAL_ARCHIVE_NAME="typecho_backup_${TIMESTAMP}.tar.gz"
FINAL_ARCHIVE_PATH="${BACKUP_DIR}/${FINAL_ARCHIVE_NAME}"
# 3. 备份 MariaDB 数据库
echo "正在备份 MariaDB 数据库 '${DB_NAME}' 到 ${DB_DUMP_FILE}..."
# 对于 MariaDB,推荐使用 mariadb-dump,但 mysqldump 通常也兼容。
# 使用 --no-tablespaces 以避免某些环境下权限问题。
mariadb-dump --host="${DB_HOST}" --port="${DB_PORT}" --user="${DB_USER}" --password="${DB_PASS}" --no-tablespaces "${DB_NAME}" > "${DB_DUMP_FILE}"
# 检查数据库备份是否成功
if [ $? -ne 0 ]; then
echo "错误:数据库 '${DB_NAME}' 备份失败。"
# 可选:如果存在部分备份文件则删除
[ -f "${DB_DUMP_FILE}" ] && rm "${DB_DUMP_FILE}"
exit 1
else
echo "数据库备份成功。"
fi
# 4. 创建包含网站文件和数据库备份的压缩包
echo "正在创建压缩包 ${FINAL_ARCHIVE_PATH}..."
# 将 SITE_ROOT 目录和 DB_DUMP_FILE 一起打包。
# tar 的 -C 选项用于切换目录,使归档内路径为相对路径。
tar -czf "${FINAL_ARCHIVE_PATH}" -C "$(dirname "${SITE_ROOT}")" "$(basename "${SITE_ROOT}")" -C "$(dirname "${DB_DUMP_FILE}")" "$(basename "${DB_DUMP_FILE}")"
# 检查 tar 是否成功
if [ $? -ne 0 ]; then
echo "错误:创建压缩包失败。"
# 可选:如果打包失败则删除数据库备份文件
[ -f "${DB_DUMP_FILE}" ] && rm "${DB_DUMP_FILE}"
exit 1
fi
# 5. 清理临时数据库备份文件
echo "正在清理临时数据库备份文件..."
rm "${DB_DUMP_FILE}"
# 6. 删除七天前的过期备份文件
echo "正在删除七天前的过期备份文件..."
find "${BACKUP_DIR}" -name "typecho_backup_*.tar.gz" -type f -mtime +7 -exec rm -f {} \;
echo "-------------------------------------"
echo "✅ Typecho 备份已成功完成!"
echo "压缩包位置:${FINAL_ARCHIVE_PATH}"
echo "-------------------------------------"
exit 0
你需要自己配置好 DB_PASS
和 BACKUP_DIR
,之后可以先跑一遍测试一下:
chmod +x typecho_backup.sh
./typecho_backup.sh
之后需要恢复就解压和恢复数据库即可
此处评论已关闭