pt-archiver實現MySQL定期分表

Jusly2018發表於2018-07-02

pt-archiver使用的場景

1、清理線上過期資料  

2、清理過期資料,並把資料歸檔到本地歸檔表中,或者遠端歸檔伺服器  

3、兩張表之間的資料不完全相同,希望合併。此時加上–ignore或–replace選項,可以輕鬆實現 

4、匯出線上資料,到線下資料作處理 

 

匯出資料的基本原理:  





     透過“過濾條件”,得在此範圍內的PK的最大值和最小值 , 然後透過PK索引, 過濾條件 + pk <此範圍的最大值 + pk >(此範圍內pk的最小值+每次增長limit指定的數) + limit. 這樣直到處理完成。 

關於分表,定期建表有一個pt-archiver可以很好的實現.  
         db_source.py_out_export和db_source.py_out_export_result做定期清理,每週三0:00歸檔到歷史庫db_hist.py_out_export_his${TABLE_DATE}和db_hist.py_out_export_result_his${TABLE_DATE}表. 
    具體實現可參考 如下
/pydata/software/percona-toolkit-3.0.2/pt-archiver.sh 
/pydata/software/percona-toolkit-3.0.2/pt-archiver.def 
  
[root@py-test percona-toolkit-3.0.2]# more pt-archiver.sh 
#-------------------------------------------------------------------------------- 
#指令碼名稱:  pt-archiver.sh 
#指令碼引數:  pt-archiver.def檔案 
#指令碼功能:  歸檔大表到歷史表 
#編 寫 人:  zj 
#編寫日期:  2017年6月19日14:20 
#更 新 人:   
#更新日期:   
#-------------------------------------------------------------------------------- 
  
EXEC_DATE=`date +%Y-%m-%d` 
TABLE_DATE=`date +%Y%m%d` 
#EXEC_DATE="2017-05-13" 
#TABLE_DATE="20170513" 
FILE_DIR=`dirname $0` 
FILE_NAME=`basename $0 .sh` 
USER="root" 
PASSWORD="dbpasswd" 
  
sed '/^#.*\|^$/d' ${FILE_DIR}/${FILE_NAME}.def >${FILE_DIR}/${FILE_NAME}.tmp 
for i in `cat ${FILE_DIR}/${FILE_NAME}.tmp` 
do       
DEF_DATA_TMP="`echo ${i} |sed s/\ //g`" #去空格,得到一行資料 
#得到資料檔案和源表名值 
SOURCE_DB=`echo ${i} | cut -d "," -f1 | tr "[A-Z]" "[a-z]"` 
TABLE_NAME=`echo ${i} | cut -d "," -f2 | tr "[A-Z]" "[a-z]"` 
FLITER_FIELD=`echo ${i} | cut -d "," -f3 | tr "[A-Z]" "[a-z]"` 
DEST_DB=`echo ${i} | cut -d "," -f4 | tr "[A-Z]" "[a-z]"` 
  
HISTABLE_NAME="${TABLE_NAME}_his${TABLE_DATE}" 
WHERE_SQL=`echo "'exec_time<\""${EXEC_DATE}" 00:00:00\"'"` 
mysql -u${USER} -p${PASSWORD} -e "create table if not exists ${DEST_DB}.${HISTABLE_NAME} like ${SOURCE_DB}.${TABLE_NAME};" 
if [ $? -ne 0 ] ;then 
echo "ERROR:create table ${HISTABLE_NAME} error!" >${FILE_DIR}/${FILE_NAME}.log 
exit 1 
fi 
  
echo " pt-archiver  --source h=127.0.0.1,P=3306,u=${USER},p=${PASSWORD},D=${SOURCE_DB},t=${TABLE_NAME} --dest h=127.0.0.1,P=3306,u=${USER},p=${PASSWORD},D=${DEST_DB},t=${HISTABLE_NAME} --no-check-charset --where 
 '${FLITER_FIELD}<\""${EXEC_DATE}" 00:00:00\"' --progress 5000 --limit=1000 --txn-size=1000 --statistics">pt-archiver-${TABLE_NAME}.sh 
sh pt-archiver-${TABLE_NAME}.sh >pt-archiver-${TABLE_NAME}.log 
done 
exit 0 
  
[root@py-test percona-toolkit-3.0.2]#  more pt-archiver.def 
##源資料庫名,源表名,篩選欄位,目標庫名 
db_source,py_out_export,export_time,db_hist 
db_source,py_out_export_result,exec_time,db_hist 

##建立每週三定時執行
[root@py-test percona-toolkit-3.0.2]#  crontab -e 
20 2 * * 3 /pydata/software/percona-toolkit-3.0.2/pt-archiver.sh >/pydata/software/percona-toolkit-3.0.2/pt-archiver.log 
  

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31525738/viewspace-2157207/,如需轉載,請註明出處,否則將追究法律責任。

相關文章