博客在进行迁移时报错了,搜了下在网上竟然有很多人遇到报错,但是从网上竟然没有搜索到使用 Typecho 自带的数据备份与恢复的操作。
只能搜索到说 Typecho 的备份与还原程序有问题,大部分人都建议直接备份并还原数据库,但是又说不出哪里又问题...
但是,从感觉上来说,一个较为大众化的程序应该不会出现这么低级的问题,于是留下此文,结果是大部分人的建议是正确的。

环境

新环境

Debian 9.13
nginx version: nginx/1.18.0
mysql Ver 15.1 Distrib 5.5.68-MariaDB, for Linux (x86_64) using readline 5.1
PHP 7.2.34
Typecho 1.1 正式版

旧环境

CentOS Linux 7.5.1804 (Core)
nginx version: nginx/1.12.2
mysql Ver 14.14 Distrib 5.5.62, for Linux (x86_64) using readline 5.1
PHP 7.2.28
Typecho 1.1 正式版

份文件格式错误与 sizeof() 错误

由于对 php 不了解,具体原因不做过多解释,大概是 php5 与 php7 以上版本兼容性问题,如需更详细的解释,请查看文章末尾"参考"。
使用 Notepad++ 或 Subline Text 3 等文本编辑软件,打开 typecho 的数据备份文件:备份文件.bak;
打开后,检查原环境中产生的备份文件中是否出现 sizeof() 错误,具体警告信息如下:

Warning: 
sizeof(): Parameter must be an array or an object that implements Countable in /www/wwwroot/yudelei.com/var/Widget/Backup.php on line 218

解决方法

编辑原环境中 /www/wwwroot/yudelei.com/var/Widget/Backup.php 文件,将:

if (sizeof($buffer) >= 1024 * 1024) {

改为:

if (is_array($buffer) && sizeof($buffer) >= 1024 * 1024) {

再执行备份与数据还原操作。

Column not found 错误

此问题是由于原环境中某些主题使用了某些插件,而相关插件在数据库中对数据库进行了更改(可能包括:查阅次数,点赞数等)或创建了新表,导致在新环境中恢复备份数据时,备份文件提供了过多的数据库字段,而新环境中并无相关的数据库字段。
可能有以下类似的报错信息:

SQLSTATE Column not found: 1054 Unknown column 'views' in 'field list'
SQLSTATE Column not found: 1054 Unknown column 'wordCount' in 'field list'
SQLSTATE General error: 1 no such table: typecho_metas

解决方法

在新环境中,安装 Typecho 后,并发布一片文章,并在文章中留下评论(如果有回复插件,可在评论中再进行下回复);
将在原环境曾经安装过的所有主题,以及各个主题附带的插件均在新环境中安装;
依次启用每套主题及主题所对应的插件,并使用其他浏览器或手机访问新发布的文章,建议多刷新几次。
最后在切回需要使用的主题,并使用"数据备份.bak"文件进行数据恢复操作。

说明

此方式与直接备份并还原数据库无本质区别,只是在于一个是通过前端操作来触发生成数据库表与字段,另一个是直接进行了数据库的备份与恢复。

参考

github.com/paypal/PayPal-PHP-SDK/issues/1014
stackoverflow.com/questions/49506003/sizeof-parameter-must-be-an-array-or-an-object-that-implements-countable

最后修改:2021 年 01 月 05 日 02 : 26 PM
如果觉得文章帮助了您,您可以随意赞赏。