首页 > 其他分享 >Copy 进阶用法

Copy 进阶用法

时间:2024-03-28 11:55:45浏览次数:20  
标签:gsql Copy 进阶 COPY 用法 导入 time copy csv

Copy 进阶用法
本文出处:https://www.modb.pro/db/239809

copy 是最基础的导入导出命令,那么它有什么其他用法可以帮助我们更好地进行导入导出的工作呢?

关于导入方式
导入数据的方式有很多种,下面列举的是最常见的三种方式

方式 特点
INSERT 通过 INSERT 语句插入一行或多行数据,及从指定表插入数据。
COPY 通过 COPY FROM STDIN 语句直接向 openGauss 写入数据。通过 JDBC 驱动的 CopyManager 接口从其他数据库向 openGauss 数据库写入数据时,具有业务数据无需落地成文件的优势。
gsql 工具的元命令\copy 与直接使用 SQL 语句 COPY 不同,该命令读取/写入的文件只能是 gsql 客户端所在机器上的本地文件。
我们可以理解为使用 copy 的时候文件是保存在服务器端(101)的,使用\copy 是备份到客户端(198)上。

测试:

在 198 上登陆 101 数据库执行 copy 查看 198 的/home/omm/copy 文件夹 查看 101 的/home/omm/copy 文件夹
在 198 上登陆 101 数据库执行\copy 查看 198 的/home/omm/copy 文件夹 查看 101 的/home/omm/copy 文件夹
导入的时候也是一样,使用 copy 是从服务端寻找文件,使用\copy 是从客户端上寻找文件。

关于数据流向
dn 进行合法性检测后进行转码
进行解析,分离字段
检测格式错误,格式错误的将要进入错误表
没有格式错误的,构造成 tuple 进行插入
Stdin 方式 data 由 gsql 读起,然后 gsql 发送给 dn Copy From 文本方式 data 由 dn 读 \Copy From 文本方式 data 由 gsql 发送给 dn

关于权限
由于 copy 命令始终是到数据库服务端找文件,当以文件形式导入导出数据时需以超级用户执行,权限要求很高,适合数据库管理员操作;而 \copy 命令可在客户端执行导入客户端的数据文件,权限要求没那么高,适合开发人员,测试人员使用。

使用普通用户 copy
$ gsql -p 26000 -d astore -U benchmarksql -W 'passwd' -c "copy copy_test to '/home/omm/test.csv' (format 'csv',header 'true')" ERROR: COPY to or from a file is prohibited for security concerns HINT: Anyone can COPY to stdout or from stdin. gsql's \copy command also works for anyone.
官方文档解释: 当参数 enable_copy_server_files 关闭时,只允许初始用户执行 COPY FROM FILENAME 或 COPY TO FILENAME 命令,当参数 enable_copy_server_files 打开,允许具有 SYSADMIN 权限的用户或继承了内置角色 gs_role_copy_files 权限的用户执行,但默认禁止对数据库配置文件,密钥文件,证书文件和审计日志执行 COPY FROM FILENAME 或 COPY TO FILENAME,以防止用户越权查看或修改敏感文件。

更改参数

astore=# show enable_copy_server_files ; enable_copy_server_files -------------------------- off (1 row) astore=# alter system set enable_copy_server_files=on; ALTER SYSTEM SET astore=# show enable_copy_server_files ; enable_copy_server_files -------------------------- on (1 row)
再次执行 copy

$ gsql -p 26000 -d astore -U benchmarksql -W 'passwd' -c "copy copy_test to '/home/omm/test.csv' (format 'csv',header 'true')" ERROR: must be system admin or a member of the gs_role_copy_files role to COPY to or from a file HINT: Anyone can COPY to stdout or from stdin. gsql's \copy command also works for anyone.
授权 SYSADMIN

openGauss=# grant all privileges to benchmarksql; ALTER ROLE
再次执行 copy

使用普通用户\copy
hr=# \c - sysadmin Password for user sysadmin: Non-SSL connection (SSL connection is recommended when requiring high-security) You are now connected to database "hr" as user "sysadmin". hr=> \du List of roles Role name | Attributes | Member of -----------+------------+----------- sysadmin | | {} hr=> \copy emp to '/home/omm/emp.csv' (format 'csv',header 'true')
导入导出最佳实践
使用 COPY 命令导入数据

