栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

删除Mysql历史数据(Python)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

删除Mysql历史数据(Python)

Python实现删除mysql历史月表数据,以及删除N天前历史数据并释放磁盘空间,delete数据不会释放表空间,手动optimize整理释放(!会锁表!)

import pymysql
import datetime
import sys

# 指定 Mysql 连接参数
HOST = ''
PORT = ''
USER = ''
PASSWORD = ''
# 保留近n天的数据
DAYS = 365

# 数据库配置
DS_0 = 'vn_wl_0'
DS_1 = 'vn_wl_1'
DS_ADAS = 'vn_wl_adas'
# 直接drop的表,有分月表的
DROP_TABLES = {
    'all_alarm_info': [DS_1, DS_ADAS],
    'can': [DS_1],
    'gps': [DS_1],
    'gps_alarm': [DS_1],
    'gps_run': [DS_1],
    'veh_arrive_station_info': [DS_1],
    'vehiclestatu_his': [DS_1],
    'wechat_push_alarm_record': [DS_1]
}
# delete部分数据的表(根据生产环境统计的表大小)
DELETE_TABLES = {
    # [vn_wl_0]
    'device_register_or_off': DS_0,
    'check_post_record': DS_0,
    'sim_gprs': DS_0,
    'driver_punch_card_record': DS_0,
    # [vn_wl_1]
    'veh_login_log': DS_1,
    'veh_online_stat': DS_1,
    'with_superior_platform_connection_detail': DS_1,
    # [vn_wl_adas]
    'mobileye_driver_safe_event': DS_ADAS,
    'mobileye_driver_score': DS_ADAS,
    'adas_media_info': DS_ADAS,
}


# 获取连接对象
def connection(DB):
    return pymysql.connect(host=HOST, port=int(PORT), user=USER, passwd=PASSWORD, db=DB)


def dropTable(table, time):
    for db in DROP_TABLES[table]:
        try:
            
            conn = connection(db)
            cur = conn.cursor()
            for num in range(0,23):
                yearMouth = time + datetime.timedelta(days=-num*31)
                sql = 'DROP TABLE IF EXISTS ' + table + "_" + yearMouth.strftime("%Y%m")
                print(sql)
                cur.execute(sql)
            cur.close()
            conn.close()
        except Exception as e:
            print("drop pre year table error [" + table + "]:" + time.strftime("%Y%m"))
            print(repr(e))


def deleteTable(db, table, yearMouthDay):
    try:
        if "device_register_or_off" == table:
            dateField = "register_or_off_time"
        elif "check_post_record" == table:
            dateField = "check_time"
        else:
            dateField = "ct"
        sql = 'delete from ' + table + ' where ' + dateField + ' < '' + yearMouthDay + '''
        print(sql)
        conn = connection(db)
        cur = conn.cursor()
        cur.execute(sql)
        conn.commit()
        cur.close()
        conn.close()
    except Exception as e:
        print("delete table error [" + table + "]:")
        print(repr(e))


# 优化表空间,delete删除后整理磁盘碎片删除数据。
# !会锁表!
def optimizeTable(db, table):
    try:
        sql = 'optimize table ' + table
        print(sql)
        conn = connection(db)
        cur = conn.cursor()
        cur.execute(sql)
        cur.close()
        conn.close()
    except Exception as e:
        print("optimize table error [" + table + "]:")
        print(repr(e))


def job():
    day = -int(DAYS)
    time = datetime.datetime.now() + datetime.timedelta(days=day)
    yearMouthDay = time.strftime("%Y-%m-%d")
    for table in DROP_TABLES:
        dropTable(table, time)

    for table in DELETE_TABLES:
        db = DELETE_TABLES[table]
        deleteTable(db, table, yearMouthDay)
        optimizeTable(db, table)


if __name__ == "__main__":

    if len(sys.argv) != 6:
        print("Parameter error, use eg:")
        print("python3 cleanHistoryData.py [mysql-host] [mysql-port] [mysql-user] [mysql-passwd] [delete-days]")
        print("python3 cleanHistoryData.py 127.0.0.1 3306 root yx_123 365")
    else:
        HOST = sys.argv[1]
        PORT = sys.argv[2]
        USER = sys.argv[3]
        PASSWORD = sys.argv[4]
        DAYS = sys.argv[5]
        job()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/840026.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号