Убить Db2 выберите оператор после заявленного времени - PullRequest
0 голосов
/ 21 января 2020

В Db2 LUW 9.7, как реализовать тайм-аут запроса?

При выполнении запросов есть параметр «тайм-аут», который я могу как-то объявить / реализовать, который заставит данный запрос прерваться после определенного время?

Пока что я могу рассмотреть только потенциально небезопасную практику уничтожения процесса, выполняющего запрос select, в Unix.

Ответы [ 4 ]

0 голосов
/ 21 января 2020

создать порог для ACTIVITYTOTALTIME или UOWTOTALTIME и установить действие при останове выполнения

https://www.ibm.com/support/knowledgecenter/en/SSEPGG_9.7.0/com.ibm.db2.luw.sql.ref.doc/doc/r0050563.html

0 голосов
/ 21 января 2020

В принципе, есть два способа добиться того, что вам нужно, в зависимости от того, имеете ли вы контроль над приложением или базой данных.

С конца приложения можно использовать SQL_ATTR_QUERY_TIMEOUT ключевое слово с CLI / ODB C или setQueryTimeout с JDB C (должен быть эквивалент для других интерфейсов). В конце я приложу пример CLI.

Если у вас есть только контроль над базой данных, можно рассмотреть возможность создания порога с ACTIVITYTOTALTIME, который бы автоматически прерывал длительные запросы.

Если вы заинтересованы в клиенте Db2 CLP, то прерывание выполнения с помощью ctrl+c будет распространять прерывание на базу данных, т.е. вы больше не должны видеть оператор как выполняющийся внутри базы данных. Однако, если вы «сломаете» его более «принудительно», например, запустите kill против db2bp процесса, связанного с оболочкой, оператор продолжит выполняться в течение некоторого времени, но в конечном итоге он будет прерван (один из них увидит AgentBreathingPoint Warning в db2diag.log , когда механизм Db2 периодически проверяет, находится ли клиент все еще, и происходит ли его исчезновение).

Пример CLI Db2:

Я буду использовать

  • db2cli исполняемый файл - CLI для запуска команд консоли Db2

  • «неверный запрос», который, как ожидается, будет выполняться в течение длительного времени:

select t1.*, t2.* from sysibm.syscolumns t1, sysibm.syscolumns t2, sysibm.syscolumns t3, sysibm.syscolumns t4, sysibm.syscolumns t5 order by t5.name desc, t4.name asc fetch first 10 rows only

  • установить тайм-аут на 10 секунд

код:

SQLAllocEnv 1
SQLAllocConnect 1 1
SQLConnect 1 SAMPLE sql_nts db2v115 sql_nts **** sql_nts
SQLAllocStmt 1 1
SQLSetStmtAttr 1 SQL_ATTR_QUERY_TIMEOUT 10
SQLPrepare 1 "select t1.*, t2.* from sysibm.syscolumns t1, sysibm.syscolumns t2, sysibm.syscolumns t3, sysibm.syscolumns t4, sysibm.syscolumns t5 order by t5.name desc, t4.name asc fetch first 10 rows only" sql_nts
SQLExecute 1
SQLFetch 1
SQLError 1 1 1

сбой SQLFetch 1, полный вывод, включая SQLCODE ниже:

$ db2cli
IBM DATABASE 2 Interactive CLI Sample Program
(C) COPYRIGHT International Business Machines Corp. 1993,1996
All Rights Reserved
Licensed Materials - Property of IBM
US Government Users Restricted Rights - Use, duplication or
disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
> SQLAllocEnv 1
SQLAllocConnect 1 1
SQLConnect 1 SAMPLE sql_nts db2v115 sql_nts *** sql_nts
SQLAllocStmt 1 1
SQLSetStmtAttr 1 SQL_ATTR_QUERY_TIMEOUT 10
SQLAllocEnv: rc = 0 (SQL_SUCCESS) 
             CLI henv = 1, Test Driver henv = 1
> SQLAllocConnect: rc = 0 (SQL_SUCCESS) 
             CLI hdbc = 1, Test Driver hdbc = 1
> SQLConnect: rc = 0 (SQL_SUCCESS) 
> SQLAllocStmt: rc = 0 (SQL_SUCCESS) 
              CLI hstmt = 1, Test Driver hstmt = 1
> SQLSetStmtAttr: rc = 0 (SQL_SUCCESS) 
> SQLPrepare 1 "select t1.*, t2.* from sysibm.syscolumns t1, sysibm.syscolumns t2, sysibm.syscolumns t3, sysibm.syscolumns t4, sysibm.syscolumns t5 order by t5.name desc, t4.name asc fetch first 10 rows only" sql_nts
SQLPrepare: rc = 0 (SQL_SUCCESS) 
> SQLExecute 1
SQLExecute: rc = 0 (SQL_SUCCESS) 
> SQLFetch 1
SQLFetch: rc = -1 (SQL_ERROR) 
> SQLError 1 1 1
SQLError: rc = 0 (SQL_SUCCESS) 
SQLError: SQLState     : S1008
          fNativeError : -952
          szErrorMsg   : [IBM][CLI Driver][DB2/6000] SQL0952N  Processing was cancelled due to an interrupt.  SQLSTATE=57014

          cbErrorMsg   : 100

0 голосов
/ 21 января 2020

ODBC / CLI: QueryTimeout

JDB C: свойство commandTimeout.
Общий драйвер IBM Data Server для свойств JDB C и SQLJ для всех поддерживаемых продуктов баз данных

если я уничтожу процесс, выполняющий запрос на выборку, в Unix, запрос также должен быть прерван

Да.

0 голосов
/ 21 января 2020

Этот вопрос не о программировании, а об администрировании.

Запрос никогда не "убьет себя". Но есть доступные инструменты, которые (после подходящей конфигурации) ограничат ресурсы, которые запрос может потреблять во время выполнения, и приведут к тому, что запрос вернет ошибку (при желании), если такие ресурсы превышены.

Вы никогда не должны уничтожать процесс, принадлежащий экземпляру Db2, что сопряжено с риском того, что вы переместите sh свою базу данных.

Для управления ресурсами (время, память, процессор) , disk, et c ...), который может использовать запрос, на V9.7 возможно использовать Workload-Manager . Это требует настройки и опыта для его правильного использования.

IBM также предложила инструмент Query-Patroller до того, как IBM представила Workload Manager (WLM). Это было другое решение, чем WLM. Я думаю, что Query Patroller был также доступен в V9.7. С тех пор он был заменен на WLM.

...