Migrate/copy 从 postgres 到 vertica 的数据
Migrate/copy data from postgres to vertica
我正在尝试 migrate/copy 使用 python3 从 postgres 到 vertica 的数据(如果还有其他用户友好的方法,我很乐意听到它们)。问题是下面的代码仅在我从 postgres 复制一列数据时才有效。如果我复制多列,它会迁移 nothing.i.e。在 vertica 中创建 table 为空。
如何将整个 table 从 postgres 迁移到 vertica?
conn = psycopg2.connect()
input = io.StringIO()
cur_postrgres = conn.cursor()
cur_postrgres.copy_expert('''COPY (SELECT id, date from table_1) TO STDOUT;''', input)
cur_postrgres.close()
cur_vertica.execute("DROP TABLE IF EXISTS table_1_temp;")
cur_vertica.connection.commit()
cur_vertica.execute('''CREATE TABLE table_1_temp (
id BIGINT, date TIMESTAMP WITHOUT TIME ZONE);''')
cur_vertica.connection.commit()
#cur_vertica.stdin = input
#input.seek(0)
cur_vertica.copy('''COPY table_1_temp FROM STDIN NULL AS 'null' ''', input.getvalue())
cur_vertica.execute("COMMIT;")
cur_vertica.close()
我相信 postgresql 副本中的默认分隔符是制表符。 vertica 的默认分隔符是管道。您可能需要在 vertica 副本上指定 DELIMITER E'\t'
,或在 postgresql 副本上指定 DELIMITER '|'
。
数据很可能因为没有足够的列而被拒绝。
另一种将 Postgres 数据库复制到 Vertica 的方法是使用 pg_dump
。这会创建一个 tar,其中包含制表符分隔的文本数据文件和一个可以在 Vertica 中编辑和执行的 SQL 程序。
如果需要创建许多 table,这会很有用。 SQL 包含每个 table 的 CREATE TABLE、ADD INDEX、CREATE SEQUENCE 等语句,并生成 COPY 语句以加载每个数据文件。
Vertica 基于 PostgresQL,因此方言相似。它生成的restore.sql
几乎是完美的,你只需要删除不相关的语句,或者更改模式名称,并细化COPY
语句。
pg_dump --format=tar --dbname=mydb --username=myuser --no-owner --verbose --no-privileges > mydata.tar
可选择在导出前压缩 tar
zip mydata.tar.zip mydata.tar
将 tarball 复制到 Vertica 机器上的工作目录
scp -i ~/.ssh/secret.pem mydata.tar.zip mydata.tar.zip myuser@123.456.345:/data
登录实例,解压tar球:
ssh -i ~/.ssh/secret.pem myuser@123.456.345:/data
unzip mydata.tar.zip
tar -xvf mydata.tar
现在适当地编辑 restore.sql
文件。我发现我需要:
删除顶部的一堆与 Vertica 无关的内容,例如 SET statement_timeout = 0;
和 COMMENT ON EXTENSION plpgsql
删除它生成的两个COPY
语句之一,一个来自STDIN
,一个来自文件
编辑 COPY
语句以添加特定于 Vertica 的内容,例如 DELIMITER AS E'\t' NULL AS '\N' ABORT ON ERROR;
之后,导入只是在 Vertica 中执行该文件:
\i restore_modified.sql
我正在尝试 migrate/copy 使用 python3 从 postgres 到 vertica 的数据(如果还有其他用户友好的方法,我很乐意听到它们)。问题是下面的代码仅在我从 postgres 复制一列数据时才有效。如果我复制多列,它会迁移 nothing.i.e。在 vertica 中创建 table 为空。
如何将整个 table 从 postgres 迁移到 vertica?
conn = psycopg2.connect()
input = io.StringIO()
cur_postrgres = conn.cursor()
cur_postrgres.copy_expert('''COPY (SELECT id, date from table_1) TO STDOUT;''', input)
cur_postrgres.close()
cur_vertica.execute("DROP TABLE IF EXISTS table_1_temp;")
cur_vertica.connection.commit()
cur_vertica.execute('''CREATE TABLE table_1_temp (
id BIGINT, date TIMESTAMP WITHOUT TIME ZONE);''')
cur_vertica.connection.commit()
#cur_vertica.stdin = input
#input.seek(0)
cur_vertica.copy('''COPY table_1_temp FROM STDIN NULL AS 'null' ''', input.getvalue())
cur_vertica.execute("COMMIT;")
cur_vertica.close()
我相信 postgresql 副本中的默认分隔符是制表符。 vertica 的默认分隔符是管道。您可能需要在 vertica 副本上指定 DELIMITER E'\t'
,或在 postgresql 副本上指定 DELIMITER '|'
。
数据很可能因为没有足够的列而被拒绝。
另一种将 Postgres 数据库复制到 Vertica 的方法是使用 pg_dump
。这会创建一个 tar,其中包含制表符分隔的文本数据文件和一个可以在 Vertica 中编辑和执行的 SQL 程序。
如果需要创建许多 table,这会很有用。 SQL 包含每个 table 的 CREATE TABLE、ADD INDEX、CREATE SEQUENCE 等语句,并生成 COPY 语句以加载每个数据文件。
Vertica 基于 PostgresQL,因此方言相似。它生成的restore.sql
几乎是完美的,你只需要删除不相关的语句,或者更改模式名称,并细化COPY
语句。
pg_dump --format=tar --dbname=mydb --username=myuser --no-owner --verbose --no-privileges > mydata.tar
可选择在导出前压缩 tar
zip mydata.tar.zip mydata.tar
将 tarball 复制到 Vertica 机器上的工作目录
scp -i ~/.ssh/secret.pem mydata.tar.zip mydata.tar.zip myuser@123.456.345:/data
登录实例,解压tar球:
ssh -i ~/.ssh/secret.pem myuser@123.456.345:/data
unzip mydata.tar.zip
tar -xvf mydata.tar
现在适当地编辑 restore.sql
文件。我发现我需要:
删除顶部的一堆与 Vertica 无关的内容,例如
SET statement_timeout = 0;
和COMMENT ON EXTENSION plpgsql
删除它生成的两个
COPY
语句之一,一个来自STDIN
,一个来自文件编辑
COPY
语句以添加特定于 Vertica 的内容,例如DELIMITER AS E'\t' NULL AS '\N' ABORT ON ERROR;
之后,导入只是在 Vertica 中执行该文件:
\i restore_modified.sql