Python远程操作Oracle实现一键备份还原数据库演示,利用socket进行impexp一键导入导出oracle数据库dmp文件
Posted 挣扎的蓝藻
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python远程操作Oracle实现一键备份还原数据库演示,利用socket进行impexp一键导入导出oracle数据库dmp文件相关的知识,希望对你有一定的参考价值。
第一章:效果演示
① 数据库恢复演示
首先看下效果图,工具是在服务端进行启用的,本地给服务端发送了命令,服务端就开始进行数据库导入操作了。
工具我进行了打包,打包教程可以看:
Python 技术篇-将 python 项目打包成 exe 独立运行程序,pyinstaller 库打包 python 代码实例演示
② 请求模拟
请求演示代码如下,body 部分按照服务端的要求定义了关键数据:
# coding:utf-8
import socket
import json
request_ip = "10.10.18.70"
request_port = 5003
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
s.connect((request_ip, request_port))
# 构造请求数据
# 头部内参数以\\r\\n分隔
# 第一行构成为【请求方式、协议】
request_header = "GET / HTTP/1.1\\r\\n" \\
"Host:" + request_ip
# 字符串跨行用\\连接,注意\\后面不要有空格
request_body = '{' \\
'"do":"imp",' \\
'"file_path":"F:/oracle/auto_2105_oracle_yz_0524.dmp",' \\
'"schema_name1":"auto_2105_oracle_yz",' \\
'"schema_name2":"auto_2105_oracle_test",' \\
'"password":"1",' \\
'"odbc":"orcl"' \\
'}'
# 头部和身体通过\\r\\n\\r\\n分隔
request = request_header + "\\r\\n\\r\\n" + request_body
s.send(bytes(request, "utf-8"))
data = s.recv(1024)
data = str(data, encoding='utf-8')
header, body = data.split('\\r\\n\\r\\n', 1)
print("服务器返回消息头部:\\n" + header)
print("\\n服务器返回消息内容:\\n" + body)
s.close()
运行效果图:
第二章:功能实现
清单如下,用到了下面的 4 个包。
# coding:utf-8
import socket
import json
import subprocess
import time
① 创建启动服务
这里起了个 5003 端口的服务,然后就等待接收客户端请求了。
def start_server(server_port):
'''
作用:根据传入的端口启用一个服务
参数1:启用服务的端口号
返回:socket实例
····
创建:小蓝枣
更改:2021-06-10
'''
# 创建一个socket对象
s_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口
s_socket.bind(("", server_port))
# 设置最大等待连接数
s_socket.listen(10)
return s_socket
# s为服务端server的标识
s_socket = start_server(5003)
while True:
# c为客户端client的标识,接收消息前accept处于阻塞状态。
c_socket, c_address = s_socket.accept()
# 读取客户端ip
c_ip = c_address[0];
# 读取客户端id
c_id = c_address[1];
handle_request(c_socket)
② 处理解析请求
当客户发来请求后,进行请求解析。
def analysis_request(data):
'''
作用:解析用户请求
参数1:请求的完整数据
返回:请求的body部分
····
创建:小蓝枣
更改:2021-06-10
'''
# print("请求的数据:", data)
data = str(data, encoding='utf-8')
header, body = data.split('\\r\\n\\r\\n', 1)
return body
def handle_request(c_socket):
'''
作用:处理用户的一次请求
参数1:客户的请求数据
····
创建:小蓝枣
更改:2021-06-10
'''
# 获取客户端请求数据
data = c_socket.recv(1024)
# 解析请求的数据
body = analysis_request(data)
# 返回响应
send_response(c_socket, "收到命令,开始进行数据库备份工作!")
# 关闭客户端连接
c_socket.close()
# 处理命令
handle_command(body)
③ 处理命令
主要是提取请求的 body 部分,这里包含了恢复数据库的一些必要信息,比如恢复那个数据库,dmp 文件的位置。
def handle_command(body):
'''
作用:处理命令
参数1:接收到的命令
····
创建:小蓝枣
更改:2021-06-10
'''
# 字符串转化为json,路径里不能包含\\,所以后面要做个转化
s_json = json.loads(body)
d = {}
# 遍历并存储json
for key, value in s_json.items():
d[key] = value
# 如果接收到转库命令
if(d["do"] == "imp"):
# 路径转化
d["file_path"] = d["file_path"].replace('/', '\\\\')
db_recovery(d["file_path"], d["schema_name1"], d["schema_name2"], d["password"], d["odbc"])
④ 服务端数据库操作
这里就是直接将必要的信息,拼成数据库实际要执行的命令并开始执行。
def db_recovery(file_path, schema_name1, schema_name2, password, odbc):
'''
作用:windows服务端数据库恢复imp
参数1:文件位置
参数2:原库schema
参数3:新库schema
参数4:新库密码
参数5:odbc
····
创建:小蓝枣
更改:2021-06-10
'''
cmd_order = 'imp %s/%s@%s file=%s fromuser=%s touser=%s\\n' % (schema_name2, password, odbc, file_path, schema_name1, schema_name2)
print("导入库完整命令如下:\\n" + cmd_order)
cmd_p = subprocess.Popen(cmd_order, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
# 时时获取输出
for i in iter(cmd_p.stdout.readline, 'b'):
i = i.decode("gbk")
if(i == ""):
break;
print(i)
⑤ 响应构造
下面就是返回给客户端的信息,告诉客户端服务端收到命令了,已经开始处理数据了。
def send_response(c_socket, response_message):
'''
作用:向客户端发送回应
参数1:要回应的数据
····
创建:小蓝枣
更改:2021-06-10
'''
# 构造响应数据
# 头部内参数以\\r\\n分隔
# 第一行构成为【协议、状态】
response_header = "HTTP/1.1 200 OK\\r\\n" \\
"Server:DB server"
response_body = response_message
# 头部和身体通过\\r\\n\\r\\n分隔
response = response_header + "\\r\\n\\r\\n" + response_body
# print("response data:", bytes(response, "utf-8"))
# 向客户端返回响应数据
c_socket.send(bytes(response, "utf-8"))
五个部分合起来就是服务端完整代码了。
喜欢的点个赞❤吧!
以上是关于Python远程操作Oracle实现一键备份还原数据库演示,利用socket进行impexp一键导入导出oracle数据库dmp文件的主要内容,如果未能解决你的问题,请参考以下文章