Copying PostgreSQL database to another server
我希望将生产PostgreSQL数据库复制到开发服务器。做这件事最快、最简单的方法是什么?
不需要创建中间文件。你可以做到
1 | pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname |
或
1 | pg_dump -C -h remotehost -U remoteuser dbname | psql -h localhost -U localuser dbname |
使用
对于大型数据库或慢速连接,转储文件和传输压缩文件可能更快。
正如Kornel所说,不需要转储到中间文件,如果要压缩工作,可以使用压缩隧道。
1 | pg_dump -C dbname | bzip2 | ssh remoteuser@remotehost"bunzip2 | psql dbname" |
或
1 | pg_dump -C dbname | ssh -C remoteuser@remotehost"psql dbname" |
但是这个解决方案还需要在两端进行会话。
1 | pg_dump the_db_name > the_backup.sql |
然后将备份复制到您的开发服务器,使用以下方法还原:
1 | psql the_new_dev_db < the_backup.sql |
使用pg_dump,稍后使用psql或pg_restore,这取决于您选择-fp还是-fc选项进行pg_dump。
使用示例:
1 2 3 4 5 6 | ssh production pg_dump -C -Fp -f dump.sql -U postgres some_database_name scp dump.sql development: rm dump.sql ssh development psql -U postgres -f dump.sql |
如果要在不同版本之间进行迁移(例如更新了postgres,并在localhost:5432上运行了9.1,在localhost:5434上运行了9.3),则可以运行:
1 | pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434 |
查看迁移文档。
目前,
用数据库名称运行这个命令,您想备份它,以获得数据库的转储。
1 2 3 | pg_dump -U {user-name} {source_db} -f {dumpfilename.sql} eg. pg_dump -U postgres mydbname -f mydbnamedump.sql |
现在将这个转储文件scp到远程机器上,在那里复制db。
1 | eg. scp mydbnamedump.sql user01@remotemachineip:~/SOME/folder/ |
在远程计算机上,在~/some/folder中运行以下命令以还原数据库。
1 2 3 | psql -U {user-name} -d {desintation_db}-f {dumpfilename.sql} eg. psql -U postgres -d mynewdb -f mydbnamedump.sql |
我费了很大的劲,最终使我能够使用Rails 4的方法是:
在旧服务器上
1 2 | sudo su - postgres pg_dump -c --inserts old_db_name > dump.sql |
我必须使用PostgresLinux用户来创建转储。另外,我还必须使用-c来强制在新服务器上创建数据库。--inserts告诉它使用insert()语法,否则它对我不起作用:(
然后,在新服务器上,简化:
1 2 | sudo su - postgres psql new_database_name < dump.sql |
要在服务器之间传输dump.sql文件,我只需使用"cat"打印内容,而不是使用"nano"重新创建内容复制粘贴内容。
另外,我在两个数据库上使用的角色是不同的,所以我必须找到替换转储中所有所有者的名称。
让我共享一个Linuxshell脚本,将表数据从一个服务器复制到另一个PostgreSQL服务器。
引用自此日志:
用于PostgreSQL服务器之间数据迁移的Linux bash shell脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/bin/bash psql \ -X \ -U user_name \ -h host_name1 \ -d database_name \ -c"\\copy tbl_Students to stdout" \ | \ psql \ -X \ -U user_name \ -h host_name2 \ -d database_name \ -c"\\copy tbl_Students from stdin" |
我正在迁移数据;请在目标/第二个数据库服务器上创建一个空表。
这是一个实用程序脚本。此外,您还可以修改脚本以供常规使用,例如添加主机名、数据库名、表名等参数。
转储数据库:
重新导入数据库:
接受的答案是正确的,但如果要避免以交互方式输入密码,可以使用此选项:
1 | PGPASSWORD={{export_db_password}} pg_dump --create -h {{export_db_host}} -U {{export_db_user}} {{export_db_name}} | PGPASSWORD={{import_db_password}} psql -h {{import_db_host}} -U {{import_db_user}} {{import_db_name}} |