

# 从 Linux 中使用 BCP 实用程序导入和导出数据
<a name="SQLServer.Procedural.Importing.BCP.Linux"></a>

BCP（批量复制程序）实用程序提供了一种在 RDS for SQL Server 数据库实例与数据文件之间传输大量数据的高效方法。您可以从 Linux 环境中使用 BCP 来执行批量数据操作，这使其可用于数据迁移、ETL 处理和常规数据传输。

BCP 既支持将数据从文件导入到 SQL Server 表中，也支持将数据从 SQL Server 表导出到文件。这对于传输包括分隔文本文件在内的各种格式的结构化数据特别有效。

## 先决条件
<a name="SQLServer.Procedural.Importing.BCP.Linux.Prerequisites"></a>

在从 Linux 系统中对 RDS for SQL Server 数据库实例使用 BCP 之前，请确保您已具备以下条件：
+ 一个 Linux 环境，该环境与 RDS for SQL Server 数据库实例具有网络连接
+ 安装在 Linux 系统上的 Microsoft SQL Server 命令行工具，包括：
  + sqlcmd：SQL Server 命令行查询工具
  + bcp：批量复制程序实用程序
+ RDS for SQL Server 数据库实例的有效凭证
+ 通过安全组配置的网络访问权限，以支持通过 SQL Server 端口（通常为 1433）进行连接
+ 针对要执行的操作的相应数据库权限

## 在 Linux 上安装 SQL Server 命令行工具
<a name="SQLServer.Procedural.Importing.BCP.Linux.Installing"></a>

