ourmysql博客中提供了 《大表删除数据的思路》,对于大表依据主键删除的思路是必须的,删除几千万的数据还算是比较简单的,如果你的数据库中的表高达数百亿条记录 ,删除其中的几十亿,就需要考虑可用性的问题了。上述文中的 利用生成的文本方式有些不妥。

我的方法是利用存储过程,游标,先根据条件获取要删除的主键,然后依据主键删除,考虑到删除50亿条记录耗费将近7天的时间(事后得出),必须后台执行。使用python 工具写一个脚本,可以针对多个服务器进行并行操作。

1 在各个服务器上创建存过!

delimiter //

CREATE  PROCEDURE `proc_del_tab`(in com_num int , in push_time datetime )

begin

declare curid bigint ;

DECLARE rowid bigint ;

declare no_more_departments int ;

declare curs cursor for

select id

from

tab

WHERE

v3 < push_time ;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_departments = 1;

SET no_more_departments=0;

set rowid = 1 ;

set autocommit = 0 ;

open curs ;

REPEAT

fetch curs into curid ;

delete from tab where id = curid ;

set rowid = rowid + 1 ;

if rowid % com_num = 0

then

commit;

end if ;

UNTIL no_more_departments

END REPEAT;

commit ;

close curs ;

end;

//

delimiter ;

2 部署python 脚本:

#!/usr/bin/env python

from MySQLdb import *

import sys

import threading

import time

import os

def now() :

#return str('2011-01-31 00:00:00')

return str( time.strftime( '%Y-%m-%d %H:%M:%S' , time.localtime() ) )

def log( strs , logs ) :

f = file( logs , 'a' , 0 )

f.write( now() + ' ' + str(strs) + '\n' )

f.close()

def delining( cur , logs ) :

sql = "SET SQL_LOG_BIN=0"

try :

cur['dsn'].execute( sql )

except Exception , e :

log( 'Set SQL_LOG_BIN OFF' + str(e) , logs )

sql = "call proc_del_tab_yang( 3000 , '%s' )" % ('2011-01-31 00:00:00')

log( 'starting process %s' % ( cur['addr'] ) , logs )

try :

cur['dsn'].execute( sql )

except Exception , e :

log( 'Execute Procedure ' + str(e) , logs )

sql = "SET SQL_LOG_BIN=1"

try :

cur['dsn'].execute( sql )

except Exception , e :

log( 'Set SQL_LOG_BIN ON' + str(e) , logs )

log( 'process %s End' % ( cur['addr'] ) , logs )

def main() :

logs = "/root/yangql/python/del_test_tab.log"

server_list=['10.250.7.110']

luser="yang"

lpasswd="yang"

con = []

for addr in server_list :

cons = None

try :

cons = connect( host = addr , user = luser , passwd = lpasswd , port = 3307 , db = 'newcloudapp' )

except Exception , e :

log( 'On Connect %s ' % ( addr ) + str(e) , logs )

continue

con.append(  { 'dsn':cons , 'addr':addr } )

cur = []

for cons in con :

try :

cur.append( { 'dsn':cons['dsn'].cursor( cursorclass = cursors.DictCursor ) , 'addr':cons['addr'] } )

except Exception , e :

log( 'On Cusros %s ' % ( cons['addr'] ) + str(e)  , logs )

continue

thpool = []

for curs in cur :

th = threading.Thread(target = delining ,args=( curs , logs ) )

thpool.append( th )

for th in thpool :

th.start()

for th in thpool :

threading.Thread.join( th )

while True :

if threading.activeCount() < 2 :

break

else :

time.sleep(1)

continue

for curs in cur :

try :

curs['dsn'].close()

except Exception , e :

log( 'On Close Cusros %s ' % ( curs['addr'] ) + str(e)  , logs )

continue

for cons in con :

try :

cons['dsn'].close()

except Exception , e :

log( 'On Close Connect %s ' % ( str(e)  ) , logs )

continue

if __name__ == '__main__' :

main()

欢迎大家提出更好的方法。。