COPY 命令从本地或其它数据库的多个数据源并行导入数据。COPY 导入大量数据的效率要比 INSERT 语句高很多,而且存储数据也更有效率。

使用 gsql 元命令导入数据 \copy 命令在任何 gsql 客户端登录数据库成功后可以执行导入数据。与 COPY 命令相比较,\copy 命令不是读取或写入指定文件的服务器,而是直接读取或写入文件.这个操作不如 COPY 命令有效,因为所有的数据必须通过客户端/服务器的连接来传递。对于大量的数据来说 COPY 命令可能会更好。

接下来通过几个测试用例,来更好地了解 copy 相关用法

测试环境: 128G SSD 40CPU OPENGAUSS 2.1.0 单机

表结构 数据文件

指定格式,分隔符导入数据
openGauss=# \copy region from 'region.csv' WITH (FORMAT csv,DELIMITER '|');

openGauss=# \copy region from 'region.csv' delimiter '|' ;

指定导入的字段
$ gsql -p 26000 -d postgres -c "copy region(r_regionkey,r_name,r_comment) from '/home/omm/region.csv' delimiter '|';"
指定导入前两列(表有三列)
$ gsql -p 26000 -d postgres -c "copy region(r_regionkey,r_name) from '/home/omm/region.csv' delimiter '|' IGNORE_EXTRA_DATA;"
若不加 IGNORE_EXTRA_DATA 会报错

\3. 指定格式导出(全列)
$ gsql -p 26000 -d postgres -c "copy region to '/home/omm/region.data' (format 'binary')"
指定格式导入(全列)

$ gsql -p 26000 -d postgres -c "copy region from '/home/omm/region.data' with(format 'binary')"

指定格式导出(指定列)

$ gsql -p 26000 -d astore -U benchmarksql -W 'passwd' -c "copy copy_test(o_orderpriority,o_clerk) to '/home/omm/test1.csv' (format 'csv',header 'true')"

指定格式导入(指定列)

$ gsql -p 26000 -d astore -U benchmarksql -W 'passwd' -c "copy copy_test(o_orderpriority,o_clerk) from '/home/omm/test1.csv' (format 'csv',header 'true',IGNORE_EXTRA_DATA )"

指定表中各个列的转换表达式
$ gsql -p 26000 -d postgres -c "copy copy_test(a,b,c) FROM '/home/omm/test_noheader.csv' DELIMITERS ',' transform(a AS a||b,b AS b+1,c AS date_trunc('year',c))"
\5. 在固定长度模式中,定义每一个字段在数据文件中的位置。 按照 column(offset,length)格式定义每一列在数据文件中的位置。
$ gsql -p 26000 -d hr -c "copy test (a,b,c) FROM '/home/omm/emp.csv' fixed FORMATTER(a(0,2),b(5,2),c(11,3)) header"
\6. 并行导入 \copy 支持并行导入,最大并行数为 8(指定超过 10,按照 8 并行) customer 表 14G (1)不开启并行导入–csv
start_time=$(date +%s) gsql -p 26000 -d postgres -c "\copy customer from '/gaussdata/copy/customer.csv' (format 'csv');" end_time=$(date +%s) echo 'The sum7 time is '$[$end_time-$start_time] 'seconds'
453s 执行完毕

(2)开启并行导入–csv

start_time=$(date +%s) gsql -p 26000 -d postgres -c "\copy customer from '/gaussdata/copy/customer_par.csv' (format 'csv') parallel 10;" end_time=$(date +%s) echo 'The sum8 time is '$[$end_time-$start_time] 'seconds'
103s 执行完毕 (3) 开启并行导入–text
start_time=$(date +%s) gsql -p 26000 -d postgres -c "\copy customer from '/gaussdata/copy/customer_par.txt' (format 'text') parallel 10;" end_time=$(date +%s) echo 'The sum time is '$[$end_time-$start_time] 'seconds'
107s 执行完毕 (4)开启并行导入–binary
start_time=$(date +%s)
gsql -p 26000 -d postgres -c "\copy customer from '/gaussdata/copy/customer.data' (format 'binary') parallel 10;"
end_time=$(date +%s)
echo 'The sum6 time is '$[$end_time-$start_time] 'seconds'
不支持binary格式并行导入总结copy to文件保留在服务器上,\copy to 文件保留在客户端上,copy from从服务器上读取文件,\copy from从客户端读取文件copy必须初始用户使用,\copy 普通用户即可执行\copy 只适合小批量、格式良好的数据导入,不会对非法字符做预处理,也无容错能力,无法适用于含有异常数据的场景。copy不支持并行parallel语法,\copy to parallel 虽然不会报错,但并行不生效,\copy from parallel 支持csv和text格式并行导入

