共计 2746 个字符,预计需要花费 7 分钟才能阅读完成。
这篇文章给大家分享的是有关 pt-archiver 如何实现 MySQL 定期分表的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。
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
感谢各位的阅读!关于“pt-archiver 如何实现 MySQL 定期分表”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
正文完