自建博客运维 · Typecho

Typecho 博客迁移
实战手册

换服务器、换域名不丢数据:把数据库、Web 目录、配置文件和伪静态规则完整搬过去,再逐项验证。

4 样必须搬迁的东西
mysqldumpMySQL 标准导出工具
整包Web 目录一键打包带走
零停机先迁后切 DNS
TL;DR · 核心结论

Typecho 迁移本质是搬四样东西:数据库(MySQL 用 mysqldump 导出,SQLite 直接拷 .db 文件)、整个 Web 目录(主题、插件、usr/uploads 附件都在里面)、根目录 config.inc.php 数据库配置、以及伪静态规则(nginx rewrite 或 Apache .htaccess)。标准做法是:旧站先全量备份 → 打包传输 → 新站恢复 → 改 config.inc.php 与数据库里的站点 URL → 重新申请/续签 SSL 证书 → DNS 切到新服务器 → 对照验证清单逐条验收。最大的坑是字符集不一致导致中文乱码,以及换域名后文章里写死的旧链接没有批量替换。

Scope

迁移到底要搬什么?

Typecho 是 PHP 轻量博客,数据分散在数据库和文件系统两处,漏搬一样就出问题

数据库 文章/评论/设置

所有文章、页面、评论、分类、标签和系统设置都在数据库里。MySQL 用 mysqldump 导出 SQL;SQLite 版则是 usr 目录下的一个 .db 文件,直接复制即可。

Web 目录 主题/插件/附件

整个站点目录打包带走:usr/themes 主题、usr/plugins 插件、usr/uploads 上传的图片附件。只搬数据库不搬目录,图片和主题全丢。

config.inc.php 连接配置

站点根目录的 config.inc.php 记录了数据库地址、库名、账号密码和表前缀。迁移后要按新服务器改这里,这是 Typecho 官方安装流程生成的核心配置文件。

伪静态规则 固定链接

开启了「文章名都可访问」这种固定链接后,需要 nginx 的 rewrite 规则或 Apache 的 .htaccess 配合。规则不搬,全站 404。详见 nginx rewrite 文档。

Backup & Restore

备份与恢复的完整步骤

先在旧站备好两份数据,再到新站原样恢复

① 导出数据库(MySQL)

  • 在旧服务器执行导出,指定 utf8mb4 避免乱码:mysqldump -u root -p --default-character-set=utf8mb4 库名 > typecho.sql
  • mysqldump 是 MySQL 官方备份工具,参数含义见 官方手册
  • SQLite 用户跳过本步,直接复制 usr/ 下的 .db 文件

② 打包 Web 目录

  • 进到站点根目录,整体压缩:tar -zcvf typecho-web.tar.gz ./*
  • 主题、插件、uploads 附件全部在包里
  • 用 scp / rsync 传到新服务器,或先下载到本地中转

③ 新站恢复文件与库

  • 解压 Web 包到新站目录,新建空库并导入:mysql -u root -p 新库名 < typecho.sql
  • 编辑 config.inc.php,填入新数据库的地址、账号、密码
  • 确认 usr/ 目录对 PHP 进程可写(上传附件要用)

④ 同步伪静态规则

  • Apache:确认 .htaccess 随目录带过来了,且开启了 rewrite
  • nginx:把旧站 server 块里的 rewrite 配置抄到新站,Typecho 常用写法是把不存在的路径转给 index.php
  • 改完执行 nginx -t 校验再 reload
Domain & Server

换域名 / 换服务器后要处理什么

数据搬完不等于迁移完成,外部链接与配置都要跟着改

变更项要做的处理常见遗漏
DNS 解析把域名 A 记录指向新服务器 IP;建议先低 TTL 观察,切流后再恢复忘了改 CDN / 子域名记录
SSL 证书在新服务器上用 certbot 等重新申请或续签证书,旧证书不能带走只迁了文件,忘了 HTTPS 证书,站点打不开
站点 URL改 config.inc.php 与数据库 option 表里的站点地址为新域名只改一处,后台跳转/静态资源仍走旧域名
正文内硬链接文章里写死的旧域名图片、内链做一次批量替换不替换,旧站一关图片全部 404
运行环境新服务器装好对应 PHP 版本与 required 扩展,参照 Typecho 安装要求缺 mbstring / pdo_mysql 扩展导致白屏
Checklist & Pitfalls

验证清单与常见坑

逐项打勾,确认迁移真的完成

验证清单 逐条过

首页能打开、单篇文章 404 消失、分类/标签页正常、后台能登录、上传一张新图能显示、RSS 输出正常、移动端样式正常。

数据库编码 乱码元凶

新旧库都用 utf8mb4,导出导入都加 --default-character-set=utf8mb4。中文乱码几乎都是字符集不一致造成的。

插件兼容 版本雷区

PHP 大版本升级后,老插件可能报错。迁移后先逐个进后台看插件列表,报错的临时停用或换替代插件,参照 Typecho 帮助文档。

文件权限 可写性

usr/ 目录需对 web 进程可写,否则无法上传附件、无法改主题。解压后注意属主,必要时 chown 调整。

FAQ

常见问题

Typecho 迁移要搬哪些东西?+
四样:一是数据库(MySQL 用 mysqldump 导出,SQLite 直接拷 .db 文件);二是整个 Web 目录,里面包含主题、插件和 usr/uploads 上传附件;三是根目录的 config.inc.php 数据库配置;四是伪静态规则(nginx rewrite 或 Apache .htaccess),固定链接才能正常访问。
换了域名之后旧文章的链接还能用吗?+
需要同步修改两处:一是 config.inc.php 里的站点地址,二是数据库 option 表中记录的站点 URL。文章正文里如果写死了旧域名的图片或链接,还要做一次批量替换,否则图片会 404。
迁移后中文标题变成乱码怎么办?+
基本是数据库字符集不一致导致的。确认建库时使用 utf8mb4 字符集与 utf8mb4_general_ci 排序规则,导出导入时指定 default-character-set=utf8mb4,新旧库字符集保持一致即可。
SQLite 版的 Typecho 怎么备份?+
SQLite 把整个数据库存成一个文件(默认在 usr 目录下的 .db 文件),停一下写入后直接复制该文件就是完整备份;恢复时把文件放回原路径即可,不需要 mysqldump。
References

参考来源