一、前言
在之前的系列文章中,我写了 LikeShop 多商户版的部署配置、秒杀性能优化和前后端分离部署。这一篇把视角拉回到上线前的最后一步——数据迁移与备份。
很多开发者把“上线”理解为“把代码传到服务器、配好 Nginx”,然后导入一个空的数据库开始运营。但真实场景往往不是这样:本地开发阶段已经有了测试数据(商品、商户、订单、配置),需要迁移到生产环境;或者从测试环境切换到正式环境时,发现数据表结构不一致、配置项丢失、文件路径不对。
多商户版的数据迁移比单商户版更复杂,因为它多了一层商户维度的数据隔离——商户入驻信息、商家独立的结算记录、平台抽佣配置,这些数据在迁移时都需要单独处理。
这篇文章就把从本地到生产环境的完整上线流程拆开讲清楚,包括迁移前的准备、多商户版的特殊处理、上线检查清单和备份策略。
二、迁移前的准备:环境差异对齐
2.1 运行环境版本必须一致
LikeShop 多商户版对运行环境有明确要求:PHP 版本必须使用 7.2~7.4,推荐 7.2,MySQL 推荐 5.7。这一点和单商户高级版不同,后者要求 PHP 8.0。
在迁移前,先确认本地和生产环境的版本:
# 查看 PHP 版本php-v# 查看 MySQL 版本mysql--version# 查看已安装的 PHP 扩展php-m|grep-E"fileinfo|redis|opcache"生产环境必须开启 OPcache,这对 PHP 执行效率有显著提升。如果本地开发时没有开启,生产环境开启后性能表现会有明显差异,但功能上不会有影响。
2.2 目录结构与权限对齐
多商户版的目录结构和单商户版有区别:服务端代码在server/目录下,运行目录必须指向server/public/,而不是根目录下的public/。
生产环境的目录权限配置如下:
/www/wwwroot/likeshop/server/ → 755,所有者为 www /www/wwwroot/likeshop/server/runtime/ → 777 /www/wwwroot/likeshop/server/public/uploads/ → 777runtime是 ThinkPHP 的运行时目录,uploads是文件上传目录,两者都必须有写入权限。
2.3 .env 文件的环境隔离
LikeShop 的数据库配置、缓存配置、调试开关都集中在server/.env文件中。这个文件不应该被提交到 Git 仓库,本地和生产环境应该各自维护一份。
生产环境的.env关键配置:
APP_DEBUG = false [DATABASE] TYPE = mysql HOSTNAME = 127.0.0.1 DATABASE = 生产数据库名 USERNAME = 生产数据库用户 PASSWORD = 生产数据库密码 HOSTPORT = 3306 CHARSET = utf8mb4 PREFIX = ls_APP_DEBUG必须设为false。如果生产环境开启了调试模式,大量的调试日志写入会严重拖慢性能,同时可能暴露敏感信息。
三、数据库迁移:多商户版的特殊处理
3.1 迁移工具选择
LikeShop 基于 ThinkPHP,没有内置类似 Laravel Migrate 的官方迁移工具。生产环境的数据迁移通常用mysqldump完成。
本地导出:
mysqldump-u本地用户名-p本地数据库名\--single-transaction\--routines\--triggers\--set-gtid-purged=OFF\>likeshop_backup.sql生产环境导入:
mysql-u生产用户名-p生产数据库名<likeshop_backup.sql如果数据量较大(超过 100MB),建议分表导出,避免单次导入超时:
# 按表导出mysqldump-uuser-pdbname ls_goods ls_goods_item>goods.sql mysqldump-uuser-pdbname ls_order ls_order_goods>order.sql3.2 多商户版的数据表差异
多商户版的表前缀同样是ls_,但数据表结构比单商户版更复杂,多了商户入驻、平台抽佣、商家独立结算等相关表。
迁移时需要特别关注的表:
| 表名 | 用途 | 迁移注意事项 |
|---|---|---|
ls_shop | 商户入驻信息 | 商户的结算账户、提现方式等敏感信息需单独核对 |
ls_shop_settlement | 商家结算记录 | 如果本地有测试结算数据,生产环境应清空 |
ls_order | 订单主表 | 多商户版订单需要正确归属到shop_id |
ls_order_goods | 订单商品表 | 需确认商品与商户的关联关系完整 |
一个容易被忽略的点:多商户版的订单是“统一下单 + 订单拆分”模式,平台统一结算后由商家提现。如果本地测试数据中有未完成的拆分订单,迁移到生产环境后可能导致结算状态混乱。
3.3 迁移前的数据清理建议
不要直接把本地测试数据全量迁移到生产环境。建议在导出前做一轮清理:
-- 清空测试订单(根据时间或订单号前缀判断)DELETEFROMls_orderWHEREorder_snLIKE'TEST%';-- 清空测试用户(保留管理员账号)DELETEFROMls_userWHEREid>1ANDmobileLIKE'138%';-- 清空测试商户DELETEFROMls_shopWHEREshop_nameLIKE'测试%';-- 清空测试结算记录TRUNCATETABLEls_shop_settlement;哪些数据应该保留:系统配置(ls_config)、支付配置、短信配置、地区数据(ls_region)、商品分类、品牌数据。这些是“基础设施”数据,不需要重新配置。
哪些数据应该清空:订单、订单商品、售后记录、账户流水、结算记录、测试用户。这些是“交易数据”,生产环境应该从零开始积累。
四、上线检查清单
4.1 服务端配置检查
.env文件:APP_DEBUG设为false,数据库配置指向生产环境- 运行目录:宝塔站点运行目录指向
server/public - 伪静态规则:
rewrite ^(.*)$ /index.php?s=/$1 last;(注意s=/$1中间的斜杠) - 目录权限:
runtime和uploads设为 777 - PHP 扩展:
fileinfo、redis、opcache均已启用 - Nginx 重载:修改配置后必须重载 Nginx
4.2 多商户版特有配置检查
- 支付回调地址:多商户版的支付宝回调地址是
域名/api/pay/aliNotify,不是单商户版的域名/api/payment/aliNotify - 平台抽佣配置:确认平台佣金比例、结算周期已在后台配置
- 商家提现配置:微信零钱提现、银行卡提现等渠道的配置是否正确
- 秒杀活动状态:如果有正在进行的秒杀活动,确认审核状态和库存预热已正确执行
4.3 定时任务配置
多商户版的定时任务通过宝塔面板配置,执行周期为每分钟一次:
php /www/wwwroot/likeshop/server/thinkcrontab或者在宝塔的「计划任务」中使用「访问 URL」方式,URL 填写https://你的域名/crontab。
上线后必须验证定时任务是否正常运行。检查方法:等待 2-3 分钟,查看server/runtime/log/下的日志文件是否有定时任务执行记录。
4.4 缓存清理
数据迁移完成后,必须清理 Redis 缓存和 ThinkPHP 运行时缓存,否则可能出现“数据已导入但页面显示旧数据”的情况。
# 清理 ThinkPHP 运行时缓存php thinkclear# 清理 Redis 缓存(谨慎操作,确认 Redis 中没有重要持久化数据)redis-cli FLUSHDB在宝塔面板中,也可以在管理后台的「系统维护」→「清除缓存」中执行。
五、数据备份策略
5.1 上线前的全量备份
官方文档明确强调:备份好整个项目的代码、资源文件、数据库,确保操作失误后可以回滚项目。
上线前的备份清单:
| 备份项 | 方法 | 存放位置 |
|---|---|---|
| 数据库 | mysqldump导出 SQL 文件 | 本地 + 对象存储 |
| 代码 | Git 仓库打 tag | 远程仓库 |
| 上传文件 | server/public/uploads/打包 | 对象存储或本地 |
.env文件 | 手动复制 | 安全位置(不提交 Git) |
.env文件、server/public/uploads/和数据库是三个最重要的备份对象,不要轻易删除或覆盖。
5.2 上线后的定期备份
生产环境上线后,建议配置每日自动备份:
- 宝塔面板:在「计划任务」中添加数据库备份任务,每天凌晨执行一次,保留最近 7 天的备份
- 对象存储:将备份文件同步到阿里云 OSS 或腾讯云 COS,防止服务器故障导致数据丢失
- 异地备份:如果条件允许,在另一台服务器上保留一份最新的备份
5.3 回滚方案
上线过程中如果发现问题需要回滚,按以下步骤操作:
# 1. 停止 Nginx 对外服务(可选)# 2. 导入上线前的数据库备份mysql-uuser-pdbname<backup_before_online.sql# 3. 恢复代码到上一个稳定版本gitcheckout<上一个稳定版本的tag># 4. 清理缓存php thinkclearredis-cli FLUSHDB# 5. 恢复 Nginx六、常见问题与避坑
坑一:迁移后页面 404
原因:运行目录配置错误。多商户版必须指向server/public,不是根目录的public。
排查:检查宝塔站点设置中的「运行目录」是否正确。
坑二:迁移后接口返回 500
原因:.env文件中的数据库配置错误,或者数据库用户权限不足。
排查:查看server/runtime/log/下的错误日志,确认具体的报错信息。
坑三:商户数据丢失或错乱
原因:迁移时只导出了部分表,遗漏了ls_shop或ls_shop_settlement等商户相关表。
排查:核对ls_shop表中的商户数量是否与本地一致,检查ls_order中的shop_id是否正确关联。
坑四:定时任务不执行
原因:Crontab 路径写错,或者 PHP 版本与站点绑定的不一致。
排查:在宝塔的「计划任务」中查看任务执行日志,确认php命令使用的是正确版本的 PHP。
坑五:上传文件无法访问
原因:uploads目录权限不足,或者文件路径在迁移后发生了变化。
排查:检查server/public/uploads/的权限是否为 777,确认数据库中的文件路径与实际存储路径一致。
七、总结
LikeShop 多商户版从本地到生产环境的上线流程,核心可以概括为四步:
环境对齐→ 确认 PHP/MySQL 版本一致,目录权限正确,.env文件隔离。
数据迁移→ 用mysqldump导出导入,清理测试数据,保留配置数据,特别关注商户相关表的完整性。
上线验收→ 逐项检查支付回调地址、定时任务、缓存清理、多商户特有配置。
备份回滚→ 上线前全量备份,上线后定期自动备份,准备好回滚方案。
多商户版相比单商户版需要额外注意商户数据的隔离性和支付回调地址的差异。把这两点处理正确,再配合完整的检查清单,上线过程就能平稳可控。
本文基于 LikeShop 多商户版 源码及官方部署文档整理,不同版本的目录结构和配置方式可能略有差异,请以实际源码为准。