我想在另一台服务器上备份和还原架构“ B”吗?不知道该怎么做,因为我是Postgres的新手。
是否必须在新服务器上创建一个名称为“ A”的新数据库,然后在其上还原模式“ B”。
pls
---来自Peter答案注释的信息:
我想备份和还原Schema“ B” +数据。其次,我忘了提到在Ubuntu 12.04上运行的Postgresql 9.1
#1 楼
您可以使用pg_dump的-n
选项选择要转储的模式。创建模式B的转储:pg_dump ...other...options... -Fc -n B >dump.dmp
恢复转储文件:
pg_restore -d somedb dump.dmp
目标数据库可以
请注意,如果架构B对架构C有依赖关系,则会遇到问题。那么,您将无法单独还原它。 >
#2 楼
您可以添加参数-n [schema name]
该参数的注释表示:
-n schema
--schema=schema
仅转储与模式匹配的模式;这会同时选择schema
本身及其所有包含的对象。如果未指定此选项
,则将转储目标数据库中的所有非系统架构。
评论
这不是彼得·艾森特劳特(Peter Eisentraut)的回答吗?
– dezso
16-2-17在10:09
#3 楼
可以使用pg_dump工具(请参阅pg_dump doc)和pg_restore(pg_restore doc)
您不需要在新服务器上创建新的数据库名称“ A”。
*基本例如:
我在窗口中创建“ dump.bat”和“ restore.bat”文件以进行转储/恢复
1 /备份:
"C:\Program Files\PostgreSQL.1\bin\pg_dump.exe" --host localhost --port 5432 --username "postgres" --role "postgres" --format plain --encoding UTF8 --schema-only --file "dump_resul.sql" --schema "name_schema_B" "name_database_A"
结果:
-- PostgreSQL database dump
-- Dumped from database version 9.1.4
-- Dumped by pg_dump version 9.1.4
SET statement_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET search_path = public, pg_catalog;
CREATE TABLE abtb_temp (
id bigint NOT NULL,
app_code character varying(100)
); ....
*注:一些重要选项:
--data-only, --format=format (ex: format=tar -> if you have a big database), --schema-only, --table=table (ex: --table=schema_name.table_name) ...
2 /还原:
"C:\Program Files\PostgreSQL.1\bin\pg_restore.exe" --host localhost --port 5432 --username "postgres" --dbname "any_database" --no-password --no-owner --no-privileges --schema name_schema_B --verbose "C:\dump_resul.sql"
(**)(**)实际上,如果格式文件为* .sql,则可以使用pgAdmin(或psql)进行还原。您应该使用pg_restore还原文件.tar(.bakup ...)
评论
回应您的评论:当您不使用--schema-only时,数据必须位于转储中,否则您可能没有权限选择表内容。
–麦丁
13年12月18日在11:01
#4 楼
我写了一个脚本,使这个琐碎。轻松将SQL函数和表模式导出到单独的*.sql
文件中。使管理,备份和源代码管理变得容易: #!/bin/sh
# Export all table schemas and functions into individual *.sql files for easy management and source control.
TEMP_WORK_PATH="/tmp/postgres"
BACKUP_ROOT_PATH="/vagrant/backup" # This is where your *.sql files will be exported at
DATABASE_NAME="myapp_db"
DATABASE_TABLES_PREFIX="myapp_"
POSTGRES_USER="postgres"
POSTGRES_PASSWORD="postgres"
[ -d $TEMP_WORK_PATH ] || mkdir -p $TEMP_WORK_PATH
rm -rf $TEMP_WORK_PATH/*
[ -d $BACKUP_ROOT_PATH ] || mkdir -p $BACKUP_ROOT_PATH
rm -rf $BACKUP_ROOT_PATH/*
mkdir $BACKUP_ROOT_PATH/tables
mkdir $BACKUP_ROOT_PATH/routines
export PGPASSWORD=$POSTGRES_PASSWORD
cd $TEMP_WORK_PATH
# Get all table schemas and write to individual files
echo "Export table schemas..."
for table in $(psql -U $POSTGRES_USER -d $DATABASE_NAME -t -c "Select table_name From information_schema.tables Where table_type='BASE TABLE' and table_name like '$DATABASE_TABLES_PREFIX%'");
do pg_dump -st $table -U $POSTGRES_USER $DATABASE_NAME > $BACKUP_ROOT_PATH/tables/$table.sql;
done;
# Get all functions in db and output to one file
echo "Getting stored functions..."
psql -U $POSTGRES_USER -At $DATABASE_NAME > $TEMP_WORK_PATH/db_functions.sql <<EOF
SELECT pg_get_functiondef(f.oid)
FROM pg_catalog.pg_proc f
INNER JOIN pg_catalog.pg_namespace n ON (f.pronamespace = n.oid)
WHERE n.nspname = 'public';
EOF
# Split function file into separate files per function
echo "Exporting stored functions..."
csplit -f function -b '%d.sql' db_functions.sql '/FUNCTION/' '{*}'
# Rename the function files to match the function name in the file
# then place the files into the target backup directory
counter=1
while [ -f $TEMP_WORK_PATH/function$counter.sql ]
do
name=$(head -1 function$counter.sql | awk {'print '})
name=$(echo $name | cut -d "." --f 2 | cut -d "(" --f 1)
mv function$counter.sql $BACKUP_ROOT_PATH/routines/$name.sql
counter=$((counter+1))
done
echo "done"
https:// gist.github.com/dantheman213/aff70ee42a11f2d1fa46983878cd62e1
#5 楼
要从多个架构中仅备份一个方案,可以使用以下脚本:创建具有特定架构的数据库转储。
连接到服务器并创建一个新数据库。
将数据库的转储还原到新创建的数据库。
从子流程导入PIPE,Popen
导入子流程
用户名=用户名
密码=密码
主机=本地主机
端口= 5432
数据库= dummy_test
架构='公共'
目的地文件= /tmp/test.sql
#特定模式的转储
try:
process = subprocess.Popen(
['pg_dump',
'--dbname=postgresql://{}:{}@{}:{}/{}'.format(username, password, host, port, database),
'-n', schema,
'-Fc',
'-f', dest_file,
'-v'],
stdout=subprocess.PIPE
)
output = process.communicate()[0]
except Exception as e:
print(e)
#连接到数据库
try:
con = psycopg2.connect(dbname='postgres', port=port,
user=username, host=host,
password=password)
except Exception as e:
print(e)
new_database = 'test_new'
con.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
cur = con.cursor()
try:
cur.execute("DROP DATABASE {} ;".format(new_database))
except Exception as e:
print('DB does not exist, nothing to drop')
#create new database
cur.execute("CREATE DATABASE {} ;".format(new_database))
cur.execute("GRANT ALL PRIVILEGES ON DATABASE {} TO {} ;".format(new_database, username))
#restore backup dump into new database
try:
backup_file = dest_file
create_process = subprocess.Popen(
['pg_restore',
'--no-owner',
'--dbname=postgresql://{}:{}@{}:{}/{}'.format(username,
password,
host,
port, new_database),
'-v',
backup_file],
stdout=subprocess.PIPE
)
output = create_process.communicate()[0]
except Exception as e:
print(e)
评论
请修复您的Python代码的缩进形式。我不敢编辑。您的脚本做什么,其他答案却没有呢?
–科林·哈特(Colin't Hart)
20年7月7日在16:40
#6 楼
这可用于进行架构备份pg_dump -U UserName -h HostName -s DBName > "file.sql"
这可用于还原数据库
psql -d DBName -h HostName -U UserName < "file.sql"
评论
这不能回答问题。问题是关于只备份具有多个模式的数据库中的一个模式,而不是整个数据库。
–马克·辛金森(Mark Sinkinson)
2015年2月4日,11:58
评论
另请注意,转储一个模式时,您不会转储Blob(LOB类型)。使用-b选项可对blob进行转储。请注意,使用-b不仅会为单个架构添加所有Blob,而且还会添加所有Blob。
– Nux
19-10-17在11:00