书接上回,对于 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_PASSBACKUP_DIR,之后可以先跑一遍测试一下:

chmod +x typecho_backup.sh
./typecho_backup.sh

之后需要恢复就解压和恢复数据库即可

最后修改:2025 年 06 月 03 日
如果觉得我的文章对你有用,请随意赞赏