操作系統 :CentOS 7.6_x64
Python版本:3.9.12
MySQL版本:5.7.38
日常開發過程中,會遇到mysql數據表的備份需求,需要針對單獨的數據表進行備份並定時清理數據。
今天記錄下python3如何使用pandas進行mysql數據表的備份,我將從以下幾個方面進行展開:
-
數據表備份邏輯描述
-
使用的相關接口及文檔
-
以FreeSWITCH的cdr表爲例進行示例
-
提供示例代碼及運行效果視頻
一、數據表表備份邏輯
大致流程如下:
備份邏輯是“定時處理”部分的功能。
業務表A:
-
定義最大預留天數;
-
定義最大預留條數;
達到最大預留天數後,按時間(6小時爲跨度)來刪除,直到滿足最大預留條數的要求。
備份表B:
-
預留時間可以hard code爲2年;
-
2小時一檢查,當前時間爲設定時間(2、3、4、5、6)時,才執行備份操作;
數據搬遷時需要批量提交,以提高性能。
二、相關接口及文檔
pandas版本:2.1.4
sqlalchemy 版本:1.4.39
pymysql 版本:1.0.2
CentOS7環境源碼安裝python3.9可參考如下文章:
三、以FreeSWITCH的cdr爲例進行示例
1、FreeSWITCH配置CDR
freeswitch-1.10.9.-release/src/mod/event_handlers/mod_odbc_cdr/conf/autoload_configs/odbc_cdr.conf.xml
[fsdb] Description=MySQL freeswitch database Driver=MySQL SERVER =192.168.137.1 PORT =3306 USER=root PASSWORD=123456 DATABASE = fsdb32 OPTION =67108864 CHARSET = UTF8
<configuration name="odbc_cdr.conf" description="ODBC CDR Configuration"> <settings> <!-- <param name="odbc-dsn" value="database:username:password"/> --> <param name="odbc-dsn" value="fsdb:root:123456"/> <!-- global value can be "a-leg", "b-leg", "both" (default is "both") --> <param name="log-leg" value="both"/> <!-- value can be "always", "never", "on-db-fail" --> <param name="write-csv" value="on-db-fail"/> <!-- location to store csv copy of CDR --> <param name="csv-path" value="/usr/local/freeswitch/log/odbc_cdr"/> <!-- if "csv-path-on-fail" is set, failed INSERTs will be placed here as CSV files otherwise they will be placed in "csv-path" --> <param name="csv-path-on-fail" value="/usr/local/freeswitch/log/odbc_cdr/failed"/> <!-- dump SQL statement after leg ends --> <param name="debug-sql" value="true"/> </settings> <tables> <table name="call_detail"> <field name="uuid" chan-var-name="uuid"/> <field name="call_uuid" chan-var-name="call_uuid"/> <field name="caller_number" chan-var-name="caller_id_number"/> <field name="callee_number" chan-var-name="destination_number"/> <field name="start_time" chan-var-name="start_stamp"/> <field name="answer_time" chan-var-name="answer_stamp"/> <field name="hangup_time" chan-var-name="end_stamp"/> <field name="billsec" chan-var-name="billsec"/> <field name="hangup_cause" chan-var-name="hangup_cause"/> </table> </tables> </configuration>
CREATE TABLE `call_detail` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `uuid` VARCHAR(50) NOT NULL DEFAULT '0', `call_uuid` VARCHAR(50) NOT NULL DEFAULT '0', `caller_number` VARCHAR(20) NOT NULL DEFAULT '0', `callee_number` VARCHAR(50) NOT NULL DEFAULT '0', `start_time` DATETIME NULL DEFAULT NULL, `answer_time` DATETIME NULL DEFAULT NULL, `hangup_time` DATETIME NULL DEFAULT NULL, `billsec` INT(11) NOT NULL DEFAULT '0', `hangup_cause` VARCHAR(50) NOT NULL, `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) COLLATE='latin1_swedish_ci' ENGINE=InnoDB ;
2、使用pandas進行數據備份
CREATE TABLE `call_detail_history` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `uuid` VARCHAR(50) NOT NULL DEFAULT '0', `call_uuid` VARCHAR(50) NOT NULL DEFAULT '0', `caller_number` VARCHAR(20) NOT NULL DEFAULT '0', `callee_number` VARCHAR(50) NOT NULL DEFAULT '0', `start_time` DATETIME NULL DEFAULT NULL, `answer_time` DATETIME NULL DEFAULT NULL, `hangup_time` DATETIME NULL DEFAULT NULL, `billsec` INT(11) NOT NULL DEFAULT '0', `hangup_cause` VARCHAR(50) NOT NULL, `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) COLLATE='latin1_swedish_ci' ENGINE=InnoDB ;
說明:
- ConfigData類
讀取配置文件 - dataBack函數
以天爲單位進行數據備份 - dataClean函數
執行數據清理功能(業務表和備份表) - dataCount函數
統計業務表裏面的數據條目 - getDbConnStr函數
生成數據庫連接字符串 - dataRotateBase函數
數據循環備份功能的具體實現,執行數據備份、數據清理操作。 - dataRotateByDays函數
按天循環備份 - dataRotateByHours函數
按小時循環備份 - dataBackTask函數
執行具體的備份任務
完整代碼可從如下渠道獲取:
關注微信公衆號(聊聊博文,文末可掃碼)後回覆 20231209 獲取。
<config> <cdrReserve> <maxDays>15</maxDays> <maxItems>100000</maxItems> </cdrReserve> <mysql> <host>192.168.137.1</host> <port>3306</port> <user>root</user> <password>123456</password> <dbname>fsdb32</dbname> </mysql> </config>
#! /bin/bash pydir=/root/py39env export CFLAGS="-I$pydir/include" export LDFLAGS="-L$pydir/lib" export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$pydir/lib $pydir/bin/python3.9 dataBack.py -f default.xml