我对远程服务器上的数据库具有只读访问权限。所以,我可以执行:
COPY products TO '/tmp/products.csv' DELIMITER ',';
Run Code Online (Sandbox Code Playgroud)
但是在该服务器上我没有创建/保存文件的权限,所以我需要在我的本地机器上执行此操作。
当我连接到远程数据库时,如何执行命令将文件保存在本地计算机而不是远程服务器上?
或者,如何执行 Linux 命令以连接到远程数据库、执行查询并将输出作为文件保存到我的本地计算机?
我有一个包含大约 6000 万行的表,我按状态将其划分为 53 个子表。这些表像这样“继承”大表:
CREATE TABLE b2b_ak (LIKE b2b including indexes, CHECK ( state = 'AK') ) INHERITS (b2b8) TABLESPACE B2B;
我的问题是:如果在复制语句完成之前我不在 b2b8 上构建索引,子表是否继承索引?换句话说,我想这样做:
Create b2b8
Create b2b8_ak inherits b2b8
COPY b2b8 FROM bigcsvfile.csv
CREATE INDEX CONCURRENTLY
Run Code Online (Sandbox Code Playgroud)
并让整个事情结果在子表上创建了所有索引。
我想在 Postgres 命令中添加冲突忽略copy
。我知道我可以将数据复制到没有唯一索引/主键的表中,然后使用插入语法on conflict
。但我想知道这是否可以直接来自COPY
?
所以我一直在使用 postgre 数据库,我注意到当我尝试读取 csv 文件并远程复制到表时,它有时会抛出错误。当我使用缓冲阅读器时它工作得很好,但我试图看看是否有办法让我使用数据库 COPY FROM 方法来工作。它在数据库所在的计算机上运行良好,但我的另一台计算机出现错误。
这一行出现错误:
st.execute("COPY inputdata FROM 'C:\\Users\\JAMES\\Downloads\\V24_Mike_110217_RemovedReturnTrips\\RyderCombiner\\AllNonMatchingWithColNames.csv' CSV HEADER DELIMITER ',';");
Run Code Online (Sandbox Code Playgroud)
这是我连接到数据库的地方:
Class.forName("org.postgresql.Driver");
Connection conn = DriverManager.getConnection("jdbc:postgresql://192.168.1.15:5432/postgres", "postgres", "pass");
Run Code Online (Sandbox Code Playgroud)
我在网上读到也许 STDIN 可以帮助我,但我无法让它工作,并且大多数在线示例都使用 pqsl。有没有办法让它工作或者我需要返回缓冲读者?
更新:
因此,我尝试使用 CopyManager API,但在尝试使用 DBUtil 建立连接时出现错误,因为即使我从以下网站下载了 jar 文件,它也无法识别:http ://commons.apache.org/proper/ commons-dbutils/download_dbutils.cgi
代码:
Connection connection = DBUtil.getConnection("POSTGRES");
String sql = "COPY inputdata FROM 'C:\\Users\\JAMES\\Downloads\\V24_Mike_110217_RemovedReturnTrips\\RyderCombiner\\AllNonMatchingWithColNames.csv' CSV HEADER DELIMITER ','";
CopyManager copyManager = new CopyManager((BaseConnection)connection);
copyManager.copyIn(sql);
Run Code Online (Sandbox Code Playgroud)
我在 DBUtil 的第一行收到错误...导入 jar 文件是使 jdbc 识别此变量的唯一方法吗?
更新2:
再次感谢大家,我最终通过遵循给定的链接和一些调整使复制工作正常。
public static void readInputData(String inputDataFile, Statement st) …
Run Code Online (Sandbox Code Playgroud) 我们正在我们的项目中引入持续集成,我们决定使用新的生产数据自动刷新我们的测试数据库实例。
我目前正在寻找最佳方法,以避免任何生产中断或减速。
我首先想通过sqlcmd
实用程序从命令行使用备份/恢复命令......
但它似乎有问题,因为它仅生成一个.bak
文件,尽管该文件仍与 .mdf/.ldf 文件“链接”。因此,在我们的测试环境中恢复它时,找不到这些.mdf
/.ldf
文件。
然后我继续在恢复命令中指定一个“WITH MOVE”选项,以便通过网络共享指定.mdf
/.ldf
文件的位置,但我认为生产服务器锁定这些文件并防止从测试服务器读取它们。
所以基本上,你知道一种直接(有效)的方法来将数据库转储到单个文件中,以便在我们的测试环境中轻松加载它吗?
当然不会破坏生产环境。
编辑:
生产和测试 SQL Server 版本都是 12.0.2000。
但我首先测试从生产加载到本地开发 SQL Server Express(也是 v12.0.2000)
我已经在 SO 上问过这个问题,但也许那是错误的位置。对于重复发帖表示歉意,但这个问题可能在这里有更好的受众。
原来的问题是:/sf/ask/1793350331/
正文如下。谢谢。
当运行 postgresql [9.3]“COPY TO”功能时,postgres 用户创建一个文件。我已经告诉它把文件放在 tmp 目录中(尽管如果需要的话可以更改)。
这是作为 cron 作业的一部分运行的,用户是专门为此任务设置的“导出”用户。最终目标是导出的文件最终位于 /home/export/created_file.csv 中。
1)postgres
如果不将文件夹设置得过于宽松,则无法将导出的文件直接存储到另一个用户的主目录中。
2) 导出用户可以将文件从其/tmp
主目录复制到其主目录,但随后无法清理(删除)postgres
中拥有的文件/tmp
。
这是一个日常过程,因此需要以某种方式删除旧文件。我可以添加一个 cron 作业来清理文件,但我希望有一个更干净的解决方案 - 要么是一种更改创建文件的权限的方法postgres
,要么是某种方式为导出用户提供能够删除的额外权限该文件在创建之前。
然而,为导出用户提供与postgres
一般情况相同的权限并不是一种选择,因为这样它将可以自由控制数据库。
任何建议,无论是基于 unix 还是基于 postgres,都将非常受欢迎,谢谢。
我正在尝试将数据导入到 postgres 中。数据字段以逗号分隔,字符串可能包含逗号,在这种情况下,这些字段将被转义:
数据结构:
create table v (a varchar);
Run Code Online (Sandbox Code Playgroud)
数据文件:
bus
'Gat\,\\e\'way_MQB'
Run Code Online (Sandbox Code Playgroud)
导入命令(在Linux下从bash运行)
cat data.csv | psql -d database -c "copy v (a) from stdin with delimiter ',' escape '\\' CSV header"
Run Code Online (Sandbox Code Playgroud)
错误:
ERROR: extra data after last expected column
Run Code Online (Sandbox Code Playgroud)
我已经和谷歌对抗这个问题好几个小时了,不明白我做错了什么?
我正在尝试根据 2009 年的 SO 答案在 postgresql 中创建数据库的副本,但遇到了问题。
在 Postgres 9.3.9 中,这将创建一个没有关系的数据库(gcis 数据库存在并且具有表和数据):
postgres=# CREATE DATABASE gcis_rollback WITH TEMPLATE gcis OWNER postgres;
CREATE DATABASE
postgres=# \c gcis_rollback
You are now connected to database "gcis_rollback" as user "postgres".
gcis_rollback=# \d
No relations found.
Run Code Online (Sandbox Code Playgroud)
我使用命令行得到同样的结果createdb
:
~$ createdb -O postgres -T gcis gcis_rollback2
~$ psql gcis_rollback2
psql (9.3.9)
Type "help" for help.
gcis_rollback2=# \d
No relations found.
Run Code Online (Sandbox Code Playgroud)
为什么我看不到该数据库的完整副本?
背景- 这是一个开发服务器,我可以在其中断开连接来制作副本。我想要的只是一个本地副本,以便在使用 Perl 框架开发/测试数据库架构更改时轻松回滚我想要的只是一个本地副本,以便在使用 Perl 框架Module::Build::Database来构建补丁 …
PostgreSQLCOPY
命令是否可以选择将 CSV 列映射到的字段?
PostgreSQLCOPY
命令似乎期望目标表与其列完全匹配。我错过了什么还是它实际上是如何工作的?
是否有一些替代命令可以启用它?
我们计划从 SQL Server 2008 R2 升级到 SQL Server 2014,目的是使用可用性组。
其中一个辅助节点将用于进行备份。
我已经测试并发现,只要我有完整的仅复制,以及跨越仅复制到我们想要恢复到的时间的日志备份链,我就可以进行时间点恢复。
我们不使用差速器,也没有计划。
除了可能无法在没有“正常”备份的情况下缩小数据文件之外,我看不出这种方法的任何缺点。我们通常不会缩小我们的数据库,除非我们做一些事情来破坏它们,到那时我们无论如何都处于干预模式。
所以我的问题是,我会后悔走这条路吗?
copy ×10
postgresql ×8
csv ×2
export ×2
sql-server ×2
backup ×1
import ×1
index ×1
jdbc ×1
linux ×1