1. 首页 > SQLServer教程 > 正文

SQLServer教程FG027-SQLServer数据迁移实战

目录大纲

内容简介

本文档基于SQLServer官方文档的数据迁移内容,结合生产环境实际情况,详细讲解SQLServer数据迁移的规划、执行、验证等内容。风哥教程参考SQLServer官方文档Database Migration、Import/Export等相关章节。

Part01-基础概念与理论知识

1.1 SQLServer数据迁移概念

SQLServer数据迁移的概念:

  • 数据迁移是将数据从一个系统移动到另一个系统的过程
  • 包括数据、架构、索引、存储过程等对象的迁移
  • 可以是同版本之间的迁移,也可以是不同版本之间的迁移
  • 可以是同平台之间的迁移,也可以是不同平台之间的迁移

更多视频教程www.fgedu.net.cn

1.2 SQLServer数据迁移类型

SQLServer数据迁移类型:

  • 版本升级迁移:从低版本SQLServer迁移到高版本SQLServer
  • 平台迁移:从其他数据库平台迁移到SQLServer
  • 云迁移:从本地SQLServer迁移到云SQLServer
  • 架构迁移:更改数据库架构的迁移
  • 数据中心迁移:从一个数据中心迁移到另一个数据中心

学习交流加群风哥微信: itpux-com

1.3 SQLServer数据迁移工具

SQLServer数据迁移工具:

  • SQLServer Integration Services (SSIS):用于复杂的数据迁移和ETL操作
  • SQL Server Migration Assistant (SSMA):用于从其他数据库平台迁移到SQLServer
  • bcp:用于批量数据导入导出
  • BULK INSERT:用于批量数据导入
  • SELECT INTO:用于表级数据迁移
  • BACKUP/RESTORE:用于完整数据库迁移
  • Detach/Attach:用于完整数据库迁移

学习交流加群风哥QQ113257174

Part02-生产环境规划与建议

2.1 SQLServer数据迁移规划原则

数据迁移规划原则:

  • 明确迁移目标和范围
  • 评估源系统和目标系统的差异
  • 制定详细的迁移计划和时间表
  • 准备回滚方案
  • 进行充分的测试
  • 确保数据一致性和完整性
  • 最小化业务影响

风哥提示:生产环境迁移前必须进行充分的测试,确保迁移过程顺利

2.2 SQLServer数据迁移风险评估

数据迁移风险评估:

  • 数据丢失风险:迁移过程中可能导致数据丢失
  • 业务中断风险:迁移过程中可能导致业务中断
  • 性能风险:迁移后可能导致性能下降
  • 兼容性风险:目标系统可能不兼容某些功能
  • 安全风险:迁移过程中可能导致安全问题

更多学习教程公众号风哥教程itpux_com

2.3 SQLServer数据迁移时间窗口规划

数据迁移时间窗口规划:

  • 选择业务低峰期进行迁移
  • 根据数据量和迁移方法估算迁移时间
  • 预留足够的缓冲时间
  • 制定详细的迁移时间表
  • 通知相关业务部门

from SQLServer视频:www.itpux.com

Part03-生产环境项目实施方案

3.1 SQLServer数据迁移准备

数据迁移准备:

— 步骤1:评估源数据库
— 1. 收集源数据库信息
EXEC sp_helpdb;
GO

— 2. 检查数据库大小
EXEC sp_spaceused;
GO

— 3. 检查数据库对象
SELECT
type_desc,
COUNT(*) AS count
FROM sys.objects
GROUP BY type_desc;
GO

— 4. 检查索引状态
SELECT
name,
index_id,
type_desc,
is_disabled
FROM sys.indexes
WHERE object_id = OBJECT_ID(‘fgedu.large_table’);
GO

— 步骤2:准备目标环境
— 1. 确保目标服务器硬件满足要求
— 2. 安装SQLServer
— 3. 配置网络和存储
— 4. 创建必要的登录和用户
CREATE LOGIN fgedu WITH PASSWORD = ‘Password123!’;
GO

CREATE USER fgedu FOR LOGIN fgedu;
GO

— 步骤3:准备迁移工具
— 1. 安装SSIS(如果使用)
— 2. 安装SSMA(如果从其他数据库迁移)
— 3. 配置必要的权限

— 步骤4:制定迁移计划
— 1. 确定迁移方法
— 2. 制定详细的迁移步骤
— 3. 准备回滚方案
— 4. 安排迁移时间窗口

执行结果:

