- Remove 27 completed one-off migration scripts - Remove old backup file (dev-backup-20251120) - Remove completed shell scripts for prod import/export - Archive migration_phase1-4 directories and documentation - Keep only view_consolidation.sql as active script All migrations have been applied to production. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
500 lines
15 KiB
Markdown
500 lines
15 KiB
Markdown
# Phase 2: PC Data Migration
|
||
|
||
## Overview
|
||
|
||
**Phase 2** migrates all PC data from the legacy `pc` table and related tables into the new unified schema created in Phase 1. This phase handles the actual data migration of **277 active PCs** and their associated records.
|
||
|
||
**Status**: Ready for testing on DEV environment
|
||
**Estimated Time**: 10-15 minutes
|
||
**Dependencies**: Phase 1 must be completed first
|
||
|
||
## What This Phase Does
|
||
|
||
Phase 2 migrates data from these legacy tables:
|
||
- `pc` (277 records) → `machines` table
|
||
- `pc_network_interfaces` (705 records) → `communications` table
|
||
- `pc_comm_config` → `communications` table
|
||
- `pc` warranty fields → `warranties` table
|
||
- `pc_dualpath_assignments` → `machinerelationships` table
|
||
|
||
## Migration Scripts
|
||
|
||
### Script Execution Order
|
||
|
||
Run scripts in this exact order:
|
||
|
||
| Script | Purpose | Records | Time |
|
||
|--------|---------|---------|------|
|
||
| **01_migrate_pcs_to_machines.sql** | Migrate PC records to machines table | ~277 PCs | 5-10 min |
|
||
| **02_migrate_network_interfaces_to_communications.sql** | Migrate network interfaces | ~705 interfaces | 3-5 min |
|
||
| **03_migrate_comm_config_to_communications.sql** | Migrate serial/IP comm configs | Variable | 2-3 min |
|
||
| **04_migrate_warranties.sql** | Migrate PC warranty data | Variable | 1-2 min |
|
||
| **05_migrate_dualpath_assignments.sql** | Migrate dualpath machine relationships | Variable | 1-2 min |
|
||
| **VERIFY_PHASE2_MIGRATION.sql** | Comprehensive verification | N/A | 1-2 min |
|
||
|
||
### Script Details
|
||
|
||
#### 01_migrate_pcs_to_machines.sql
|
||
**Critical Script - All other scripts depend on this**
|
||
|
||
Migrates all active PC records from `pc` table to `machines` table:
|
||
|
||
- Creates `pc_to_machine_id_mapping` table for tracking old→new IDs
|
||
- Maps PC types to new machine types:
|
||
- Standard → PC - Standard
|
||
- Shopfloor → PC - Shopfloor
|
||
- Engineer → PC - Engineer
|
||
- Server/VM → PC - Server
|
||
- Laptop → PC - Laptop
|
||
- Sets `machinenumber` = `hostname` for PCs
|
||
- Creates backup: `pc_backup_phase2`
|
||
|
||
**Key Fields Migrated**:
|
||
- hostname, loggedinuser, serialnumber
|
||
- modelnumberid, osid, machinestatusid, pctypeid
|
||
- requires_manual_machine_config
|
||
- businessunitid, printerid (if exists)
|
||
- mapleft, maptop (if exists)
|
||
|
||
#### 02_migrate_network_interfaces_to_communications.sql
|
||
|
||
Migrates PC network interfaces to the unified `communications` table:
|
||
|
||
- Uses `comstypeid` for 'Network_Interface'
|
||
- Maps `ipaddress` → `address` field
|
||
- Preserves: macaddress, subnetmask, defaultgateway
|
||
- Preserves: interfacename, isdhcp, ismachinenetwork
|
||
- Creates backup: `pc_network_interfaces_backup_phase2`
|
||
|
||
#### 03_migrate_comm_config_to_communications.sql
|
||
|
||
Migrates serial and IP communication configs:
|
||
|
||
- Maps Serial configs: `portid` → `address`, preserves baud/databits/stopbits/parity
|
||
- Maps IP configs: `ipaddress` → `address`, `socketnumber` → `port`
|
||
- Combines `crlf` + `additionalsettings` into `settings` field
|
||
- Creates backup: `pc_comm_config_backup_phase2`
|
||
|
||
#### 04_migrate_warranties.sql
|
||
|
||
Migrates warranty data from PC table to normalized `warranties` table:
|
||
|
||
- Only migrates PCs with `warrantyenddate` NOT NULL
|
||
- Maps fields:
|
||
- `warrantyenddate` → `enddate`
|
||
- `warrantyservicelevel` → `servicelevel`
|
||
- `warrantylastchecked` → `lastcheckeddate`
|
||
- `warrantyname` set to NULL (not in old schema)
|
||
|
||
#### 05_migrate_dualpath_assignments.sql
|
||
|
||
Migrates dualpath machine relationships:
|
||
|
||
- Creates **bidirectional** relationships:
|
||
- primary_machine → secondary_machine
|
||
- secondary_machine → primary_machine
|
||
- Uses `relationshiptype` = 'Dualpath'
|
||
- Joins on `machinenumber` (hostname) to find machine IDs
|
||
- Creates backup: `pc_dualpath_assignments_backup_phase2`
|
||
|
||
#### VERIFY_PHASE2_MIGRATION.sql
|
||
|
||
Comprehensive verification script with 9 sections:
|
||
|
||
1. PC to machines migration verification
|
||
2. Network interfaces migration verification
|
||
3. Comm config migration verification
|
||
4. Warranties migration verification
|
||
5. Dualpath assignments verification
|
||
6. Overall communications summary
|
||
7. Relationship summary
|
||
8. Backup table verification
|
||
9. Final summary and critical issues check
|
||
|
||
All checks should show status with 0 critical issues.
|
||
|
||
## How to Run
|
||
|
||
### Option A: Run Individual Scripts (Recommended for Testing)
|
||
|
||
```bash
|
||
# Connect to MySQL
|
||
mysql -u root -p shopdb
|
||
|
||
# Run scripts in order
|
||
source 01_migrate_pcs_to_machines.sql
|
||
source 02_migrate_network_interfaces_to_communications.sql
|
||
source 03_migrate_comm_config_to_communications.sql
|
||
source 04_migrate_warranties.sql
|
||
source 05_migrate_dualpath_assignments.sql
|
||
|
||
# Verify migration
|
||
source VERIFY_PHASE2_MIGRATION.sql
|
||
```
|
||
|
||
### Option B: Run All Scripts at Once
|
||
|
||
```bash
|
||
# Run all scripts and capture output
|
||
mysql -u root -p shopdb < 01_migrate_pcs_to_machines.sql > /tmp/phase2_01.log 2>&1
|
||
mysql -u root -p shopdb < 02_migrate_network_interfaces_to_communications.sql > /tmp/phase2_02.log 2>&1
|
||
mysql -u root -p shopdb < 03_migrate_comm_config_to_communications.sql > /tmp/phase2_03.log 2>&1
|
||
mysql -u root -p shopdb < 04_migrate_warranties.sql > /tmp/phase2_04.log 2>&1
|
||
mysql -u root -p shopdb < 05_migrate_dualpath_assignments.sql > /tmp/phase2_05.log 2>&1
|
||
mysql -u root -p shopdb < VERIFY_PHASE2_MIGRATION.sql > /tmp/phase2_verify.log 2>&1
|
||
|
||
# Review logs
|
||
cat /tmp/phase2_*.log
|
||
```
|
||
|
||
## Prerequisites
|
||
|
||
### Phase 1 Must Be Complete
|
||
|
||
Before running Phase 2, verify Phase 1 is complete:
|
||
|
||
```sql
|
||
-- Should return 8 tables
|
||
SELECT COUNT(*) FROM information_schema.tables
|
||
WHERE table_schema = 'shopdb'
|
||
AND table_name IN (
|
||
'comstypes', 'communications', 'warranties', 'compliance',
|
||
'relationshiptypes', 'machinerelationships', 'machinestatus'
|
||
);
|
||
|
||
-- Should return rows
|
||
SELECT COUNT(*) FROM comstypes;
|
||
SELECT COUNT(*) FROM relationshiptypes;
|
||
|
||
-- machines table should have new columns
|
||
DESCRIBE machines; -- Check for hostname, osid, pctypeid, etc.
|
||
```
|
||
|
||
### Database Backup
|
||
|
||
**CRITICAL**: Create a full database backup before running Phase 2:
|
||
|
||
```bash
|
||
# Create backup
|
||
mysqldump -u root -p shopdb > /tmp/shopdb-before-phase2-$(date +%Y%m%d-%H%M%S).sql
|
||
|
||
# Verify backup
|
||
ls -lh /tmp/shopdb-before-phase2-*.sql
|
||
```
|
||
|
||
## What Gets Created
|
||
|
||
### New Records
|
||
|
||
- **277 new machine records** (PCs migrated to machines table)
|
||
- **~705 communication records** (network interfaces)
|
||
- **Variable communication records** (serial/IP configs)
|
||
- **Variable warranty records** (PCs with warranty dates)
|
||
- **Variable relationship records** (dualpath assignments × 2)
|
||
|
||
### Mapping Tables
|
||
|
||
- **pc_to_machine_id_mapping**: Maps old `pcid` to new `machineid`
|
||
- Used by scripts 02-05
|
||
- Used by Phase 3 view updates
|
||
- Used by Phase 4 application updates
|
||
- **DO NOT DELETE** until migration fully complete
|
||
|
||
### Backup Tables
|
||
|
||
Phase 2 creates these backup tables:
|
||
|
||
- `pc_backup_phase2` (277 records)
|
||
- `pc_network_interfaces_backup_phase2` (~705 records)
|
||
- `pc_comm_config_backup_phase2`
|
||
- `pc_dualpath_assignments_backup_phase2`
|
||
|
||
## Verification Checklist
|
||
|
||
After running all scripts, verify:
|
||
|
||
### 1. Record Counts Match
|
||
|
||
```sql
|
||
-- PCs migrated
|
||
SELECT COUNT(*) FROM pc WHERE isactive = 1; -- Original count
|
||
SELECT COUNT(*) FROM machines WHERE pctypeid IS NOT NULL; -- Should match
|
||
|
||
-- Network interfaces migrated
|
||
SELECT COUNT(*) FROM pc_network_interfaces WHERE isactive = 1; -- Original
|
||
SELECT COUNT(*) FROM communications c
|
||
JOIN comstypes ct ON c.comstypeid = ct.comstypeid
|
||
WHERE ct.typename = 'Network_Interface'; -- Should match
|
||
|
||
-- Mapping table populated
|
||
SELECT COUNT(*) FROM pc_to_machine_id_mapping; -- Should equal PC count
|
||
```
|
||
|
||
### 2. No NULL Values in Critical Fields
|
||
|
||
```sql
|
||
-- Check for data quality issues
|
||
SELECT COUNT(*) FROM machines
|
||
WHERE pctypeid IS NOT NULL
|
||
AND (hostname IS NULL OR machinetypeid IS NULL); -- Should be 0
|
||
|
||
SELECT COUNT(*) FROM communications
|
||
WHERE machineid IS NULL OR comstypeid IS NULL; -- Should be 0
|
||
```
|
||
|
||
### 3. Dualpath Relationships Bidirectional
|
||
|
||
```sql
|
||
-- Check for one-way relationships (should be 0)
|
||
SELECT COUNT(*) FROM machinerelationships mr1
|
||
JOIN relationshiptypes rt ON mr1.relationshiptypeid = rt.relationshiptypeid
|
||
WHERE rt.relationshiptype = 'Dualpath'
|
||
AND NOT EXISTS (
|
||
SELECT 1 FROM machinerelationships mr2
|
||
WHERE mr2.machineid = mr1.related_machineid
|
||
AND mr2.related_machineid = mr1.machineid
|
||
AND mr2.relationshiptypeid = mr1.relationshiptypeid
|
||
);
|
||
```
|
||
|
||
### 4. All Backup Tables Created
|
||
|
||
```sql
|
||
-- Should return 4 rows
|
||
SELECT table_name, table_rows
|
||
FROM information_schema.tables
|
||
WHERE table_schema = 'shopdb'
|
||
AND table_name LIKE '%_backup_phase2';
|
||
```
|
||
|
||
### 5. Run Full Verification
|
||
|
||
```bash
|
||
mysql -u root -p shopdb < VERIFY_PHASE2_MIGRATION.sql
|
||
```
|
||
|
||
Review output for:
|
||
- All checks showing status
|
||
- Critical issues count = 0
|
||
- Record counts matching expected values
|
||
|
||
## Rollback Procedures
|
||
|
||
### Full Rollback
|
||
|
||
If Phase 2 needs to be completely rolled back:
|
||
|
||
```sql
|
||
-- 1. Delete migrated PC records from machines
|
||
DELETE FROM machines WHERE pctypeid IS NOT NULL;
|
||
|
||
-- 2. Delete communications from PCs
|
||
DELETE FROM communications
|
||
WHERE machineid IN (SELECT new_machineid FROM pc_to_machine_id_mapping);
|
||
|
||
-- 3. Delete warranties for PCs
|
||
DELETE FROM warranties
|
||
WHERE machineid IN (SELECT new_machineid FROM pc_to_machine_id_mapping);
|
||
|
||
-- 4. Delete dualpath relationships
|
||
DELETE FROM machinerelationships
|
||
WHERE relationshiptypeid = (
|
||
SELECT relationshiptypeid FROM relationshiptypes
|
||
WHERE relationshiptype = 'Dualpath'
|
||
);
|
||
|
||
-- 5. Drop mapping table
|
||
DROP TABLE IF EXISTS pc_to_machine_id_mapping;
|
||
|
||
-- 6. Verify original data intact
|
||
SELECT COUNT(*) FROM pc WHERE isactive = 1;
|
||
SELECT COUNT(*) FROM pc_network_interfaces WHERE isactive = 1;
|
||
SELECT COUNT(*) FROM pc_comm_config;
|
||
```
|
||
|
||
### Restore from Database Backup
|
||
|
||
If full rollback needed:
|
||
|
||
```bash
|
||
# Stop applications using database
|
||
# ...
|
||
|
||
# Restore from backup
|
||
mysql -u root -p shopdb < /tmp/shopdb-before-phase2-YYYYMMDD-HHMMSS.sql
|
||
|
||
# Verify restoration
|
||
mysql -u root -p shopdb -e "SELECT COUNT(*) FROM pc; SELECT COUNT(*) FROM machines;"
|
||
```
|
||
|
||
## Known Issues and Considerations
|
||
|
||
### 1. Hostname as Machine Number
|
||
|
||
PCs use `hostname` as `machinenumber` in the machines table. This differs from other equipment that uses numeric machine numbers (e.g., "M-1234").
|
||
|
||
**Rationale**: PCs are identified by hostname in the organization. Using hostname preserves this convention.
|
||
|
||
### 2. NULL Warranty Names
|
||
|
||
The old `pc` table didn't have a `warrantyname` field, so migrated PC warranties will have `warrantyname = NULL`. This is expected and correct.
|
||
|
||
### 3. Business Unit Assignment
|
||
|
||
Script 01 attempts to preserve existing `businessunitid` if the PC already exists in machines table. Otherwise defaults to businessunitid = 1.
|
||
|
||
**Post-migration**: Review and update business unit assignments as needed.
|
||
|
||
### 4. Communication Type Mapping
|
||
|
||
The old schema used string-based `configtype` ('Serial', 'IP'). The new schema uses foreign keys to `comstypes` table. Mapping is:
|
||
|
||
- `configtype = 'Serial'` → comstypeid for 'Serial'
|
||
- `configtype = 'IP'` → comstypeid for 'IP'
|
||
- Network interfaces → comstypeid for 'Network_Interface'
|
||
|
||
### 5. MySQL 5.6 Compatibility
|
||
|
||
All scripts are tested and compatible with MySQL 5.6. Phase 1 script 03 was updated to use `FROM DUAL` syntax for MySQL 5.6 compatibility.
|
||
|
||
## Testing Recommendations
|
||
|
||
### DEV Environment Testing
|
||
|
||
1. **Create backup** before testing
|
||
2. **Run Phase 2 scripts** individually
|
||
3. **Review each script output** for errors
|
||
4. **Run verification script**
|
||
5. **Test application** (check PC pages still work)
|
||
6. **Test rollback** procedure
|
||
7. **Restore from backup** to test restoration
|
||
8. **Document any issues** found
|
||
|
||
### Application Testing
|
||
|
||
After Phase 2, test these application areas:
|
||
|
||
- PC list pages
|
||
- PC detail pages
|
||
- Network interface displays
|
||
- Warranty reports
|
||
- Dualpath machine displays
|
||
- Any reports using PC data
|
||
|
||
**Note**: Application code still uses old `pc` table. Phase 3 and 4 will update views and application code.
|
||
|
||
## Timeline
|
||
|
||
### Phase 2 Execution Timeline
|
||
|
||
- **Script execution**: 10-15 minutes
|
||
- **Verification**: 5-10 minutes
|
||
- **Application testing**: 1-2 hours
|
||
- **Total**: ~2-3 hours
|
||
|
||
### Overall Migration Timeline
|
||
|
||
- **Phase 1**: Schema changes (COMPLETE)
|
||
- **Phase 2**: Data migration (CURRENT - Ready for testing)
|
||
- **Phase 3**: View updates (Pending)
|
||
- **Phase 4**: Application code updates (Pending)
|
||
|
||
**Estimated total**: 20-30 days from design to production deployment
|
||
|
||
## Support and Troubleshooting
|
||
|
||
### Common Issues
|
||
|
||
#### Issue: Script 01 fails with mapping error
|
||
|
||
**Symptom**: Error joining pc to machines on machinenumber
|
||
**Cause**: Duplicate hostnames in pc or machines tables
|
||
**Fix**: Investigate duplicates:
|
||
|
||
```sql
|
||
-- Find duplicate hostnames in pc
|
||
SELECT hostname, COUNT(*)
|
||
FROM pc WHERE isactive = 1
|
||
GROUP BY hostname HAVING COUNT(*) > 1;
|
||
|
||
-- Find duplicate hostnames in machines
|
||
SELECT hostname, COUNT(*)
|
||
FROM machines WHERE isactive = 1
|
||
GROUP BY hostname HAVING COUNT(*) > 1;
|
||
```
|
||
|
||
#### Issue: Communications migration shows wrong counts
|
||
|
||
**Symptom**: Verification shows fewer communications than expected
|
||
**Cause**: Missing `pc_to_machine_id_mapping` entries
|
||
**Fix**: Check mapping table:
|
||
|
||
```sql
|
||
-- Find unmapped PCs
|
||
SELECT p.pcid, p.hostname
|
||
FROM pc p
|
||
WHERE p.isactive = 1
|
||
AND NOT EXISTS (
|
||
SELECT 1 FROM pc_to_machine_id_mapping m WHERE m.pcid = p.pcid
|
||
);
|
||
```
|
||
|
||
#### Issue: Dualpath relationships not bidirectional
|
||
|
||
**Symptom**: Verification shows one-way relationships
|
||
**Cause**: Script 05 only ran first INSERT, not second
|
||
**Fix**: Manually run second INSERT block from script 05
|
||
|
||
### Getting Help
|
||
|
||
- Review VERIFY_PHASE2_MIGRATION.sql output
|
||
- Check backup tables for data comparison
|
||
- Review script comments and NOTES sections
|
||
- Consult PC_MACHINES_CONSOLIDATION_PLAN.md for design rationale
|
||
|
||
## Next Steps
|
||
|
||
After Phase 2 is complete and verified:
|
||
|
||
1. **Phase 3**: Update 19 views that reference `pc` table
|
||
- Views need to query `machines` table instead
|
||
- Some views may need UNION with both tables during transition
|
||
|
||
2. **Phase 4**: Update ASP application files (50+ files estimated)
|
||
- Update queries to use `machines` table
|
||
- Update stored procedures
|
||
- Update reports
|
||
|
||
3. **Production Deployment**
|
||
- Schedule maintenance window
|
||
- Execute on production database
|
||
- Monitor application performance
|
||
|
||
## File Manifest
|
||
|
||
```
|
||
migration_phase2/
|
||
├── README.md (this file)
|
||
├── 01_migrate_pcs_to_machines.sql (354 lines)
|
||
├── 02_migrate_network_interfaces_to_communications.sql (201 lines)
|
||
├── 03_migrate_comm_config_to_communications.sql (213 lines)
|
||
├── 04_migrate_warranties.sql (165 lines)
|
||
├── 05_migrate_dualpath_assignments.sql (178 lines)
|
||
└── VERIFY_PHASE2_MIGRATION.sql (562 lines)
|
||
|
||
Total: 7 files, 1,673 lines
|
||
```
|
||
|
||
## Change Log
|
||
|
||
| Date | Version | Changes |
|
||
|------|---------|---------|
|
||
| 2025-11-06 | 1.0 | Initial Phase 2 scripts created |
|
||
|
||
---
|
||
|
||
**Author**: Database Migration Team
|
||
**Date**: 2025-11-06
|
||
**Status**: Ready for DEV testing
|
||
**Next Review**: After DEV testing complete
|