博客在进行迁移时报错了,搜了下在网上竟然有很多人遇到报错,但是从网上竟然没有搜索到使用 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