python 刪除大表資料

2022-09-01 00:09:33 字數 2830 閱讀 3588

#!/usr/bin/env python

# encoding: utf-8

#@author: 東哥加油!

#@file: del_tb_bigtable_statistic.py

#@time: 2018/11/21 15:39

import pymysql

import datetime

import math

import time

#獲取連線

def get_conn():

conn = none

try:

conn = pymysql.connect(

host="192.168.1.2",

port=3306,

user="root",

passwd="mysqlpassword",

charset="utf8",

)except exception as err:

print(err)

return conn

#查詢語句執行

def get_data(sql):

conn = get_conn()

cur = conn.cursor()

cur.execute(sql)

data = cur.fetchall()

conn.close()

return data

#93天前的時間戳

# 2018-07-24 00:00:00 轉成毫秒時間戳

def get_pdate_begin(xday):

now_time = datetime.datetime.now()

step_time = datetime.timedelta(days=xday)

yes_time = now_time - step_time

pdate = yes_time.strftime('%y%m%d')

print(pdate)

return pdate

#資料備份,放到tb_bigtable_statistic_hist表中

def data_bak(xday):

conn = get_conn()

cur = conn.cursor()

cidlist = data_zk(xday)

if cidlist == 0:

print('當天無資料')

else:

for cids in cidlist:

try:

sql = '''insert into db_order.tb_bigtable_statistic_hist \

select * from db_order.tb_bigtable_statistic \

where cid in( %s )''' % cids

cur.execute(sql)

conn.commit()

except:

print('備份失敗!!!')

conn.rollback()

conn.close()

exit(99)

conn.close()

#組裝cid成in的條件(....),5000個cid為一組

def data_zk(xday):

conn = get_conn()

cur = conn.cursor()

cid = get_cid(xday)

var1 = "-999"

i = 0

list =

if cid.__len__() > 0:

for one in cid:

var1=var1+","+str(one[0])

i=i+1

if(i==2000):

var1 = "-999"

i=0return list

else:

return 0

#獲取該條件所有的cid

def get_cid(xday):

pdate = get_pdate_begin(xday)

sql = '''select cid

from db_order.tb_bigtable_statistic

where pdate = %s limit 20000''' % (pdate)

cid = get_data(sql)

return cid

#刪除資料

def del_data(xday):

conn = get_conn()

cur = conn.cursor()

cidlist = data_zk(xday)

if cidlist == 0:

print('當天無資料')

else:

for cids in cidlist:

try:

sql = '''delete from db_order.tb_bigtable_statistic \

where cid in( %s )''' % cids

cur.execute(sql)

conn.commit()

except:

print('備份失敗!!!')

conn.rollback()

conn.close()

exit(99)

conn.close()

def move_data(xday):

data_bak(xday)

del_data(xday)

if __name__ == '__main__':

move_data(93)

oracle大表刪除資料方案

需求簡介 生產資料庫乙個表有27億多資料,要刪除其中其中2014年之前的歷史資料 大約4億左右 表資訊 5個字段的主鍵 乙個欄位的單列索引 hash分割槽。資料庫情況 每日1 00 9 00會跑增量資料程式,其他sql不能影響增量程式。所以資料要在9 00 24 00之內跑完 解決方案1 delet...

Oracle 刪除大表中部分資料

需求 專案中有一張表大概有7000多萬條資料,造成表空間已滿,需要清理部分資料,打算清理3000萬。2b 做法 delete from table name where id 40000000 備註 select count 1 from table name where id his batch ...

大表分批刪除指令碼

昨天幹了件傻事,在公司新搭了個測試庫,把正式庫還原到測試庫後,把恢復模式改為簡單,然後無腦寫了個指令碼把所有業務表今年以前的資料刪除。之後就回家了。今天跑過來上去一看,呃的神,測試庫日誌達到了200多gb。這才意識到單個業務表的資料量比較大,而我用單個delete語句來刪除的,單個事務忒大了導致日誌...