ETL from Moodle to this LMS
Moodle migration
Source connection
Moodle DB moodle-db.internal:3306 · Moodle 4.1 · read-only userLast tested 16 Oct 2026, 09:02Connected
01Done
Extract1,204,553 rows read02Done
TransformMapped with migrate.config.json03Running
Load26% of rows04Waiting
VerifyStarts after loadEntities
| Entity (source table) | Source count | Migrated | Failed | Status | Progress |
|---|---|---|---|---|---|
| Users mdl_user | 2,618 | 2,602 | 16 | Done | 99% |
| Courses mdl_course | 214 | 214 | 0 | Done | 100% |
| Sections mdl_course_sections | 1,241 | 1,241 | 0 | Done | 100% |
| Activities mdl_quiz / mdl_assign / mdl_resource | 5,360 | 5,188 | 12 | Done | 96% |
| Enrollments mdl_user_enrolments + mdl_enrol | 48,210 | 31,022 | 0 | Running | 64% |
| Grades mdl_grade_grades | 120,455 | 0 | 0 | Pending | 0% |
| Files mdl_files | 9,812 | 9,120 | 42 | Failed | 92% |
Verify report
| Check | Source | Target | Result |
|---|---|---|---|
| Users: email uniqueness | 3,902 | 3,902 | Match |
| Quiz attempts per user | 18,442 | 18,430 | 12 missing |
| Final grades (rounded) | 48,210 | 47,996 | 214 mismatch |
| File checksums (sha256) | 12,650 | 12,609 | 41 retry |
migrate.config.json
{
"source": { "type": "mysql", "host": "moodle-db.internal", "version": "4.1" },
"map": {
"users": { "from": "mdl_user", "key": "email" },
"courses": { "from": "mdl_course", "to": "Course" },
"sections": { "from": "mdl_course_sections" },
"activities": { "from": ["mdl_quiz", "mdl_assign", "mdl_resource"] },
"enrollments": { "from": ["mdl_user_enrolments", "mdl_enrol"] },
"grades": { "from": ["mdl_grade_items", "mdl_grade_grades"] },
"files": { "from": "mdl_files", "target": "s3://lms-media", "rewriteUrls": true }
}
}Error log (last 4 of 291)
10:41:22 WARN load.grades gi=4412 user=u_2931 value 87.4999 exceeds scale, rounded to 87.50 10:41:23 ERROR load.grades gg=902211 missing activity map for mdl_quiz id=3180 10:41:58 ERROR load.files sha256 mismatch contenthash=9f3a... retry 2/3 10:42:07 WARN load.enrol duplicate (user=u_118, course=c_41) skipped