pg_dump & pg_restore 密码使用 python 模块子进程
pg_dump & pg_restore password using python module subprocess
问题: 在 Python 脚本中使用 PSQL pg_dump
和 pg_restore
并使用 subprocess
模块。
背景: 我正在使用来自本地主机(即 Ubuntu 14.04.5 LTS
)的以下 python 2.7
脚本来创建 table 的备份在 PSQL 服务器(即 PostgreSQL 9.4.11
)中,并将其恢复到较新版本的 PSQL 服务器(即 PostgreSQL 9.6.2
)中的远程主机(即 Ubuntu 16.04.2 LTS
)。
#!/usr/bin/python
from subprocess import PIPE,Popen
def dump_table(host_name,database_name,user_name,database_password,table_name):
command = 'pg_dump -h {0} -d {1} -U {2} -p 5432 -t public.{3} -Fc -f /tmp/table.dmp'\
.format(host_name,database_name,user_name,table_name)
p = Popen(command,shell=True,stdin=PIPE)
return p.communicate('{}\n'.format(database_password))
def restore_table(host_name,database_name,user_name,database_password):
command = 'pg_restore -h {0} -d {1} -U {2} < /tmp/table.dmp'\
.format(host_name,database_name,user_name)
p = Popen(command,shell=True,stdin=PIPE)
return p.communicate('{}\n'.format(database_password))
def main():
dump_table('localhost','testdb','user_name','passwd','test_tbl')
restore_table('remotehost','new_db','user_name','passwd')
if __name__ == "__main__":
main()
当我按上述顺序使用函数时,dump_table()
函数成功完成并创建了 /tmp/table.sql
文件,但 restore_table()
函数 returns 出现以下错误:
('', 'Password: \npg_restore: [archiver (db)] connection to database
"database_name" failed: FATAL: password authentication failed for user
"username"\nFATAL: password authentication failed for user
"username"\n')*
我已经通过在 shell 中执行 pg_restore
的命令检查了凭据和输出,并且我还将凭据包含在 .pgpass 中(尽管不相关,因为我将密码传递到p.communicate()
)
有没有人有过类似的经历?我几乎卡住了!
此致,
D.
评论了以下作品和所做的更改。
我不确定为什么 pg_restore
在使用完整命令(即不在列表中拆分)和在 Popen
中使用 shell=True
时会产生密码验证错误,但是另一方面,pg_dump
使用 shell=True
和完整命令可以正常工作。 <
必须用它做任何事情吗?
#!/usr/bin/python
from subprocess import PIPE,Popen
import shlex
def dump_table(host_name,database_name,user_name,database_password,table_name):
command = 'pg_dump -h {0} -d {1} -U {2} -p 5432 -t public.{3} -Fc -f /tmp/table.dmp'\
.format(host_name,database_name,user_name,table_name)
p = Popen(command,shell=True,stdin=PIPE,stdout=PIPE,stderr=PIPE)
return p.communicate('{}\n'.format(database_password))
def restore_table(host_name,database_name,user_name,database_password):
#Remove the '<' from the pg_restore command.
command = 'pg_restore -h {0} -d {1} -U {2} /tmp/table.dmp'\
.format(host_name,database_name,user_name)
#Use shlex to use a list of parameters in Popen instead of using the
#command as is.
command = shlex.split(command)
#Let the shell out of this (i.e. shell=False)
p = Popen(command,shell=False,stdin=PIPE,stdout=PIPE,stderr=PIPE)
return p.communicate('{}\n'.format(database_password))
def main():
dump_table('localhost','testdb','user_name','passwd','test_tbl')
restore_table('localhost','testdb','user_name','passwd')
if __name__ == "__main__":
main()
您可以使用环境变量 https://www.postgresql.org/docs/11/libpq-envars.html 和 pg_dump 的“--no-password”选项。
def dump_schema(host, dbname, user, password, **kwargs):
command = f'pg_dump --host={host} ' \
f'--dbname={dbname} ' \
f'--username={user} ' \
f'--no-password ' \
f'--format=c ' \
f'--file=/tmp/schema.dmp '
proc = Popen(command, shell=True, env={
'PGPASSWORD': password
})
proc.wait()
这是一个 python 脚本,用于获取 postgres 转储并将其恢复到新数据库。
import subprocess
DB_NAME = 'PrimaryDB' # your db name
DB_USER = 'postgres' # you db user
DB_HOST = "localhost"
DB_PASSWORD = 'sarath1996'# your db password
dump_success = 1
print ('Backing up %s database ' % (DB_NAME))
command_for_dumping = f'pg_dump --host={DB_HOST} ' \
f'--dbname={DB_NAME} ' \
f'--username={DB_USER} ' \
f'--no-password ' \
f'--file=backup.dmp '
try:
proc = subprocess.Popen(command, shell=True, env={
'PGPASSWORD': DB_PASSWORD
})
proc.wait()
except Exception as e:
dump_success = 0
print('Exception happened during dump %s' %(e))
if dump_success:
print('db dump successfull')
print(' restoring to a new database database')
"""database to restore dump must be created with
the same user as of previous db (in my case user is 'postgres').
i have #created a db called ReplicaDB. no need of tables inside.
restore process will #create tables with data.
"""
backup_file = '/home/Downloads/BlogTemplate/BlogTemplate/backup.dmp'
"""give absolute path of your dump file. This script will create the backup.dmp in the same directory from which u are running the script """
if not dump_success:
print('dump unsucessfull. retsore not possible')
else:
try:
process = subprocess.Popen(
['pg_restore',
'--no-owner',
'--dbname=postgresql://{}:{}@{}:{}/{}'.format('postgres',#db user
'sarath1996', #db password
'localhost', #db host
'5432', 'ReplicaDB'), #db port ,#db name
'-v',
backup_file],
stdout=subprocess.PIPE
)
output = process.communicate()[0]
except Exception as e:
print('Exception during restore %e' %(e) )
问题: 在 Python 脚本中使用 PSQL pg_dump
和 pg_restore
并使用 subprocess
模块。
背景: 我正在使用来自本地主机(即 Ubuntu 14.04.5 LTS
)的以下 python 2.7
脚本来创建 table 的备份在 PSQL 服务器(即 PostgreSQL 9.4.11
)中,并将其恢复到较新版本的 PSQL 服务器(即 PostgreSQL 9.6.2
)中的远程主机(即 Ubuntu 16.04.2 LTS
)。
#!/usr/bin/python
from subprocess import PIPE,Popen
def dump_table(host_name,database_name,user_name,database_password,table_name):
command = 'pg_dump -h {0} -d {1} -U {2} -p 5432 -t public.{3} -Fc -f /tmp/table.dmp'\
.format(host_name,database_name,user_name,table_name)
p = Popen(command,shell=True,stdin=PIPE)
return p.communicate('{}\n'.format(database_password))
def restore_table(host_name,database_name,user_name,database_password):
command = 'pg_restore -h {0} -d {1} -U {2} < /tmp/table.dmp'\
.format(host_name,database_name,user_name)
p = Popen(command,shell=True,stdin=PIPE)
return p.communicate('{}\n'.format(database_password))
def main():
dump_table('localhost','testdb','user_name','passwd','test_tbl')
restore_table('remotehost','new_db','user_name','passwd')
if __name__ == "__main__":
main()
当我按上述顺序使用函数时,dump_table()
函数成功完成并创建了 /tmp/table.sql
文件,但 restore_table()
函数 returns 出现以下错误:
('', 'Password: \npg_restore: [archiver (db)] connection to database "database_name" failed: FATAL: password authentication failed for user "username"\nFATAL: password authentication failed for user "username"\n')*
我已经通过在 shell 中执行 pg_restore
的命令检查了凭据和输出,并且我还将凭据包含在 .pgpass 中(尽管不相关,因为我将密码传递到p.communicate()
)
有没有人有过类似的经历?我几乎卡住了!
此致, D.
评论了以下作品和所做的更改。
我不确定为什么 pg_restore
在使用完整命令(即不在列表中拆分)和在 Popen
中使用 shell=True
时会产生密码验证错误,但是另一方面,pg_dump
使用 shell=True
和完整命令可以正常工作。 <
必须用它做任何事情吗?
#!/usr/bin/python
from subprocess import PIPE,Popen
import shlex
def dump_table(host_name,database_name,user_name,database_password,table_name):
command = 'pg_dump -h {0} -d {1} -U {2} -p 5432 -t public.{3} -Fc -f /tmp/table.dmp'\
.format(host_name,database_name,user_name,table_name)
p = Popen(command,shell=True,stdin=PIPE,stdout=PIPE,stderr=PIPE)
return p.communicate('{}\n'.format(database_password))
def restore_table(host_name,database_name,user_name,database_password):
#Remove the '<' from the pg_restore command.
command = 'pg_restore -h {0} -d {1} -U {2} /tmp/table.dmp'\
.format(host_name,database_name,user_name)
#Use shlex to use a list of parameters in Popen instead of using the
#command as is.
command = shlex.split(command)
#Let the shell out of this (i.e. shell=False)
p = Popen(command,shell=False,stdin=PIPE,stdout=PIPE,stderr=PIPE)
return p.communicate('{}\n'.format(database_password))
def main():
dump_table('localhost','testdb','user_name','passwd','test_tbl')
restore_table('localhost','testdb','user_name','passwd')
if __name__ == "__main__":
main()
您可以使用环境变量 https://www.postgresql.org/docs/11/libpq-envars.html 和 pg_dump 的“--no-password”选项。
def dump_schema(host, dbname, user, password, **kwargs):
command = f'pg_dump --host={host} ' \
f'--dbname={dbname} ' \
f'--username={user} ' \
f'--no-password ' \
f'--format=c ' \
f'--file=/tmp/schema.dmp '
proc = Popen(command, shell=True, env={
'PGPASSWORD': password
})
proc.wait()
这是一个 python 脚本,用于获取 postgres 转储并将其恢复到新数据库。
import subprocess
DB_NAME = 'PrimaryDB' # your db name
DB_USER = 'postgres' # you db user
DB_HOST = "localhost"
DB_PASSWORD = 'sarath1996'# your db password
dump_success = 1
print ('Backing up %s database ' % (DB_NAME))
command_for_dumping = f'pg_dump --host={DB_HOST} ' \
f'--dbname={DB_NAME} ' \
f'--username={DB_USER} ' \
f'--no-password ' \
f'--file=backup.dmp '
try:
proc = subprocess.Popen(command, shell=True, env={
'PGPASSWORD': DB_PASSWORD
})
proc.wait()
except Exception as e:
dump_success = 0
print('Exception happened during dump %s' %(e))
if dump_success:
print('db dump successfull')
print(' restoring to a new database database')
"""database to restore dump must be created with
the same user as of previous db (in my case user is 'postgres').
i have #created a db called ReplicaDB. no need of tables inside.
restore process will #create tables with data.
"""
backup_file = '/home/Downloads/BlogTemplate/BlogTemplate/backup.dmp'
"""give absolute path of your dump file. This script will create the backup.dmp in the same directory from which u are running the script """
if not dump_success:
print('dump unsucessfull. retsore not possible')
else:
try:
process = subprocess.Popen(
['pg_restore',
'--no-owner',
'--dbname=postgresql://{}:{}@{}:{}/{}'.format('postgres',#db user
'sarath1996', #db password
'localhost', #db host
'5432', 'ReplicaDB'), #db port ,#db name
'-v',
backup_file],
stdout=subprocess.PIPE
)
output = process.communicate()[0]
except Exception as e:
print('Exception during restore %e' %(e) )