精华内容
下载资源
问答
  • pt-query-digest用法

    2017-08-11 08:56:28
    pt-query-digest是用于分析MySQL慢查询一个工具,它也可以分析binlog、General log、slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdump抓取mysql协议数据来进行分析。可以把分析结果输出到文件中,分析过程是...

    pt-query-digest是用于分析MySQL慢查询的一个工具,它也可以分析binlog、General log、slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdump抓取的mysql协议数据来进行分析。可以把分析结果输出到文件中,分析过程是先对查询语句的条件进行参数化,然后对参数化以后的查询进行分组统计,统计出各查询的执行时间、次数、占比等,可以借助分析结果找出问题进行优化。

    使用说明

    shell> pt-query-digest [OPTIONS] [DSN]
    详情可参考
    shell>pt-query-digest --help
    
    常用参数:
    --create-review-table :当使用--review参数把分析结果输出到表中时,如果没有表就自动创建。
    --create-history-table:当使用--history参数把分析结果输出到表中时,如果没有表就自动创建。
    --filter :  对输入的慢查询按指定的字符串进行匹配过滤后再进行分析
    --limit:限制输出结果百分比或数量,默认值是20,即将最慢的20条语句输出,如果是95%则按总响应时间占比从大到小排序,输出到总和达到95%位置截止。
    --log=s :指定输出的日志文件
    --history 将分析结果保存到表中,分析结果比较详细,下次再使用--history时,如果存在相同的语句,且查询所在的时间区间和历史表
               中的不同,则会记录到数据表中,可以通过查询同一CHECKSUM来比较某类型查询的历史变化。
    --review:将分析结果保存到表中,这个分析只是对查询条件进行参数化,一个类型的查询一条记录,比较简单。
               当下次使用--review时,如果存在相同的语句分析,就不会记录到数据表中。
    --output 分析结果输出类型,值可以是report(标准分析报告)、slowlog(Mysql slow log)、json、json-anon,一般使用report,以便于阅读。
    --since:从该指定日期开始分析。
    --until:截止时间,配合—since可以分析一段时间内的慢查询。

    使用示例

    a) pt-query-digest分析慢查询日志
    shell> pt-query-digest --report slow.log
    
    b) 报告最近半个小时的慢查询:
    shell> pt-query-digest --report --since 1800s slow.log
    
    c) 报告一个时间段的慢查询:
    shell> pt-query-digest --report --since '2013-02-10 21:48:59' --until '2013-02-16 02:33:50' slow.log
    
    d) 报告只含select语句的慢查询:
    shell> pt-query-digest --filter '$event->{fingerprint} =~ m/^select/i' slow.log
    
    e) 报告针对某个用户的慢查询:
    shell> pt-query-digest --filter '($event->{user} || "") =~ m/^root/i' slow.log
    
    f) 报告所有的全表扫描或full join的慢查询:
    shell> pt-query-digest --filter '(($event->{Full_scan} || "") eq "yes") || (($event->{Full_join} || "") eq "yes")' slow.log
    
    g) 把查询保存到query_review表
    shell> pt-query-digest --user=root –password=abc123 --review h=localhost,D=test,t=query_review 
                           --create-review-table  slow.log
    
    h) 把查询保存到query_history表
    shell> pt-query-digest --user=root –password=abc123 --history  h=localhost,D=test,t=query_history
                           --create-history-table  slow.log
    
    i) 通过tcpdump抓取mysql的tcp协议数据,然后再分析
    shell> tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp.txt
    shell> pt-query-digest --type tcpdump mysql.tcp.txt> slow_report.log
    
    j) 分析binlog
    shell> mysqlbinlog mysql-bin.000093 > mysql-bin000093.sql
    shell> pt-query-digest --type=binlog mysql-bin000093.sql > slow_report.log
    
    k) 分析general log
    shell> pt-query-digest --type=genlog localhost.log > slow_report.log
    
    如下为输入结果示例:
    shell> pt-query-digest --report --since '2014-03-16 00:00:00' --until '2014-03-18 15:00:00' localhost-slow.log 
    # 1.4s user time, 560ms system time, 14.55M rss, 20.66M vsz
    # Current date: Wed Mar 18 15:58:13 2015
    # Hostname: rac2
    # Files: localhost-slow.log
    # Overall: 146 total, 26 unique, 0.00 QPS, 0.01x concurrency _____________
    # Time range: 2014-03-16 00:15:21 to 2014-03-18 12:54:55
    # Attribute          total     min     max     avg     95%  stddev  median
    # ============     ======= ======= ======= ======= ======= ======= =======
    # Exec time          3052s      3s    329s     21s     73s     46s      6s
    # Lock time           75ms       0    52ms   513us   384us     4ms       0
    # Rows sent        153.24M       0   9.70M   1.05M   6.29M   1.98M  76.03k
    # Rows examine     294.40M       0  27.08M   2.02M   8.86M   3.50M 380.41k
    # Query size        30.12k      21   2.66k  211.25  793.42  304.51   56.92
    
    # Profile
    # Rank Query ID           Response time   Calls R/Call   V/M   Item
    # ==== ================== =============== ===== ======== ===== ===========
    #    1 0x924A00E4A9B5281D 1279.0169 41.9%    12 106.5847 13... SELECT ...
    #    2 0x67A347A2812914DF 1130.2242 37.0%    75  15.0697 29.24 SELECT ...
    #    3 0x0EF758B84C68B150  285.1478  9.3%     6  47.5246 10.37 SELECT ...
    #    4 0x9819CE7C2E230790   64.1319  2.1%    10   6.4132  1.36 SELECT ...
    #    5 0x68669DF0A107825A   43.8553  1.4%     6   7.3092  2.30 SELECT ...
    #    6 0x7E5DC47A12C9AA5B   39.9418  1.3%     8   4.9927  0.21 SELECT ...
    #    7 0xBF7F26947159B76E   27.5826  0.9%     2  13.7913  0.74 SELECT ...
    #    8 0x038D7A7043C978D4   27.5193  0.9%     3   9.1731  0.00 SELECT ...
    #    9 0x84C28126923E551C   22.6308  0.7%     1  22.6308  0.00 SELECT ...
    # MISC 0xMISC              131.8447  4.3%    23   5.7324   0.0 <17 ITEMS>
    
    # Query 9: 0 QPS, 0x concurrency, ID 0x84C28126923E551C at byte 158279 ___
    # Scores: V/M = 0.00
    # Time range: all events occurred at 2014-03-16 14:06:14
    # Attribute    pct   total     min     max     avg     95%  stddev  median
    # ============ === ======= ======= ======= ======= ======= ======= =======
    # Count          0       1
    # Exec time      0     23s     23s     23s     23s     23s       0     23s
    # Lock time      0   179us   179us   179us   179us   179us       0   179us
    # Rows sent      0     286     286     286     286     286       0     286
    # Rows examine   0   2.63k   2.63k   2.63k   2.63k   2.63k       0   2.63k
    # Query size     0     128     128     128     128     128       0     128
    # String:
    # Databases    yilucaifu
    # Hosts
    # Users        root
    # Query_time distribution
    #   1us
    #  10us
    # 100us
    #   1ms
    #  10ms
    # 100ms
    #    1s
    #  10s+  ################################################################
    # Tables
    #    SHOW TABLE STATUS FROM `yilucaifu` LIKE 'pingan_tranaccount'\G
    #    SHOW CREATE TABLE `yilucaifu`.`pingan_tranaccount`\G
    #    SHOW TABLE STATUS FROM `yilucaifu` LIKE 'activity_38_code'\G
    #    SHOW CREATE TABLE `yilucaifu`.`activity_38_code`\G
    # EXPLAIN /*!50100 PARTITIONS*/
    select user_id     from yilucaifu.pingan_tranaccount  where user_id not in(
    select user_id from  activity_38_code where status =1 )\G

    将分析结果可视化

    使用pt-query-digest分析慢查询日志并将查询分析数据保存到MySQL数据库表中.然后使用应用程序来展示分析结果.
    目前有基于LAMP的Query-Digest-UI、Anemometer开源项目支持。

    将慢日志插入表中:
    shell> pt-query-digest --user=root --password=abc224 --review h='10.10.10.134',D=test,t=global_query_review --history h='10.10.10.134',D=test,t=global_query_review_history --no-report --create-review-table --create-history-table --limit=20% slowquery.log
    
    或者
    shell> pt-query-digest --user=root --password=abc224 --review h='10.10.10.134',D=test,t=global_query_review --no-report --create-review-table slowquery.log
    
    
    shell> pt-query-digest --user=root --password=abc224 --history h='10.10.10.134',D=test,t=global_query_review_history --no-report --create-history-table slowquery.log
    
    
    mysql> select * from global_query_review limit 2 \G
    *************************** 1. row ***************************
       checksum: 300935684267402542
    fingerprint: call test.confixinverstweek
         sample: CALL test.confixinverstweek('2014-07-01','2014-07-10',0.0060)
     first_seen: 2014-07-09 14:35:29
      last_seen: 2014-07-14 08:04:11
    reviewed_by: NULL
    reviewed_on: NULL
       comments: NULL
    
    mysql> select * from global_query_review_history limit 1 \G
    *************************** 1. row ***************************
                        checksum: 300935684267402542
                          sample: CALL test.confixinverstweek('2014-07-01','2014-07-10',0.0060)
                          ts_min: 2014-07-09 14:35:29
                          ts_max: 2014-07-14 08:04:11
                          ts_cnt: 4
                  Query_time_sum: 419674
                  Query_time_min: 13882.8
                  Query_time_max: 227433
               Query_time_pct_95: 216908
               Query_time_stddev: 90097.8
               Query_time_median: 189384
                   Lock_time_sum: 0
                   Lock_time_min: 0
                   Lock_time_max: 0
                Lock_time_pct_95: 0
                Lock_time_stddev: 0
                Lock_time_median: 0
                   Rows_sent_sum: 0
                   Rows_sent_min: 0
                   Rows_sent_max: 0
                Rows_sent_pct_95: 0
                Rows_sent_stddev: 0
                Rows_sent_median: 0
               Rows_examined_sum: 0
               Rows_examined_min: 0
               Rows_examined_max: 0
            Rows_examined_pct_95: 0
            Rows_examined_stddev: 0
            Rows_examined_median: 0
               Rows_affected_sum: NULL
               Rows_affected_min: NULL
               Rows_affected_max: NULL
            Rows_affected_pct_95: NULL
            Rows_affected_stddev: NULL
            Rows_affected_median: NULL
                   Rows_read_sum: NULL
                   Rows_read_min: NULL
                   Rows_read_max: NULL
                Rows_read_pct_95: NULL
                Rows_read_stddev: NULL
                Rows_read_median: NULL
                Merge_passes_sum: NULL
                Merge_passes_min: NULL
                Merge_passes_max: NULL
             Merge_passes_pct_95: NULL
             Merge_passes_stddev: NULL
             Merge_passes_median: NULL
             InnoDB_IO_r_ops_min: NULL
             InnoDB_IO_r_ops_max: NULL
          InnoDB_IO_r_ops_pct_95: NULL
          InnoDB_IO_r_ops_stddev: NULL
          InnoDB_IO_r_ops_median: NULL
           InnoDB_IO_r_bytes_min: NULL
           InnoDB_IO_r_bytes_max: NULL
        InnoDB_IO_r_bytes_pct_95: NULL
        InnoDB_IO_r_bytes_stddev: NULL
        InnoDB_IO_r_bytes_median: NULL
            InnoDB_IO_r_wait_min: NULL
            InnoDB_IO_r_wait_max: NULL
         InnoDB_IO_r_wait_pct_95: NULL
         InnoDB_IO_r_wait_stddev: NULL
         InnoDB_IO_r_wait_median: NULL
        InnoDB_rec_lock_wait_min: NULL
        InnoDB_rec_lock_wait_max: NULL
     InnoDB_rec_lock_wait_pct_95: NULL
     InnoDB_rec_lock_wait_stddev: NULL
     InnoDB_rec_lock_wait_median: NULL
           InnoDB_queue_wait_min: NULL
           InnoDB_queue_wait_max: NULL
        InnoDB_queue_wait_pct_95: NULL
        InnoDB_queue_wait_stddev: NULL
        InnoDB_queue_wait_median: NULL
       InnoDB_pages_distinct_min: NULL
       InnoDB_pages_distinct_max: NULL
    InnoDB_pages_distinct_pct_95: NULL
    InnoDB_pages_distinct_stddev: NULL
    InnoDB_pages_distinct_median: NULL
                      QC_Hit_cnt: NULL
                      QC_Hit_sum: NULL
                   Full_scan_cnt: NULL
                   Full_scan_sum: NULL
                   Full_join_cnt: NULL
                   Full_join_sum: NULL
                   Tmp_table_cnt: NULL
                   Tmp_table_sum: NULL
           Tmp_table_on_disk_cnt: NULL
           Tmp_table_on_disk_sum: NULL
                    Filesort_cnt: NULL
                    Filesort_sum: NULL
            Filesort_on_disk_cnt: NULL
            Filesort_on_disk_sum: NULL
    1 row in set (0.00 sec)

    也可以自己做一个简单的web程序,即可获取慢查询日志的结果。

    展开全文
  • $watch $digest $apply 一 简介 AngularJS提供了一个非常酷特性叫做双向数据绑定(Two-way Data Binding),这个特性大大简化了我们代码编写方式。数据绑定意味着当View中有任何数据发生了变化,那么这个变化也会...

    $watch $digest $apply

    一 简介

    AngularJS提供了一个非常酷的特性叫做双向数据绑定(Two-way Data Binding),这个特性大大简化了我们的代码编写方式。数据绑定意味着当View中有任何数据发生了变化,那么这个变化也会自动地反馈到scope的数据上,也即意味着scope模型会自动地更新。类似地,当scope模型发生变化时,view中的数据也会更新到最新的值。那么AngularJS是如何做到这一点的呢?当你写下表达式如{{ aModel }}时,AngularJS在幕后会为你在scope模型上设置一个watcher,它用来在数据发生变化的时候更新view。

    二 $watch

    1.什么是$watch
    $scope对象上的$watch方法会给Angular事件循环内的每个$digest调用装配一个脏值检查,如果在表达式上检测到变化,Angular总是会返回$digest循环。
    也就是说,$watch代表的就是对数据源的监听,当数据源发生变化,就会触发第二个参数的回调函数。
    2.使用
    $watch函数本身接受两个必要参数和一个可选的参数:

    $scope.$watch(‘aModel’, function(newValue, oldValue) { 
      //update the DOM with newValue 
    },true); 
    

    第一个参数:可以是一个作用域对象的属性,或者是一个函数,在$digest循环中的每个$digest调用都会涉及到它。如果是一个字符串,Angular会在$scope上下文中对它求值。
    第二个参数:作为回调的监听器函数,它智慧在第一个参数的当前值与先前值不相等时调用。
    第三个参数:true/false,默认为false,主要用于第一个参数为引用型的情况下。
    3.举例:

    <body>
            <input ng-model=‘name‘ type=‘text‘/>
            <div>change count: {{count}}</div>
            <script>
                angular.module(‘myApp‘,[])
                             .run([‘$rootScope‘,function($rootScope){
                                    $rootScope.count = 0;
                                    $rootScope.name = ‘hcc‘;
                                    $rootScope.$watch(‘name‘,function(){
                                        $rootScope.count++;
                                    })
                             }]);
            </script>
    </body>
    

    用$watch来对$rootScope中的name进行监视,并在它发生变化的时候将$rootScope中的count属性增加1。因此,每当我们对name进行一次修改时,下面显示的count数字就会增加1。
    然而,我们在实际运用中常常不只是对一个原始类型的属性进行监视,还可能对集合进行监视。对于原始类型,如果我们使用了一个赋值操作,则这个原始类型变量会“真正的”被进行一次复制,然而对于引用类型,在进行赋值时,仅仅是将赋值的变量指向了这个引用类型。因此如果要对一个引用类型,尤其是在实际运用中常见的对象数组进行监视时,情况就不一样了。

    <body>
            <div hg-repeat=‘item in items‘>
                <input ng-model=‘item.a‘/><span>{{item.a}}</span>
            </div>
            <div>change count: {{count}}</div>
            <script>
                angular.module(‘myApp‘,[])
                             .run([‘$rootScope‘,function($rootScope){
                                    $rootScope.count = 0;
                                    $rootScope.items = [
                                        { "a": 1 },
                                        { "a": 2 },
                                        { "a": 3 },
                                        { "a": 4 }
                                    ]
                                    $rootScope.$watch(‘items‘,function(){
                                        $rootScope.count++;
                                    },true)
                             }]);
            </script>
    </body>
    

    在angular 1.1.4版本之后,添加了一个$watchCollection()方法来针对数组(也就是集合)进行监视,它的性能介于全等监视和引用监视二者之间,即它并不会对数组中每一项的属性进行监视,但是可以对数组的项目的增减做出反应。
    在这里只需将$rootScope.$watch改成$rootScope.$watchCollection即可:

    $rootScope.$watchCollection(‘items‘,function() {
                                    $rootScope.count++;
     })
    

    对集合的操作,推荐使用这种方式。

    三 $digest和$apply

    在调用了$scope.$digest()后,$digest循环就开始了。假设你在一个ng-click指令对应的handler函数中更改了scope中的一条数据,此时AngularJS会自动地通过调用$digest()来触发一轮$digest循环。当$digest循环开始后,它会触发每个watcher。这些watchers会检查scope中的当前model值是否和上一次计算得到的model值不同。如果不同,那么对应的回调函数会被执行。调用该函数的结果,就是view中的表达式内容会被更新。

    AngularJS并不直接调用$digest(),而是调用$scope.$apply(),后者会调用$rootScope.$digest()。因此,一轮$digest循环在$rootScope开始,随后会访问到所有的children scope中的watchers。

    正常情况下,在angular上下文中,修改数据源就会自动触发。$apply只是把$digest做了一次封装,来提供手动触发,那么为什么需要手动触发呢。因为如果是不在angular上下文的情况下,如浏览器DOM事件,setTimeout执行,这种情况下,angular无法获取到事件,所以,通过apply来手动触发一下,在apply的参数中去修改数据源。

    举例:

    <body ng-app=“myApp”> 
      <div ng-controller=“MessageController”> 
        Delayed Message: {{message}} 
      </div>   
    </body> 
    angular.module(‘myApp’,[]).controller(‘MessageController’, function($scope) {     
          $scope.getMessage = function() { 
            setTimeout(function() { 
              $scope.message = ‘Fetched after 3 seconds'; 
              console.log(‘message:’+$scope.message); 
            }, 2000); 
          } 
    
          $scope.getMessage(); 
    
        }); 
    

    通过运行这个例子,你会看到过了两秒钟之后,控制台确实会显示出已经更新的model,然而,view并没有更新。原因也许你已经知道了,就是我们忘了调用$apply()方法。因此,我们需要修改getMessage()。

    angular.module(‘myApp’,[]).controller(‘MessageController’, function($scope) {     
          $scope.getMessage = function() { 
            setTimeout(function() { 
              $scope.$apply(function() { 
                //wrapped this within $apply 
                $scope.message = ‘Fetched after 3 seconds';   
                console.log(‘message:+ $scope.message); 
              }); 
            }, 2000); 
          } 
    
          $scope.getMessage(); 
    
        }); 
    
    展开全文
  • 文章目录一、pt-query-digest工具简单使用 一、pt-query-digest工具简单使用 简介 pt-query-digest是用于分析mysql慢查询一个第三方工具,它可以分析binlog、General log、slowlog,也可以通过...

    一、pt-query-digest工具的简单使用
    • 简介

      • pt-query-digest是用于分析mysql慢查询的一个第三方工具,它可以分析binlog、General log、slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdump抓取的Mysql协议数据来进行分析。
      • 可以把分析结果输出到文件中,分析过程是先对查询语句的条件进行参数化,然后对参数化以后的查询进行分组统计,统计出各查询的执行时间、次数、占比等,可以借助分析结果找出问题进行优化。
    • 安装

      • pt-query-digest本质是pert脚本,所以首先安装perl模块

        yum install -y perl-CPAN perl-Time-HiRes
        
      • 快速安装

        • 官网地址:https://www.percona.com/downloads/

        • 下载资源

          wget https://www.percona.com/downloads/percona-toolkit/3.2.0/binary/redhat/7/x86_64/percona-toolkit-3.2.0-1.el7.x86_64.rpm
          
        • 本地安装

          yum localinstall -y percona-toolkit-3.2.0-1.el7.x86_64.rpm
          
        • 检查是否安装完成

          pt-query-digest --help
          

          [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SKG75h5D-1597230962104)(../mysql-imgs/image-20200811184122343.png)]

      • 相关命令简单用法【这边的每一个命令都需要自己使用时去详细查看】

        • 查看服务器信息

          pt-summary
          

          [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lnOOBgPY-1597230962106)(../mysql-imgs/image-20200811191535597.png)]

        • 查看磁盘开销使用信息

          pt-diskstats
          

          [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mTxjj36x-1597230962108)(../mysql-imgs/image-20200811191831615.png)]

        • 查看mysql数据库信息

          pt-mysql-summary --user=root --password=123456
          

          [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MLa964Fv-1597230962112)(../mysql-imgs/image-20200811192124537.png)]

          • 可以看到mysql相关的具体信息:有系统时间,数据库实例,msyql服务路径,主从信息等信息。
        • 分析慢查询日志

          // pt-query-digest xxx慢日志文件路径 
          // --limit=100% 查看所有记录
          // 总分模式,先描述总体信息,然后分条分析
          pt-query-digest /var/lib/mysql/xxx-slow.log
          
        • 查找mysql的从库和同步状态

          pt-slave-find --host=localhost --user=root --password=123456
          
        • 查看mysql的死锁信息

          // 将死锁信息放入库为test,表为deadlocks,用户root,密码123456
          pt-deadlock-logger --run-time=10 --interval=3 --create-dest-table --dest D=test,t=deadlocks u=root,p=123456
          
        • 从慢查询日志中分析索引使用情况

          pt-index-usage --user=root --password=123456 --host=localhost /var/lib/mysql/myshop02-slow.log
          
        • 查找慢查找数据库表中重复的索引

          pt-duplicate-key-checker --host=localhost --user=root --password=123456
          
        • 查看mysql表和文件的当前活动IO开销(不要在高峰使用)

          pt-ioprofile
          
        • 查看不同mysql配置文件差异(集群常用,双方都生效的变量)

          pt-config-diff /etc/my.cnf	/root/my_master.cnf
          
          • 用在集群中,主从复制或者出现问题排查,主机和从机差异的时候经常用到。
        • pt-find查找mysql表和执行命令

          // 查找数据库里大于1M的表
          pt-find --user=root	--password=123456 --tablesize +1M
          // 查找表和索引大小排序
          pt-find --user=root	--password=123456 --printf "%T\t%D.%N\n" | sort -rn
          

          [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oaze1ROf-1597230962114)(../mysql-imgs/image-20200812100600558.png)]

        • pt-kill杀掉符合标准的mysql进程

          // 显示查询时间大于3秒的查询
          pt-kill --user=root --password=123456 --busy-time 3 --print
          // 杀掉大于3秒的查询
          pt-kill --user=root --password=123456 --busy-time 3 --kill
          
        • 查看mysql授权(集群常用,授权复制)

          pt-show-grants --user=root --password=123456
          pt-show-grants --user=root --password=123456 --separate --revoke
          
        • 验证数据库复制的完整性(集群常用,主从复制后检验)

          pt-table-checksum --user=root --password=123456
          
    • 使用过程遇到的问题

      • 问题一:

        • DBI connect(’;;mysql_read_default_group=client’,‘test’,…) failed: Access denied for user ‘test’@‘localhost’ (using password: YES) at /usr/bin/pt-find line 323.

        • 解决方案:

          • 连接数据之后,更改

            // 重点:WITH mysql_native_password
            // username 就是数据库的用户名
            // ip_address 对应自己设置 可以是localhost 可以是ip 可以是%
            // password 密码
            ALTER USER 'username'@'ip_address' IDENTIFIED WITH mysql_native_password BY 'password';
            
          • 重新登录mysql,再次尝试相关命令

    二、使用pt-query-digest可以分析的三大类有问题的SQL
    • 查询次数多且每次查询占用时间长的sql
      • 通常为pt-query-digest分析的前几个查询,该工具可以很清楚的看出每个SQL执行的次数及百分比等信息,执行的次数多,占比比较大的SQL
    • IO大的sql
      • 注意pt-query-digest分析中的Rows examine项,扫描的行数越大,IO越大
    • 未命中的索引的SQL
      • pt-query-digest分析中的Rows examine 和 Rows Send的对比。说明该SQL的索引命中率不高,对于这种SQL,我们要重点进行关注。
    展开全文
  • [percona-toolkit]pt-query-digest用法

    千次阅读 2017-02-27 18:20:25
    pt-query-digest是用于分析MySQL慢查询一个工具,它也可以分析binlog、General log、slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdump抓取MySQL协议数据来进行分析。可以把分析结果输出到文件中,分析过程是...
    pt-query-digest是用于分析MySQL慢查询的一个工具,它也可以分析binlog、General log、slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdump抓取的MySQL协议数据来进行分析。可以把分析结果输出到文件中,分析过程是先对查询语句的条件进行参数化,然后对参数化以后的查询进行分组统计,统计出各查询的执行时间、次数、占比等,可以借助分析结果找出问题进行优化。

    使用说明

    shell> pt-query-digest [OPTIONS] [DSN]
    详情可参考
    shell>pt-query-digest --help
    
    常用参数:
    --create-review-table :当使用--review参数把分析结果输出到表中时,如果没有表就自动创建。
    --create-history-table:当使用--history参数把分析结果输出到表中时,如果没有表就自动创建。
    --filter :  对输入的慢查询按指定的字符串进行匹配过滤后再进行分析
    --limit:限制输出结果百分比或数量,默认值是20,即将最慢的20条语句输出,如果是95%则按总响应时间占比从大到小排序,输出到总和达到95%位置截止。
    --log=s :指定输出的日志文件
    --history 将分析结果保存到表中,分析结果比较详细,下次再使用--history时,如果存在相同的语句,且查询所在的时间区间和历史表
               中的不同,则会记录到数据表中,可以通过查询同一CHECKSUM来比较某类型查询的历史变化。
    --review:将分析结果保存到表中,这个分析只是对查询条件进行参数化,一个类型的查询一条记录,比较简单。
               当下次使用--review时,如果存在相同的语句分析,就不会记录到数据表中。
    --output 分析结果输出类型,值可以是report(标准分析报告)、slowlog(Mysql slow log)、json、json-anon,一般使用report,以便于阅读。
    --since:从该指定日期开始分析。
    --until:截止时间,配合—since可以分析一段时间内的慢查询。

    使用示例

    a) pt-query-digest分析慢查询日志
    shell> pt-query-digest --report slow.log
    
    b) 报告最近半个小时的慢查询:
    shell> pt-query-digest --report --since 1800s slow.log
    
    c) 报告一个时间段的慢查询:
    shell> pt-query-digest --report --since '2013-02-10 21:48:59' --until '2013-02-16 02:33:50' slow.log
    
    d) 报告只含select语句的慢查询:
    shell> pt-query-digest --filter '$event->{fingerprint} =~ m/^select/i' slow.log
    
    e) 报告针对某个用户的慢查询:
    shell> pt-query-digest --filter '($event->{user} || "") =~ m/^root/i' slow.log
    
    f) 报告所有的全表扫描或full join的慢查询:
    shell> pt-query-digest --filter '(($event->{Full_scan} || "") eq "yes") || (($event->{Full_join} || "") eq "yes")' slow.log
    
    g) 把查询保存到query_review表
    shell> pt-query-digest --user=root –password=abc123 --review h=localhost,D=test,t=query_review 
                           --create-review-table  slow.log
    
    h) 把查询保存到query_history表
    shell> pt-query-digest --user=root –password=abc123 --history  h=localhost,D=test,t=query_history
                           --create-history-table  slow.log
    
    i) 通过tcpdump抓取mysql的tcp协议数据,然后再分析
    shell> tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp.txt
    shell> pt-query-digest --type tcpdump mysql.tcp.txt> slow_report.log
    
    j) 分析binlog
    shell> mysqlbinlog mysql-bin.000093 > mysql-bin000093.sql
    shell> pt-query-digest --type=binlog mysql-bin000093.sql > slow_report.log
    
    k) 分析general log
    shell> pt-query-digest --type=genlog localhost.log > slow_report.log
    
    如下为输入结果示例:

    pt-query-digest /var/lib/mysql/localhost-slow.log 

    # 70ms user time, 100ms system time, 25.46M rss, 222.04M vsz
    # Current date: Sun Sep 4 19:41:48 2016
    # Hostname: localhost.localdomain
    # Files: /var/lib/mysql/localhost-slow.log
    # Overall: 1 total, 1 unique, 0 QPS, 0x concurrency ______________________
    # Time range: all events occurred at 2016-09-05T02:19:47
    # Attribute total min max avg 95% stddev median
    # ============ ======= ======= ======= ======= ======= ======= =======
    # Exec time 12s 12s 12s 12s 12s 0 12s
    # Lock time 19ms 19ms 19ms 19ms 19ms 0 19ms
    # Rows sent 0 0 0 0 0 0 0
    # Rows examine 785.25k 785.25k 785.25k 785.25k 785.25k 0 785.25k
    # Query size 41 41 41 41 41 0 41

    # Profile
    # Rank Query ID Response time Calls R/Call V/M Item
    # ==== ================== ============== ===== ======= ===== =============
    # 1 0xE8455DF24FC49F59 11.5505 100.0% 1 11.5505 0.00 INSERT SELECT tb_slow

    # Query 1: 0 QPS, 0x concurrency, ID 0xE8455DF24FC49F59 at byte 0 ________
    # This item is included in the report because it matches --limit.
    # Scores: V/M = 0.00
    # Time range: all events occurred at 2016-09-05T02:19:47
    # Attribute pct total min max avg 95% stddev median
    # ============ === ======= ======= ======= ======= ======= ======= =======
    # Count 100 1
    # Exec time 100 12s 12s 12s 12s 12s 0 12s
    # Lock time 100 19ms 19ms 19ms 19ms 19ms 0 19ms
    # Rows sent 0 0 0 0 0 0 0 0
    # Rows examine 100 785.25k 785.25k 785.25k 785.25k 785.25k 0 785.25k
    # Query size 100 41 41 41 41 41 0 41
    # String:
    # Databases test
    # Hosts localhost
    # Users root
    # Query_time distribution
    # 1us
    # 10us
    # 100us
    # 1ms
    # 10ms
    # 100ms
    # 1s
    # 10s+ ################################################################
    # Tables
    # SHOW TABLE STATUS FROM `test` LIKE 'tb_slow'\G
    # SHOW CREATE TABLE `test`.`tb_slow`\G
    insert into tb_slow select * from tb_slow\G
    [root@localhost percona-toolkit]# pt-query-digest /var/lib/mysql/localhost-slow.log --user=root --password^C
    [root@localhost percona-toolkit]# clear
    [root@localhost percona-toolkit]# pt-query-digest /var/lib/mysql/localhost-slow.log --user=root --password=root --review h='localhost',D=test,t=global_query_review --no-report --create-review-table
    *******************************************************************
    Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client
    is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER
    together with SSL_ca_file|SSL_ca_path for verification.
    If you really don't want to verify the certificate and keep the
    connection open to Man-In-The-Middle attacks please set
    SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.
    *******************************************************************
    at /usr/bin/pt-query-digest line 11879.
    *******************************************************************
    Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client
    is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER
    together with SSL_ca_file|SSL_ca_path for verification.
    If you really don't want to verify the certificate and keep the
    connection open to Man-In-The-Middle attacks please set
    SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.
    *******************************************************************
    at /usr/bin/pt-query-digest line 11879.

    将分析结果可视化

    使用pt-query-digest分析慢查询日志并将查询分析数据保存到MySQL数据库表中.然后使用应用程序来展示分析结果.
    目前有基于LAMP的Query-Digest-UI、Anemometer开源项目支持。

    将慢日志插入表中:
    shell> pt-query-digest --user=root --password=abc224 --review h='10.10.10.134',D=test,t=global_query_review --history h='10.10.10.134',D=test,t=global_query_review_history --no-report --create-review-table --create-history-table --limit=20% slowquery.log
    
    或者
    shell> pt-query-digest --user=root --password=abc224 --review h='10.10.10.134',D=test,t=global_query_review --no-report --create-review-table slowquery.log
    
    
    shell> pt-query-digest --user=root --password=abc224 --history h='10.10.10.134',D=test,t=global_query_review_history --no-report --create-history-table slowquery.log
    
    
    mysql> select * from global_query_review limit 2 \G
    *************************** 1. row ***************************
       checksum: 300935684267402542
    fingerprint: call test.confixinverstweek
         sample: CALL test.confixinverstweek('2014-07-01','2014-07-10',0.0060)
     first_seen: 2014-07-09 14:35:29
      last_seen: 2014-07-14 08:04:11
    reviewed_by: NULL
    reviewed_on: NULL
       comments: NULL
    
    mysql> select * from global_query_review_history limit 1 \G
    *************************** 1. row ***************************
                        checksum: 300935684267402542
                          sample: CALL test.confixinverstweek('2014-07-01','2014-07-10',0.0060)
                          ts_min: 2014-07-09 14:35:29
                          ts_max: 2014-07-14 08:04:11
                          ts_cnt: 4
                  Query_time_sum: 419674
                  Query_time_min: 13882.8
                  Query_time_max: 227433
               Query_time_pct_95: 216908
               Query_time_stddev: 90097.8
               Query_time_median: 189384
                   Lock_time_sum: 0
                   Lock_time_min: 0
                   Lock_time_max: 0
                Lock_time_pct_95: 0
                Lock_time_stddev: 0
                Lock_time_median: 0
                   Rows_sent_sum: 0
                   Rows_sent_min: 0
                   Rows_sent_max: 0
                Rows_sent_pct_95: 0
                Rows_sent_stddev: 0
                Rows_sent_median: 0
               Rows_examined_sum: 0
               Rows_examined_min: 0
               Rows_examined_max: 0
            Rows_examined_pct_95: 0
            Rows_examined_stddev: 0
            Rows_examined_median: 0
               Rows_affected_sum: NULL
               Rows_affected_min: NULL
               Rows_affected_max: NULL
            Rows_affected_pct_95: NULL
            Rows_affected_stddev: NULL
            Rows_affected_median: NULL
                   Rows_read_sum: NULL
                   Rows_read_min: NULL
                   Rows_read_max: NULL
                Rows_read_pct_95: NULL
                Rows_read_stddev: NULL
                Rows_read_median: NULL
                Merge_passes_sum: NULL
                Merge_passes_min: NULL
                Merge_passes_max: NULL
             Merge_passes_pct_95: NULL
             Merge_passes_stddev: NULL
             Merge_passes_median: NULL
             InnoDB_IO_r_ops_min: NULL
             InnoDB_IO_r_ops_max: NULL
          InnoDB_IO_r_ops_pct_95: NULL
          InnoDB_IO_r_ops_stddev: NULL
          InnoDB_IO_r_ops_median: NULL
           InnoDB_IO_r_bytes_min: NULL
           InnoDB_IO_r_bytes_max: NULL
        InnoDB_IO_r_bytes_pct_95: NULL
        InnoDB_IO_r_bytes_stddev: NULL
        InnoDB_IO_r_bytes_median: NULL
            InnoDB_IO_r_wait_min: NULL
            InnoDB_IO_r_wait_max: NULL
         InnoDB_IO_r_wait_pct_95: NULL
         InnoDB_IO_r_wait_stddev: NULL
         InnoDB_IO_r_wait_median: NULL
        InnoDB_rec_lock_wait_min: NULL
        InnoDB_rec_lock_wait_max: NULL
     InnoDB_rec_lock_wait_pct_95: NULL
     InnoDB_rec_lock_wait_stddev: NULL
     InnoDB_rec_lock_wait_median: NULL
           InnoDB_queue_wait_min: NULL
           InnoDB_queue_wait_max: NULL
        InnoDB_queue_wait_pct_95: NULL
        InnoDB_queue_wait_stddev: NULL
        InnoDB_queue_wait_median: NULL
       InnoDB_pages_distinct_min: NULL
       InnoDB_pages_distinct_max: NULL
    InnoDB_pages_distinct_pct_95: NULL
    InnoDB_pages_distinct_stddev: NULL
    InnoDB_pages_distinct_median: NULL
                      QC_Hit_cnt: NULL
                      QC_Hit_sum: NULL
                   Full_scan_cnt: NULL
                   Full_scan_sum: NULL
                   Full_join_cnt: NULL
                   Full_join_sum: NULL
                   Tmp_table_cnt: NULL
                   Tmp_table_sum: NULL
           Tmp_table_on_disk_cnt: NULL
           Tmp_table_on_disk_sum: NULL
                    Filesort_cnt: NULL
                    Filesort_sum: NULL
            Filesort_on_disk_cnt: NULL
            Filesort_on_disk_sum: NULL
    1 row in set (0.00 sec)
    展开全文
  • $apply(),$digest()用法

    千次阅读 2015-04-23 16:47:38
    ...有个疑问就是在手动使用$apply()时候,会出现'$apply already in progress' 错误,经过查资料,看到一个好解决方法 $scope.safeApply = function(fn) { var phase = this.$root.$$p
  • $scope.$apply(); $scope.$digest();  让 从服务器 数据库 获取数据 重新绑定前台 scope内数据刷新 重新渲染到前台页面
  • 传统浏览器事件循环 :浏览器本身一直在等待事件,并作出响应。如果你点击一个button或者在input 中输入字符,我们在 JS 中 监听这些事件并设定了回调函数,那么这些事件被触发以后,回调函数就会在浏览器解释器...
  • MessageDigest 类为应用程序提供信息摘要算法功能,如 MD5 或 SHA 算法。信息摘要是安全单向哈希函数,它接收任意大小数据,并输出固定长度...一旦所有需要更新数据都已经被更新了,应该调用digest() 方法之一
  • 用法 分析慢查询日志 cat mysql-slow.log | docker run -i --rm matsuu/pt-query-digest > analyzed-slow.log 分析tcpdump cat dump.log | docker run -i --rm matsuu/pt-query-digest --type tcpdump > analyzed...
  • HTTP Digest Auth库创建与HTTP Digest身份验证一起使用auth标头 安装 您可以通过以下方式从十六进制安装此软件包: def deps do [{ :http_digex , " ~> 0.0.1 " }] end 或者,您可以选择从github安装,如下所...
  • 用法 final DigestAuthenticator authenticator = new DigestAuthenticator ( new Credentials ( " username " , " pass " )); final Map< String> authCache = new ConcurrentHashMap<> (); f
  • linux md5sum 的用法

    2019-09-19 21:01:53
    MD5全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)“指纹”(或称“报文摘要”),不同文件产生相 同报文...
  • 1.鲍勃有两把钥匙,一把是公钥,另一把是私钥。...这里要强调是,只要鲍勃私钥不泄露,这封信就是安全,即使落在别人手里,也无法解密。5.鲍勃给苏珊回信,决定采用"数字签名"。他写完后先用H...
  • MD5概念和用途用法

    千次阅读 2018-05-09 10:17:45
    MD5概念:MD5是message-digest algorithm 5(信息-摘要算法)缩写,被用户加密解密技术上,任何一个文件都会被转化成一个128bits唯一码值(通常是16进制32位);如果文件或内容被修改,那么他MD5编码也就改变...
  • perl一些基本用法

    2015-08-24 02:01:00
    ReadLine support available (try 'install Bundle::CPAN')cpan&gt;进入cpanshell,好了,我为了安装spamassassin,需要安装以下几个install Digest::SHA1 install H...
  • linux之 md5sum 的用法

    2018-12-31 16:28:04
    MD5全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)“指纹”(或称“报文摘要”),不同文件产生相 同报文摘要...
  • Linuxmd5sum用法

    2017-11-01 19:49:55
    在linux或Unix上,md5sum是用来计算和校验文件报文摘要工具程序。...MD5全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是3
  • 用法:摘要[-c] 例如,如果要使用skein512 / 256算法计算校验和,请使用以下命令:digest skein512 / 256 *> checksums.skein要验证校验和:digest -c skein512 / 256 checksums.skein您可以获取以下内容完整列表...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 141
精华内容 56
关键字:

digest的用法