This document provides detailed information about each module in the SQL Server upgrade solution.
The solution is organized into 6 functional modules, each handling a specific aspect of the upgrade process:
Purpose: Centralized logging functionality
Functions:
Initialize-UpgradeLogging: Sets up log files and Windows Event LogWrite-UpgradeLog: Writes messages to console, files, and Event Log
Features:
- Multiple log levels (Information, Warning, Error)
- File-based logging with timestamps
- Windows Event Log integration
- Error log separation
Purpose: Connection management and testing
Functions:
Test-InstanceConnectivity: Tests and establishes SQL Server connectionsTest-CollationCompatibility: Verifies collation compatibility between instances
Features:
- Robust connection objects using Connect-DbaInstance
- Connection timeout handling
- Collation mismatch detection and warnings
Purpose: Database enumeration and filtering
Functions:
Get-UserDatabases: Retrieves user databases based on filter criteria
Features:
- Excludes system databases (master, model, msdb, tempdb)
- Supports "All" filter for all user databases
- Supports specific database name arrays
Purpose: Encryption and TDE support
Functions:
Test-EncryptionSupport: Detects TDE and encrypted objects in databases
Features:
- TDE encryption state detection
- Encrypted object counting
- Comprehensive encryption information reporting
Purpose: Complete database migration
Functions:
Copy-CompleteDatabase: Migrates entire databases as complete units
Features:
- Complete database copy using Copy-DbaDatabase
- Backup/restore method for data integrity
- Encryption handling during migration
- Idempotent operations (checks for existing databases)
- WhatIf mode support
Purpose: Post-upgrade maintenance tasks
Functions:
Invoke-PostUpgradeTasks: Executes maintenance tasks after migration
Features:
- Database integrity checks (DBCC CHECKDB)
- Compatibility level updates to SQL Server 2022
- Statistics updates
- Index rebuilds
All modules require:
- PowerShell 5.1 or later
- dbatools module
Module dependency chain:
- SQLUpgrade.Logging - No dependencies (base module)
- SQLUpgrade.Connection - Depends on Logging
- SQLUpgrade.Database - Depends on Logging
- SQLUpgrade.Encryption - Depends on Logging
- SQLUpgrade.Migration - Depends on Logging and Encryption
- SQLUpgrade.PostUpgrade - Depends on Logging
The main script Start-SQLServerUpgrade.ps1 follows this pattern:
- Import all required modules
- Initialize logging (SQLUpgrade.Logging)
- Test connectivity (SQLUpgrade.Connection)
- Check collation compatibility (SQLUpgrade.Connection)
- Get databases to process (SQLUpgrade.Database)
- For each database:
- Test encryption if needed (SQLUpgrade.Encryption)
- Migrate complete database (SQLUpgrade.Migration)
- Execute post-upgrade tasks (SQLUpgrade.PostUpgrade)
Each module implements consistent error handling:
- Try-catch blocks around all operations
- Detailed error logging with stack traces
- Graceful degradation for non-critical errors
- Windows Event Log integration for critical errors
The modular design allows for easy extension:
- Add new modules for additional functionality
- Extend existing modules with new functions
- Modify individual modules without affecting others
- Follow the same patterns for consistency
Each module can be tested independently:
- Import individual modules for unit testing
- Mock dependencies for isolated testing
- Use WhatIf mode for safe testing
- Validate function exports and parameters
# Import specific modules
Import-Module .\Modules\SQLUpgrade.Logging.psm1
Import-Module .\Modules\SQLUpgrade.Connection.psm1
# Initialize logging
$logInfo = Initialize-UpgradeLogging -LogPath "C:\Logs\CustomUpgrade"
# Test connectivity
$sourceConn = Test-InstanceConnectivity -Instance "SQL2019\PROD" -LogFile $logInfo.LogFile -ErrorLogFile $logInfo.ErrorLogFile
$targetConn = Test-InstanceConnectivity -Instance "SQL2022\PROD" -LogFile $logInfo.LogFile -ErrorLogFile $logInfo.ErrorLogFile
# Check collation compatibility
$collationOK = Test-CollationCompatibility -SourceConnection $sourceConn -TargetConnection $targetConn -LogFile $logInfo.LogFile -ErrorLogFile $logInfo.ErrorLogFile
Write-Host "Collation compatible: $collationOK"Initialize-UpgradeLogging -LogPath "C:\Logs\SQLUpgrade"Returns hashtable with LogFile and ErrorLogFile paths.
Write-UpgradeLog -Message "Operation completed" -Level "Information" -LogFile $LogFile -ErrorLogFile $ErrorLogFile -WriteToEventLog$connection = Test-InstanceConnectivity -Instance "SQL2019\PROD" -LogFile $LogFile -ErrorLogFile $ErrorLogFileReturns connection object or $null if failed.
$isCompatible = Test-CollationCompatibility -SourceConnection $sourceConn -TargetConnection $targetConn -LogFile $LogFile -ErrorLogFile $ErrorLogFileReturns boolean indicating compatibility.
$databases = Get-UserDatabases -Connection $sourceConn -DatabaseFilter "All" -LogFile $LogFile -ErrorLogFile $ErrorLogFile
$databases = Get-UserDatabases -Connection $sourceConn -DatabaseFilter @("DB1", "DB2") -LogFile $LogFile -ErrorLogFile $ErrorLogFileReturns array of database objects.
$encInfo = Test-EncryptionSupport -Connection $sourceConn -DatabaseName "MyDB" -LogFile $LogFile -ErrorLogFile $ErrorLogFileReturns hashtable with HasTDE, EncryptedObjectCount, and TDEStatus.
Copy-CompleteDatabase -SourceConnection $sourceConn -TargetConnection $targetConn -DatabaseName "MyDB" -IncludeEncryption $true -WhatIfMode $false -LogFile $LogFile -ErrorLogFile $ErrorLogFileInvoke-PostUpgradeTasks -TargetConnection $targetConn -DatabaseNames @("DB1", "DB2") -WhatIfMode $false -LogFile $LogFile -ErrorLogFile $ErrorLogFile