PostgreSQL pg_转储/复制

PostgreSQL pg_转储/复制,postgresql,pg-dump,Postgresql,Pg Dump,我需要将可定义的表选择的内容转储为CSV,以便初始加载由于各种原因无法与PostgreSQL连接的系统 我编写了一个脚本来执行此操作,它使用带有-c标志的psql运行一系列表,以运行psql的\COPY命令将相应的表转储到如下文件中: COPY table_name TO table_name.csv WITH (FORMAT 'csv', HEADER, QUOTE '\"', DELIMITER '|'); 它很好用。但我相信您已经发现了问题:由于大约60多张表的处理过程大约需要

我需要将可定义的表选择的内容转储为CSV,以便初始加载由于各种原因无法与PostgreSQL连接的系统

我编写了一个脚本来执行此操作,它使用带有-c标志的psql运行一系列表,以运行psql的\COPY命令将相应的表转储到如下文件中:

COPY table_name TO table_name.csv WITH (FORMAT 'csv', HEADER, QUOTE '\"', DELIMITER '|');
它很好用。但我相信您已经发现了问题:由于大约60多张表的处理过程大约需要57分钟,因此一致性的可能性非常接近于绝对零

我想了想,并怀疑我可以对pg_转储进行一些轻量级的更改,以实现我想要的功能,即从pg_转储创建多个csv,同时希望表之间保持完整性,并且能够指定并行转储

我添加了一些标志,以允许我应用文件后缀(日期),设置格式选项并传入相关输出文件的路径

但是,我修改的pg_转储在写入文件时失败,如:

COPY table_name (pkey_id, field1, field2 ... fieldn) TO table_name.csv WITH (FORMAT 'csv', HEADER, QUOTE '"', DELIMITER '|')
注意:在pg_dump中,列列表被展开

所以我四处寻找进一步的信息,找到了这些

在网络上写入文件似乎是一个禁忌;但是我现在在同一台机器上。我觉得写/tmp也可以,因为它是任何人都可以写的

所以我试着用:

seingramp@seluonkeydb01:~$ ./tp_dump -a -t table_name -D /tmp/ -k "FORMAT 'csv', HEADER, QUOTE '\"', DELIMITER '|'" -K "_$DATE_POSTFIX"
tp_dump: warning: there are circular foreign-key constraints on this table:
tp_dump:   table_name
tp_dump: You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints.
tp_dump: Consider using a full dump instead of a --data-only dump to avoid this problem.
--
-- PostgreSQL database dump
--

-- Dumped from database version 12.3
-- Dumped by pg_dump version 14devel

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

--
-- Data for Name: material_master; Type: TABLE DATA; Schema: mm; Owner: postgres
--

COPY table_name (pkey_id, field1, field2 ... fieldn) FROM stdin;
tp_dump: error: query failed:
tp_dump: error: query was: COPY table_name (pkey_id, field1, field2 ... fieldn) TO PROGRAM 'gzip > /tmp/table_name_20200814.csv.gz' WITH (FORMAT 'csv', HEADER, QUOTE '"', DELIMITER '|')
我对数据进行了中性化处理,因为它是特定于客户的

我没有发现pg_dump的错误消息很有帮助,你知道我做错了什么吗? 从第1900行开始,更改非常小(请原谅代码!),忽略了在getopt()周围添加的标志


我还尝试了其他一些技巧,比如指定postgres拥有的目录。我知道这是一个快速的破解,但我希望你能帮助我,谢谢你的关注。

这是
pg\u restore-f
的一个用例。 因此:


pg_dump
将创建表的一致快照,因此在dump.out中数据库处于“冻结”状态。然后,您可以使用
pg_restore
来“解冻”计划中需要的部分。通过使用
-a
您将获得所需的
副本。

