GaussDB作为一款高性能关系型数据库,支持使用COPY命令高效地进行数据的__导出(COPY TO)__和__导入(COPY FROM)__操作
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)进一步提升灵活性。
浙公网安备 33010602011771号