How to copy table from server to another in PostgreSQL?
我在PostgreSQL 8.4上有两个服务器:
1 2 | server1:5432 server2:5432 |
现在我想从server1复制表并将其放在server2的数据库中。
它有可能做到吗?
UPDATE
我尝试在@Valery Viktorovsky的回答中做:
1 2 3 4 | pg_dump --server1:5432 --encoding=utf8 --no-owner --username=postgres --123456 np_point > D: p_point.sql psql --server2:5432 --username=postgres mrsk -f D: p_point.sql |
并得到错误:
1 2 | ERROR: syntax error at OR near"pg_dump" LINE 1: pg_dump --server1:5432 --encoding=utf8 --no-owner --use... |
最安全的方法是使用pg_dump。
1 2 | pg_dump --host server1 --encoding=utf8 --no-owner --username=foo --password -t table_name db_name > server1_db.sql psql --host server2 --username=foo db_name -f server1_db.sql |
试试这个
使用psql中的COPY命令。连接到server1并导出到CSV然后连接到server2并从CSV导入
我在python中编写了一个可以提供帮助的小脚本。
注意 - 它只适用于小表。你首先需要pip安装pandas,sqlalchemy和psycopg2。
将文件创建为pycopy.py并使用"python pycopy.py tablename"(不带引号)运行它。您可以更改源和目??标以使用任何其他数据库类型 - 只需更改源和目??标字符串。
剧本:
1 2 3 4 5 6 7 8 9 10 11 | import pandas AS pd import sys import sqlalchemy AS sa strengine_source='postgresql://user:password@db_ip:5432/dbsourcename' strengine_dest='postgresql://user:password@db_ip:5432/dbdestinationname' IF len(sys.argv) > 1: tblname = sys.argv[1] df=pd.read_sql("select * from" + tblname,sa.create_engine(strengine_source)) df.to_sql(tblname,sa.create_engine(strengine_dest), INDEX=FALSE) |
您还可以使用Linux shell脚本将表数据从一个服务器迁移到另一个PostgreSQL服务器。
我刚刚将我的答案贴在下面类似的堆栈问题上请参考。
将PostgreSQL数据库复制到另一台服务器
这将仅将特定数据库中的特定表复制到目标数据库
1 | pg_dump -h localhost -U postgres -p 5432 -C -t TABLE_NAME source_db_name | ssh -C username@ip"psql -h localhost -U postgres -p 5432 destination_db_name" |
确切的命令 -
1.通过
1 | pg_dump --host"source hostname" --port 5432 --username"username" --no-password --verbose --file"filename" --table"source schema.tablename""source db name" |
这将在您运行上面命令的目录中创建一个名为"filename"的文件 - 它将具有源表的模式和数据。你也可以给出任何绝对路径。
2.通过psql导入:
1 | psql --host"target hostname" --port 5432 --username"username" --password --verbose --file"file name""target db name" |
- >这会提示输入密码
在运行导入之前,删除目标表(如果存在)。
像魅力一样工作,并在2分钟内完成10M行