SQL Server 按表导出/导入 (bcp, sqlpackage)
SQL Server难度: 中级耗时: 20–60 分钟这不是备份,而是逻辑数据迁移:用 bcp 导出表并加载到另一个数据库(native 或字符格式、格式文件、batch、TABLOCK、标识列、UTF-8),将查询结果导出为 CSV/文本文件 (queryout),用 sqlpackage 迁移架构 + 数据(.bacpac Export/Import,例如迁移到 Azure SQL Database),以及仅迁移架构(.dacpac Extract、Script、Publish)。包括在 Linux 上安装 mssql-tools18 和 sqlpackage。完成后,您将得到目标端行数已与源端核对一致的表,或一个可共享的文件。
如果要把整个数据库迁移到相同或更高版本的 SQL Server,备份/还原更快、更一致:SQL Server 备份与还原。
架构: 1 台服务器(命令在 SQL Server 上或一台管理服务器上运行)
场景
- 迁移表:bcp out → bcp in — 将一个或多个表复制到另一个 SQL Server 数据库;目标端必须事先建好表。
- 将查询结果导出到文件:bcp queryout (CSV/文本) — 将查询结果写入 CSV/文本文件,提供给其他系统(Excel、ETL、报表)。
- 架构 + 数据:sqlpackage Export / Import (.bacpac) — 用一个文件迁移架构和数据;特别适用于迁移到 Azure SQL Database 或中小型数据库。
- 仅架构:sqlpackage Extract / Script / Publish (.dacpac) — 仅提取架构、与目标比较并生成变更脚本,或在新环境中部署空架构。
开始之前
- 已选择合适的工具: - bcp (native):在 SQL Server 之间迁移一个或多个大表;最快。目标表必须事先存在。 - bcp (字符) / queryout:向其他系统(ETL、报表、Excel)提供文本/CSV。 - .bacpac (Export/Import):用一个文件迁移架构 + 数据;特别适用于迁移到 Azure SQL Database。大型数据库(数百 GB)上很慢,此时请优先使用备份/还原或 bcp。 - .dacpac (Extract):仅架构(表、视图、存储过程);用于架构比较和在新环境中部署空架构。
- … 在源端有读取权限(表的 SELECT;Export/Extract 建议 db_owner),在目标端有写入权限(bcp in 需要 INSERT + ALTER TABLE;Import/Publish 需要 dbcreator 或 db_owner)。在运行脚本前提供密码:read -rsp '密码: ' SQLCMDPASSWORD; export SQLCMDPASSWORD,以及 sudo --preserve-env=SQLCMDPASSWORD bash <script>.sh。
- 已以管理员身份打开 PowerShell(开始 → "PowerShell" → 右键 → Run as administrator)。…打开 PowerShell 的 Windows 帐户…登录名 …… 在源端有读取权限,在目标端有写入权限(bcp in 需要 INSERT + ALTER TABLE;Import/Publish 需要 dbcreator 或 db_owner)。
- 命令服务器可通过 TCP 访问源 (…)… 和目标 (…)… SQL Server。
- 命令服务器可通过 TCP 访问源 (…)… 和目标 (…)… SQL Server;bcp 和 sqlcmd 在 PATH 中(随 SQL Server 安装或 "Microsoft Command Line Utilities for SQL Server" 提供)。
- 导出目录 (…) 所在磁盘的可用空间不小于要迁移的数据量(native 文件大致等于表的数据大小;字符文件可能更大;.bacpac 是压缩的)。
- 导出目录 (…) 所在驱动器的可用空间不小于要迁移的数据量。
- 目标数据库 (…) 中已按相同结构建好表(bcp 不建表)。迁移架构的简便方法是本指南的仅架构 (.dacpac) 选项。大批量加载时可禁用目标表上的非聚集索引和触发器,之后再检查外键。
- 导出期间源端没有写入(应用已停止),或使用数据库的副本作为源(从 COPY_ONLY 备份还原的库或 database snapshot)。bcp 和 sqlpackage Export 不具备事务一致性:导出期间发生变化的表之间可能不一致。
指南阶段
- 工具与准备 — 安装 sqlcmd 和 bcp 工具 (mssql-tools18) · 安装 sqlpackage · 检查 bcp 和 sqlcmd 工具 · 安装 sqlpackage · 创建导出目录 · 创建导出目录
- 迁移表 (bcp out / in) — 记录源表的行数和大小 · 生成格式文件 · 生成格式文件 · 导出表 (bcp out) · 导出表 (bcp out) · 检查目标表 …
- 导出查询结果 (queryout) — 将查询结果写入文件 (bcp queryout) · 将查询结果写入文件 (bcp queryout)
- 架构 + 数据 (.bacpac) — 将数据库导出为 .bacpac (Export) · 将数据库导出为 .bacpac (Export) · 创建目标数据库(如不存在) · 将 .bacpac 加载到目标 (Import) · 将 .bacpac 加载到目标 (Import) · 检查目标数据库中的表和行数
- 仅架构 (.dacpac) — 将架构提取为 .dacpac (Extract) · 将架构提取为 .dacpac (Extract) · 创建目标数据库(如不存在) · 生成针对目标的变更脚本 (Script) · 生成针对目标的变更脚本 (Script) · 将架构应用到目标 (Publish) …
- 后续 — 清理导出文件 · 清理导出文件