mysql百万数据删除_【MySQL】删除大量数据的具体实现相关推荐

  1. mysql百万级数据测试_百万级数据mysql测试环境介绍

    mysql 作为一款非常优秀的免费数据库被广泛的使用,平时我们开发的项目数据过百万的时候不多.最近花了大量的时间来深入的研究mysql百万级数据情况下的优化. 遇到了很多问题并解决了他们,特此分享给大 ...

  2. mysql 清理host文件_如何删除mysql 数据库里面的host

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  3. mysql error log清理_手动删除mysql日志/var/log/mysql/error.log导致的mysql无法启动

    问题环境 ubuntu-mate for raspberry mysql默认配置 问题起源 最近在搞fail2ban这东西,顺便翻了翻各种日志,然后看见mysql的日志有点多就想清理一下,于是直接su ...

  4. mysql dump 数据时间_使用mysqldump备份数据及做时间点还原测试步骤

    1.备份dbtest数据库数据 # mysqldump --databases dbtest --master-data=2 --single-transaction >s2.sql 记录当前的 ...

  5. php 导出mysql 数据库表结构图_导入和导出数据表的图文介绍(phpMyAdmin的使用教程5)...

    导入和导出数据表的图文介绍(phpMyAdmin的使用教程5) 导入和导出数据是互逆的两个操作,导入数据是通过扩展名为.sql的文件导入到数据库中,导出数据是将数据表结构,表记录储存为.sql的文件, ...

  6. mysql查看数据倾斜_深入理解hadoop数据倾斜

    深入理解hadoop之数据倾斜 1.什么是数据倾斜 我们在用map /reduce程序执行时,有时候会发现reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理 ...

  7. mysql运维技巧_​mysql初级运维使用技巧

    整理了一下,工作中用到的最高的关于mysql的一些命令和使用技巧,分享给刚接触mysql的小伙伴么. 1mysql最基础 1.1mysql安装 建议新人安装mysql直接使用yum安装即可,大牛们已经 ...

  8. 不平衡数据采样_过度采样不平衡数据的5种打击技术

    不平衡数据采样 Imbalance data is a case where the classification dataset class has a skewed proportion. For ...

  9. 大数据文字游戏_什么是大数据?

    我进入数据行业多年,亲眼见证了当下大数据时代的到来,和以前的数据可能有很大的区别. 在以前,我们理解的数据可能是比如教育行业:学生的成绩,银行:大家的存款数据,各行各业都有自己的具体的数据信息. 在当 ...

  10. python爬取淘宝数据魔方_《淘宝数据魔方技术架构解析》阅读笔记

    淘宝网拥有国内最具商业价值的海量数据.截至当前,每天有超过30亿的店铺.商品浏览记录,10亿在线商品数,上千万的成交.收藏和评价数据.如何从这些数据中挖掘出真正的商业价值,进而帮助淘宝.商家进行企业的 ...

最新文章

  1. Java 11 正式发布!
  2. Google colab: 修改系统时间 change system time
  3. (转)字符串匹配算法总结
  4. stl map高效遍历删除的方法
  5. 根据”so劫持”过360加固详细分析
  6. XP共享访问无权限解决方法
  7. 杭电多校第十场 hdu6434 Count 欧拉函数打表 快速打表模板
  8. keycloak集群化的思考
  9. c++ 如何获取系统时间
  10. php复制xml文件,PHP_php xml文件操作实现代码(二),复制代码 代码如下:?php //创 - phpStudy...
  11. sqlserver2008导出mysql_SQLserver 2008将数据导出到Sql脚本文件的方法
  12. linux 软件 tar deb rmp,专业编剧软件Fade In Linux版提供deb、rpm、tar.gz包下载
  13. Flat Tech html5 前端响应式模板
  14. Elasticsearch 搜索数组字段
  15. 用Python做一个简单的翻译工具
  16. for循环和while循环
  17. 电脑故障,路由器及网络
  18. 关于Ubuntu 16.04系统挂载硬盘以及迁移MYSQL数据存储目录的操作步骤
  19. storm配置:如何解决worker进程内存过小的问题
  20. visual studio怎么让button一直生效_民用建设工程设计合同怎么生效

热门文章

  1. C语言数据结构(大话数据结构——笔记2)第四章:栈与队列
  2. Python 编码规范 TODO注释
  3. python lambda表达式的使用方法(匿名函数)
  4. 初学__Python——Python的基本输入输出函数
  5. linux——apache
  6. java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.LoopTag 错误
  7. php实现队列上传,php实现队列
  8. unity 批量导入模型工具_如何将VMD舞蹈导入桌面萌娘MMD
  9. 利用python发送邮件_利用python实现简单的邮件发送客户端示例
  10. 二叉树的基本操作_二叉树的遍历