原始网页:https://www.cockroachlabs.com/docs/stable/query-behavior-troubleshooting.html


如果一个查询返回了异常的结果或是查询执行时间超出预期,查看本小节内容可以帮助你解决问题。

正确性问题

性能问题

如果查询执行时间超过预期,用户需要检查以下几点:

如果用户仍然无法定位查询慢的原因,请提交issue

响应bad connectionclosed

如果用户接收到了bad connection或是closed的响应,通常情况下这意味着客户端连接的节点已经死亡。用户可以通过访问集群的其他节点或是使用cockroach node status命令来确认问题。

一旦发现故障节点,可以检查该节点的日志文件(默认在cockroach-data/logs)。

此类异常完全是不应该出现的错误,用户可以提交相关的issue

SQL日志

有几种方法可以记录SQL查询,使用的日志记录类型取决于您的要求。

SQL审计日志

WARNING: 该功能为实验性质的功能,接口和输出可能会随版本发生变化。

如果用户想要针对特定表记录所有的查询,SQL审计功能将会非常有用。

集群范围内的执行日志

对于部署在生产环境的集群,最好的方式是开启集群配置sql.trace.log_statement_execute,去记录所有的查询。

SET CLUSTER SETTING sql.trace.log_statement_execute = true;

开启该配置后,集群的所有节点都将记录执行的所有的SQL查询到各自的日志文件。如果不再需要记录查询日志,可以通过以下SQL语句关闭:

SET CLUSTER SETTING sql.trace.log_statement_execute = false;

对应节点的执行日志

如果需要测试本地的CockroachDB,且只记录指定节点的查询日志,用户可以在该节点启动时附带CLI Flag,或是在节点启动后执行一个SQL函数。

使用CLI启动一个新节点,即在cockroach start命令中附加--vmodule和对应Flag参数。例如:

cockroach start --insecure --host=localhost --vmodule=exec_log=2

而在节点启动后开启SQL日志,可以执行crdb_internal.set_vmodule函数

SELECT crdb_internal.set_vmodule('exec_log=2');

输出如下:

+---------------------------+
| crdb_internal.set_vmodule |
+---------------------------+
|                         0 |
+---------------------------+
(1 row)

一旦开启日志功能,节点的所有查询都将输出到CockroachDB日志文件当中:

I180402 19:12:28.112957 394661 sql/exec_log.go:173  [n1,client=127.0.0.1:50155,user=root] exec "psql" {} "SELECT version()" {} 0.795 1 ""