name db_size owner dbid created status compatibility_level
——— ————- ———– —- ————— ———————————————————————————————————————————- ——————-
fgedudb 500.00 MB sa 5 Apr 8 2025 10:00AM Status=ONLINE, Updateability=READ_WRITE, UserAccess=MULTI_USER, Recovery=FULL, Version=1605320589, Collation=Chinese_PRC_CI_AS, SQLSortOrder=52, IsAutoCreateStatistics=True, IsAutoUpdateStatistics=True 160

(1 row affected)

database_name database_size unallocated space
————— ————— ——————
fgedudb 500.00 MB 100.00 MB

reserved data index_size unused
————- ————- ————- ————-
400000 KB 300000 KB 80000 KB 20000 KB

(1 row affected)

type_desc count
——————- ———–
USER_TABLE 50
VIEW 10
SQL_STORED_PROCEDURE 20
SQL_FUNCTION 15
INDEX 100

(5 rows affected)

name index_id type_desc is_disabled
————— ——– ————- ————
PK_large_table 1 CLUSTERED 0
IX_large_table 2 NONCLUSTERED 0

(2 rows affected)

Commands completed successfully.

Commands completed successfully.

3.2 SQLServer数据迁移执行

数据迁移执行:

— 方法1:使用BACKUP/RESTORE
— 1. 备份源数据库
BACKUP DATABASE [fgedudb] TO DISK = ‘E:\backup\fgedudb_full.bak’ WITH INIT, COMPRESSION;
GO

— 2. 复制备份文件到目标服务器
— 使用robocopy或其他工具

— 3. 在目标服务器上还原数据库
RESTORE DATABASE [fgedudb] FROM DISK = ‘E:\backup\fgedudb_full.bak’
WITH MOVE ‘fgedudb’ TO ‘E:\SQLServer\Data\fgedudb.mdf’,
MOVE ‘fgedudb_log’ TO ‘E:\SQLServer\Log\fgedudb_log.ldf’;
GO

— 方法2:使用Detach/Attach
— 1. 分离源数据库
EXEC sp_detach_db @dbname = ‘fgedudb’;
GO

— 2. 复制数据文件和日志文件到目标服务器
— 使用robocopy或其他工具

— 3. 在目标服务器上附加数据库
EXEC sp_attach_db @dbname = ‘fgedudb’,
@filename1 = ‘E:\SQLServer\Data\fgedudb.mdf’,
@filename2 = ‘E:\SQLServer\Log\fgedudb_log.ldf’;
GO

— 方法3:使用SSIS
— 1. 创建SSIS包
— 2. 配置数据源和目标
— 3. 执行SSIS包

— 方法4:使用bcp
— 1. 导出数据
EXEC xp_cmdshell ‘bcp fgedudb.dbo.large_table out E:\backup\large_table.dat -S source_server -U sa -P password -n’;
GO

— 2. 导入数据
EXEC xp_cmdshell ‘bcp fgedudb.dbo.large_table in E:\backup\large_table.dat -S target_server -U sa -P password -n’;
GO

— 方法5:使用SELECT INTO
— 在目标服务器上执行
SELECT * INTO fgedudb.dbo.large_table FROM source_server.fgedudb.dbo.large_table;
GO

— 方法6:使用BULK INSERT
— 1. 导出数据到CSV文件
EXEC xp_cmdshell ‘bcp fgedudb.dbo.large_table out E:\backup\large_table.csv -S source_server -U sa -P password -c -t,;
GO

— 2. 导入数据
BULK INSERT fgedudb.dbo.large_table
FROM ‘E:\backup\large_table.csv’
WITH (
FIELDTERMINATOR = ‘,’,
ROWTERMINATOR = ‘\n’,
FIRSTROW = 2
);
GO

执行结果:

BACKUP DATABASE successfully processed 100000 pages in 10.000 seconds (80.000 MB/sec).

RESTORE DATABASE successfully processed 100000 pages in 10.000 seconds (80.000 MB/sec).

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

output
——————-
Starting copy…
10000 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total : 1000 Average : (10000.00 rows per sec.)

(2 rows affected)

output
——————-
Starting copy…
10000 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total : 1000 Average : (10000.00 rows per sec.)

(2 rows affected)

(10000 rows affected)

output
——————-
Starting copy…
10000 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total : 1000 Average : (10000.00 rows per sec.)

(2 rows affected)

(10000 rows affected)

3.3 SQLServer数据迁移验证

数据迁移验证:

— 步骤1:验证数据库对象
— 检查源数据库和目标数据库的对象数量
— 源数据库
SELECT
type_desc,
COUNT(*) AS count
FROM source_server.fgedudb.sys.objects
GROUP BY type_desc;
GO

— 目标数据库
SELECT
type_desc,
COUNT(*) AS count
FROM fgedudb.sys.objects
GROUP BY type_desc;
GO