要从 Linux 中使用 BCP，您需要安装 Microsoft SQL Server 命令行工具。有关特定 Linux 发行版的详细安装说明，请参阅以下 Microsoft 文档：
+ [Install sqlcmd and bcp the SQL Server command-line tools on Linux](https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools)
+ [bcp utility](https://docs.microsoft.com/en-us/sql/tools/bcp-utility)：BCP 实用程序的完整参考资料

安装完成后，请运行以下命令以确保工具位于 PATH 下：

```
bcp -v
sqlcmd -?
```

## 从 RDS for SQL Server 中导出数据
<a name="SQLServer.Procedural.Importing.BCP.Linux.Exporting"></a>

您可以使用 BCP 将数据从 RDS for SQL Server 数据库实例导出到 Linux 系统上的文件。这对于创建备份、执行数据分析或准备数据来进行迁移非常有用。

### 基本导出语法
<a name="SQLServer.Procedural.Importing.BCP.Linux.Exporting.Basic"></a>

使用 BCP 导出数据的基本语法是：

```
bcp database.schema.table out output_file -S server_name -U username -P password [options]
```

其中：
+ `database.schema.table`：完全限定的表名称
+ `output_file`：输出文件的路径和名称
+ `server_name`：RDS for SQL Server 端点
+ `username`：数据库用户名
+ `password`：数据库密码

### 导出示例
<a name="SQLServer.Procedural.Importing.BCP.Linux.Exporting.Example"></a>

以下示例从 `sales` 数据库中名为 `customers` 的表导出数据：

```
bcp sales.dbo.customers out /home/user/customers.txt \
    -S mydb.cluster-abc123.us-east-1.rds.amazonaws.com \
    -U admin \
    -P mypassword \
    -c \
    -t "|" \
    -r "\n"
```

此命令：
+ 从 `customers` 表中导出数据
+ 将输出保存到 `/home/user/customers.txt`
+ 使用字符格式 (`-c`)
+ 使用竖线（\$1）作为字段分隔符 (`-t "|"`)
+ 使用换行符作为行分隔符 (`-r "\n"`)

## 将数据导入到 RDS for SQL Server
<a name="SQLServer.Procedural.Importing.BCP.Linux.Importing"></a>

您可以使用 BCP 将 Linux 系统上文件中的数据导入到 RDS for SQL Server 数据库实例。这对于数据迁移、加载测试数据或定期更新数据非常有用。

### 基本导入语法
<a name="SQLServer.Procedural.Importing.BCP.Linux.Importing.Basic"></a>

使用 BCP 导入数据的基本语法是：

```
bcp database.schema.table in input_file -S server_name -U username -P password [options]
```

其中：
+ `database.schema.table`：完全限定的目标表名称
+ `input_file`：输入文件的路径和名称
+ `server_name`：RDS for SQL Server 端点
+ `username`：数据库用户名
+ `password`：数据库密码

### 导入示例
<a name="SQLServer.Procedural.Importing.BCP.Linux.Importing.Example"></a>

以下示例将数据从文件导入到名为 `customers` 的表中：

```
bcp sales.dbo.customers in /home/user/customers.txt \
    -S mydb.cluster-abc123.us-east-1.rds.amazonaws.com \
    -U admin \
    -P mypassword \
    -c \
    -t "|" \
    -r "\n" \
    -b 1000
```

此命令：
+ 将数据导入到 `customers` 表中
+ 读取 `/home/user/customers.txt` 中的数据
+ 使用字符格式 (`-c`)
+ 使用竖线（\$1）作为字段分隔符 (`-t "|"`)
+ 使用换行符作为行分隔符 (`-r "\n"`)
+ 以 1000 行为一批处理数据 (`-b 1000`)

## 常用 BCP 选项
<a name="SQLServer.Procedural.Importing.BCP.Linux.Options"></a>

BCP 提供了许多选项来控制数据格式和传输行为。下表介绍了常用的选项：


| 选项 | 描述 | 
| --- | --- | 
| -c | 对所有列使用字符数据类型 | 
| -n | 使用原生数据库数据类型 | 
| -t | 指定字段分隔符（默认为制表符） | 
| -r | 指定行分隔符（默认为换行符） | 
| -b | 指定批量操作的批次大小 | 
| -F | 指定要导出或导入的第一行 | 
| -L | 指定要导出或导入的最后一行 | 
| -e | 指定用于捕获被拒绝行的错误文件 | 
| -f | 指定用于对数据进行格式化的格式文件 | 
| -q | 将带引号的标识符用于对象名称 | 

## 最佳实践和注意事项
<a name="SQLServer.Procedural.Importing.BCP.Linux.BestPractices"></a>

当从 Linux 中将 BCP 与 RDS for SQL Server 结合使用时，请考虑以下最佳实践：
+ **使用批处理**：对于大型数据集，使用 `-b` 选项来分批处理数据。这可以提高性能并可实现更好的错误恢复。
+ **妥善地处理错误**：使用 `-e` 选项在单独的文件中捕获错误信息和被拒绝的行，以进行分析。
+ **选择适当的数据格式**：当源和目标都是 SQL Server 时，使用字符格式 (`-c`) 来实现跨平台兼容性，或使用原生格式 (`-n`) 来提高性能。
+ **保护您的凭证**：避免直接在命令行中放入密码。考虑使用环境变量或配置文件以及适当的权限。
+ **使用小型数据集进行测试**：在处理大量数据之前，使用较小的数据集测试 BCP 命令以验证格式和连接性。
+ **监控网络连接**：确保稳定的网络连接，特别是对于大型数据传输。考虑使用诸如 `screen` 或 `tmux` 之类的工具执行长时间运行的操作。
+ **验证数据完整性**：在传输数据后，验证行数和样本数据，以确保操作成功完成。

## 排查常见 问题
<a name="SQLServer.Procedural.Importing.BCP.Linux.Troubleshooting"></a>

下表描述了从 Linux 中使用 BCP 时可能遇到的常见问题及其解决方案：


| 事务 | 解决方案 | 
| --- | --- | 
| 连接超时或网络错误 | 验证 Amazon RDS 端点、安全组设置和网络连接。确保可以从 Linux 系统访问 SQL Server 端口（通常为 1433）。 | 
| 身份验证失败次数 | 验证用户名和密码。确保数据库用户对您正在执行的操作具有相应的权限。 | 
| 数据格式错误 | 检查您的字段和行分隔符。确保数据格式符合 BCP 的预期。对复杂的数据结构使用格式文件。 | 
| 权限被拒绝错误 | 请确保数据库用户对目标表具有 INSERT 权限（用于导入）或 SELECT 权限（用于导出）。 | 
| 大文件处理问题 | 通过 -b 选项使用批处理。考虑将大文件拆分成较小的分块，以改善性能和错误恢复。 | 
| 字符编码问题 | 确保数据文件使用兼容的字符编码。对字符格式使用 -c 选项或指定相应的代码页。 | 