翼度科技»论坛 编程开发 python 查看内容

python3使用pandas备份mysql数据表

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
操作系统 :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可参考如下文章:
https://www.cnblogs.com/MikeZhang/p/centos7-install-py39-20220704.html1、使用pandas库的read_sql_query进行数据读取,可参考如下文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_sql_query.html2、pymysql是一个纯python实现的mysql操作库,安装及使用起来比较方便,且可跨平台使用。文档地址:https://pymysql.readthedocs.io/en/latest/3、SQLAlchemy是一个功能强大的Python ORM 工具包,借助该工具可更便捷的实现数据备份。官方网址: https://www.sqlalchemy.org/三、以FreeSWITCH的cdr为例进行示例

FreeSWITCH版本 :1.10.91、FreeSWITCH配置CDR

fs模块: mod_odbc_cdr默认配置: conf/autoload_configs/odbc_cdr.conf.xml
如果没有该模块及配置文件,需要在编译时安装该模块,并将源码里面的配置文件复制到conf/autoload_configs目录,源码里面的配置文件路径如下:
  1. freeswitch-1.10.9.-release/src/mod/event_handlers/mod_odbc_cdr/conf/autoload_configs/odbc_cdr.conf.xml
复制代码
FreeSWICH通过ODBC方式支持MySQL可参考这篇文章的第二部分:https://www.cnblogs.com/MikeZhang/p/dockerFS20230716.html/etc/odbc.ini 配置示例:
  1. [fsdb]
  2. Description=MySQL freeswitch database
  3. Driver=MySQL
  4. SERVER =192.168.137.1
  5. PORT =3306
  6. USER=root
  7. PASSWORD=123456
  8. DATABASE = fsdb32
  9. OPTION =67108864
  10. CHARSET = UTF8
复制代码
odbc_cdr.conf.xml配置示例(可根据情况调整所需字段):
  1. <configuration name="odbc_cdr.conf" description="ODBC CDR Configuration">
  2.   <settings>
  3.    
  4.     <param name="odbc-dsn" value="fsdb:root:123456"/>
  5.    
  6.     <param name="log-leg" value="both"/>
  7.    
  8.     <param name="write-csv" value="on-db-fail"/>
  9.    
  10.     <param name="csv-path" value="/usr/local/freeswitch/log/odbc_cdr"/>
  11.    
  12.     <param name="csv-path-on-fail" value="/usr/local/freeswitch/log/odbc_cdr/failed"/>
  13.    
  14.     <param name="debug-sql" value="true"/>
  15.   </settings>
  16.   <tables>
  17.     <table name="call_detail">
  18.       <field name="uuid" chan-var-name="uuid"/>
  19.       <field name="call_uuid" chan-var-name="call_uuid"/>
  20.       <field name="caller_number" chan-var-name="caller_id_number"/>
  21.       <field name="callee_number" chan-var-name="destination_number"/>
  22.       <field name="start_time" chan-var-name="start_stamp"/>
  23.       <field name="answer_time" chan-var-name="answer_stamp"/>
  24.       <field name="hangup_time" chan-var-name="end_stamp"/>
  25.       <field name="billsec" chan-var-name="billsec"/>
  26.       <field name="hangup_cause" chan-var-name="hangup_cause"/>
  27.     </table>
  28.   </tables>
  29. </configuration>
复制代码
需要创建对应的数据表,建表语句如下:
  1. CREATE TABLE `call_detail` (
  2.     `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  3.     `uuid` VARCHAR(50) NOT NULL DEFAULT '0',
  4.     `call_uuid` VARCHAR(50) NOT NULL DEFAULT '0',
  5.     `caller_number` VARCHAR(20) NOT NULL DEFAULT '0',
  6.     `callee_number` VARCHAR(50) NOT NULL DEFAULT '0',
  7.     `start_time` DATETIME NULL DEFAULT NULL,
  8.     `answer_time` DATETIME NULL DEFAULT NULL,
  9.     `hangup_time` DATETIME NULL DEFAULT NULL,
  10.     `billsec` INT(11) NOT NULL DEFAULT '0',
  11.     `hangup_cause` VARCHAR(50) NOT NULL,
  12.     `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  13.     PRIMARY KEY (`id`)
  14. )
  15. COLLATE='latin1_swedish_ci'
  16. ENGINE=InnoDB
  17. ;
复制代码
2、使用pandas进行数据备份

2.1 建立备份表建表语句如下:
  1. CREATE TABLE `call_detail_history` (
  2.     `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  3.     `uuid` VARCHAR(50) NOT NULL DEFAULT '0',
  4.     `call_uuid` VARCHAR(50) NOT NULL DEFAULT '0',
  5.     `caller_number` VARCHAR(20) NOT NULL DEFAULT '0',
  6.     `callee_number` VARCHAR(50) NOT NULL DEFAULT '0',
  7.     `start_time` DATETIME NULL DEFAULT NULL,
  8.     `answer_time` DATETIME NULL DEFAULT NULL,
  9.     `hangup_time` DATETIME NULL DEFAULT NULL,
  10.     `billsec` INT(11) NOT NULL DEFAULT '0',
  11.     `hangup_cause` VARCHAR(50) NOT NULL,
  12.     `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  13.     PRIMARY KEY (`id`)
  14. )
  15. COLLATE='latin1_swedish_ci'
  16. ENGINE=InnoDB
  17. ;
复制代码
2.2 进行数据表备份1) 编写备份脚本文件名:dataBack.py示例代码如下:

 说明:

  • ConfigData类
    读取配置文件
  • dataBack函数
    以天为单位进行数据备份
  • dataClean函数
    执行数据清理功能(业务表和备份表)
  • dataCount函数
    统计业务表里面的数据条目
  • getDbConnStr函数
    生成数据库连接字符串
  • dataRotateBase函数
    数据循环备份功能的具体实现,执行数据备份、数据清理操作。
  • dataRotateByDays函数
    按天循环备份
  • dataRotateByHours函数
    按小时循环备份
  • dataBackTask函数
    执行具体的备份任务
完整代码可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20231209 获取。
2)添加配置文件文件名:default.xml配置文件示例如下:
  1. <config>
  2.     <cdrReserve>
  3.         <maxDays>15</maxDays>
  4.         <maxItems>100000</maxItems>
  5.     </cdrReserve>
  6.    
  7.     <mysql>
  8.         <host>192.168.137.1</host>
  9.         <port>3306</port>
  10.         <user>root</user>
  11.         <password>123456</password>
  12.         <dbname>fsdb32</dbname>        
  13.     </mysql>
  14.    
  15. </config>
复制代码
说明:cdrReserve/maxDays : 最大预留天数cdrReserve/maxItems : 最大预留条数mysql : mysql连接参数
3)编写启动脚本文件名称:start.sh示例如下:
  1. #! /bin/bash
  2. pydir=/root/py39env
  3. export CFLAGS="-I$pydir/include"
  4. export LDFLAGS="-L$pydir/lib"
  5. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$pydir/lib
  6. $pydir/bin/python3.9 dataBack.py -f default.xml
复制代码
说明:这里使用的是自定义python环境,python版本是3.9.12。
CentOS7环境源码安装python3.9可参考如下文章:https://www.cnblogs.com/MikeZhang/p/centos7-install-py39-20220704.html四、运行效果

运行效果如下:

运行效果视频可从如下渠道获取(修改数据时间进行测试):关注微信公众号(聊聊博文,文末可扫码)后回复 2023120901 获取。好,就这么多了,希望对你有帮助。
来源:https://www.cnblogs.com/MikeZhang/p/pyPandasBackup20231210.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具