IMO,该要求是不合理的。我将提供您现有解决方案中的CSV文件。如果您的客户必须具有数据一致性,那么我会将最近的一致性备份还原到另一个数据库,并从中创建CSV文件。在设置为可重复读取的单个事务中运行所有复制语句怎么样?@Mike,现有的解决方案是MS technolgy——遗憾的是,在这个方向上没有希望。@a_horse_,没有名字的有趣想法!如果可以从psql中的\COPY运行,那可能是一个不错的选择。很抱歉,我没有早点回来,我已经分心了。感谢您不厌其烦地研究我的问题,并提出一个可行的解决方案——我很感激。
        /*
         * Use COPY (SELECT ...) TO when dumping a foreign table's data, and when
         * a filter condition was specified.  For other cases a simple COPY
         * suffices.
         */
        if (tdinfo->filtercond || tbinfo->relkind == RELKIND_FOREIGN_TABLE)
        {
                /* Note: this syntax is only supported in 8.2 and up */
                appendPQExpBufferStr(q, "COPY (SELECT ");
                /* klugery to get rid of parens in column list */
                if (strlen(column_list) > 2)
                {
                        appendPQExpBufferStr(q, column_list + 1);
                        q->data[q->len - 1] = ' ';
                }
                else
                        appendPQExpBufferStr(q, "* ");

                if ( copy_from_spec )
                {
                        if ( copy_from_postfix )
                        {
                                appendPQExpBuffer(q, "FROM %s %s) TO PROGRAM 'gzip > %s%s%s.csv.gz' WITH (%s)",
                                                  fmtQualifiedDumpable(tbinfo),
                                                  tdinfo->filtercond ? tdinfo->filtercond : "",
                                                  copy_from_dest ? copy_from_dest : "",
                                                  fmtQualifiedDumpable(tbinfo),
                                                  copy_from_postfix,
                                                  copy_from_spec);
                        }
                        else
                        {
                                appendPQExpBuffer(q, "FROM %s %s) TO PROGRAM 'gzip > %s%s.csv.gz' WITH (%s)",
                                                  fmtQualifiedDumpable(tbinfo),
                                                  tdinfo->filtercond ? tdinfo->filtercond : "",
                                                  copy_from_dest ? copy_from_dest : "",
                                                  fmtQualifiedDumpable(tbinfo),
                                                  copy_from_spec);
                        }
                }
                else
                {
                        appendPQExpBuffer(q, "FROM %s %s) TO stdout;",
                                                  fmtQualifiedDumpable(tbinfo),
                                                  tdinfo->filtercond ? tdinfo->filtercond : "");
                }
        }
        else
        {
                if ( copy_from_spec )
                {
                        if ( copy_from_postfix )
                        {
                                appendPQExpBuffer(q, "COPY %s %s TO PROGRAM 'gzip > %s%s%s.csv.gz' WITH (%s)",
                                                  fmtQualifiedDumpable(tbinfo),
                                                  column_list,
                                                  copy_from_dest ? copy_from_dest : "",
                                                  fmtQualifiedDumpable(tbinfo),
                                                  copy_from_postfix,
                                                  copy_from_spec);
                        }
                        else
                        {
                                appendPQExpBuffer(q, "COPY %s %s TO PROGRAM 'gzip > %s%s.csv.gz' WITH (%s)",
                                                  fmtQualifiedDumpable(tbinfo),
                                                  column_list,
                                                  copy_from_dest ? copy_from_dest : "",
                                                  fmtQualifiedDumpable(tbinfo),
                                                  copy_from_spec);
                        }
                }
                else
                {
                        appendPQExpBuffer(q, "COPY %s %s TO stdout;",
                                                  fmtQualifiedDumpable(tbinfo),
                                                  column_list);
                }
-- Create custom format dump file
pg_dump -d some_db -U some_user -Fc -f dump.out
-- Move that file to where you need it
-- Dump data only from named table to a file from the dump file.
pg_restore -a -t table_1 -f table_1_data.sql dump.out