标签:gsql,Copy,进阶,COPY,用法,导入,time,copy,csv
From: https://www.cnblogs.com/helloopenGauss/p/18101284

相关文章

  • JavaWeb——HttpServletRequest获取请求头信息和请求中的参数信息用法
    HttpServletRequest接口提供了访问HTTP请求信息的方法,包括请求行和请求头。下面是一些常用的HttpServletRequest方法,用于获取请求行和请求头信息。StringgetMethod():返回请求的HTTP方法,如GET、POST等。StringgetRequestURI():返回请求的URI,不包括查询字符串。String......
  • CSS的使用——常用选择器的用法
    CSS选择器用于选择要样式化的HTML元素。下面介绍常见的CSS选择器用法。1.通配选择器*{margin:0;padding:0;}2.元素选择器h1{color:blue;}3.类选择器.my-class{font-size:16px;}4.ID选择器#my-id{background-color:ligh......
  • this指向&call,apply,bind的用法及手写
    我们知道call,apply,bind主要用来修改this指向。那么这三个方法的用法区别是什么?具体是怎么修改this 指向的?我们该如何手写自己的call,apply,bind函数?我们先从this指向讲起。明白了this在不同情况的指向,再来看这三个方法在操纵this的具体情况及异同,明白其作用后再......
  • 在 Windows Server 2022 系统中,你可以使用一些组合命令结合系统自带的工具来实现文件
    在WindowsServer2022系统中,你可以使用一些组合命令结合系统自带的工具来实现文件夹同步。以下是一个示例组合命令,结合Robocopy和TaskScheduler来实现文件夹同步:使用Robocopy进行文件夹同步:Robocopy是Windows自带的一个命令行工具,用于复制大量文件和文件夹。你可......
  • python-列表、元组、字符串、集合、字典等用法
    目录1.列表(list)1.1  列表的定义语法1.2  列表的下标索引1.3  列表的常用操作1.4  列表的循环遍历示例2.元组(tuple)3.字符串4.数据容器(序列)的切片4.2序列切片课后练习5.集合(set)5.1  集合的操作方法6.字典(dict)7.容器排序,排序之后会变成列表对象1.......
  • springboot的filter过滤器的用法
    springboot的filter过滤器的用法在项目下创建一个包,包名为filter在filter包下创建一个类型,命名随便然后配置过滤器给类加上过滤器的注释@WebFilter(filename="filtername",urlPatterns="/*")filtername用来设置过滤器的名称,urlPatters配置过滤器作用于那些文件实......
  • whistle.vase的基本用法
    安装w2installwhistle.vase使用启动whistle,进入127.0.0.1:8899/#plugins点击vase,进入vase页面创建对应模版引擎的文件不同的模版引擎用法参考:https://github.com/whistle-plugins/whistle.vase#whistlevase这里的模版引擎中除了whistle.vase内置的script引擎外,其他的......
  • C# 中的Async 和 Await 的用法详解
    C#中的Async和Await的用法详解  众所周知C#提供Async和Await关键字来实现异步编程。在本文中,我们将共同探讨并介绍什么是Async和Await,以及如何在C#中使用Async和Await。同样本文的内容也大多是翻译的,只不过加上了自己的理解进行了相关知识点的补充,如果你认为自己的......
  • MySQL 中 CONCAT() 和 CONCAT_WS()用法
    CONCAT和CONCAT_WS都是MySQL中用于字符串连接的函数,但它们之间有一些区别:CONCAT函数:CONCAT函数用于连接两个或多个字符串。它接受任意数量的参数,将它们连接在一起并返回结果。如果其中有一个参数为NULL,则返回的结果也为NULL。例如:SELECTCONCAT('Hello','',......
  • python 数据类型和运算符 进阶学习
    有了前面的基础的,我们对数据类型有了一定的了解,按照思维进阶深度学习的学习方法,我们对前面的实例进行扩展学习,以求学习到更多一点的知识。实例二:输入两个数,计算它们的和、平方、三次方、平方根、三次方根  首先是复习前面的数据类型的知识该程序的执行结果  是......