Ubuntu升级后恢复WordPress

昨天手欠将Ubuntu升级到了16.04.5 LTS,结果导致博客无法访问。大致看了下,主要的原因可能是:

  • nginx替代了apache2,成为了默认的http server
  • php升级到了7.0,需要启用新的libapache2-mod-php模块,还有php-mysql等

第一次尝试

暂时先继续使用apache,并重新下载了WordPress5.0,且仍然沿用之前旧的mysql数据库表,dbName以及tableName均保持一致,但站点仍然无法正常显示。

由于之前的WordPress是从4.*升级到5.0的,很多配置文件都不太一样,所以还是需要重新初始化。

第二次尝试

mysql数据库表启用新的表名前缀,终于站点可以正常打开了,但是之前的文章全部都没有了。插件以及主题可以从之前目录的wp-content目录中拷贝出来,文章全部是存在mysql表中的,因此需要将文章从之前的表中恢复出来。

第三次尝试

尝试通过表数据的完全复制来进行恢复

delete from wp_posts;
delete from wp_options;
insert into wp_posts select * from old_posts;
insert into wp_options select * from old_options;

但是站点又是无法正常显示,尝试失败。

第四次尝试

尝试了数据订正的方式,即先随便发一篇文章,然后将表中这条记录的关键字段用旧表中的记录进行update,从而“订正”为之前的博客文章。比如:

update wp_posts a join ngtnf_posts b set a.post_date = b.post_date, a.post_date_gmt = b.post_date_gmt, a.post_content = b.post_content, a.post_title = b.post_title, a.post_modified = b.post_modified, a.post_modified_gmt = b.post_modified_gmt where a.id = 45 and b.id = 314;

但是却出现了乱码。原来Ubuntu升级后,mysql的版本也进行了升级,从而造成表的默认charset也发生了改变

之前的默认charset为latin1
CREATE TABLE `ngtnf_posts` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `post_author` bigint(20) unsigned NOT NULL DEFAULT '0',
  `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_content` longtext NOT NULL,
  `post_title` text NOT NULL,
  `post_excerpt` text NOT NULL,
  `post_status` varchar(20) NOT NULL DEFAULT 'publish',
  `comment_status` varchar(20) NOT NULL DEFAULT 'open',
  `ping_status` varchar(20) NOT NULL DEFAULT 'open',
  `post_password` varchar(255) NOT NULL DEFAULT '',
  `post_name` varchar(200) NOT NULL DEFAULT '',
  `to_ping` text NOT NULL,
  `pinged` text NOT NULL,
  `post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_content_filtered` longtext NOT NULL,
  `post_parent` bigint(20) unsigned NOT NULL DEFAULT '0',
  `guid` varchar(255) NOT NULL DEFAULT '',
  `menu_order` int(11) NOT NULL DEFAULT '0',
  `post_type` varchar(20) NOT NULL DEFAULT 'post',
  `post_mime_type` varchar(100) NOT NULL DEFAULT '',
  `comment_count` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`),
  KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`),
  KEY `post_parent` (`post_parent`),
  KEY `post_author` (`post_author`),
  KEY `post_name` (`post_name`(191))
) ENGINE=InnoDB AUTO_INCREMENT=318 DEFAULT CHARSET=latin1

新的默认charset为utf8mb4
CREATE TABLE `wp_posts` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `post_author` bigint(20) unsigned NOT NULL DEFAULT '0',
  `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_content` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL,
  `post_title` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
  `post_excerpt` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
  `post_status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'publish',
  `comment_status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'open',
  `ping_status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'open',
  `post_password` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
  `post_name` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
  `to_ping` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
  `pinged` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
  `post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_content_filtered` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL,
  `post_parent` bigint(20) unsigned NOT NULL DEFAULT '0',
  `guid` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
  `menu_order` int(11) NOT NULL DEFAULT '0',
  `post_type` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'post',
  `post_mime_type` varchar(100) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
  `comment_count` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`),
  KEY `post_name` (`post_name`(191)),
  KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`),
  KEY `post_parent` (`post_parent`),
  KEY `post_author` (`post_author`)
) ENGINE=InnoDB AUTO_INCREMENT=84 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci 

mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> select id,post_title from ngtnf_posts where id = 123;
+-----+---------------+
| id  | post_title    |
+-----+---------------+
| 123 | 首页        |
+-----+---------------+
1 row in set (0.00 sec)

mysql> set names latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> select id,post_title from ngtnf_posts where id = 123;
+-----+------------+
| id  | post_title |
+-----+------------+
| 123 | 首页       |
+-----+------------+
1 row in set (0.00 sec)

第五次尝试

因此先要解决不同charset表之间数据复制的问题,通过mysqldump将表的记录导出,再导入到一张临时表中,即可完成latin1到utf8mb4之间的转换。

mysqldump -uroot --default-character-set=latin1 wordpress ngtnf_posts > posts.sql

将posts.sql中的表名替换为临时表名,将latin1替换为utf8mb4

mysql -uroot -Dwordpress < posts.sql 

数据导入到临时表后,即可沿用之前的数据订正的方式进行恢复了

update wp_posts a 
join ngtnf_posts_backup b 
set a.post_date = b.post_date, a.post_date_gmt = b.post_date_gmt, a.post_content = b.post_content, a.post_title = b.post_title, a.post_modified = b.post_modified, a.post_modified_gmt = b.post_modified_gmt where a.id = 45 and b.id = 314;

《Ubuntu升级后恢复WordPress》有1条评论

发表评论