Django并行测试克隆数据库失败问题求助
Django并行测试随机数据库克隆失败问题解决
错误根源分析
mysqldump: Got errno 32 on write是进程间IO/管道竞争错误,并行测试时多个进程同时执行mysqldump/导入操作,容易导致输出截断或管道溢出。Duplicate entry '0' for key 'auth_permission.PRIMARY'是因为不完整的dump文件导入后,权限表主键数据异常,本质是前面的IO错误导致SQL文件不完整。- 后续的
Table doesn't exist错误是失败的数据库副本未被完整创建,测试进程读取了残缺的数据库。
具体解决办法
改用MySQL数据库模板克隆(推荐,仅8.0+支持)
Django默认的mysqldump克隆方式在并行场景下易冲突,MySQL 8.0+支持通过CREATE DATABASE ... WITH TEMPLATE快速克隆数据库,性能和稳定性远高于dump/导入。在settings.py中修改测试配置:DATABASES = { 'default': { # 你的常规数据库配置(ENGINE、HOST、USER等) 'TEST': { 'CLONE': True, 'NAME': 'test_your_dbname', }, } }限制并行进程数
避免并行数超过CPU核心数,比如4核CPU用--parallel 4,减少资源竞争:python manage.py test --parallel 4优化mysqldump/导入命令参数
针对老版本MySQL(不支持模板克隆),自定义dump命令参数减少IO压力:DATABASES = { 'default': { # 常规配置 'TEST': { 'DUMP_CMD': ['mysqldump', '--quick', '--single-transaction', '--skip-lock-tables'], 'LOAD_CMD': ['mysql', '--quick'], }, } }--quick:让mysqldump逐行输出,避免内存溢出;--single-transaction:保证InnoDB表dump的一致性,无需锁表;--skip-lock-tables:跳过MyISAM表锁,减少进程等待。
检查MySQL目录权限
Errno 32可能是MySQL数据目录/临时目录权限不足,导致写入失败。确认运行测试的用户对MySQL数据目录(如/var/lib/mysql)有读写权限。保留测试数据库减少重复创建
使用--keepdb参数避免每次测试都重新创建和迁移数据库,减少并行场景下的数据库操作冲突:python manage.py test --parallel --keepdb注意:修改迁移文件后,需手动删除测试数据库或添加
--noinput强制覆盖。
内容的提问来源于stack exchange,提问作者Y S
相关产品推荐
相关产品推荐

