zoukankan      html  css  js  c++  java
  • Pt-Archiver 使用说明

    Pt-Archiver 使用说明:

    工具介绍:

    Pt-Archiver 是一款数据库单表数据导出,清理,归档工具

    官方文档地址:

    https://www.percona.com/doc/percona-toolkit/LATEST/pt-archiver.html

    常用配置说明:

    -where 'id<3000'    设置操作条件
    --limit 10000  每次取1000行数据给pt-archive处理
    --txn-size 1000    设置1000行为一个事务提交一次
    --progress 5000    每处理5000行输出一次处理信息
    --statistics   结束的时候给出统计信息:开始的时间点,结束的时间点,查询的行数,归档的行数,删除的行数,以及各个阶段消耗的总的时间和比例,便于以此进行优化。只要不加上--quiet,默认情况下pt-archive都会输出执行过程的
    --charset=UTF8 指定字符集为UTF8,字符集需要对应当前库的字符集来操作
    --no-delete    表示不删除原来的数据,注意:如果不指定此参数,所有处理完成后,都会清理原表中的数据
    --bulk-delete  批量删除source上的旧数据
    --bulk-insert  批量插入数据到dest主机 (看dest的general log发现它是通过在dest主机上LOAD DATA LOCAL INFILE插入数据的)

    --dry-run 模拟执行

    --source 源数据

    --dest 目标数据

    注意事项:
    --source --dest 后的DSN之间不能空格出现,否则会出错。
    --where条件的值,有字符串的,要用引号括起来。
     
    DSN 是指 --source --dest  的参数
     
    工作原理:
    181214 10:55:55         36 Connect  root@10.10.11.16 on platform-unitive
                     36 Query    set autocommit=0
                     36 Query    /*!40101 SET NAMES "UTF8"*/
                     36 Query    SHOW VARIABLES LIKE 'wait\_timeout'
                     36 Query    SET SESSION wait_timeout=10
                     36 Query    SELECT @@SQL_MODE
                     36 Query    SET @@SQL_QUOTE_SHOW_CREATE = 1/*!40101, @@SQL_MODE='NO_AUTO_VALUE_ON_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'*/
                     36 Query    SELECT version()
                     36 Query    SHOW VARIABLES LIKE 'version%'
                     36 Query    SHOW ENGINES
                     36 Query    SHOW VARIABLES LIKE 'innodb_version'
                     36 Query    show variables like 'innodb_rollback_on_timeout'
                     36 Query    /*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, @@SQL_MODE := '', @OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, @@SQL_QUOTE_SHOW_CREATE := 1 */
                     36 Query    USE `platform-unitive`
                     36 Query    SHOW CREATE TABLE `platform-unitive`.`u_push_message`
                     36 Query    /*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */
                     36 Query    SELECT CONCAT(/*!40100 @@session.character_set_connection, */ "")
                     37 Connect  root@10.10.11.16 on platform-unitive
                     37 Query    set autocommit=0
                     37 Query    /*!40101 SET NAMES "UTF8"*/
                     37 Query    SHOW VARIABLES LIKE 'wait\_timeout'
                     37 Query    SET SESSION wait_timeout=10
                     37 Query    SELECT @@SQL_MODE
                     37 Query    SET @@SQL_QUOTE_SHOW_CREATE = 1/*!40101, @@SQL_MODE='NO_AUTO_VALUE_ON_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'*/
                     37 Query    SELECT version()
                     37 Query    SHOW VARIABLES LIKE 'version%'
                     37 Query    SHOW ENGINES
                     37 Query    SHOW VARIABLES LIKE 'innodb_version'
                     37 Query    show variables like 'innodb_rollback_on_timeout'
                     37 Query    /*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, @@SQL_MODE := '', @OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, @@SQL_QUOTE_SHOW_CREATE := 1 */
                     37 Query    USE `platform-unitive`
                     37 Query    SHOW CREATE TABLE `platform-unitive`.`u_push_message_2018`
                     37 Query    /*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */
                     37 Query    SELECT CONCAT(/*!40100 @@session.character_set_connection, */ "")
                     36 Query    SHOW VARIABLES LIKE 'wsrep_on'
                     36 Query    SHOW VARIABLES LIKE 'wsrep_on'
                     36 Query    SHOW VARIABLES LIKE 'version%'
                     36 Query    SHOW ENGINES
                     36 Query    SHOW VARIABLES LIKE 'innodb_version'
                     36 Query    SELECT MAX(`id`) FROM `platform-unitive`.`u_push_message`
                     36 Query    SELECT CONCAT(@@hostname, @@port)
                     37 Query    SELECT CONCAT(@@hostname, @@port)
                     36 Query    SELECT /*!40001 SQL_NO_CACHE */ `id`,`app_codes`,`device_type`,`msg_subject`,`msg_body`,`push_time`,`offline_days`,`expire_time`,`push_type`,`device_ids`,`group_codes`,`uids`,`click_action`,`click_uri`,`msg_content`,`message_roam_type`,`msg_type`,`priority`,`msg_batch_no`,`need_time_scope`,`query_id`,`status`,`push_count`,`creater`,`create_time`,`modifier`,`modify_time`,`version`,`schedule_flag`,`notice_url`,`msg_channel`,`is_need_pull` FROM `platform-unitive`.`u_push_message` FORCE INDEX(`PRIMARY`) WHERE (id <= 640040) AND (`id` < '23928907') ORDER BY `id` LIMIT 2
                     36 Query    SELECT 'pt-archiver keepalive'
                     37 Query    commit
                     36 Query    commit
                     37 Query    LOAD DATA LOCAL INFILE '/tmp/3xbPFCYChYpt-archiver' INTO TABLE `platform-unitive`.`u_push_message_2018`CHARACTER SET UTF8(`id`,`app_codes`,`device_type`,`msg_subject`,`msg_body`,`push_time`,`offline_days`,`expire_time`,`push_type`,`device_ids`,`group_codes`,`uids`,`click_action`,`click_uri`,`msg_content`,`message_roam_type`,`msg_type`,`priority`,`msg_batch_no`,`need_time_scope`,`query_id`,`status`,`push_count`,`creater`,`create_time`,`modifier`,`modify_time`,`version`,`schedule_flag`,`notice_url`,`msg_channel`,`is_need_pull`)
                     36 Query    SELECT 'pt-archiver keepalive'
                     36 Query    DELETE FROM `platform-unitive`.`u_push_message` WHERE (((`id` >= '640021'))) AND (((`id` <= '640022'))) AND (id <= 640040) LIMIT 2
                     37 Query    commit
                     36 Query    commit
     
     
    使用场景一:
    u_push_message 表按照推送时间90天前数据 归档到 u_push_message_2018
    1,创建u_push_message_2018 表结构与u_push_message 完全一致,不需要额外索引
    2,编写执行脚本
    pt-archiver  --source h=10.10.11.16,P=3309,u=root,p='kws@1234',D=platform-unitive,t=u_push_message  --dest h=10.10.11.16,P=3309,u=root,p='kws@1234',D=platform-unitive,t=u_push_message_2018  --charset=UTF8 --where 'push_time <= 1536854400000' --progress 10000 --limit=10000 --txn-size 10000 --bulk-insert --bulk-delete --statistics  --purge
     
    3,增加--dry-run 去服务器检查执行 
    pt-archiver  --source h=10.10.11.16,P=3309,u=root,p='kws@1234',D=platform-unitive,t=u_push_message  --dest h=10.10.11.16,P=3309,u=root,p='kws@1234',D=platform-unitive,t=u_push_message_2018  --charset=UTF8 --where 'push_time <= 1536854400000' --progress 10000 --limit=10000 --txn-size 10000 --bulk-insert --bulk-delete --statistics  --purge --dry-run
     
    4.检查输出日志是否符合预期:
    SELECT /*!40001 SQL_NO_CACHE */ `id`,`app_codes`,`device_type`,`msg_subject`,`msg_body`,`push_time`,`offline_days`,`expire_time`,`push_type`,`device_ids`,`group_codes`,`uids`,`click_action`,`click_uri`,`msg_content`,`message_roam_type`,`msg_type`,`priority`,`msg_batch_no`,`need_time_scope`,`query_id`,`status`,`push_count`,`creater`,`create_time`,`modifier`,`modify_time`,`version`,`schedule_flag`,`notice_url`,`msg_channel`,`is_need_pull` FROM `platform-unitive`.`u_push_message` FORCE INDEX(`PRIMARY`) WHERE (push_time <= 1536854400000) AND (`id` < '23928907') ORDER BY `id` LIMIT 10000
    SELECT /*!40001 SQL_NO_CACHE */ `id`,`app_codes`,`device_type`,`msg_subject`,`msg_body`,`push_time`,`offline_days`,`expire_time`,`push_type`,`device_ids`,`group_codes`,`uids`,`click_action`,`click_uri`,`msg_content`,`message_roam_type`,`msg_type`,`priority`,`msg_batch_no`,`need_time_scope`,`query_id`,`status`,`push_count`,`creater`,`create_time`,`modifier`,`modify_time`,`version`,`schedule_flag`,`notice_url`,`msg_channel`,`is_need_pull` FROM `platform-unitive`.`u_push_message` FORCE INDEX(`PRIMARY`) WHERE (push_time <= 1536854400000) AND (`id` < '23928907') AND ((`id` >= ?)) ORDER BY `id` LIMIT 10000
    DELETE FROM `platform-unitive`.`u_push_message` WHERE (((`id` >= ?))) AND (((`id` <= ?))) AND (push_time <= 1536854400000) LIMIT 10000
    LOAD DATA LOCAL INFILE ? INTO TABLE `platform-unitive`.`u_push_message_2018`CHARACTER SET UTF8(`id`,`app_codes`,`device_type`,`msg_subject`,`msg_body`,`push_time`,`offline_days`,`expire_time`,`push_type`,`device_ids`,`group_codes`,`uids`,`click_action`,`click_uri`,`msg_content`,`message_roam_type`,`msg_type`,`priority`,`msg_batch_no`,`need_time_scope`,`query_id`,`status`,`push_count`,`creater`,`create_time`,`modifier`,`modify_time`,`version`,`schedule_flag`,`notice_url`,`msg_channel`,`is_need_pull`)
     
    5,编写执行计划脚本每天3点执行: 替换 --where 'push_time <= 1536854400000' 中的push_time时间
    Shell 脚本示例:
    #/bin/bash
     
    #时间变量
    month=`date -d "10 day ago" "+%Y-%m-%d 00:00:00"`
    lock_time=`date -d "60 day ago" "+%Y-%m-%d"`
    timeStamp=`date -d "$month" +%s` 
    currentTimeStamp=$((timeStamp*1000))
     
    #数据库变量
    source_data=platform-unitive
    source_table=u_push_message
    out_data=platform-unitive
    out_table=u_push_message_2018
    out_dir=/tmp/"$out_data"
    out_time=`date "+%Y_%m_%d"`
    out_file="$out_dir"/"$out_table"_archiver_log_"$out_time"
     
    #判断文件夹是否存在,不存在就创建
    if [ ! -d "$out_dir" ]; then
    /bin/mkdir "$out_dir" -p
    fi
     
    #数据归档,判断进程是否存在,不存在就开始,存在就不开始.
    count=`ps -ef|grep "/usr/bin/pt-archiver"|grep "t=$out_table,"|grep -v grep|wc -l`
    echo $count
    if [ "$count" -eq 0 ]
    then
    echo "start process....."
    /usr/bin/pt-archiver --source h=10.10.11.16,P=3309,u=root,p='kws@1234',D=$source_data,t=$source_table --dest h=10.10.11.16,P=3309,u=root,p='kws@1234',t=$out_table,D=$out_data --charset=UTF8 --where "push_time <= '$currentTimeStamp'"  --progress 10000 --limit=10000 --txn-size 10000 --bulk-insert --bulk-delete --purge --statistics  >>"$out_file" 2>&1  &
    else
    echo "runing....."
    fi
  • 相关阅读:
    SNMP++
    临界区,互斥量,信号量,事件的区别
    2015 年最棒的 5 个 HTML5 框架(转)
    java.lang.OutOfMemoryError: PermGen space及其解决方法
    java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind
    eclipse安装tomcat插件
    (转)Activity的跳转与传值
    Android SDK下载和更新失败的解决方法
    Android客户端WebView控件与Javascript交互
    SCI期刊
  • 原文地址:https://www.cnblogs.com/cbliu/p/13995396.html
Copyright © 2011-2022 走看看