做英文站的站长买了台新VPS,准备把老机器上的站点搬过去,命令敲到一半停住了,不知道是先改DNS还是先把数据导过去。vps怎么迁移,顺序定死就三步:先在新机还原数据、再切DNS、再逐项验证。切DNS之前,新机必须已经能自己独立跑通,停机时间才压得下来。MySQL官方手册里说,mysqldump做的是逻辑备份,产出一组可执行的SQL语句,用来重现原数据库的对象定义和表数据,打包这一步的技术底座就在这儿。
对出海做站的人来说,换机器是成本和服务商稳定性出了问题之后的常规动作。这类活最怕的不是命令难,是顺序乱。旧机先关、DNS先改、数据最后搬,任何一步提前,访客那边就是全站打不开。
- 这是换VPS时把站点搬过去、把停机时间压短的操作顺序:先打包、后切DNS、再逐项验证。
- 官方依据在MySQL的mysqldump手册、PostgreSQL的pg_dump手册和Let's Encrypt的集成指南里。
- 顺序不能换:数据打包和还原都在旧机还活着的时候完成。
- 官方页没有给迁移耗时和费用数字,别信任何拍脑袋的「半小时搞定」。
- 最容易踩的坑是拿mysqldump当大数据量的快速备份,官方明说它不是为这个设计的。
下面把三段顺序拆成能照着做的动作,每一步写清楚做什么、为什么这么做、出问题回头查哪里。
本文目录
先搞清楚:VPS迁移到底在搬什么
搬站不是把文件夹复制过去就完事。一台跑着网站的VPS里,真正要跟着走的有四样东西,少一样新机就跑不起来。
要搬的四样东西:站点文件、数据库、证书与配置、域名解析指向
站点文件是程序本体、主题、插件、上传的图片附件。数据库是文章、设置、用户、订单这些结构化数据。证书与配置包括HTTPS证书、Nginx或Apache的站点配置、PHP版本、伪静态规则。域名解析指向是最后一步才动的,把域名的A记录从旧机IP改成新机IP。
前三样在新机上必须先跑通,第四样才是让访客看到新机。顺序颠倒,等于让访客去敲一扇还没装好门框的门。
为什么顺序比速度重要:DNS一改,访客就去新机了
DNS是域名到IP的翻译表。A记录一改,全世界解析到这个域名的访客就会被送到新IP。新机上如果没有完整的程序和数据库,访客看到的是数据库连接错误、403、或者一个空白首页。这时候你想回滚,还得等旧记录重新生效。
打包这一步本身也有备份的价值。WordPress站点在动手迁移前先做一次完整备份,出任何问题都还有退路,具体做法可以照着WordPress备份教程走一遍。
迁移前检查清单:这6项没确认就别动手
下面每一项都写成「动作、判断标准、不通过怎么回查」,过不了就先修,别硬上。
1. 新机能不能连、磁盘够不够、系统版本对不对
动作是用SSH登录新机,跑一遍磁盘剩余空间和系统版本。判断标准:剩余空间要能装下站点文件加数据库导出文件再加还原时的临时占用,操作系统大版本和旧机一致或兼容。不通过就回查买机器时选的配置,空间不够只能加盘,或者先清老站的日志和缓存。
SSH这一步如果还没跑通,先看SSH上手步骤,连不上机器后面全都免谈。选机器本身的门道,可以翻海外vps服务器那篇慢慢看。
2. 数据库账号权限够不够
mysqldump对权限有明确要求:被导出表的SELECT、被导出视图的SHOW VIEW、被导出触发器的TRIGGER;不用--single-transaction时需要LOCK TABLES;不用--no-tablespaces时需要PROCESS,这条从MySQL 8.0.21起生效。另外从8.0.32起,如果gtid_mode=ON且gtid_purged=ON或AUTO,配合--single-transaction还需要RELOAD或FLUSH_TABLES权限。
判断标准是拿这个账号实际跑一次小库导出,能出文件就是够。不通过就用root或有权限的账号补授,别指望报错之后它自己好。
3. 老站当前证书什么时候到期、续期是不是自动的
动作是打开站点看证书详情里的到期时间,再看服务器上的自动续期任务是否在跑。判断标准:剩余有效期足够覆盖整个迁移窗口。Let's Encrypt默认证书有效期是90天,官方建议在到期前30天续期,所以剩余不足30天就该在新机上重新签发,别把一张快过期的证书搬过去。
4. 域名解析后台的登录方式与当前记录先存档
动作是登录域名解析后台,把当前的A记录、CNAME记录、MX记录、TXT记录全部截图或抄下来。判断标准:你能独立登录后台,并且知道哪条记录是主域名、哪条是www。不通过就先把后台账号找回来,迁移当天现找密码是最常见的手忙脚乱。
5. 备份留一份在异地,别只留在老机上
动作是把打包好的站点文件和数据库导出文件下载到本地或者另一台存储上。判断标准:老机被释放、被重装、被服务商停机,你手上还有一份能还原的完整数据。这条不是多余,换机器最常见的翻车就是数据刚搬一半,旧机器先到期了。
6. 迁移窗口避开证书续期日和流量高峰
动作是看一眼自动续期任务下次触发的时间,把迁移安排到别的时间段。判断标准:迁移过程中不会有另一件事同时在改配置。证书续期失败不该被当成致命错误,官方要求做优雅重试和指数退避,也就是说续期本身有容错,但迁移当天多一个变量就多一处要排查的地方。
第一步:把数据打包搬到新机
打包分两块:文件打包和数据库导出。两块都做完,才算「新机有料可还原」。
站点文件:打包压缩后传过去,保留目录权限
动作是在旧机上把站点根目录打成一个压缩包,用scp或sftp传到新机,再解压到对应目录。理由是文件数量多的时候逐个传容易中断,压缩成一个包传完再解,断了重传一次就行。
权限要一起带上。WordPress这类程序对目录权限敏感,上传目录需要可写,程序文件不需要。传完先对比两边的文件数,数量对不上就是传漏了,回头查压缩包里有没有排除掉上传目录。
MySQL:mysqldump导出单个库,三个关键选项
导出单个数据库的基础命令是这样,写成一行在旧机上执行(把库名和文件名换成你自己的):
mysqldump -u 用户名 -p --single-transaction --default-character-set=utf8mb4 库名 --result-file=导出文件名.sql
三个选项各自管一件事。--single-transaction让导出在一个事务里完成,InnoDB表能拿到一致快照,同时省掉LOCK TABLES权限要求。--default-character-set=utf8mb4避免中文和表情符号变成问号。--result-file直接写文件,绕开输出重定向的编码问题。
Windows上要特别注意:用PowerShell配合输出重定向做导出会生成UTF-16编码文件,而UTF-16不允许作为连接字符集,这个文件根本加载不进去。官方的绕开办法就是改用--result-file,它以ASCII格式创建输出。
导出完先看文件大小,几百字节大概率是空库或者权限不对。再打开文件头部看一眼,正常应该有建表语句。想看当前版本支持哪些选项,执行mysqldump --help。
PostgreSQL:pg_dump选格式,还原配pg_restore
pg_dump的导出分脚本格式和归档格式两类。脚本格式是纯文本,里面是要重建数据库的SQL命令,还原时把脚本喂给psql即可。归档格式必须配合pg_restore重建数据库,好处是能选择性还原,甚至重排还原项。
实际迁移里优先选custom格式(-Fc)或directory格式(-Fd)。官方说这两种最灵活,支持选择和重排归档项、支持并行还原、默认压缩。要并行导出只能用directory格式,因为只有它允许多个进程同时写数据,而且并行导出前要确认max_connections能容纳njobs加1个连接。
还有个容易忽略的点:pg_dump只导出单个数据库。要导整个集群或者角色、表空间这类全局对象,得用pg_dumpall。
大数据量怎么办:mysqldump不是快速备份方案
官方写得很直接:mysqldump不是为大量数据做快速或可扩展备份的方案。数据量大时,即使备份步骤耗时还算合理,还原也可能很慢,因为重放SQL语句涉及插入、建索引这些磁盘I/O。
规模大的库,官方建议用物理备份,按原始格式复制数据文件以便快速还原。表以InnoDB为主或者InnoDB与MyISAM混合时,可以考虑MySQL Enterprise提供的mysqlbackup。这几个判断要在动手前做,别导到一半才发现要等几个小时。
第二步:在新机把站点跑起来再切DNS
这一步的目标只有一个:不依赖域名,新机自己就能把站点跑通。
建库、导数据、改站点配置文件里的数据库连接
动作是在新机上建一个同名数据库和同名用户,把导出文件导进去。MySQL用source命令或命令行导入,PostgreSQL用pg_restore还原归档文件。导完检查表数量和数据行数,跟旧机对一遍。
然后是改配置文件。站点根目录下的配置文件里通常有数据库主机、库名、用户名、密码四项,全部改成新机的。改完别急着开浏览器,先在后台点一次「测试连接」,返回成功再往下走。这一步是人必须亲手做的,AI替不了。
服务器环境如果还没搭,宝塔面板这类工具能把建站流程缩短,具体步骤见宝塔面板搭建网站。
用hosts指向新机IP先自测,别等DNS生效才发现问题
动作是在自己电脑的hosts文件里加一行,把域名指向新机IP。这样只有你这一台机器访问的是新机,别人还是走旧机。判断标准:首页能打开、内页能打开、后台能登录、表单能提交,四项都过。
这一步是整个迁移里最省时间的设计。DNS还没动,你已经有充足的时间在新机上排查,访客那边完全无感。测完记得把hosts里那一行删掉,不然过几天你自己都忘了为什么访问的是旧内容。
证书:新机重新签发还是搬过去
看剩余有效期决定。剩余不足30天的,按到期前30天续期的规则,直接在新机上重新签发,顺手把自动续期在新机上配好。
用http-01挑战签证书的话,新机必须允许入站80端口流量,所以别用IP白名单去卡80端口。官方还建议始终允许明文HTTP访问并重定向到HTTPS,这比直接拒绝或丢弃80端口连接的体验更好,安全性相同。
第三步:DNS什么时候切、怎么切
切DNS是整件事里唯一一个访客能感知的动作,所以它必须排在最后,并且要留好退路。
切之前把TTL调小,留出回滚窗口
TTL是解析记录的缓存时间。把TTL调低,等旧记录在各地缓存里过期,再改A记录。这样一旦新机出问题,把A记录改回旧IP,回滚生效的时间也短。
如果跳过这一步直接改A记录,回滚时可能还要等原来的TTL时长。这一天的等待看着浪费,实际是给自己留的保险。
改A记录到新机IP,改完自己先查解析结果
动作是在域名解析后台把主域名和www的A记录值改成新机IP,保存。然后在本地用nslookup或dig查一次,看返回的是不是新IP。判断标准:查询结果指向新机,且用新IP直接访问站点能打开。
各地DNS生效时间不一样,海外访客和国内访客看到的切换时点也会错开。这期间新旧两台机器都要保持可访问,别急着关旧机。
老机先别关,保留一段时间做回滚
判断标准是新机稳定跑过一段观察期,日志里没有异常报错,访问数据正常,再把旧机停掉或者退掉。保留期内旧机的数据库不要再写入,否则两边数据分叉,回滚回去反而丢数据。
如果迁移的是IP而不是域名,换IP的操作看VPS换IP怎么换,思路和切解析是一回事。
第四步:迁移后逐项验证清单
切完DNS不等于迁移完成,下面四层都要过一遍。
站点层:首页、内页、后台登录、表单提交
首页和内页各开几个,重点看带图片的页面和带评论的页面。后台登录一次,确认账号密码没丢。表单提交一条测试数据,看有没有进数据库、有没有发通知邮件。
数据层:数据库连接、写入一条测试数据、看有没有报错
在新机上发布一篇测试文章或者改一个设置项,再打开看前台有没有变化。这一步验证的是写权限,只读能过写不了一定会出问题。同时看服务器错误日志,数据库连接类的报错要当场处理。
证书层:到期时间、HTTPS是否正常、80端口是否放行
浏览器地址栏看锁标,点进去看证书到期时间和签发对象对不对。80端口要放行,Let's Encrypt的http-01挑战需要入站80端口,续期时会用到。所有挑战类型还需要允许入站53端口(TCP与UDP)到权威DNS服务器。
解析层:A记录是否已指向新机、53端口是否可达
再查一次解析结果,确认主域名和www都指向新机。用在线工具或本地命令查53端口通不通。解析没生效就别去改站点配置,那会把问题搞得更乱。
如果迁移后站点打不开、或者能打开但跳到了错的地址,通常是站点配置里的域名和地址没改,这类情况的处理见迁移后打不开怎么改回地址。
数字和限制:迁移这件事上官方给了哪些硬指标
下面这些数字都来自官方文档,迁移时对着看,能省掉一批试错。

