Postgres copy命令导入导出数据

最近有需要对数据进行迁移的需求,由于postgres性能的关系,单表3000W的数据量查询起来有一些慢,需要对大表进行切割,拆成若干个子表,涉及到原有数据要迁移到子表的需求。起初的想法是使用存储过程,使用select insert方式进行,但是数据量大的时候耗时有点久,于是需要想别的办法,就发现了postgres本身支持的copy命令。

copy命令

COPY在PostgreSQL表和文件之间交换数据。 COPY TO把一个表的所有内容都拷贝到一个文件,而COPY FROM从一个文件里拷贝数据到一个表里(把数据附加到表中已经存在的内容里)。 COPY TO还能拷贝SELECT查询的结果。

如果声明了一个字段列表,COPY将只在文件和表之间拷贝已声明字段的数据。 如果表中有任何不在字段列表里的字段,那么COPY FROM将为那些字段插入缺省值。

带文件名的COPY指示PostgreSQL服务器直接从文件中读写数据。 如果声明了文件名,那么服务器必须可以访问该文件,而且文件名必须从服务器的角度声明。 如果使用了PROGRAM选项,则服务器会从指定的这个程序进行输入或是写入该程序作为输出。 如果使用了STDIN 或STDOUT选项,那么数据将通过客户端和服务器之间的连接来传输。

常用参数说明:

table_name 
现存表的名字(可以有模式修饰)

column_name 
可选的待拷贝字段列表。如果没有声明字段列表,那么将使用所有字段

query 
一个必须用圆括弧包围的SELECT或VALUES命令,其结果将被拷贝

filename 
输入或输出文件的路径名。输入文件名可以是绝对或是相对的路径,但输出文件名必须是绝对路径。 Windows用户可能需要使用E”字符串和双反斜线作为路径名称

PROGRAM 
需执行的程序名。在COPY FROM命令中,输入是从程序的标准输出中读取,而在COPY TO中,命令的输出会作为程序的标准输入。

注意,程序一般是在命令行界面下执行,当用户需要传递一些变量给程序时,如果这些变量的来源不是可靠的,用户必须小心过滤处理那些对命令行界面来说是有特殊意义的字符。 基于安全的原因,最好是使用固定的命令字符串,或者至少是应避免直接使用用户输入(应先过滤特殊字符)

STDOUT 
声明输入将写入客户端应用

FORMAT 
选择被读或者写的数据格式:text、csv(逗号分隔值),或者binary。 默认是text

导出CSV:

命令:

COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
    TO { ‘filename‘ | PROGRAM ‘command‘ | STDOUT }
    [ [ WITH ] ( option [, ...] ) ]
  • 1
  • 2
  • 3

copy to的导出速度非常之快,经测试10W的数据量只需要3秒左右的时间

示例:

COPY user TO ‘/tmp/data/test.csv‘ WITH csv;
  • 1

也可以导出指定的属性:

COPY user(name,password) TO ‘/tmp/data/test.csv‘ WITH csv;
  • 1

也可以使用select 语句:

COPY (select * from user) TO ‘/tmp/data/test.csv‘ WITH csv;
  • 1

也可以指定要导出哪些字段:

COPY (select name,age from user) TO ‘/tmp/data/test.csv‘ WITH csv header;
  • 1

导入CSV:

命令:

COPY table_name [ ( column_name [, ...] ) ]
    FROM { ‘filename‘ | PROGRAM ‘command‘ | STDIN }
    [ [ WITH ] ( option [, ...] ) ]
  • 1
  • 2
  • 3

示例:

COPY user_1 FROM ‘/tmp/data/test.csv‘ WITH csv;
  • 1

导入命令基本与导出一样,只是将TO 改为 FROM

如果导出的时候,指定了header属性,那么在导入的时候,也需要指定:

COPY user_1(name, age) FROM ‘/tmp/data/test.csv‘ WITH csv header;
  • 1

注意事项:

第一点: 
copy命令必须在plsql命令行执行,执行用户必须为superuser,否则会提示:

ERROR:  must be superuser to COPY to or from a file
HINT:  Anyone can COPY to stdout or from stdin. psql‘s \copy command also works for anyone.
  • 1
  • 2

普通用户进行执行,需要在copy前面加入 “\”,即 \copy即可

第二点: 
如果导出的字段,有integer[]类型,直接导出,再导入的话,会有问题,解决办法是需要在导出的时候,进行处理:

\COPY ( select coalesce(integer_array, ‘{}‘)::integer[] as integer_array from table ) TO ‘/tmp/data.csv‘ with csv header;
  • 1

更多详细信息,可以查看官方文档:

https://blog.csdn.net/wtopps/article/details/79097748

原文地址:https://www.cnblogs.com/zyy98877/p/10462273.html

时间: 2024-10-09 22:06:20

Postgres copy命令导入导出数据的相关文章

BCP是SQL Server中负责导入导出数据的一个命令行工具

