python3使用pandas备份mysql数据表

操作系统 :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.html

1、使用pandas库的read_sql_query进行数据读取,可参考如下文档:

pandas.read_sql_query — pandas 2.1.4 documentation

2、pymysql是一个纯python实现的mysql操作库,安装及使用起来比较方便,且可跨平台使用。

文档地址:PyMySQL documentation — PyMySQL 0.7.2 documentation

3、SQLAlchemy是一个功能强大的Python ORM 工具包,借助该工具可更便捷的实现数据备份。

官方网址: SQLAlchemy - The Database Toolkit for Python

三、以FreeSWITCH的cdr为例进行示例

FreeSWITCH版本 :1.10.9

1、FreeSWITCH配置CDR

fs模块: mod_odbc_cdr

默认配置: conf/autoload_configs/odbc_cdr.conf.xml

如果没有该模块及配置文件,需要在编译时安装该模块,并将源码里面的配置文件复制到conf/autoload_configs目录,源码里面的配置文件路径如下:

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 配置示例:

[fsdb]
Description=MySQL freeswitch database
Driver=MySQL
SERVER =192.168.137.1
PORT =3306
USER=root
PASSWORD=123456
DATABASE = fsdb32
OPTION =67108864
CHARSET = UTF8

odbc_cdr.conf.xml配置示例(可根据情况调整所需字段):

<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进行数据备份

2.1 建立备份表

建表语句如下:

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
;

2.2 进行数据表备份

1) 编写备份脚本

文件名:dataBack.py

示例代码如下:

 说明:

  • ConfigData类
    读取配置文件
  • dataBack函数
    以天为单位进行数据备份
  • dataClean函数
    执行数据清理功能(业务表和备份表)
  • dataCount函数
    统计业务表里面的数据条目
  • getDbConnStr函数
    生成数据库连接字符串
  • dataRotateBase函数
    数据循环备份功能的具体实现,执行数据备份、数据清理操作。
  • dataRotateByDays函数
    按天循环备份
  • dataRotateByHours函数
    按小时循环备份
  • dataBackTask函数
    执行具体的备份任务

完整代码可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20231209 获取。

2)添加配置文件

文件名:default.xml

配置文件示例如下:

<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>
说明:

cdrReserve/maxDays : 最大预留天数

cdrReserve/maxItems : 最大预留条数

mysql : mysql连接参数

3)编写启动脚本

文件名称:start.sh

示例如下:

#! /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

说明:

这里使用的是自定义python环境,python版本是3.9.12。

CentOS7环境源码安装python3.9可参考如下文章:

https://www.cnblogs.com/MikeZhang/p/centos7-install-py39-20220704.html

四、运行效果

运行效果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用 python 中的文件操作函数来存储 DTU 离线数据。具体步骤如下: 1. 打开一个文件用于写入,使用 Python 的 built-in 函数 `open()`。例如: ```python f = open('data.txt', 'w') ``` 2. 将 DTU 离线数据写入文件中,使用文件对象的 `write()` 方法。例如: ```python f.write(data) ``` 3. 关闭文件,使用文件对象的 `close()` 方法。例如: ```python f.close() ``` 需要注意的是,上述代码仅能够将 DTU 离线数据写入文本文件中。如果需要将数据存储到其他格式的文件中(例如 Excel、CSV 等),可以使用第三方库,例如 Pandas、xlwt 等。 ### 回答2: 要使用Python存储DTU的离线数据,可以采取以下步骤: 1. 导入所需的Python库,例如pandas和numpy,以便处理和存储数据。 2. 配置DTU设备,确保它以正确的方式生成离线数据。例如,设置设备将数据保存到CSV文件或者以其他常见的数据格式输出。 3. 使用Python的文件读取功能,读取DTU生成的离线数据文件。可以使用pandas的read_csv函数,或者其他适合数据格式的读取函数。 4. 如果数据需要进行预处理,可以使用Python的数据处理库,例如pandas和numpy,对数据进行清洗、去除异常值或者其他处理操作。 5. 将处理后的数据存储到特定的格式中。可以使用pandas的to_csv函数将数据保存为CSV文件,或者使用pandas的to_excel函数将数据保存为Excel文件,也可以将数据存储到数据库中,如MySQL或SQLite等。 6. 在存储数据时,可以选择添加时间戳或其他元数据,以便在之后的分析中进行更加精确的时间序列分析。 7. 建议使用适当的命名规范为数据文件命名,以便稍后的数据检索和管理。 8. 如果数据量较大,可以考虑使用压缩算法,例如gzip或bz2,将数据文件进行压缩存储,以节省存储空间。 9. 根据需求和数据处理工作的频率,可以使用定期任务或计划任务,自动化执行数据处理和存储步骤。 总之,使用Python存储DTU的离线数据需要读取和处理数据的能力,然后选择合适的存储格式,如CSV、Excel或数据库,以及管理和组织数据的方法。 ### 回答3: 在使用Python存储DTU(数据终端设备)的离线数据时,可以使用以下方法: 1. 导入所需库:首先,确保计算机上已安装Python,并导入所需的库,如pandas和numpy。 2. 数据采集:使用合适的传感器或设备,将离线数据采集到DTU中。 3. 数据传输:DTU负责将采集到的数据传输到计算机中。可以使用串口或以太网连接。 4. 数据解析:DTU通常会将数据以二进制格式传输,因此需要解析接收到的数据。根据DTU的数据格式,使用Python编写代码来解析它。 5. 存储数据:使用pandas库中的DataFrame结构来存储解析后的数据。创建一个新的DataFrame对象,将数据逐行添加到其中。 6. 数据分析和处理:使用numpy和pandas库提供的各种功能对存储的数据进行分析和处理。可以进行数据清洗、数据转换、特征提取等操作。 7. 数据可视化:可以使用matplotlib或seaborn等库将存储的数据可视化,以便更好地理解和分析数据。 8. 数据导出:根据需求,可以将存储的数据导出为不同的格式,如CSV、Excel等,以方便在其他平台或工具中使用。 9. 数据备份与恢复:为了防止数据丢失,应定期进行数据备份。可以使用Python编写脚本来实现数据的自动备份和恢复。 总结:通过以上步骤,可以使用Python来存储DTU的离线数据,并进行进一步的数据操作、分析和可视化。使用适当的库和技术,可以更好地管理和利用DTU采集的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

softshow1026

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值