【MySQL】刪除大量資料的具體實現
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()
歡迎大家提出更好的方法。。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-759736/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 大量刪除資料的速度
- MySQL 快速刪除大量資料(千萬級別)的幾種實踐方案——附原始碼MySql原始碼
- 儲存系統實現-資料刪除之索引的刪除索引
- Laravel 如何實現資料的軟刪除Laravel
- MySQL刪除資料表MySql
- oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄)Oracle
- MongoDB中如何優雅地刪除大量資料MongoDB
- oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄) 轉Oracle
- 【轉】oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄)Oracle
- php 刪除資料夾的實現程式碼PHP
- MySQL刪除重複資料MySql
- 刪除SQL Server日誌的具體方法SQLServer
- Laravel 中利用『模型事件』來實現刪除資料時的連帶刪除Laravel模型事件
- React實現表單資料的新增與刪除React
- MySQL(四) 資料表的插入、更新、刪除資料MySql
- MySQL實現刪除資料左右空格trim() 左空格ltrim() 右空格rtrim()MySql
- [MYSQL -20]更新和刪除資料MySql
- [MYSQL] 資料庫建立與刪除MySql資料庫
- MySQL刪除資料的簡單嘗試MySql
- mysql 刪除表中重複的資料MySql
- MongoDB中優雅刪除大量資料的三種方式純尹MongoDB
- 儲存系統實現-如何刪除資料
- whk我【資料刪除】你個【資料刪除】的
- mybatis實現MySQL資料庫的增刪改查MyBatisMySql資料庫
- Linux中RM快速刪除大量檔案/資料夾方法Linux
- MySQL超大表刪除資料過程MySql
- 講解刪除SQL Server日誌的具體方法SQLServer
- MySQL 中刪除的資料都去哪兒了?MySql
- 如何刪除資料庫下的所有表(mysql)資料庫MySql
- 【RAC】刪除RAC資料庫節點(四)——刪除資料庫軟體及ASM軟體資料庫ASM
- 簡單介紹mysql如何刪除資料表和關聯的資料表刪除詳情MySql
- 批量刪除大量小檔案
- CoreData實踐(六)——資料刪除
- MySQL 批量更新、刪除資料shell指令碼MySql指令碼
- mysql資料庫誤刪除操作說明MySql資料庫
- 刪除資料
- MySQL防止delete命令刪除資料的兩種方法MySqldelete
- Mysql資料庫值的新增、修改、刪除及清空MySql資料庫