查询优化器调优利器之 minirepro

大家在使用greenplum的过程中可能会遇到跑了某种SQL而导致数据库PANIC问题,或者数据库的执行计划并没有那么合理而导致SQL性能过慢的问题。这样的时候,我们往往需要联系Pivotal的技术支持部门来获取帮助。而为了更好的跟后端的技术支持人员沟通这样的问题,我们需要一个叫mini-repro的工具。

一、什么是minirepro?

Minirepro 工具是一个比gpsd轻量级的工具。它会收集对应SQL的命名空间信息和统计信息,从而可以在另外一套集群上重现问题。gpsd工具相比Minirepro工具会收集整个数据库的元数据和统计信息。因为Minirepro比GPSD轻量级的优势(只收集对应SQL的信息,而非全库),让它成为数据库管理员和Pivotal售后支持优先使用的优化器排错工具。 简单的使用用例如下,我们通过–version查看版本信息和–help即可查看命令的使用方式:

[gpadmin@mdw]$ /usr/local/GP-4.3.7.2/bin/minirepro --version
minirepro 1.0
[gpadmin@mdw]$ /usr/local/GP-4.3.7.2/bin/minirepro --help
Usage: minirepro  [options]
Options:
  --version             show program's version number and exit
  -?, --help            Show this help message and exit
  -h HOST, --host=HOST  Specify a remote host
  -p PORT, --port=PORT  Specify a port other than 5432
  -U USER, --user=USER  Database user to connect with.This is mandatory as of now
  -q QUERY_FILE         file name that contains the query
  -f OUTPUT_FILE        minirepro output file name. Must be absolute path 
Example: minirepro database-name -q sql-file-name -f /tmp/output-file-name -U gpadmin

注意:Minirepro只在4.3.7版本之上可用。

一个更详细的例子如下: 比如说prod_db是一个生产库,我们在跑query.sql中的的语句的时候出现了数据库PANIC或者SQL运行速度过慢的问题。我们可以使用如下语句来收集mini-repro:

gpadmin@mdw]$ minirepro prod_db -q query.sql -f /data/oufile_msq -U gpadmin 
 Connecting to database: host=mdw, port=5432, user=gpadmin, db=prod_db …
 Extracting metadata from query file query.sql …
 Invoking pg_dump to dump DDL …
 pg_dump -h mdw -p 5432 -U gpadmin -sxO prod_db -t 'ravedw.v_f_dtd_modular_scenario_fdsf|fdsf_scenario_map|mt_position|mt_scenario_surf_dim_msr|mt_modular_scenario' -f /tmp/20160419101152/ravedw.dp.sql
 pg_dump -h mdw -p 5432 -U gpadmin -sxO prod_db -t 'dwuser.u_modular_scenarios_fdsf' -f /tmp/20160419101152/dwuser.dp.sql
 Writing schema DDLs …
 Writing table & view DDLs …
 Writing table statistics …
 Writing column statistics …
 Attaching raw query text …
 --- MiniRepro completed! ---

其中,/data/oufile_msq 是mini-repro产生的文件。我们可以利用这个文件在另外一个Greenplum数据库集群中使用psql -f /data/oufile_msq 即可实现元数据和统计信息的导入,并且重现优化器上面的问题。

二、在使用minirepro的过程中我们可能会遇到一些问题:

问题1:

Minirepro 是否会收集我表中的数据?

答: 不会,minirepro只会收集表的DDL和统计信息,不会收集表中数据,可以完全放心的把收集结果交给Greenplum的技术支持人员 

问题2:

Minirepro是否会可以在有其他作业的情况下跑:

答:可以的,minirepro不会调用排他锁,可以跟没有排他锁的作业一起跑

问题3:

Error while running gp_toolkit.gp_dump_query_oids(text).
Please make sure the function is installed and the query file contains single valid query.

error 'ERROR:  Cannot parse query. Please make sure the input contains a single valid query. (gpoptutils.c:53)

这实际上是一个SQL file的错误,在输入的的sql文件里可能存在一些格式或者缩进的错误,我们需要打开上面例子中query.sql来排查输入的SQL语句。

问题4:

Error while running gp_toolkit.gp_dump_query_oids(text).
 Please make sure the function is installed and the query file contains single valid query.

这个错误是在4.3中gp_toolkit工具没有安装的错误,我们需要按照下面步骤解决: 用vi或者其他文本编辑器打开这个gp_toolkit_2.sql: 删除文件一开始的”begin;”” 然后再psql中跑这个SQL

prod_db=# \i gp_toolkit_2.sql ( or ) 
 psql -f gp_toolkit_2.sql

在运行此SQL的过程中,如果遇到下面的问题请忽略:

relation "gp_pgdatabase_invalid" already exists
function "gp_skew_idle_fraction" already exists with same argument types

安装完成后,请再次运行mini-repro。

问题5:

raise ValueError(errmsg("Extra data", s, end, len(s))) 
 ValueError: Extra data: line 2 column 1 - line 3 column 1 (char 134 - 150)

这个问题的产生的原因是因为我们在.psqlrc中打开了timing的设置 ,在.psqlrcz中删除“\timing”既可解决这个问题

总结:

minirepro是一个可以重现SQL统计信息相关的问题的工具,通过这个工具我们可以很快的在另一套集群中重现问题。对于大部分的软件问题,如果可以持续的重现,那么我们可以相对较快的找到问题的根源。 希望大家都能熟练的使用minirepro ,从而精准的定位问题!

关于作者:

Alex Jiang, Pivotal 技术支持中心售后支持专家。作者曾就职于EMC、埃森哲、爱立信等知名公司。有多年的数据库相关经验,熟悉Greenplum、PostgreSQL。

关注微信公众号

VMware 中国研发中心