折腾博客的时候,经常搬服务器,按理来说,迁移是一件很简单的事。
通常,数据迁移包括以下几步:
- 网站根目录打包迁移,例如public_html这样的目录。
- 数据库迁移,通过phpmyadmin或者navicat之类的,把mysql数据复制到新的服务器上面。
- 通过修改本机hosts检查新服务器是否部署成功。
- 更改DNS,实施迁移。
通常我在dnspod里面,设置的解析缓存时间很短,基本上我修改DNS,是马上生效的。但毕竟用户的DNS不在我们的控制范围,总会有用户解析到旧的服务器上面,杯具就这样发生了。
案例回放
一个内部系统,进行服务迁移,从A服务器到B服务器。但是迁移过程中,域名解析没有同步生效,有的用户访问到了A,有的用户访问到了B。
一些用户,在系统上面新建了一部分数据,这部分新的数据,一部分存放在A里面,一部分存放在B里面。很自然,我必须得让B里面的数据是最新的,于是我需要去复制A里面的新数据到B里面去。因为AB都有新数据,结果部分数据的ID冲突了。
ID冲突不要紧,insert的时候不要给ID,让B系统重新生成ID就好。但是这样又引入一个新的问题,数据表里面的ID有关联,新ID丢失了原来的关联。
解决方案
为了解决这个问题,复制A的新数据到B的时候,先给两边临时保存一下他们各自的ID,例如用temp_pid。
代码语言:javascript复制# 备份关联id
UPDATE `posts` SET temp_pid = pid
然后我们就可以根据这个temp_pid恢复新增数据的各种关联。
代码语言:javascript复制# 动态更新新关联id
UPDATE posts parent,posts child
SET child.parent_pid = parent.pid
WHERE child.parent_pid = parent.temp_pid
AND child.parent_pid <> 0
感谢@toobug提供的方案。
END
你们在服务迁移的时候,又是怎么做的呢?直接关闭旧系统?