Python远程操作Oracle实现一键备份还原数据库演示,利用socket进行imp、exp一键导入导出oracle数据库dmp文件

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Python远程操作Oracle实现一键备份还原数据库演示,利用socket进行imp、exp一键导入导出oracle数据库dmp文件

     

Python 远程操作 Oracle 进行数据库备份还原

第一章:效果演示

① 数据库恢复演示

首先看下效果图,工具是在服务端进行启用的,本地给服务端发送了命令,服务端就开始进行数据库导入操作了。

image.png

工具我进行了打包,打包教程可以看:

Python 技术篇-将 python 项目打包成 exe 独立运行程序,pyinstaller 库打包 python 代码实例演示

image.png

② 请求模拟

请求演示代码如下,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()

运行效果图:

image.png

第二章:功能实现

清单如下,用到了下面的 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"))

五个部分合起来就是服务端完整代码了。

喜欢的点个赞❤吧!

目录
打赏
0
0
0
0
15
分享
相关文章
|
5月前
|
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
在数字时代,网络应用成为连接世界的桥梁。Python凭借简洁的语法和丰富的库支持,成为开发高效网络应用的首选。本文通过实时聊天室案例,介绍Python Socket编程的基础与进阶技巧。基础篇涵盖服务器和客户端的建立与数据交换;进阶篇则探讨多线程与异步IO优化方案,助力提升应用性能。通过本案例,你将掌握Socket编程的核心技能,推动网络应用飞得更高、更远。
92 1
|
4月前
|
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
223 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
248 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
Python网络编程:从Socket到Web应用
在信息时代,网络编程是软件开发的重要组成部分。Python作为多用途编程语言,提供了从Socket编程到Web应用开发的强大支持。本文将从基础的Socket编程入手,逐步深入到复杂的Web应用开发,涵盖Flask、Django等框架的应用,以及异步Web编程和微服务架构。通过本文,读者将全面了解Python在网络编程领域的应用。
68 1
Python中的Socket魔法:如何利用socket模块构建强大的网络通信
本文介绍了Python的`socket`模块,讲解了其基本概念、语法和使用方法。通过简单的TCP服务器和客户端示例,展示了如何创建、绑定、监听、接受连接及发送/接收数据。进一步探讨了多用户聊天室的实现,并介绍了非阻塞IO和多路复用技术以提高并发处理能力。最后,讨论了`socket`模块在现代网络编程中的应用及其与其他通信方式的关系。
471 3
轻量级数据库的利器:Python 及其内置 SQLite 简介
轻量级数据库的利器:Python 及其内置 SQLite 简介
103 3
Python Socket编程大揭秘:从菜鸟到黑客的进阶之路,你准备好了吗?
【10月更文挑战第4天】在编程领域,Python Socket编程犹如一把开启网络世界的钥匙,带领开发者从简单数据传输迈向复杂应用构建。本文将引导你从零开始,逐步掌握Socket编程的核心技巧,包括基本概念、TCP服务器与客户端的搭建、并发处理及异常管理、SSL/TLS加密通信,直至深入了解网络协议与安全漏洞。通过实战演练与理论学习,助你成为驾驭网络世界的高手。
56 1
聊一聊 Python 的 socket,以及 select、poll、epoll 又是怎么一回事?
聊一聊 Python 的 socket,以及 select、poll、epoll 又是怎么一回事?
254 2
告别网络编程迷雾!Python Socket编程基础与实战,让你秒变网络达人!
在网络编程的世界里,Socket编程是连接数据与服务的关键桥梁。对于初学者,这往往是最棘手的部分。本文将用Python带你轻松入门Socket编程,从创建TCP服务器与客户端的基础搭建,到处理并发连接的实战技巧,逐步揭开网络编程的神秘面纱。通过具体的代码示例,我们将掌握Socket的基本概念与操作,让你成为网络编程的高手。无论是简单的数据传输还是复杂的并发处理,Python都能助你一臂之力。希望这篇文章成为你网络编程旅程的良好开端。
82 3

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等