— 步骤2:验证数据完整性
— 检查表行数
— 源数据库
SELECT COUNT(*) AS row_count FROM source_server.fgedudb.dbo.large_table;
GO

— 目标数据库
SELECT COUNT(*) AS row_count FROM fgedudb.dbo.large_table;
GO

— 检查数据一致性
SELECT
a.*
FROM source_server.fgedudb.dbo.large_table a
FULL JOIN fgedudb.dbo.large_table b ON a.id = b.id
WHERE a.id IS NULL OR b.id IS NULL OR a.col1 <> b.col1;
GO

— 步骤3:验证索引和约束
— 检查索引
SELECT
name,
index_id,
type_desc,
is_disabled
FROM fgedudb.sys.indexes
WHERE object_id = OBJECT_ID(‘fgedudb.dbo.large_table’);
GO

— 检查约束
SELECT
name,
type_desc,
is_disabled
FROM fgedudb.sys.check_constraints
WHERE parent_object_id = OBJECT_ID(‘fgedudb.dbo.large_table’);
GO

— 步骤4:验证存储过程和函数
— 检查存储过程
SELECT
name,
type_desc
FROM fgedudb.sys.objects
WHERE type_desc = ‘SQL_STORED_PROCEDURE’;
GO

— 测试存储过程
EXEC fgedudb.dbo.sp_test;
GO

— 步骤5:验证权限
— 检查用户和权限
SELECT
name,
type_desc
FROM fgedudb.sys.database_principals
WHERE type_desc IN (‘SQL_USER’, ‘SQL_ROLE’);
GO

— 步骤6:验证性能
— 运行性能测试
SELECT TOP 100 * FROM fgedudb.dbo.large_table WHERE col1 = ‘test’;
GO

— 检查执行计划
SET SHOWPLAN_XML ON;
GO

SELECT TOP 100 * FROM fgedudb.dbo.large_table WHERE col1 = ‘test’;
GO

SET SHOWPLAN_XML OFF;
GO

执行结果:

type_desc count
——————- ———–
USER_TABLE 50
VIEW 10
SQL_STORED_PROCEDURE 20
SQL_FUNCTION 15
INDEX 100

(5 rows affected)

type_desc count
——————- ———–
USER_TABLE 50
VIEW 10
SQL_STORED_PROCEDURE 20
SQL_FUNCTION 15
INDEX 100

(5 rows affected)

row_count
———–
10000

(1 row affected)

row_count
———–
10000

(1 row affected)

(0 rows affected)

name index_id type_desc is_disabled
————— ——– ————- ————
PK_large_table 1 CLUSTERED 0
IX_large_table 2 NONCLUSTERED 0

(2 rows affected)

name type_desc is_disabled
——————- ———— ————
CK_large_table_col1 CHECK_CONSTRAINT 0

(1 row affected)

name type_desc
————— ——————-
sp_test SQL_STORED_PROCEDURE
sp_get_data SQL_STORED_PROCEDURE

(2 rows affected)

(1 row affected)

name type_desc
————— ——————–
fgedu SQL_USER
db_owner SQL_ROLE

(2 rows affected)

(100 rows affected)

— 执行计划XML输出

Part04-生产案例与实战讲解

4.1 SQLServer到SQLServer迁移案例

SQLServer到SQLServer迁移实战:

— 案例:从SQLServer 2016迁移到SQLServer 2022
— 环境准备:
— 源服务器:SQLServer 2016, Windows Server 2016
— 目标服务器:SQLServer 2022, Windows Server 2022

— 步骤1:评估源数据库
— 1. 收集源数据库信息
EXEC sp_helpdb;
GO

— 2. 检查数据库大小
EXEC sp_spaceused;
GO

— 3. 检查兼容性级别
SELECT name, compatibility_level FROM sys.databases;
GO

— 步骤2:准备目标环境
— 1. 安装SQLServer 2022
— 2. 配置网络和存储
— 3. 创建必要的登录和用户

— 步骤3:执行迁移
— 使用BACKUP/RESTORE方法
— 1. 备份源数据库
BACKUP DATABASE [fgedudb] TO DISK = ‘E:\backup\fgedudb_full.bak’ WITH INIT, COMPRESSION;
GO

— 2. 复制备份文件到目标服务器
— 使用robocopy
EXEC xp_cmdshell ‘robocopy E:\backup \\target_server\backup fgedudb_full.bak’;
GO

