You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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错误是失败的数据库副本未被完整创建,测试进程读取了残缺的数据库。

具体解决办法

  1. 改用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',
            },
        }
    }
    
  2. 限制并行进程数
    避免并行数超过CPU核心数,比如4核CPU用--parallel 4,减少资源竞争:

    python manage.py test --parallel 4
    
  3. 优化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表锁,减少进程等待。
  4. 检查MySQL目录权限
    Errno 32可能是MySQL数据目录/临时目录权限不足,导致写入失败。确认运行测试的用户对MySQL数据目录(如/var/lib/mysql)有读写权限。

  5. 保留测试数据库减少重复创建
    使用--keepdb参数避免每次测试都重新创建和迁移数据库,减少并行场景下的数据库操作冲突:

    python manage.py test --parallel --keepdb
    

    注意:修改迁移文件后,需手动删除测试数据库或添加--noinput强制覆盖。


内容的提问来源于stack exchange,提问作者Y S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:34:33