Maatkit 分析工具

From: http://www.livingelsewhere.net/life/note/view/1
Maatkit 分析工具

Maatkit 是 Baron Schwartz 的另一项创造,是一系列命令行工具的集合。所有工具都是用 Perl 编写的,用来补充 MySQL 未能提供的的那些重要功能。可以在 http://www.maatkit.org/ 上找到它们,包括了分析工具和其它一些小功能。

这些分析工具的其中一个是 mk-query-profiler,当它检测服务器状态变量时能够执行查询,并会打印出一个具体且易读的关于查询前后的系统状态变量差异情况的报告。这份报告能使查询有更深的理解,而不仅限于在它执行的时候。

可以将查询通过管道传入 mk-query-profiler 的标准输入口,指定一个或多个查询文件,或者仅仅是要求它检测服务器而不运行任何查询(当运行一个外部应用时,这种方式会用得上)。也能让它运行 shell 命令而不是查询。

mk-query-profiler 的报告分成好几个段落。默认的情况下,这个报告打印出的是一批摘要信息,但是,也可以得到一份包含了每一个查询或者所选择的查询的报告,然后加载到 mk-profile-compact 的辅助工具里方便地进行比较。

以下是这份报告的主要段落:

  • 『Overall stats』段罗列了一些基本信息,例如执行时间、命令的数据和网络流量。
  • 『Table and index accesses』段显示了这个批处理的有多少个不同类型的执行计划。如果看到有很多表扫描,在可能意味着没有合适的索引可用于查询。
  • 『Row operations』段显示了底层处理的数据和/或者个批处理产生的 InnoDB 操作的数目。糟糕的查询计划会引发更多的底层操作。
  • 『I/O operations』段显示了这个批处理引发了多少内存和磁盘数据流。有一个可比较的段是显示跟 InnoDB 相关的数据操作。

总而言之,这份报告可以细致地描述出服务器正在处理多少种类型的任务,这比仅仅是衡量查询所需要的时间要有价值得多。例如。可以帮助筛选这样两个查 询:它们在第负载时,在一个小数据集上都用几乎相等的时间完成了查询;但是,当使用到的数据量变到很大的时候,或者说在高负载的时候,它们的表现就有了巨 大的差异。它也可以被用来验证优化是否起到了作用,在这种应用环境下,它就像是一个微型的基准测试工具。

在这个工具里还有另外几种分析工具:
mk-visual-explain

重构从 EXPLAIN 里取得的查询执行计划,然后以更易读懂的树状图来显示。当查询计划很复杂的时候,这个尤为有用。查看 EXPLAIN 的输入,所看到的是数百行语句,这样的长度几乎没人能理解它们。mk-visual-explain 作为一个教学工具也很有用,或者试着去学习怎么看懂 EXPLAIN 输出的时候,它也能帮得上忙。

mk-duplicate-key-checker

它能识别出重复的或荣誉的索引或外键,在会影响到性能。

mk-deadlock-logger

检测 InnoDB 里的死锁并将它们记录在一个文件里或表里。

mk-heartbeat

精确测量复制的延迟时间,无须检查 SHOW SLAVE STATUS(它也不总是正确)。默认情况下,它保留了过去 1 分钟、5 分钟和 15 分钟里的移动平均值。这时针对第一版里那个心跳(Heartbeat)脚本提到过的更完整更具可配置性的实现。
Maatkit 辅助脚本

mk-archiver

运行清除和归档任务,帮助清理表里不需要的数据。这个工具是被设计用来移动数据的,而无需用 OLTP 查询。但是,有可以用来建立数据仓库,或者查找和移除陈旧的数据。它能把数据写到一个文件里,并且/或者写到任何 MySQL 示例上的另一个表里。它还有一个插件机制,使定制任务更加容易实现,举例来说,可以使用一个插件,让它在系统往日志表里插入数据时,自动在数据仓库里生成 一个摘要表。

mk-find

跟 Unix 的 find 命令类似,但是,它是用于 MySQL 的数据库和表。

mk-parallel-dump

执行多线程逻辑备份。为了能够在多 CPU 或多磁盘的系统里更快速地备份,它能把每个表分割成所需要大小的几个分块。实际上,可以用它来把任何工具都封装成多线程的形式,因此,它在多线程 CHECK TABLE 或 OPTIMIZE TABLE 操作方面也很有用处(以此为例)。许多类型的任务都能在多 CPU 或多磁盘获取并行处理的好处。

mk-parallel-restore

它是 mk-parallel-dump 的逆程序。它并行地把文件夹在到 MySQL里。这个工具能够通过 LOAD DATA INFILE 直接加载分界符文件,或者用 mysql 客户端直接执行 SQL 文件。它对许多加载操作做了一个灵活的封装,例如可以通过命名管道加载压缩文件。

mk-show-grants

能对 GRANT 语句进行规整化、排除、分离和排序,使它更易于在命令行里操作。有一种有趣的应用是把数据库权限存储在一个版本控制系统里,这样就不会有任何伪造的更改。

mk-slave-delay

使从服务器的更新滞后它的主机,以便于灾难还原。如果有一条破坏性 SQL 语句在主机上执行后,能在从服务器执行这条语句之前将它停止,重放二进制日志直到这条语句,然后将其提升为主机。这样的做法要快于在主机上重甲爱最近的一 个备份,然后重新执行自备份以来的所有日志。

mk-slave-prefetch

实现『为从服务器线程准备好缓存』里讨论过的技术。在某些工作负载下,它能使复制在从服务器上运行得更快。

mk-slave-restart

使从服务器在遇到一个错误后重新启动。

mk-table-checksum

在一台或多台服务器上并行地生成表内容的检验和,或者在各个复制里进行校验和查询,以检验从服务器上的数据是否一致。

mk-table-sync

更高效地找出表之间的差异,并生成用于解析它们的最小的 SQL 命令集。它也能在复制里面操作。

how to use default parameter in JS function

http://www.markhansen.co.nz/javascript-optional-parameters/

Import is:

function connect(hostname, port, method) {
    hostname = hostname || "localhost";
    port = port || 80;
    method = method || "GET";
}

The short-circuit OR operator || returns the left side if the left argument is truthy (evaluates to truein conditionals), otherwise it checks if the right argument is truthy, returning it. We can use this shortcut because undefined is falsy: in conditionals, undefined evaluates to false.

This shortcut approach is a very common idiom, but it does have a disadvantage: You can’t use for any argument that could accept a falsy value: false0nullundefined, the empty string "", and NaN.

Using the || shortcut will override any falsy input value. If you expect a falsy value, you must explicitly check for argument === undefined.