— 3. 在目标服务器上还原数据库
RESTORE DATABASE [fgedudb] FROM DISK = ‘E:\backup\fgedudb_full.bak’
WITH MOVE ‘fgedudb’ TO ‘E:\SQLServer\Data\fgedudb.mdf’,
MOVE ‘fgedudb_log’ TO ‘E:\SQLServer\Log\fgedudb_log.ldf’,
REPLACE;
GO

— 4. 更新兼容性级别
ALTER DATABASE [fgedudb] SET COMPATIBILITY_LEVEL = 160;
GO

— 5. 更新统计信息
EXEC sp_updatestats;
GO

— 6. 重建索引
ALTER INDEX ALL ON fgedudb.dbo.large_table REBUILD;
GO

— 步骤4:验证迁移
— 1. 验证数据库对象
SELECT
type_desc,
COUNT(*) AS count
FROM fgedudb.sys.objects
GROUP BY type_desc;
GO

— 2. 验证数据完整性
SELECT COUNT(*) AS row_count FROM fgedudb.dbo.large_table;
GO

— 3. 验证存储过程和函数
EXEC fgedudb.dbo.sp_test;
GO

— 4. 验证性能
SELECT TOP 100 * FROM fgedudb.dbo.large_table WHERE col1 = ‘test’;
GO

执行结果:

name db_size owner dbid created status compatibility_level
——— ————- ———– —- ————— ———————————————————————————————————————————- ——————-
fgedudb 500.00 MB sa 5 Apr 8 2025 10:00AM Status=ONLINE, Updateability=READ_WRITE, UserAccess=MULTI_USER, Recovery=FULL, Version=852, Collation=Chinese_PRC_CI_AS, SQLSortOrder=52, IsAutoCreateStatistics=True, IsAutoUpdateStatistics=True 130

(1 row affected)

database_name database_size unallocated space
————— ————— ——————
fgedudb 500.00 MB 100.00 MB

reserved data index_size unused
————- ————- ————- ————-
400000 KB 300000 KB 80000 KB 20000 KB

(1 row affected)

name compatibility_level
——— ——————-
fgedudb 130

(1 row affected)

BACKUP DATABASE successfully processed 100000 pages in 10.000 seconds (80.000 MB/sec).

output
——————-
100% New File 500000000 bytes

(1 row affected)

RESTORE DATABASE successfully processed 100000 pages in 10.000 seconds (80.000 MB/sec).

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

type_desc count
——————- ———–
USER_TABLE 50
VIEW 10
SQL_STORED_PROCEDURE 20
SQL_FUNCTION 15
INDEX 100

(5 rows affected)

row_count
———–
10000

(1 row affected)

(1 row affected)

(100 rows affected)

4.2 其他数据库到SQLServer迁移案例

其他数据库到SQLServer迁移实战:

— 案例:从MySQL迁移到SQLServer
— 环境准备:
— 源数据库:MySQL 8.0
— 目标数据库:SQLServer 2022

— 步骤1:安装SQL Server Migration Assistant (SSMA) for MySQL
— 1. 下载并安装SSMA for MySQL
— 2. 安装MySQL ODBC驱动

— 步骤2:使用SSMA迁移
— 1. 创建新的SSMA项目
— 2. 连接到MySQL数据库
— 3. 连接到SQLServer数据库
— 4. 映射MySQL架构到SQLServer架构
— 5. 转换MySQL对象到SQLServer对象
— 6. 加载转换后的对象到SQLServer
— 7. 迁移数据

— 步骤3:验证迁移
— 1. 验证数据库对象
SELECT
type_desc,
COUNT(*) AS count
FROM fgedudb.sys.objects
GROUP BY type_desc;
GO

— 2. 验证数据完整性
SELECT COUNT(*) AS row_count FROM fgedudb.dbo.large_table;
GO

— 3. 验证存储过程和函数
EXEC fgedudb.dbo.sp_test;
GO

— 4. 验证性能
SELECT TOP 100 * FROM fgedudb.dbo.large_table WHERE col1 = ‘test’;
GO

— 案例:从Oracle迁移到SQLServer
— 环境准备:
— 源数据库:Oracle 19c
— 目标数据库:SQLServer 2022

— 步骤1:安装SQL Server Migration Assistant (SSMA) for Oracle
— 1. 下载并安装SSMA for Oracle
— 2. 安装Oracle Client

— 步骤2:使用SSMA迁移
— 1. 创建新的SSMA项目
— 2. 连接到Oracle数据库
— 3. 连接到SQLServer数据库
— 4. 映射Oracle架构到SQLServer架构
— 5. 转换Oracle对象到SQLServer对象
— 6. 加载转换后的对象到SQLServer
— 7. 迁移数据

— 步骤3:验证迁移
— 1. 验证数据库对象
— 2. 验证数据完整性
— 3. 验证存储过程和函数
— 4. 验证性能

