Postgres 9.3 版,托管在 Amazon RDS 上。我有一个messages
包含 10G 数据的表。我psql
在 EC2 上使用连接了数据库。然后用
\COPY (select * from messages) TO '/tmp/messages.csv' WITH (FORMAT CSV, FORCE_QUOTE *)
Run Code Online (Sandbox Code Playgroud)
将所有消息复制到 EC2 上的文件中。
然后我尝试将文件复制回表:
\COPY messages FROM '/tmp/messages.csv' WITH (FORMAT CSV)
Run Code Online (Sandbox Code Playgroud)
大约 5 分钟后,我总是收到此错误。这个messages.csv
文件大约10G。
connection not open
The connection to the server was lost. Attempting reset: Succeeded.
Run Code Online (Sandbox Code Playgroud)
我尝试了一个愚蠢的解决方案,通过将文件拆分为多个较小的主干来减少输入数据的大小。即每个 400MB。
split -l 1000000 messages.csv messages_
Run Code Online (Sandbox Code Playgroud)
这会创建多个较小的文件,每个文件 400MB。这工作正常。
但是有没有我可以更改的配置来保持大文件的连接?
我尝试设置tcp_keepalives_idle=7200
andtcp_keepalives_interval=7200
和tcp_keepalives_count=5
,但连接在 10-15 分钟后仍然丢失。
PostgreSQLCOPY
命令是否可以选择将 CSV 列映射到的字段?
PostgreSQLCOPY
命令似乎期望目标表与其列完全匹配。我错过了什么还是它实际上是如何工作的?
是否有一些替代命令可以启用它?
我们计划从 SQL Server 2008 R2 升级到 SQL Server 2014,目的是使用可用性组。
其中一个辅助节点将用于进行备份。
我已经测试并发现,只要我有完整的仅复制,以及跨越仅复制到我们想要恢复到的时间的日志备份链,我就可以进行时间点恢复。
我们不使用差速器,也没有计划。
除了可能无法在没有“正常”备份的情况下缩小数据文件之外,我看不出这种方法的任何缺点。我们通常不会缩小我们的数据库,除非我们做一些事情来破坏它们,到那时我们无论如何都处于干预模式。
所以我的问题是,我会后悔走这条路吗?
我正在copy
从函数执行命令
execute 'copy (select * from tableName) to ''/tmp/result.txt'''
Run Code Online (Sandbox Code Playgroud)
它工作正常。但是,tableName
是动态的,将有更多的表(循环迭代)。result.txt
只有最后一次迭代(表)数据。
如果必须的话,我可以通过命令行使用\o
或>>
附加到文件中。但是,我必须使用该功能。
我读了http://shuber.io/reading-from-the-filesystem-with-postgres/。它建议使用临时表的解决方案。我可以做类似的事情,但没有临时表吗?(我必须避免归档日志)。创建临时表会创建存档日志吗?
有没有办法copy
在函数中附加命令?
看起来很简单,但我似乎无法在COPY
.
Vertica 是COPY
原子的吗?如果数据加载中断或以某种方式失败,Vertica 是否会负责清理工作?
tsrange 如何以二进制形式存储?
例如创建表
CREATE TABLE public.test (t tsrange);
INSERT INTO test VALUES ('[2010-01-01 14:30, 2010-01-01 15:30)');
INSERT INTO test VALUES ('[2011-01-01 14:31, 2015-11-01 15:30)');
INSERT INTO test VALUES ('[2017-01-01 14:31, 2018-11-01 15:30)');
COPY test TO '/tmp/pgcopy' WITH (FORMAT binary);
COPY test TO '/tmp/pgcopy.csv' WITH (FORMAT csv);
Run Code Online (Sandbox Code Playgroud)
它输出:
cat /tmp/pgcopy.csv
"[""2010-01-01 14:30:00"",""2010-01-01 15:30:00"")"
"[""2011-01-01 14:31:00"",""2015-11-01 15:30:00"")"
"[""2017-01-01 14:31:00"",""2018-11-01 15:30:00"")"
hexdump -C /tmp/pgcopy
00000000 50 47 43 4f 50 59 0a ff 0d 0a 00 00 00 00 00 00 |PGCOPY..........|
00000010 …
Run Code Online (Sandbox Code Playgroud) 我在将 CSV 文件从网络共享驱动器复制到 postgreSQL 时遇到问题,目前的解决方法是先将文件复制到本地驱动器,但这是链中的另一个过程,它变得过于混乱。
如果我运行以下命令
COPY test_schema.test FROM 'X:\_Postgres DBs\Testing\test_file.csv'
CSV HEADER;
Run Code Online (Sandbox Code Playgroud)
我得到:
ERROR: could not open file "X:\_Postgres DBs\Testing\test_file.csv"
for reading: No such file or directory
Run Code Online (Sandbox Code Playgroud)
好的,所以 postgreSQL Server 不理解 Windows 映射驱动器,很好,但是如果我运行:
COPY test_schema.test FROM '\\ws7.domain.com\share-name\_Postgres
DBs\Testing\test_file2.csv' CSV HEADER;
Run Code Online (Sandbox Code Playgroud)
我得到:
ERROR: could not open file "\\ws7.domain.com\share-name\_Postgres
DBs\Testing\test_file2.csv" for reading: Permission denied
Run Code Online (Sandbox Code Playgroud)
文件 test_file2.csv 可以在同一台服务器上本地打开,例如记事本/记事本++/写字板,因此看起来没有任何文件属性,例如“正在使用的文件”
任何人有任何提示如何将 COPY 与共享网络驱动器一起使用?(我们的数据库 UI 是用 Delphi 编码的,所以我正在寻找处理 postgresql 脚本的方法,我可以从 Delphi 调用,否则我将不得不编写一些繁琐的 Delphi Firedac 批处理方法。)
我想了解增加是否work_mem
有助于提高命令的速度COPY
。
是否COPY
使用work_mem
或maint_work_mem
广泛使用?
PostgreSQL 的COPY
命令对于快速导入大量数据非常有用,并且数据必须采用数据类型的文本表示形式。
我正在导入大量数据,包括一timestamp
列,但它存储为“unix time”,即自纪元以来的秒数。我可以将其转换为ISO 8601(例如2010-01-01 00:00:00
,并且 PostgreSQL 接受 a 的转换timestamp
。它不接受原始纪元值整数。
是否可以让 postgres 接受纪元整数值并将其解释/转换为时间戳?这将使我的代码更简单(也许更快)。
这适用于psql
:
create temporary table test1 ( v1 timestamp );
copy test1 from stdin ;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF signal.
>> 2010-01-01 00:00:00
>> \.
COPY 1
Run Code Online (Sandbox Code Playgroud)
但这些没有:
copy test1 from stdin …
Run Code Online (Sandbox Code Playgroud) 将纯文件插入/复制到 postgres 表中的好方法是什么(最好使用psql
命令行)?
就我而言,这些文件是来自 Maildir 档案的一堆电子邮件,所以我尝试使用COPY
:
psql -c "COPY emails (data) FROM '/tmp/emailfile' WITH (FORMAT text);" emails
Run Code Online (Sandbox Code Playgroud)
我将在 for 循环 shell 脚本中使用它 ( for file in $(ls dir); do psql ...; done
)。
但是,我无法找到文件中不可能存在的良好“分隔符”,并且我收到以下错误:ERROR: extra data after last expected column
。
因此,我考虑使用数据库中的COPY ... FORMAT binary
版本和字段(然后将列转换到数据库内部),但这需要文件头和预告片,我没有简单的方法来即时构建。BYTEA
TEXT
有没有一种简单的方法可以从命令行执行此操作,或者我需要为此编写一个 python 脚本吗?
copy ×10
postgresql ×8
csv ×2
import ×2
backup ×1
date-format ×1
dump ×1
fields ×1
optimization ×1
performance ×1
psql ×1
sql-server ×1
timestamp ×1
vertica ×1