在pgAdmin中将整个数据库(其结构和数据)复制到新数据库的正确方法是什么?
当前回答
如果数据库具有打开的连接,则此脚本可能会有所帮助。我每天晚上都用这个从实时生产数据库的备份中创建一个测试数据库。这假设您有一个来自生产数据库的.SQL备份文件(我在webmin中执行此操作)。
#!/bin/sh
dbname="desired_db_name_of_test_enviroment"
username="user_name"
fname="/path to /ExistingBackupFileOfLive.sql"
dropdbcmp="DROP DATABASE $dbname"
createdbcmd="CREATE DATABASE $dbname WITH OWNER = $username "
export PGPASSWORD=MyPassword
echo "**********"
echo "** Dropping $dbname"
psql -d postgres -h localhost -U "$username" -c "$dropdbcmp"
echo "**********"
echo "** Creating database $dbname"
psql -d postgres -h localhost -U "$username" -c "$createdbcmd"
echo "**********"
echo "** Loading data into database"
psql -d postgres -h localhost -U "$username" -d "$dbname" -a -f "$fname"
其他回答
如果数据库具有打开的连接,则此脚本可能会有所帮助。我每天晚上都用这个从实时生产数据库的备份中创建一个测试数据库。这假设您有一个来自生产数据库的.SQL备份文件(我在webmin中执行此操作)。
#!/bin/sh
dbname="desired_db_name_of_test_enviroment"
username="user_name"
fname="/path to /ExistingBackupFileOfLive.sql"
dropdbcmp="DROP DATABASE $dbname"
createdbcmd="CREATE DATABASE $dbname WITH OWNER = $username "
export PGPASSWORD=MyPassword
echo "**********"
echo "** Dropping $dbname"
psql -d postgres -h localhost -U "$username" -c "$dropdbcmp"
echo "**********"
echo "** Creating database $dbname"
psql -d postgres -h localhost -U "$username" -c "$createdbcmd"
echo "**********"
echo "** Loading data into database"
psql -d postgres -h localhost -U "$username" -d "$dbname" -a -f "$fname"
在原始数据库处于流量状态的生产环境中,我只使用:
pg_dump production-db | psql test-db
在文档中,不鼓励将createdb或CREATE DATABASE与模板一起使用:
尽管可以通过以下方式复制模板1以外的数据库将其名称指定为模板,这还不是通用“复制数据库”功能。主要限制是没有其他会话可以连接到模板数据库它正在被复制。如果有任何其他连接,CREATE DATABASE将失败启动时存在;否则,将创建到模板的新连接数据库被锁定,直到CREATE database完成。
pg_dump或pg_dumpall是复制数据库和所有数据的好方法。如果您使用的是类似于pgAdmin的GUI,则在执行备份命令时,会在后台调用这些命令。复制到新数据库分两个阶段完成:备份和恢复
pg_dumpall保存PostgreSQL集群上的所有数据库。这种方法的缺点是,您最终会得到一个可能非常大的文本文件,其中包含创建数据库和填充数据所需的SQL。这种方法的优点是您可以免费获得集群的所有角色(权限)。要转储所有数据库,请从超级用户帐户执行此操作
pg_dumpall > db.out
和恢复
psql -f db.out postgres
pgdump有一些压缩选项,可以为您提供更小的文件。我有一个生产数据库,每天使用cron作业备份两次
pg_dump --create --format=custom --compress=5 --file=db.dump mydatabase
其中compress是压缩级别(0到9),create告诉pgdump添加命令以创建数据库。使用还原(或移动到新群集)
pg_restore -d newdb db.dump
其中newdb是要使用的数据库的名称。
其他需要考虑的事情
PostgreSQL使用ROLES管理权限。pg_dump不会复制这些文件。此外,我们还没有处理postgresql.conf和pg_hba.conf中的设置(如果要将数据库移动到另一个服务器)。您必须自己计算conf设置。但我刚刚发现了一个备份角色的技巧。角色是在集群级别管理的,您可以使用--Roles only命令行开关要求pg_dumpall仅备份角色。
如果要复制整个模式,可以使用以下命令生成pg_dump:
pg_dump-h database.host.com-d数据库名-n schema_name-U数据库用户--密码
当您想要导入该转储时,可以使用:
psql“host=database.host.com user=database_user password=database_password dbname=database_name options=--search_path=schema_name”-f sql_dump_to_import.sql
有关连接字符串的详细信息:https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-连接字符串
或者只需将其组合成一行:
pg_dump -h database.host.com -d postgres -n schema_name -U database_user --password | psql "host=database.host.com user=database_user password=database_password dbname=database_name options=--search_path=schema_name”
首先,sudo作为数据库用户:
sudo su postgres
转到PostgreSQL命令行:
psql
创建新数据库,授予权限并退出:
CREATE DATABASE new_database_name;
GRANT ALL PRIVILEGES ON DATABASE new_database_name TO my_user;
\d
将结构和数据从旧数据库复制到新数据库:
pg_dump old_database_name | psql new_database_name
推荐文章
- 查询JSON类型内的数组元素
- 获得PostgreSQL数据库中当前连接数的正确查询
- 纬度和经度的数据类型是什么?
- 如何在PostgreSQL中临时禁用触发器?
- 输入文件似乎是一个文本格式转储。请使用psql
- 使用LIMIT/OFFSET运行查询,还可以获得总行数
- 当恢复sql时,psql无效命令\N
- 货币应该使用哪种数据类型?
- 如何添加列,如果不存在PostgreSQL?
- 如何在Postgres中获得两个字段的MIN() ?
- 截断Postgres数据库中的所有表
- 如何连接列在Postgres选择?
- 将varchar字段的类型更改为整数:"不能自动转换为整数类型"
- PostgreSQL可以索引数组列吗?
- PostgreSQL:角色不允许登录