前几天双十一,使用新用户优惠,入手了腾讯云的一台服务器。准备把几个网站迁移过去。在迁移过程中,遇到了几个问题,这里简单记录一下,以备后期查阅。
问题一:数据库迁移到腾讯云数据库
之前没有用过云数据库,这次双十一活动99元入手一台,然后兴冲冲的准备导入数据库,却发现数据库导入限制2M大小!但凡是运营过一段时间的网站,数据库怎么不止2M吧?而且还不支持压缩格式,仅支持sql格式。于是我就开了外网访问权限,然后用Navicat Premium链接云数据库以后导入的。刚才截图的时候,才发现,还有一个地方可以导入,也不知道是这几天新加的功能,还是我之前眼瞎没看到。。。如下图:
看来正确的方法是使用这里的导入功能。另外导入的话,要注意数据库版本,数据库版本不对的话,可以在云数据库管理界面找到版本升级功能进行升级。
问题二:OSS迁移到COS
腾讯云对象存储服务(COS)提供了迁移功能,你可以使用迁移功能,很方便的把阿里云OSS里的数据迁移过来。迁移过来以后,问题就开始出现了。之前用的是小麦苹果网提供的OSS Upload插件,那么迁移完成之后,首先要停用这个插件,不然前台打不开。然后装上沈唁志提供的Sync QCloud COS插件,开始使用COS。
这时候会发现,很多图片无法显示了。主要是因为两个插件的功能不太一样所导致的。OSS Upload支持在OSS中使用不同的路径访问,比如:https://cdn.xxx.com/uploads/2020/11/test.png
,而这个test.png在我们服务器的实际路径是:https://www.xxx.com/wp-content/uploads/2020/11/test.png
。然而,Sync QCloud COS插件并不支持这个功能。所以我们迁移的时候,要注意在COS存储桶里新建wp-content目录,然后把OSS的uploads文件夹迁移到这个目录里。当然,如果你在OSS里用的也是跟网站本身路径一样的话,那就不用改。然后就是在数据库中查找修改这些地址。推荐使用Better Search Replace插件进行搜索替换。普通搜索替换,对于数据库中被序列化的数值进行简单替换的话,会因为字符数量变化,造成数据损坏。替换之前,最好先备份数据库。
替换完成,发现调用原图的地方,可以正常显示图片了,可是很多缩略图无法显示。这是因为我之前在OSS Upload插件设置中禁用了缩略图功能,所以没有生成对应的缩略图。然而,Sync QCloud COS插件并不支持这个功能。所以我们要重新生成缩略图。于是开始在服务器上安装 WP-CLI ,并重新生成丢失的缩略图。
本以为万事大吉了,没想到还有惊喜在等着我。。在 WP-CLI 命令界面,可以看到很多主图丢失了。没有主图,自然没法生成缩略图。这个估计是OSS Upload插件的bug,因为我之前设置了在服务器上保留原图,结果却丢失了两千多张主图(总共六千多张)。如果不是这个插件的原因,那么可能是其他管理员在网站后台开启过一段时间的不保留原图功能。
好吧, 不管怎么说,丢失了这么多原图,得想办法找回来呀。先随便选了几个丢失的原图,去COS中查找,发现在COS中存在。这就好办了,整个下载COS中的uploads文件夹,然后上传到服务器的对应位置就可以了。可是数据太多了,7个多G,下载上传太慢,还浪费流量哈。那就针对性解决吧,只下载丢失的主图。首先查询全部媒体文章,然后获取到文件所在路径,然后用file_exists
判断文件是否存在,不存在的话,就从COS里下载到服务器。示例代码如下:
<?php
require_once dirname(__FILE__).'../../../../wp-load.php';
$args = array(
'post_status' => 'any',
'post_type' => 'attachment',
'posts_per_page' => -1,
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) {
$i = 0;
$upload_dir = wp_upload_dir();
while ( $the_query->have_posts() ) {
$the_query->the_post();
$file_name = get_post_meta($post->ID, '_wp_attached_file', true);
$file_url = $upload_dir['baseurl'] . '/' . $file_name;
$file_path = $upload_dir['basedir'] . '/' . $file_name;
if ( ! file_exists($file_path) ) {//如果本地不存在
$file_content = file_get_contents($file_url);//读取远程文件
if ( file_put_contents($file_path, $file_content) ) {//写入本地文件
echo $post->ID . ' -> <span style="color:green">ok</span><br>';
} else {
echo $post->ID . ' -> <span style="color:red">error</span><br>';
}
$i++;
}
if ( $i > 29 ) {//考虑到附件中可能会有mp4文件,然后执行时会造成超时,所以每次最对下载30个文件。
break;
}
}
echo '<h1>' . $i . '</h1>';
} else {
echo '<h1>没有找到!</h1>';
}
wp_reset_postdata();
偷懒写了这样一段代码,其实可以用COS的SDK,那样不但内网下载速度更快,而且还不走外网流量哈。反复刷新了有几十次以后,终于OK了。再次去用 WP-CLI 生成丢失的缩略图。惊喜又来了,提示有47个主图不存在。
没办法,再次排查吧。根据 WP-CLI提供的文章ID,找到对应的图片名称,发现服务器上已经存在了对应的主图,那么是什么原因造成的呢?首先考虑的是_wp_attached_file
这个meta字段不存在,所以获取不到文件路径。用文章ID在数据库的post_meta表中进行查找,可以看到确实丢失了 _wp_attached_file
字段。不过在post表中的guid字段中,有文件路径。OK,把上面的代码稍微改一下,继续处理吧。示例代码如下:
<?php
require_once dirname(__FILE__).'../../../../wp-load.php';
$args = array(
'post_status' => 'any',
'post_type' => 'attachment',
'posts_per_page' => -1,
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) {
$i = 0;
while ( $the_query->have_posts() ) {
$the_query->the_post();
$file_name = get_post_meta($post->ID, '_wp_attached_file', true);
if ( ! $file_name ) {
$file_path = str_replace('http://www.xxx.com/wp-content/uploads/', '', $post->guid);//仅保留年份开头的文件路径
$post_meta = update_post_meta($post->ID, '_wp_attached_file', $file_path);//更新到post_meta表中
var_dump($post_meta);
echo '<br>';
$i++;
}
}
echo '<h1>' . $i . '</h1>';
} else {
echo '<h1>没有找到!</h1>';
}
wp_reset_postdata();
再次去用 WP-CLI 生成丢失的缩略图。这次终于OK了。全部图片都找回来了。这个估计是历史遗留问题,而不是这次迁移造成的哈。