GaussDB作为一款高性能关系型数据库,支持使用COPY命令高效地进行数据的导出(COPY TO)和导入(COPY FROM)操作。该命令主要用于在数据库表与操作系统文件之间批量传输数据,适用于数据迁移、备份恢复、ETL流程等场景。以下从核心语法、关键参数、使用场景、注意事项等方面详细介绍。
一、核心语法 COPY命令分为两种模式:服务器端模式(直接操作数据库服务器文件系统)和客户端模式(通过客户端工具操作本地文件)。GaussDB主要支持服务器端模式,客户端模式需通过psql的\copy元命令实现(本质是客户端工具转发指令)。
1. 导出数据:COPY TO 将表(或查询结果)的数据导出到服务器文件系统中的文件。 语法:
COPY [ONLY] table_name [(column_list)] FROM { 'filename' | PROGRAM 'command' | STDIN } [WITH] [ FORMAT format_name -- 文件格式(TEXT/CSV/BINARY) [DELIMITER 'delimiter_character'] -- 列分隔符(默认',' for CSV,'\t' for TEXT) [NULL [AS] 'null_string'] -- 空值表示(默认'\N') [HEADER] -- 是否包含表头(仅CSV支持) [QUOTE 'quote_character'] -- 引号字符(仅CSV支持,默认'"') [ESCAPE 'escape_character'] -- 转义字符(仅CSV支持,默认'"'或'') [ENCODING 'encoding_name'] -- 文件编码(默认与数据库一致) [FORCE_QUOTE { (column_list) | * }] -- 强制引用指定列(仅CSV) [FORCE_NOT_NULL (column_list)] -- 禁止自动识别空值(仅CSV) ] 示例: 导出employees表所有数据到服务器的/data/emp_export.csv,使用CSV格式并包含表头:
COPY employees TO '/data/emp_export.csv' WITH (FORMAT CSV, HEADER, DELIMITER ','); 2. 导入数据:COPY FROM 将服务器文件系统中的文件数据导入到数据库表中(支持覆盖或追加)。 语法:
COPY [ONLY] table_name [(column_list)] FROM { 'filename' | PROGRAM 'command' | STDIN } [WITH] [ FORMAT format_name -- 文件格式(同导出) [DELIMITER 'delimiter_character'] -- 列分隔符(同导出) [NULL [AS] 'null_string'] -- 空值表示(同导出) [HEADER] -- 是否跳过表头(仅CSV支持) [QUOTE 'quote_character'] -- 引号字符(同导出) [ESCAPE 'escape_character'] -- 转义字符(同导出) [ENCODING 'encoding_name'] -- 文件编码(同导出) [FORCE_NOT_NULL (column_list)] -- 强制指定列为非空(仅CSV) ] 示例: 从服务器的/data/emp_import.csv导入数据到employees表(跳过首行表头):
COPY employees FROM '/data/emp_import.csv' WITH (FORMAT CSV, HEADER, DELIMITER ','); 二、关键参数详解 参数 说明 ONLY 仅导出/导入表本身数据,不包含继承表(仅对继承表有效)。 column_list 指定目标列(导入时跳过未列出的列;导出时仅输出指定列)。 FORMAT 支持TEXT(默认,通用文本格式)、CSV(逗号分隔,符合RFC 4180)、BINARY(二进制格式,保留类型信息)。 DELIMITER 列分隔符(TEXT默认\t,CSV默认,)。 HEADER 仅CSV格式有效,表示文件首行是列名(导出时添加,导入时跳过)。 NULL 定义空值的字符串表示(如NULL AS ''表示空字符串视为空值)。 QUOTE 仅CSV有效,指定包裹含特殊字符(如分隔符、换行符)字段的引号(默认")。 ESCAPE 仅CSV有效,定义转义引号的字符(默认",即两个连续引号""表示一个")。 ENCODING 文件编码(如UTF8、GBK),需与文件实际编码一致,否则可能乱码。 FORCE_QUOTE 仅CSV有效,强制对指定列(或所有列)添加引号(即使内容无特殊字符)。 FORCE_NOT_NULL 仅CSV有效,禁止自动将QUOTE内的空字符串识别为空值(需配合QUOTE使用)。 三、使用场景 数据迁移:快速将数据从旧系统导出为CSV,再导入到GaussDB。 备份恢复:导出关键表数据作为备份(优于pg_dump的轻量级需求场景)。 ETL集成:与外部数据处理工具(如Spark、DataX)配合,通过CSV文件中转数据。 调试分析:导出表数据到本地,用Excel、Python等工具分析。 四、注意事项 权限要求: 执行COPY的用户需拥有目标表的SELECT(导出)或INSERT(导入)权限。 服务器端模式:数据库进程(如gaussdb用户)需有文件路径的读写权限(避免使用root路径,建议用/tmp或业务目录)。 文件路径: 服务器端模式:文件路径必须是数据库服务器的本地路径(如/data/),客户端无法直接指定本地路径(需用\copy元命令)。 客户端模式(\copy):通过psql执行,文件路径为客户端本地路径(如\copy employees from 'local.csv' with csv)。 数据格式匹配: 导入时,文件列数必须与表列数一致(或通过column_list指定目标列)。 数据类型需兼容(如文件中的字符串需能转换为表的INT/DATE等类型,否则报错)。 性能优化: COPY是批量操作,比逐条INSERT快得多(减少事务日志和锁竞争)。 大文件导入时,建议关闭索引/约束(导入后重建),或使用DISABLE TRIGGER ALL临时禁用触发器(仅PostgreSQL兼容语法,GaussDB可能部分支持)。 错误处理: 默认情况下,遇到错误会终止整个操作。可通过LOG ERRORS子句(需GaussDB版本支持)记录错误行,或结合ON_ERROR_STOP(psql元命令)控制行为。 二进制格式: BINARY格式存储列类型元数据,适合跨版本/跨平台传输,但可读性差,通常仅在需要精确类型保留时使用。 五、与\copy的区别 GaussDB支持通过psql客户端执行\copy元命令,本质是将客户端文件通过标准输入/输出转发到服务器端COPY。两者主要区别:
特性 COPY(服务器端) \copy(客户端) 文件路径 数据库服务器本地路径 客户端本地路径 权限要求 数据库进程需有文件权限 客户端用户需有文件权限 适用场景 服务器端直接操作大文件 客户端本地小文件快速导入导出 总结 GaussDB的COPY命令是高效的数据传输工具,适用于批量数据的导入导出。使用时需注意文件路径权限、数据格式匹配及性能优化,结合具体场景选择服务器端或客户端模式。对于复杂ETL流程,可结合外部表(EXTERNAL TABLE)或数据集成工具(如DataX)进一步提升灵活性。