| 项目 | 数字 | 对迁移意味着什么 |
|---|---|---|
| Let's Encrypt证书默认有效期 | 90天 | 剩余不足30天建议直接在新机重签,别搬旧证书 |
| 续期时机 | 到期前30天 | 迁移窗口避开续期日,少一个变量 |
| 单张证书名称上限 | 100个 | 多个站点合成一张证书时算好域名数量 |
| pg_dump并行连接数 | njobs + 1 | 并行导出前确认max_connections够用 |
| MySQL PROCESS权限要求 | 8.0.21起 | 新旧版本权限要求不同,先跑mysqldump --help |
证书相关的三个数字决定你要不要重签,数据库相关的两个数字决定你的导出命令在该版本上能不能跑通。其余关于耗时和费用的数字,任何精确到分钟的承诺都不必当真。
常见误区和排查:迁移卡住时按这个顺序查
导出文件导不进去:先看是不是PowerShell生成的UTF-16
在Windows上用输出重定向做的导出,编码是UTF-16,而UTF-16不允许作为连接字符集,这个文件加载不进去。改用--result-file重新导一次就好。这个坑排查起来最快,先看文件编码再怀疑别的。
pg_dump部分导出还原失败:-n和-t不导依赖对象
用-n指定schema或用-t指定表时,pg_dump不会导出这些对象可能依赖的其他对象,所以不保证单独还原能成功。要部分导出就先导出整个数据库,再用pg_restore挑要还原的部分。
并行导出中断:有人加了排他锁,或连接数不够
并行导出时如果worker进程拿不到表上的共享锁,说明期间有人请求了排他锁,pg_dump只能中止。另一种情况是连接数不够,要确认max_connections能容纳njobs加1。另外运行pg_dump时要看标准错误上的警告,很多问题在那里就有提示。
命令行写密码:改用选项文件
官方说在命令行里直接写密码应被视为不安全,应该改用选项文件。这不只是安全问题,脚本里带明文密码,日志和命令历史里都会留一份。
GTID开着还直接加载含系统表的导出
服务器开了gtid_mode=ON,导出文件里又包含系统表时,官方不建议直接加载这个导出文件。要么导出时不带系统表,判断标准是看导出文件里有没有系统表的建表语句。
如果整个迁移过程慢得离谱,先分清是网络慢还是磁盘慢,加速思路见VPS速度慢如何加速。
用AI帮你把迁移命令和验证表整理出来
AI在这件事上做的不是替你执行,是把命令和清单整理对,省掉翻文档的时间。分三步。
第一步,让AI按官方手册拼还原命令,并逐条注明每个选项在手册里的作用。第二步,把迁移前检查清单整理成勾选表,每条标出对应哪份官方文档。第三步,把验证项整理成打勾表,覆盖数据库连接、证书有效期、80与443端口、53端口。整理资料、对照官方文档这类活,可以交给猎者出海的AI Agent做,它按官方原文比对,不自己加选项。
下面三条提示词是本文给的示例,不是官方模板,可以直接复制:
「按MySQL 8.0官方mysqldump手册,给我一条导出单个数据库的命令,要求逐行注明每个选项在手册里的作用,不要加手册里没有的选项。」
「按PostgreSQL 18官方pg_dump手册,比较plain、custom、directory三种格式在还原方式、并行、压缩上的差别,每条都附手册原句。」
「按Let's Encrypt官方Integration Guide,列出续期检查频率、续期时机、重试退避三条规则的原句,不要改写。」
必须人亲手做的有三件:在新机后台把数据库连接信息填进站点配置文件,并点一次「测试连接」看是否返回成功;在域名解析后台把A记录改到新机IP,改完看解析生效结果再决定是否继续下一步;在新机上看证书到期时间与80、443端口连通结果,决定是保留新证书还是重新签发。这三件事AI替不了,也不该替。
常见问题
VPS迁移一般要停机多久
按先打包、后切DNS的顺序做,停机时间只发生在DNS生效这一段。实际时长取决于你的数据量和各地DNS缓存过期速度。
旧VPS什么时候可以退掉
新机稳定跑过一个观察期、日志无异常、访问数据正常之后再退。观察期内旧机的数据库不要再写入,否则两边数据分叉,回滚会丢数据。
mysqldump能不能用来备份很大的库
官方明说它不是为大量数据做快速或可扩展备份的方案,数据量大时还原会因为重放SQL涉及磁盘I/O而很慢。规模大的库要考虑物理备份。
pg_dump会锁住数据库让别人用不了吗
不会。pg_dump不阻塞其他用户读写数据库,即使数据库正被并发使用也能做出一致的导出。但部分导出用-n或-t时依赖对象不会被导出,单独还原不保证成功。
证书能不能直接搬到新机
剩余不足30天,建议直接在新机重签,顺便把自动续期在新机上配好。
切完DNS发现站点打不开怎么办
先把A记录改回旧机IP止损,再回新机查站点配置里的域名和数据库连接。等新机用hosts自测通过,再切第二次。
迁移这件事没什么技巧,就是顺序别乱、每一步都要有能验证的结果。旧机多留几天,比事后到处找数据要划算得多。

发表评论