BCP是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据.BCP可以将数据库的表或视图直接导出,也能通过SELECT FROM语句对表或视图进行过滤后导出.在导入导出数据时,可以使用默认值或是使用一个格式文件将文件中的数据导入到数据库或将数据库中的数据导出到文件中. 下面将详细讨论如何利用BCP导入导出数据. 1. BCP的主要参数介绍 BCP共有四个动作可以选择. (1) 导入. 这个动作使用in命令完成,后面

exp/expdp 与 imp/impdp命令导入导出数据库详解

一.exp命令导出数据库 如何使exp的帮助以不同的字符集显示:set nls_lang=simplified chinese_china.zhs16gbk,通过设置环境变量,可以让exp的帮助以中文显示,如果set nls_lang=American_america.字符集,那么帮助就是英文的了. 参数: 1.1  导出用户全部数据 exp 登录名称/用户密码@服务命名 FILE=文件存储的路径以及名称 log=日志存储的路径以及名称 FULL=Y(表示导出全部数据,如视图.索引关联关系等等全

mysql导入导出数据中文乱码解决方法小结

inux系统中 linux默认的是utf8编码,而windows是gbk编码,所以会出现上面的乱码问题. 解决mysql导入导出数据乱码问题 首先要做的是要确定你导出数据的编码格式,使用mysqldump的时候需要加上--default-character-set=utf8, 例如下面的代码: 复制代码 代码如下: mysqldump -uroot -p --default-character-set=utf8 dbname tablename > bak.sql 那么导入数据的时候也要使用--

常见SQL Server导入导出数据的几个工具

摘自:http://www.cnblogs.com/chenxizhang/archive/2011/06/09/2076542.html 在我们的日常工作中,与数据库打交道的机会越来越多.这一篇文章我整理一下常见的SQL Server导入导出数据的几个工具 1. 数据导入导出向导 这是一个可视化的工具,我放在首位,是由于它可以极大灵活地满足导入导出功能,而且是所见即所得的,易于使用. 启动数据导入导出向导的方式有好多种,我自己习惯直接通过如下的命令启动(开始=>运行) dtswizard(顾名

[转]mysql导入导出数据中文乱码解决方法小结

本文章总结了mysql导入导出数据中文乱码解决方法,出现中文乱码一般情况是导入导入时编码的设置问题,我们只要把编码调整一致即可解决此方法,下面是搜索到的一些方法总结,方便需要的朋友. linux系统中 linux默认的是utf8编码,而windows是gbk编码,所以会出现上面的乱码问题. 解决mysql导入导出数据乱码问题 首先要做的是要确定你导出数据的编码格式,使用mysqldump的时候需要加上--default-character-set=utf8, 例如下面的代码: 代码如下: mys

oracle10g和oracle11g导入导出数据区别

其中flxuser为用户名,flxuser为密码,file值为导入到数据库中的备份文件. oracle10g和oracle11g导入导出数据的命令方式大有不同: oracle10g导入数据: imp flxuser/flxuser file=test.dmp log=test_20140507.log full=y oracle10g导出数据: Exp flxuser/flxuser owner =flxuser buffer=102400000 file=test.dmp Log=test_2

ORacle数据库导入导出数据

一.导出1.导出整个数据库通用命令:exp 数据库用户名/数据库密码@数据库别名 file=E:\目录\文件名.dmp举例:exp gwyxgldb /gwyxgldb @192.168.0.31  file=d:\gwyxgldb.dmp 2.导出部分表通用命令exp 数据库用户名/数据库密码@数据库别名 GRANTS=Y TABES=(要导出的表1, 要导出的表2,...) file=E:\目录\文件名.dmp exp gwyxgldb /gwyxgldb @192.168.0.31 gra

Excel格式导入导出数据(单语言版本)

Excel格式导入导出数据(单语言版本) 可以使用常用的excel格式导入导出相关数据,包含: 1. 商品分类: 2. 筛选组: 3. 筛选: 4. 商品资料: 5. 商品附加图片资料,(不包含图片本身的上传或抓取): 6. 商品选项: 7. 商品属性: 8. 产品特价数据: 9. 商品折扣数据: 10. 商品奖励积分数据: 特色: 1. 常用excel软件编辑商品数据后导入: 2. 导出的文件名称包含日期和时间,便于备份存档: 3. 由于涉及到服务器的内存,以及数据的多寡,可以将数据按照商品I

(六)成批导入导出数据

(六) 成批导入导出数据 假设已经存在teaching数据库, 存在一张Student表,如图: 右键teaching->任务->导入数据 下一步->数据源(Microsoft Excel)->文件路径导入表->下一步(选择哪个数据库) 下一步->复制一个或多个表或视图的数据 下一步->选择导入的表和导入到数据库的表,如图->编辑映射 下一步: 源 --> 目标 删除目标表中的行,原来表中数据被清除 向目标表中追加行(选择该选项)->确定 下一步