Python远程操作Oracle实现一键备份还原数据库演示,利用socket进行imp、exp一键导入导出oracle数据库dmp文件
生活随笔
收集整理的這篇文章主要介紹了
Python远程操作Oracle实现一键备份还原数据库演示,利用socket进行imp、exp一键导入导出oracle数据库dmp文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Python 遠程操作 Oracle 進行數據庫備份還原
- 第一章:效果演示
- ① 數據庫恢復演示
- ② 請求模擬
- 第二章:功能實現
- ① 創建啟動服務
- ② 處理解析請求
- ③ 處理命令
- ④ 服務端數據庫操作
- ⑤ 響應構造
第一章:效果演示
① 數據庫恢復演示
首先看下效果圖,工具是在服務端進行啟用的,本地給服務端發送了命令,服務端就開始進行數據庫導入操作了。
工具我進行了打包,打包教程可以看:
Python 技術篇-將 python 項目打包成 exe 獨立運行程序,pyinstaller 庫打包 python 代碼實例演示
② 請求模擬
請求演示代碼如下,body 部分按照服務端的要求定義了關鍵數據:
# coding:utf-8 import socket import jsonrequest_ip = "10.10.18.70" request_port = 5003s = 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_bodys.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()# 讀取客戶端ipc_ip = c_address[0];# 讀取客戶端idc_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 bodydef 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 = {}# 遍歷并存儲jsonfor 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进行imp、exp一键导入导出oracle数据库dmp文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 白盒测试工具 - sonar的安装、配置
- 下一篇: Python 调用有道翻译api接口翻译