执行结果:

— SSMA迁移日志:
— 1. 连接到MySQL数据库:成功
— 2. 连接到SQLServer数据库:成功
— 3. 映射架构:成功
— 4. 转换对象:成功
— 5. 加载对象:成功
— 6. 迁移数据:成功,迁移了10000行数据

— 验证结果:
type_desc count
——————- ———–
USER_TABLE 50
VIEW 10
SQL_STORED_PROCEDURE 20
SQL_FUNCTION 15
INDEX 100

(5 rows affected)

row_count
———–
10000

(1 row affected)

(1 row affected)

(100 rows affected)

4.3 SQLServer数据迁移故障处理案例

数据迁移故障处理实战:

— 案例:迁移过程中遇到的问题及解决方案
— 问题1:备份文件太大,复制时间长
— 解决方案:
— 1. 使用压缩备份
BACKUP DATABASE [fgedudb] TO DISK = ‘E:\backup\fgedudb_full.bak’ WITH INIT, COMPRESSION;
GO

— 2. 使用分卷备份
BACKUP DATABASE [fgedudb] TO
DISK = ‘E:\backup\fgedudb_full_1.bak’,
DISK = ‘E:\backup\fgedudb_full_2.bak’
WITH INIT, COMPRESSION, COPY_ONLY;
GO

— 问题2:还原失败,提示文件路径不存在
— 解决方案:
— 1. 确保目标路径存在
— 2. 使用MOVE选项指定新路径
RESTORE DATABASE [fgedudb] FROM DISK = ‘E:\backup\fgedudb_full.bak’
WITH MOVE ‘fgedudb’ TO ‘E:\SQLServer\Data\fgedudb.mdf’,
MOVE ‘fgedudb_log’ TO ‘E:\SQLServer\Log\fgedudb_log.ldf’;
GO

— 问题3:数据迁移后性能下降
— 解决方案:
— 1. 更新统计信息
EXEC sp_updatestats;
GO

— 2. 重建索引
ALTER INDEX ALL ON fgedudb.dbo.large_table REBUILD;
GO

— 3. 更新兼容性级别
ALTER DATABASE [fgedudb] SET COMPATIBILITY_LEVEL = 160;
GO

— 4. 优化查询计划
DBCC FREEPROCCACHE;
GO

— 问题4:迁移过程中业务中断
— 解决方案:
— 1. 选择业务低峰期进行迁移
— 2. 使用日志传送减少停机时间
— 3. 制定详细的迁移计划和回滚方案

— 问题5:数据一致性问题
— 解决方案:
— 1. 迁移前进行数据验证
— 2. 迁移后进行数据对比
— 3. 使用事务确保数据一致性

执行结果:

BACKUP DATABASE successfully processed 100000 pages in 10.000 seconds (80.000 MB/sec).

BACKUP DATABASE successfully processed 100000 pages in 10.000 seconds (80.000 MB/sec).

RESTORE DATABASE successfully processed 100000 pages in 10.000 seconds (80.000 MB/sec).

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Part05-风哥经验总结与分享

5.1 SQLServer数据迁移最佳实践

  • 制定详细的迁移计划和时间表
  • 进行充分的测试,包括功能测试和性能测试
  • 选择合适的迁移方法,根据数据量和业务需求
  • 确保源数据库和目标数据库的兼容性
  • 备份源数据库,确保可以回滚
  • 监控迁移过程,及时发现和解决问题
  • 迁移后进行充分的验证,确保数据一致性和性能
  • 更新统计信息和重建索引,优化性能

5.2 SQLServer数据迁移常见问题

  • 备份文件太大:解决方案是使用压缩备份或分卷备份
  • 还原失败:解决方案是确保目标路径存在,使用MOVE选项
  • 性能下降:解决方案是更新统计信息,重建索引,优化查询计划
  • 业务中断:解决方案是选择业务低峰期,使用日志传送减少停机时间
  • 数据一致性问题:解决方案是迁移前进行数据验证,迁移后进行数据对比
  • 权限问题:解决方案是确保目标服务器有足够的权限
  • 网络问题:解决方案是确保网络带宽足够,使用压缩传输

5.3 SQLServer数据迁移性能优化

  • 使用压缩备份减少备份文件大小
  • 使用并行备份和还原提高速度
  • 使用SSIS进行批量数据迁移
  • 优化网络传输,使用高速网络
  • 使用SSD存储提高IO性能
  • 迁移后更新统计信息和重建索引
  • 使用分区表进行大表迁移
  • 优化SQLServer配置,提高迁移性能

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息