大家在使用Greenplum的过程中可能会遇到跑了某种SQL而导致数据库PANIC问题,或者数据库的执行计划并没有那么合理而导致SQL性能过慢的问题。这样的时候,作为商业用户,可以联系VMware技术支持部门来获取帮助。Greenplum SQL 问题重现利器Minirepo可以帮我们断定问题是执行计划上出了问题,还是数据层面出了问题。
一、什么是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 *
复制代码
安装完成后,请再次运行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 ,从而精准的定位问题!
作者:Greenplum中文社区
链接:https://juejin.cn/post/6864481851877097485