場景描述
線上
mysql
數據庫里面有張表保存有每天的統計結果,每天有1千多萬條,這是我們意想不到的,統計結果咋有這么多。運維找過來,磁盤占了
200G
,最后問了運營,可以只保留最近3天的,前面的數據,只能刪了。刪,怎么刪?
因為這是線上數據庫,里面存放有很多其它數據表,如果直接刪除這張表的數據,肯定不行,可能會對其它表有影響。嘗試每次只刪除一天的數據,還是卡頓的厲害,沒辦法,寫個Python腳本批量刪除吧。
具體思路是:
- 每次只刪除一天的數據;
- 刪除一天的數據,每次刪除50000條;
- 一天的數據刪除完,開始刪除下一天的數據;
Python代碼
# -*-coding:utf-8 -*-
import sys
# 這是我們內部封裝的Python Module
sys.path.append('/var/lib/hadoop-hdfs/scripts/python_module2')
import keguang.commons as commons
import keguang.timedef as timedef
import keguang.sql.mysqlclient as mysql
def run(starttime, endtime, regx):
tb_name = 'statistic_ad_image_final_count'
days = timedef.getDays(starttime,endtime,regx)
# 遍歷刪除所有天的數據
for day in days:
print '%s 數據刪除開始'%(day)
mclient = getConn()
sql = '''
select 1 from %s where date = '%s' limit 1
'''%(tb_name, day)
print sql
result = mclient.query(sql)
# 如果查詢到了這一天的數據,繼續刪除
while result is not ():
sql = 'delete from %s where date = "%s" limit 50000'%(tb_name, day)
print sql
mclient.execute(sql)
sql = '''
select 1 from %s where date = '%s' limit 1
'''%(tb_name, day)
print sql
result = mclient.query(sql)
print '%s 數據刪除完成'%(day)
mclient.close()
# 返回mysql 連接
def getConn():
return mysql.MysqlClient(host = '0.0.0.0', user = 'test', passwd = 'test', db= 'statistic')
if __name__ == '__main__':
regx = '%Y-%m-%d'
yesday = timedef.getYes(regx, -1)
starttime = '2019-08-17'
endtime ='2019-08-30'
run(starttime, endtime, regx)
循環判斷數據,如果有,繼續刪除當天
50000
條數據;否則,開始刪除下一天的數據。花了半個小時,終于刪除完了。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
