Azure SQL数据库迁移失败:含Always Encrypted加密数据的表迁移问题
问题场景
尝试通过Azure Data Studio和Azure SQL Migration实例迁移本地SQL数据库至Azure SQL Database,其中包含带Always Encrypted加密列的表,迁移失败并抛出以下错误:
Failure happened on 'Sink' side. ErrorCode=SqlOperationFailed,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=A database operation failed. Please search error to get more details.,Source=Microsoft.DataTransfer.ClientLibrary,''Type=System.Data.SqlClient.SqlException,Message=Invalid column type from bcp client for colid 3.,Source=.Net SqlClient Data Provider,SqlErrorNumber=4816,Class=16,ErrorCode=-2146232060,State=4,Errors=[{Class=16,Number=4816,State=4,Message=Invalid column type from bcp client for colid 3.,},],'
解决步骤
确认目标库的Always Encrypted配置
先在Azure SQL Database中完成目标表的加密配置:- 创建与源表完全匹配的加密列,包括加密类型(确定性/随机化)、列主密钥、列加密密钥
- 重点核对错误中提到的
colid 3列,确保其数据类型、长度、精度与源表完全一致
迁移向导中启用Always Encrypted支持
在Azure Data Studio的迁移流程中:- 进入高级设置面板,勾选启用Always Encrypted数据迁移选项
- 确保迁移工具能访问加密密钥:若使用本地密钥存储,需保证迁移代理有访问权限;若使用Azure Key Vault,需为迁移服务主体配置密钥的读取权限
验证BCP工具版本兼容性
- 确保迁移过程中使用的BCP工具为SQL Server 2016及以上版本,该版本开始支持Always Encrypted数据的导入导出
- 避免手动指定旧版本BCP工具,让迁移向导自动选择兼容版本
使用DAC包+BCP离线迁移(备选方案)
如果在线迁移仍失败,可采用离线方式:- 使用
SqlPackage.exe导出包含Always Encrypted元数据的DAC包:SqlPackage.exe /Action:Export /SourceServerName:localhost /SourceDatabaseName:YourDB /TargetFile:YourDB.dacpac /IncludeAlwaysEncryptedMetadata:true - 将DAC包部署到Azure SQL Database,部署时保留加密配置
- 使用BCP工具导入加密数据,添加
-k参数保留加密状态:bcp YourDB.dbo.YourTable in "data.csv" -S yourazuresql.database.windows.net -d YourDB -U username -P password -k -c
- 使用
内容的提问来源于stack exchange,提问作者Osura Dissanayake

