GaussDB作为一款高性能关系型数据库,支持使用COPY命令高效地进行数据的__导出(COPY TO)__和__导入(COPY FROM)__操作

79 阅读5分钟

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)进一步提升灵活性。