postgresql psycopg COPY命令用于大数据集,需要花费很长时间

2j4z5cfb  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(159)

我有2个不同的数据库,我需要复制一个数据库之间的数据到另一个。我使用以下代码:

with psycopg.connect(dsn_src) as conn1, \
    psycopg.connect(dsn_tgt) as conn2:
    with conn1.cursor().copy("COPY " + table + " TO STDOUT (FORMAT BINARY)") as copy1:
        with conn2.cursor().copy("COPY " + table + " FROM STDIN (FORMAT BINARY)") as copy2:
            for data in copy1:
                copy2.write(data)

问题是,我复制了大约10M+行,而且似乎循环永远都要进行。有什么方法可以提高性能吗?

rdrgkggo

rdrgkggo1#

1.通过管道pg_dumppsql,使用PostgreSQL本地格式复制表。

pg_dump -h source_db_host -p source_db_port -U source_db_user \
    --schema='your_schema'                                    \
    --table='your_schema.your_table' source_db_name           \
| psql -h target_db_host -p target_db_port -U target_db_user  \
    -v ON_ERROR_STOP=1 target_db_name                         \
&>> your_table.clone.log  &

1.首先是高压缩的多线程pg_dump,然后是多线程pg_restore

pg_dump -Z9 -Fd -h 127.0.0.1 -p 5432 --verbose --jobs=16 \
--schema 'source_schema' --table='source_schema.source_table' \
-U source_user source_dbname -f transfer_file_name \
> source_table.backup.log 2>&1 &

pg_restore -h target_db_host -p 5432 -U target_user \
--dbname=target_db_name --format=d --exit-on-error \
--verbose --jobs=16 transfer_file_name \
&>> source_table.restore.14.log &

1.使用postgres_fdw将其作为外部表链接,使其可访问,而不必在目标上第二次物理写入。

CREATE EXTENSION IF NOT EXISTS postgres_fdw;

CREATE SERVER source_db FOREIGN DATA WRAPPER postgres_fdw 
OPTIONS (host '127.0.0.1', dbname 'source_db_name', port '5432');

CREATE USER MAPPING FOR your_user_on_target SERVER source_db
OPTIONS (user 'your_user_on_source', password 'your_password');

CREATE SCHEMA schema_linked_from_source;

IMPORT FOREIGN SCHEMA schema_on_source LIMIT TO (table_on_source)
FROM SERVER source_db INTO schema_linked_from_source;

dblink类似。
1.设置replication以连续传输数据。
1.尝试其他psycopg插入方法。

相关问题