sch_oat.sql 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010
  1. {**************************************************************************}
  2. {* *}
  3. {* Licensed Materials - Property of IBM and/or HCL *}
  4. {* *}
  5. {* IBM Informix Dynamic Server *}
  6. {* Copyright IBM Corporation 2001, 2015 *}
  7. {* (c) Copyright HCL Technologies Ltd. 2017. All Rights Reserved. *}
  8. {* *}
  9. {**************************************************************************}
  10. DATABASE sysadmin;
  11. {****************************************************}
  12. {*** ***}
  13. {*** IWA-OAT Integration ***}
  14. {*** dwa_start_capture ***}
  15. {*** dwa_stop_capture ***}
  16. {*** ***}
  17. {****************************************************}
  18. DROP FUNCTION IF EXISTS
  19. dwa_start_capture(VARCHAR(128),VARCHAR(50),INT,INT,INT);
  20. CREATE FUNCTION dwa_start_capture(
  21. warehouse_db VARCHAR(128), /* name of the warehouse database */
  22. uname VARCHAR(50), /* optional: user name */
  23. sess_id INT, /* optional: session ID */
  24. tr_num INT, /* optional: number of traces */
  25. tr_size INT) /* optional: size (kB) of single trace row */
  26. RETURNING INT AS sql_id, /* last sqlid before capture started or */
  27. /* zero if no trace record exists. */
  28. INT as sql_finishtime, /* last finishtime before capture started */
  29. /* or zero if no trace record exists. */
  30. VARCHAR(255) AS message; /* dummy message */
  31. /* Required database connection: sysadmin database as user informix. */
  32. /* Function to start workload capture: set tracing parameters and */
  33. /* retrieve sql_id and sql_finishtime of the last trace entry in the */
  34. /* trace buffer. The combination of both serves as unique begin marker */
  35. /* for the capture in the trace buffer. */
  36. /* When not providing values for the optional parameter: pass NULL. */
  37. /* When specifying a user name, the tracing will be narrowed down for */
  38. /* that user only, accumulating less trace records and hence minmizing */
  39. /* the risk of trace buffer wrap around. */
  40. /* Specifying a session ID can narrow down tracing even more. */
  41. /* Default for tr_num is 10000, for tr_size it is 32 (kB). */
  42. DEFINE sqlid INT;
  43. DEFINE sqlfinishtime INT;
  44. DEFINE task_result VARCHAR(255);
  45. DEFINE esql INT;
  46. DEFINE eisam INT;
  47. BEGIN
  48. ON EXCEPTION SET esql, eisam
  49. ROLLBACK WORK;
  50. RAISE EXCEPTION esql, eisam;
  51. END EXCEPTION
  52. IF ((warehouse_db IS NULL) OR (TRIM(warehouse_db) == '')) THEN
  53. RAISE EXCEPTION -1822;
  54. END IF
  55. BEGIN WORK;
  56. LET sqlid = -1;
  57. LET sqlfinishtime = -1;
  58. IF (tr_num is NULL) THEN
  59. LET tr_num = 10000;
  60. END IF
  61. IF (tr_size is NULL) THEN
  62. LET tr_size = 32;
  63. END IF
  64. LET task_result = task('set sql tracing database clear');
  65. LET task_result = task('set sql tracing database', warehouse_db);
  66. LET task_result = task('set sql tracing user clear');
  67. IF (sess_id is not NULL) THEN
  68. LET task_result = task('set sql tracing session', 'on', sess_id);
  69. ELIF (uname is not NULL) THEN
  70. LET task_result = task('set sql tracing user add', uname);
  71. END IF
  72. IF (uname is not NULL) THEN
  73. LET task_result =task('set sql tracing on', tr_num, tr_size, 'low',
  74. 'user');
  75. ELSE
  76. LET task_result = task('set sql tracing on', tr_num, tr_size, 'low',
  77. 'global');
  78. END IF
  79. LET task_result = task('set sql tracing resume');
  80. SELECT MAX(sql_id) INTO sqlid FROM sysmaster:syssqltrace;
  81. IF (sqlid is NULL) THEN
  82. LET sqlid = 0;
  83. LET sqlfinishtime = 0;
  84. ELSE
  85. SELECT sql_finishtime INTO sqlfinishtime FROM sysmaster:syssqltrace
  86. WHERE sql_id = sqlid;
  87. END IF
  88. COMMIT WORK;
  89. END
  90. RETURN sqlid, sqlfinishtime, task_result;
  91. END FUNCTION;
  92. DROP FUNCTION IF EXISTS dwa_stop_capture();
  93. CREATE FUNCTION dwa_stop_capture()
  94. RETURNING INT AS sql_id, /* id of last trace record within capture */
  95. INT AS sql_finishtime, /* finishtime of last record within capture */
  96. VARCHAR(255) as message; /* dummy message */
  97. /* Required database connection: sysadmin database as user informix. */
  98. /* Function to stop workload capture: retrieve sql_id and sql_finishtime */
  99. /* of the last trace entry in the trace buffer. The combination of both */
  100. /* serves as unique end marker for the capture in the trace buffer. */
  101. /* Tracing is suspended to avoid wrap around of the trace buffer between */
  102. /* the stop action and the saving of the trace entries to a separate */
  103. /* workload table by a call to dwa_fill_wltab(). */
  104. DEFINE sqlid INT;
  105. DEFINE sqlfinishtime INT;
  106. DEFINE task_result VARCHAR(255);
  107. DEFINE esql INT;
  108. DEFINE eisam INT;
  109. BEGIN
  110. ON EXCEPTION SET esql, eisam
  111. ROLLBACK WORK;
  112. RAISE EXCEPTION esql, eisam;
  113. END EXCEPTION
  114. BEGIN WORK;
  115. LET sqlid = -1;
  116. LET sqlfinishtime = -1;
  117. LET task_result = task('set sql tracing suspend');
  118. SELECT MAX(sql_id) INTO sqlid FROM sysmaster:syssqltrace;
  119. IF (sqlid is NULL) THEN
  120. LET sqlid = -1;
  121. LET sqlfinishtime = -1;
  122. ELSE
  123. SELECT sql_finishtime INTO sqlfinishtime FROM sysmaster:syssqltrace
  124. WHERE sql_id = sqlid;
  125. END IF
  126. COMMIT WORK;
  127. END
  128. RETURN sqlid, sqlfinishtime, task_result;
  129. END FUNCTION;
  130. {****************************************************}
  131. {*** ***}
  132. {*** Crete GLS Files ***}
  133. {*** ***}
  134. {****************************************************}
  135. EXECUTE FUNCTION admin('create glfiles');
  136. DROP PROCEDURE IF EXISTS oat_create_gls_table;
  137. DROP TABLE IF EXISTS locales_ext;
  138. CREATE PROCEDURE oat_create_gls_table( )
  139. DEFINE cmd CHAR(4096);
  140. DEFINE unload_file VARCHAR(255);
  141. DEFINE bad_file VARCHAR(255);
  142. DEFINE ifxdir VARCHAR(255);
  143. DEFINE osname VARCHAR(255);
  144. --SET DEBUG FILE TO "/tmp/oat_debug.out";
  145. --TRACE ON;
  146. SELECT env_value INTO ifxdir FROM sysmaster:sysenv
  147. WHERE env_name = "INFORMIXDIR";
  148. SELECT os_name INTO osname FROM sysmaster:sysmachineinfo;
  149. IF (osname = 'Windows') THEN
  150. LET unload_file = '\gls\glsinfo.csv';
  151. LET bad_file = (select TRIM(env_value) from sysmaster:sysenv where env_name = 'DBTEMP') || '\'||DBINFO('sessionid')||'glsinfo_bad.csv';
  152. ELSE
  153. LET unload_file = '/gls/glsinfo.csv';
  154. LET bad_file = (select TRIM(env_value) from sysmaster:sysenv where env_name = 'DBTEMP') || '/'||DBINFO('sessionid')||'glsinfo_bad.csv';
  155. END IF
  156. EXECUTE IMMEDIATE "DROP TABLE IF EXISTS informix.locales_ext";
  157. LET cmd = "CREATE EXTERNAL TABLE informix.locales_ext (" ||
  158. " filename varchar(200)," ||
  159. " language varchar(200)," ||
  160. " territory varchar(200)," ||
  161. " modifier varchar(200)," ||
  162. " codeset varchar(200)," ||
  163. " name varchar(200), " ||
  164. " lc_source_version integer, " ||
  165. " cm_source_version integer " ||
  166. " ) USING ( " ||
  167. " DATAFILES ('DISK:"||TRIM(ifxdir)||unload_file||"'),"||
  168. " REJECTFILE '"||TRIM(bad_file)||"',"||
  169. " FORMAT 'delimited'," ||
  170. " DELIMITER ',')";
  171. EXECUTE IMMEDIATE cmd;
  172. END PROCEDURE;
  173. EXECUTE PROCEDURE oat_create_gls_table();
  174. {****************************************************}
  175. {*** ***}
  176. {*** Background admin Task ***}
  177. {*** ***}
  178. {****************************************************}
  179. DROP FUNCTION IF EXISTS admin_async(lvarchar, CHAR(129), lvarchar(1024),
  180. DATETIME hour to second, DATETIME hour to second,
  181. INTERVAL day(2) to second, BOOLEAN, BOOLEAN,
  182. BOOLEAN, BOOLEAN, BOOLEAN, BOOLEAN, BOOLEAN );
  183. CREATE FUNCTION admin_async(cmd lvarchar(4096),
  184. cur_group CHAR(129),
  185. comments lvarchar(1024)
  186. DEFAULT "Background admin API",
  187. start_time DATETIME hour to second
  188. DEFAULT CURRENT hour to second,
  189. end_time DATETIME hour to second
  190. DEFAULT NULL,
  191. frequency INTERVAL day(2) to second
  192. DEFAULT NULL,
  193. monday BOOLEAN DEFAULT 't',
  194. tuesday BOOLEAN DEFAULT 't',
  195. wednesday BOOLEAN DEFAULT 't',
  196. thursday BOOLEAN DEFAULT 't',
  197. friday BOOLEAN DEFAULT 't',
  198. saturday BOOLEAN DEFAULT 't',
  199. sunday BOOLEAN DEFAULT 't'
  200. )
  201. RETURNING INTEGER
  202. DEFINE ret_task_id INTEGER;
  203. DEFINE del_time INTERVAL DAY TO SECOND;
  204. DEFINE id INTEGER;
  205. DEFINE task_id INTEGER;
  206. DEFINE seq_id INTEGER;
  207. DEFINE cmd_num INTEGER;
  208. DEFINE boot_time DATETIME YEAR TO SECOND;
  209. --SET DEBUG FILE TO "/tmp/debug.out";
  210. --TRACE ON;
  211. IF cur_group IS NULL THEN
  212. LET cur_group = "MISC";
  213. END IF
  214. SELECT FIRST 1 value::INTERVAL DAY TO SECOND INTO del_time FROM ph_threshold
  215. WHERE name = "BACKGROUND TASK HISTORY RETENTION";
  216. IF del_time IS NULL THEN
  217. LET del_time = 7 UNITS DAY;
  218. END IF
  219. BEGIN
  220. ON EXCEPTION IN ( -310, -316 )
  221. END EXCEPTION WITH RESUME
  222. CREATE TABLE IF NOT EXISTS job_status (
  223. js_id SERIAL,
  224. js_task INTEGER,
  225. js_seq INTEGER,
  226. js_comment LVARCHAR(512),
  227. js_command LVARCHAR(4096),
  228. js_start DATETIME year to second
  229. DEFAULT CURRENT year to second,
  230. js_done DATETIME year to second DEFAULT NULL,
  231. js_result INTEGER
  232. );
  233. CREATE INDEX IF NOT EXISTS job_status_ix1 ON job_status(js_id);
  234. CREATE INDEX IF NOT EXISTS job_status_ix2 ON job_status(js_task);
  235. CREATE INDEX IF NOT EXISTS job_status_ix3 ON job_status(js_result);
  236. END
  237. BEGIN
  238. ON EXCEPTION IN ( -8301 )
  239. END EXCEPTION WITH RESUME
  240. CREATE SEQUENCE background_task START 1 NOMAXVALUE ;
  241. END
  242. INSERT INTO ph_task
  243. ( tk_name,
  244. tk_description,
  245. tk_type,
  246. tk_group,
  247. tk_execute,
  248. tk_start_time,
  249. tk_stop_time,
  250. tk_frequency,
  251. tk_Monday,
  252. tk_Tuesday,
  253. tk_Wednesday,
  254. tk_Thursday,
  255. tk_Friday,
  256. tk_Saturday,
  257. tk_Sunday,
  258. tk_attributes
  259. )
  260. VALUES
  261. (
  262. "Background Task ("|| background_task.NEXTVAL ||")",
  263. TRIM(comments),
  264. "TASK",
  265. cur_group,
  266. "insert into job_status (js_task, js_seq , js_comment,js_command) VALUES($DATA_TASK_ID,$DATA_SEQ_ID, '"||TRIM(comments)||"','"||TRIM(REPLACE(REPLACE(cmd,"'"),"""") )||"' ); update job_status set (js_result)= ( admin("||TRIM(cmd)||") ) WHERE js_task = $DATA_TASK_ID AND js_seq = $DATA_SEQ_ID ;update job_status set (js_done) = ( CURRENT ) WHERE js_task = $DATA_TASK_ID AND js_seq = $DATA_SEQ_ID ",
  267. start_time,
  268. end_time,
  269. frequency,
  270. monday,
  271. tuesday,
  272. wednesday,
  273. thursday,
  274. friday,
  275. saturday,
  276. sunday,
  277. 8);
  278. LET ret_task_id = DBINFO("sqlca.sqlerrd1");
  279. /* Cleanup the job_status table */
  280. SELECT dbinfo('UTC_TO_DATETIME',sh_boottime)
  281. INTO boot_time
  282. FROM sysmaster:sysshmvals;
  283. FOREACH SELECT js_id, js_task, js_seq, js_result
  284. INTO id, task_id, seq_id, cmd_num
  285. FROM job_status J, OUTER ph_run, command_history
  286. WHERE ( CURRENT - js_done > del_time OR
  287. (js_start < boot_time AND js_done IS NULL ) )
  288. AND js_task = run_task_id
  289. AND js_seq = run_task_seq
  290. AND js_result = ABS(cmd_number)
  291. DELETE FROM ph_run WHERE run_task_id = task_id
  292. AND run_task_seq = seq_id;
  293. DELETE FROM command_history WHERE cmd_number = cmd_num;
  294. DELETE FROM job_status WHERE js_id = id;
  295. -- Cleanup the task table only if this is not a repeating task
  296. DELETE FROM ph_task WHERE tk_id = task_id AND tk_next_execution IS NULL;
  297. END FOREACH
  298. RETURN ret_task_id;
  299. END FUNCTION;
  300. INSERT INTO ph_threshold
  301. (name,task_name,value,value_type,description)
  302. VALUES
  303. ("BACKGROUND TASK HISTORY RETENTION", "Cleanup background tasks",
  304. "7 0:00:00","NUMERIC",
  305. "Remove all dormant background tasks that are older than then the threshold.");
  306. DROP TABLE IF EXISTS jobs_status;
  307. CREATE TABLE IF NOT EXISTS job_status (
  308. js_id SERIAL,
  309. js_task INTEGER,
  310. js_seq INTEGER,
  311. js_comment LVARCHAR(512),
  312. js_command LVARCHAR(4096),
  313. js_start DATETIME year to second
  314. DEFAULT CURRENT year to second,
  315. js_done DATETIME year to second DEFAULT NULL,
  316. js_result INTEGER
  317. );
  318. CREATE INDEX IF NOT EXISTS job_status_ix1 ON job_status(js_id);
  319. CREATE INDEX IF NOT EXISTS job_status_ix2 ON job_status(js_task);
  320. CREATE INDEX IF NOT EXISTS job_status_ix3 ON job_status(js_result);
  321. {****************************************************}
  322. {*** Compression ***}
  323. {*** ***}
  324. {*** mon_estimate_compression ***}
  325. {*** get_compression_estimate ***}
  326. {*** admin_async_estimates ***}
  327. {*** mon_page_usage ***}
  328. {*** ***}
  329. {****************************************************}
  330. DROP FUNCTION IF EXISTS mon_estimate_compression( INTEGER, INTEGER);
  331. CREATE FUNCTION mon_estimate_compression(task_id integer, id integer)
  332. RETURNING integer;
  333. DEFINE p INTEGER;
  334. DEFINE d VARCHAR(128);
  335. DEFINE o VARCHAR(32);
  336. DEFINE t VARCHAR(128);
  337. DEFINE e VARCHAR(255);
  338. FOREACH SELECT tab.partnum , TRIM(dbsname) AS dbsname ,
  339. TRIM(owner) AS owner, TRIM(tabname) AS tabname,
  340. ( SUBSTR( sysadmin:task('fragment estimate_compression',
  341. tab.partnum) , 102 ) )
  342. INTO p , d , o , t , e
  343. FROM sysmaster:systabnames tab , sysmaster:sysptnhdr hdr
  344. WHERE dbsname NOT IN ( 'sysmaster','sysutils','syscdr',
  345. 'sysuser','system', 'syscdcv1','syscdcv2',
  346. 'syscdcv3','syscdcv4','syscdcv5','syscdcv6',
  347. 'syscdcv7', 'syscdcv8','syscdcv9')
  348. AND tabname != dbsname
  349. AND ((nrows >= 2000 AND npdata > 0) OR (npdata = 0 AND npused >= 500))
  350. AND tab.partnum = hdr.partnum
  351. AND tabname != 'TBLSpace'
  352. AND bitand(flags,'0x0004') != 4
  353. -- Time series
  354. AND bitand(flags,2147483648) != 2147483648
  355. AND tabname NOT IN ( SELECT tabname FROM systables WHERE tabid < 100 )
  356. INSERT INTO mon_compression_estimates
  357. (id, est_partnum , est_dbname , est_owner , est_tabname , est_estimate )
  358. VALUES
  359. (id, p,d,o,t,e);
  360. END FOREACH
  361. RETURN 0;
  362. END FUNCTION;
  363. MERGE
  364. INTO ph_group AS t
  365. USING ( select "COMPRESSION","Compression Tasks" FROM sysmaster:sysdual) as s(grp,desc)
  366. ON t.group_name = s.grp
  367. WHEN MATCHED THEN UPDATE
  368. SET t.group_description = s.desc
  369. WHEN NOT MATCHED THEN INSERT
  370. (t.group_id,t.group_name, t.group_description)
  371. VALUES
  372. (0,s.grp, s.desc);
  373. DELETE FROM ph_task WHERE tk_name = 'mon_compression_estimates';
  374. INSERT INTO ph_task
  375. (
  376. tk_name,
  377. tk_type,
  378. tk_group,
  379. tk_description,
  380. tk_result_table,
  381. tk_create,
  382. tk_execute,
  383. tk_stop_time,
  384. tk_start_time,
  385. tk_frequency,
  386. tk_delete
  387. )
  388. VALUES
  389. (
  390. 'mon_compression_estimates',
  391. 'SENSOR',
  392. 'COMPRESSION',
  393. 'Get compression estimates',
  394. 'mon_compression_estimates',
  395. 'create table mon_compression_estimates(id integer, est_partnum integer,est_dbname varchar(128),est_owner varchar(32),est_tabname varchar(128),est_estimate lvarchar(32000),est_date datetime year to second default CURRENT year to second); create index mon_estimate_compression_idx1 on mon_compression_estimates ( est_partnum );',
  396. 'mon_estimate_compression',
  397. NULL,
  398. DATETIME(02:30:00) HOUR TO SECOND,
  399. INTERVAL ( 7 ) DAY TO DAY,
  400. INTERVAL ( 30 ) DAY TO DAY
  401. );
  402. DROP FUNCTION IF EXISTS get_compression_estimate( VARCHAR(128), VARCHAR(12),
  403. VARCHAR(128), VARCHAR(32) );
  404. CREATE FUNCTION get_compression_estimate( pnum varchar(128), comptype varchar(12),
  405. dbname varchar(128) , owner varchar(32) )
  406. RETURNING int;
  407. DEFINE e LVARCHAR;
  408. DEFINE cmd INTEGER;
  409. --SET DEBUG FILE TO "/tmp/debug2.out";
  410. --TRACE ON;
  411. IF comptype == 'fragment' THEN
  412. SELECT admin(comptype||' estimate_compression',pnum)
  413. INTO cmd FROM sysmaster:sysdual ;
  414. ELSE
  415. SELECT admin(comptype||' estimate_compression',pnum , dbname , owner )
  416. INTO cmd FROM sysmaster:sysdual ;
  417. END IF
  418. RETURN cmd;
  419. END FUNCTION;
  420. DROP FUNCTION admin_async_estimates(varchar(128), varchar(12), varchar(128),
  421. varchar(32), CHAR(129), lvarchar(1024),
  422. DATETIME hour to second, DATETIME hour to second,
  423. INTERVAL day(2) to second, BOOLEAN, BOOLEAN,
  424. BOOLEAN, BOOLEAN, BOOLEAN, BOOLEAN, BOOLEAN);
  425. CREATE FUNCTION admin_async_estimates(cmd varchar(128),
  426. comptype varchar(12),
  427. dbname varchar(128),
  428. owner varchar(32),
  429. cur_group CHAR(129),
  430. comments lvarchar(1024)
  431. DEFAULT "Background admin API",
  432. start_time DATETIME hour to second
  433. DEFAULT CURRENT hour to second,
  434. end_time DATETIME hour to second
  435. DEFAULT NULL,
  436. frequency INTERVAL day(2) to second
  437. DEFAULT NULL,
  438. monday BOOLEAN DEFAULT 't',
  439. tuesday BOOLEAN DEFAULT 't',
  440. wednesday BOOLEAN DEFAULT 't',
  441. thursday BOOLEAN DEFAULT 't',
  442. friday BOOLEAN DEFAULT 't',
  443. saturday BOOLEAN DEFAULT 't',
  444. sunday BOOLEAN DEFAULT 't'
  445. )
  446. RETURNING INTEGER
  447. DEFINE ret_task_id INTEGER;
  448. DEFINE del_time INTERVAL DAY TO SECOND;
  449. DEFINE id INTEGER;
  450. DEFINE task_id INTEGER;
  451. DEFINE seq_id INTEGER;
  452. DEFINE cmd_num INTEGER;
  453. DEFINE boot_time DATETIME YEAR TO SECOND;
  454. IF cur_group IS NULL THEN
  455. LET cur_group = 'MISC';
  456. END IF
  457. SELECT FIRST 1 value::INTERVAL DAY TO SECOND INTO del_time FROM ph_threshold
  458. WHERE name = 'BACKGROUND TASK HISTORY RETENTION';
  459. IF del_time IS NULL THEN
  460. LET del_time = 7 UNITS DAY;
  461. END IF
  462. BEGIN
  463. ON EXCEPTION IN ( -310, -316 )
  464. END EXCEPTION WITH RESUME
  465. CREATE TABLE IF NOT EXISTS job_status (
  466. js_id SERIAL,
  467. js_task INTEGER,
  468. js_seq INTEGER,
  469. js_comment LVARCHAR(512),
  470. js_command LVARCHAR(4096),
  471. js_start DATETIME year to second
  472. DEFAULT CURRENT year to second,
  473. js_done DATETIME year to second DEFAULT NULL,
  474. js_result INTEGER
  475. );
  476. CREATE INDEX IF NOT EXISTS job_status_ix1 ON job_status(js_id);
  477. CREATE INDEX IF NOT EXISTS job_status_ix2 ON job_status(js_task);
  478. CREATE INDEX IF NOT EXISTS job_status_ix3 ON job_status(js_result);
  479. END
  480. BEGIN
  481. ON EXCEPTION IN ( -8301 )
  482. END EXCEPTION WITH RESUME
  483. CREATE SEQUENCE background_task START 1 NOMAXVALUE ;
  484. END
  485. IF comptype == 'fragment' THEN
  486. INSERT INTO ph_task
  487. ( tk_name,
  488. tk_description,
  489. tk_type,
  490. tk_group,
  491. tk_execute,
  492. tk_start_time,
  493. tk_stop_time,
  494. tk_frequency,
  495. tk_Monday,
  496. tk_Tuesday,
  497. tk_Wednesday,
  498. tk_Thursday,
  499. tk_Friday,
  500. tk_Saturday,
  501. tk_Sunday,
  502. tk_attributes
  503. )
  504. VALUES
  505. (
  506. 'Background Task ('|| background_task.NEXTVAL ||')',
  507. TRIM(comments),
  508. 'TASK',
  509. cur_group,
  510. "insert into job_status (js_task, js_seq , js_comment,js_command) VALUES($DATA_TASK_ID,$DATA_SEQ_ID, '"||TRIM(comments)||"','"||"Estimate for "||comptype||" "||TRIM(REPLACE(REPLACE(cmd,"'"),"""") )||"' ); update job_status set js_result=get_compression_estimate("""||cmd||""" ,"""||comptype||""" , """" , """" ) WHERE js_task = $DATA_TASK_ID AND js_seq = $DATA_SEQ_ID; insert into mon_compression_estimates SELECT 0,tab.partnum , TRIM(dbsname) , TRIM(owner) , TRIM(tabname) , substr(trim(cmd_ret_msg),102) , current FROM sysmaster:systabnames tab , sysmaster:sysptnhdr hdr , command_history where hdr.partnum = tab.partnum and tab.partnum ="""||cmd||""" and cmd_number = ( select case when ( js_result < 0 ) then js_result *-1 else js_result end from job_status where js_task = $DATA_TASK_ID AND js_seq = $DATA_SEQ_ID ) ;update job_status set (js_done) = ( CURRENT ) WHERE js_task = $DATA_TASK_ID AND js_seq = $DATA_SEQ_ID ;" ,
  511. start_time,
  512. end_time,
  513. frequency,
  514. monday,
  515. tuesday,
  516. wednesday,
  517. thursday,
  518. friday,
  519. saturday,
  520. sunday,
  521. 8);
  522. ELSE
  523. INSERT INTO ph_task
  524. ( tk_name,
  525. tk_description,
  526. tk_type,
  527. tk_group,
  528. tk_execute,
  529. tk_start_time,
  530. tk_stop_time,
  531. tk_frequency,
  532. tk_Monday,
  533. tk_Tuesday,
  534. tk_Wednesday,
  535. tk_Thursday,
  536. tk_Friday,
  537. tk_Saturday,
  538. tk_Sunday,
  539. tk_attributes
  540. )
  541. VALUES
  542. (
  543. 'Background Task ('|| background_task.NEXTVAL ||')',
  544. TRIM(comments),
  545. 'TASK',
  546. cur_group,
  547. "insert into job_status (js_task, js_seq , js_comment,js_command) VALUES($DATA_TASK_ID,$DATA_SEQ_ID, '"||TRIM(comments)||"','"||"Estimate for "||comptype||" "||TRIM(REPLACE(REPLACE(cmd,"'"),"""") )||"' ); update job_status set js_result=get_compression_estimate("""||cmd||""" ,"""||comptype||""", """||dbname||""" , """||owner||""") WHERE js_task = $DATA_TASK_ID AND js_seq = $DATA_SEQ_ID; insert into mon_compression_estimates SELECT 0,tab.partnum , TRIM(dbsname) , TRIM(owner) , TRIM(tabname) , substr(trim(cmd_ret_msg),102) , current FROM sysmaster:systabnames tab , sysmaster:sysptnhdr hdr , command_history where hdr.partnum = tab.partnum and tab.tabname ="""||cmd||""" and dbsname = """||dbname||""" and owner = """||owner||""" and cmd_number = ( select case when ( js_result < 0 ) then js_result *-1 else js_result end from job_status where js_task = $DATA_TASK_ID AND js_seq = $DATA_SEQ_ID ) ;update job_status set (js_done) = ( CURRENT ) WHERE js_task = $DATA_TASK_ID AND js_seq = $DATA_SEQ_ID ;" ,
  548. start_time,
  549. end_time,
  550. frequency,
  551. monday,
  552. tuesday,
  553. wednesday,
  554. thursday,
  555. friday,
  556. saturday,
  557. sunday,
  558. 8);
  559. END IF
  560. LET ret_task_id = DBINFO('sqlca.sqlerrd1');
  561. /* Cleanup the job_status table */
  562. SELECT dbinfo('UTC_TO_DATETIME',sh_boottime)
  563. INTO boot_time
  564. FROM sysmaster:sysshmvals;
  565. FOREACH SELECT js_id, js_task, js_seq, js_result
  566. INTO id, task_id, seq_id, cmd_num
  567. FROM job_status J, OUTER ph_run, command_history
  568. WHERE ( CURRENT - js_done > del_time OR
  569. (js_start < boot_time AND js_done IS NULL ) )
  570. AND js_task = run_task_id
  571. AND js_seq = run_task_seq
  572. AND js_result = ABS(cmd_number)
  573. DELETE FROM ph_run WHERE run_task_id = task_id
  574. AND run_task_seq = seq_id;
  575. DELETE FROM command_history WHERE cmd_number = cmd_num;
  576. DELETE FROM job_status WHERE js_id = id;
  577. -- Cleanup the task table only if this is not a repeating task
  578. DELETE FROM ph_task WHERE tk_id = task_id AND tk_next_execution IS NULL;
  579. END FOREACH
  580. RETURN ret_task_id;
  581. END FUNCTION;
  582. DROP TABLE IF EXISTS mon_compression_estimates;
  583. CREATE TABLE mon_compression_estimates (
  584. id INTEGER,
  585. est_partnum INTEGER,
  586. est_dbname VARCHAR(128),
  587. est_owner VARCHAR(32),
  588. est_tabname VARCHAR(128),
  589. est_estimate LVARCHAR(32000),
  590. est_date DATETIME YEAR TO SECOND DEFAULT CURRENT YEAR TO SECOND);
  591. CREATE INDEX IF NOT EXISTS mon_estimate_compression_idx1
  592. ON mon_compression_estimates ( est_partnum );
  593. DELETE FROM ph_task WHERE tk_name = 'mon_page_usage';
  594. INSERT INTO ph_task
  595. (
  596. tk_name,
  597. tk_type,
  598. tk_group,
  599. tk_description,
  600. tk_result_table,
  601. tk_create,
  602. tk_execute,
  603. tk_stop_time,
  604. tk_start_time,
  605. tk_frequency,
  606. tk_delete
  607. )
  608. VALUES
  609. (
  610. 'mon_page_usage',
  611. 'SENSOR',
  612. 'DISK',
  613. 'Get page usage estimate',
  614. 'mon_page_usage',
  615. 'CREATE TABLE mon_page_usage(ID integer, dbsnum smallint, type char(2), partnum integer, lockid integer, nextns smallint, nrows bigint, nptotal integer, npused integer, free integer, partly_used integer, mostly_used integer, very_full integer,run_time datetime year to second );create index mon_page_usage_ix1 on mon_page_usage(partnum,id);create index mon_page_usage_ix2 on mon_page_usage(lockid,id);',
  616. 'INSERT INTO mon_page_usage select $DATA_SEQ_ID, trunc(P.partnum / 1048577) as dbsnum, CASE WHEN bitand(P.flags,"0x80000000") > 0 THEN "TS" WHEN bitand(P.flags,"0x22760") > 0 THEN "T" WHEN P.nkeys = 1 AND P.npused > 1 AND P.partnum <> P.lockid AND bitand(P.flags,4) = 0 THEN "I" ELSE "T" END::CHAR(2) as type, P.partnum, P.lockid, P.nextns, P.nrows, P.nptotal, P.npused, P.nptotal - ( BM.partly_used+BM.mostly_used+BM.very_full) AS free ,BM.partly_used ,BM.mostly_used , BM.very_full, CURRENT FROM sysmaster:sysptnhdr P, outer (select b.pb_partnum as partnum, (b.pb_partnum/1048577)::integer as dbsnum ,sum(decode(bitand(b.pb_bitmap, 12),4 ,1,0)) as partly_used ,sum(decode(bitand(b.pb_bitmap, 12),8 ,1,0)) as mostly_used ,sum(decode(bitand(b.pb_bitmap, 12),12,1,0)) as very_full from sysmaster:sysptnbit b where b.pb_bitmap > 0 group by b.pb_partnum ) as BM WHERE P.partnum = BM.partnum and bitand(p.flags,"0xE0") = 0 and sysmaster:partpagenum(P.partnum)>1;UPDATE STATISTICS HIGH FOR TABLE mon_page_usage(ID,dbsnum,partnum,lockid)',
  617. NULL,
  618. DATETIME(03:00:00) HOUR TO SECOND,
  619. INTERVAL (1) DAY TO DAY,
  620. INTERVAL (7) DAY TO DAY
  621. );
  622. {****************************************************}
  623. {*** Backup Stored Procedure ***}
  624. {****************************************************}
  625. DROP FUNCTION IF EXISTS oatBackup(INT, INT, INT);
  626. CREATE FUNCTION oatBackup(backupLevel INT, task_id INT, task_seq INT)
  627. RETURNING INT
  628. DEFINE tapedevice CHAR(257);
  629. DEFINE deviceType CHAR(10);
  630. DEFINE tapeblock INTEGER;
  631. DEFINE args1 CHAR(40);
  632. DEFINE args2 CHAR(1000);
  633. DEFINE args3 CHAR(5);
  634. DEFINE errsql INTEGER;
  635. DEFINE errisam INTEGER;
  636. DEFINE errtext VARCHAR(255);
  637. DEFINE rc INTEGER;
  638. ON EXCEPTION SET errsql, errisam, errtext
  639. INSERT INTO ph_alert (
  640. ID, alert_task_id,alert_task_seq, alert_type, alert_color,
  641. alert_state, alert_object_type, alert_object_name,
  642. alert_message, alert_action
  643. ) VALUES (
  644. 0,task_id, task_seq, 'ERROR', 'RED',
  645. 'NEW', 'SERVER','BACKUP LEVEL '||backupLevel,
  646. 'Level '||backupLevel||' backup of server FAILED with error('
  647. ||errsql||','||errisam||' - '||errtext||').',
  648. NULL
  649. );
  650. END EXCEPTION;
  651. -- SET DEBUG FILE TO '/tmp/debug.oatBackup.out';
  652. -- TRACE ON;
  653. LET tapedevice = NULL;
  654. {*** Get the ontape tape device ***}
  655. SELECT value::CHAR(257) INTO tapedevice FROM ph_threshold
  656. WHERE name = 'ONTAPE_TAPEDEV';
  657. IF tapedevice IS NULL THEN
  658. INSERT INTO ph_alert (
  659. ID, alert_task_id,alert_task_seq, alert_type, alert_color,
  660. alert_state, alert_object_type, alert_object_name,
  661. alert_message, alert_action
  662. ) VALUES (
  663. 0,task_id, task_seq, 'ERROR', 'RED',
  664. 'NEW', 'SERVER','oatBackup stored procedure',
  665. 'Error executing procedure oatBackup. sysadmin:ph_threshold does not have an entry for ONTAPE_TAPEDEV which contains the TAPEDEV value for backup',
  666. NULL
  667. );
  668. RETURN -1;
  669. END IF
  670. {*** Get the device type: file, directory or tape ***}
  671. SELECT value::CHAR(10) INTO deviceType FROM ph_threshold
  672. WHERE name = 'ONTAPE_DEVICE_TYPE';
  673. LET tapeblock = 512;
  674. {*** Get the ontape block size ***}
  675. SELECT value::integer INTO tapeblock FROM ph_threshold
  676. WHERE name = 'ONTAPE_TAPEBLK';
  677. {*** Build the command ***}
  678. LET args1 = 'ontape archive ' || TRIM(deviceType) ||' level ' || backupLevel;
  679. IF deviceType = 'file' THEN
  680. LET args2 = TRIM(tapedevice) ||'_L'||backupLevel;
  681. ELSE
  682. LET args2 = tapedevice;
  683. END IF
  684. LET args3 = tapeblock;
  685. LET rc = -1;
  686. BEGIN
  687. ON EXCEPTION SET errsql, errisam, errtext
  688. INSERT INTO ph_alert (
  689. ID, alert_task_id,alert_task_seq, alert_type, alert_color,
  690. alert_state, alert_object_type, alert_object_name,
  691. alert_message, alert_action
  692. ) VALUES (
  693. 0,task_id, task_seq, 'ERROR', 'RED',
  694. 'NEW', 'SERVER','BACKUP LEVEL '||backupLevel,
  695. 'Level '|| backupLevel
  696. ||' backup of server FAILED starting ontape with error('
  697. ||errsql||','||errisam||' - '||errtext||').',
  698. NULL
  699. );
  700. END EXCEPTION;
  701. {*** Run the command ***}
  702. SELECT admin(TRIM(args1),TRIM(args2),TRIM(args3))
  703. INTO rc FROM systables WHERE tabid=1;
  704. IF rc > 0 THEN
  705. INSERT INTO ph_alert (
  706. ID, alert_task_id,alert_task_seq, alert_type, alert_color,
  707. alert_state, alert_object_type, alert_object_name,
  708. alert_message, alert_action
  709. ) VALUES (
  710. 0,task_id, task_seq, 'INFO', 'GREEN',
  711. 'NEW', 'SERVER','BACKUP LEVEL ' || backupLevel,
  712. 'Level ' || backupLevel || ' backup of server completed successfully.',
  713. NULL
  714. );
  715. ELSE
  716. INSERT INTO ph_alert (
  717. ID, alert_task_id,alert_task_seq, alert_type, alert_color,
  718. alert_state, alert_object_type, alert_object_name,
  719. alert_message, alert_action
  720. ) VALUES (
  721. 0,task_id, task_seq, 'ERROR', 'RED',
  722. 'NEW', 'SERVER','BACKUP LEVEL '||backupLevel,
  723. 'Level '|| backupLevel ||' backup of server FAILED starting ontape with error(see sysadmin:command_history.cmd_number=' ||ABS(rc),
  724. NULL
  725. );
  726. END IF
  727. END
  728. RETURN rc;
  729. END FUNCTION;
  730. {****************************************************}
  731. {*** Onbar Backup Stored Procedure ***}
  732. {****************************************************}
  733. DROP FUNCTION IF EXISTS oatOnbarBackup(INT, INT, INT);
  734. CREATE FUNCTION oatOnbarBackup(backupLevel INT, task_id INT, task_seq INT)
  735. RETURNING INT
  736. DEFINE backupGen CHAR(2);
  737. DEFINE onbarArgs1 CHAR(40);
  738. DEFINE smsyncArgs1 CHAR(10);
  739. DEFINE smsyncArgs2 CHAR(6);
  740. DEFINE errsql INTEGER;
  741. DEFINE errisam INTEGER;
  742. DEFINE errtext VARCHAR(255);
  743. DEFINE rc INTEGER;
  744. ON EXCEPTION SET errsql, errisam, errtext
  745. INSERT INTO ph_alert (
  746. ID, alert_task_id,alert_task_seq, alert_type, alert_color,
  747. alert_state, alert_object_type, alert_object_name,
  748. alert_message, alert_action
  749. ) VALUES (
  750. 0,task_id, task_seq, 'ERROR', 'RED',
  751. 'NEW', 'SERVER','BACKUP LEVEL '||backupLevel,
  752. 'Level '||backupLevel||' backup of server FAILED with error('
  753. ||errsql||','||errisam||' - '||errtext||').',
  754. NULL
  755. );
  756. END EXCEPTION;
  757. -- SET DEBUG FILE TO '/tmp/debug.oatOnbarBackup.out';
  758. -- TRACE ON;
  759. {*** Get the number of level 0 backup generations to retain ***}
  760. SELECT value::CHAR(2) INTO backupGen FROM ph_threshold
  761. WHERE name = 'BACKUP_GENR_RETAIN';
  762. {*** Build the command ***}
  763. LET onbarArgs1 = 'onbar backup whole system level ' || backupLevel;
  764. LET smsyncArgs1 = 'onsmsync';
  765. LET smsyncArgs2 = '-g ' || backupGen;
  766. LET rc = -1;
  767. BEGIN
  768. ON EXCEPTION SET errsql, errisam, errtext
  769. INSERT INTO ph_alert (
  770. ID, alert_task_id,alert_task_seq, alert_type, alert_color,
  771. alert_state, alert_object_type, alert_object_name,
  772. alert_message, alert_action
  773. ) VALUES (
  774. 0,task_id, task_seq, 'ERROR', 'RED',
  775. 'NEW', 'SERVER','BACKUP LEVEL '||backupLevel,
  776. 'Level '|| backupLevel ||' backup of server FAILED starting ON-Bar with error('
  777. ||errsql||','||errisam||' - '||errtext||').',
  778. NULL
  779. );
  780. END EXCEPTION;
  781. {*** Run the command ***}
  782. SELECT admin(TRIM(onbarArgs1)) INTO rc FROM systables WHERE tabid=1;
  783. IF rc > 0 THEN
  784. INSERT INTO ph_alert (
  785. ID, alert_task_id,alert_task_seq, alert_type, alert_color,
  786. alert_state, alert_object_type, alert_object_name,
  787. alert_message, alert_action
  788. ) VALUES (
  789. 0,task_id, task_seq, 'INFO', 'GREEN',
  790. 'NEW', 'SERVER','BACKUP LEVEL ' || backupLevel,
  791. 'Level ' || backupLevel || ' backup of server completed successfully.',
  792. NULL
  793. );
  794. IF (backupGen <> '-1') THEN
  795. {*** Run the onsmsync command to retain the backup generations ***}
  796. SELECT admin(TRIM(smsyncArgs1),TRIM(smsyncArgs2)) INTO rc FROM systables WHERE tabid=1;
  797. IF rc > 0 THEN
  798. INSERT INTO ph_alert (
  799. ID, alert_task_id,alert_task_seq, alert_type, alert_color,
  800. alert_state, alert_object_type, alert_object_name,
  801. alert_message, alert_action
  802. ) VALUES (
  803. 0,task_id, task_seq, 'INFO', 'GREEN',
  804. 'NEW', 'SERVER','RETAIN BACKUP LEVEL 0',
  805. 'Setting retention of ' || backupGen || ' generations completed successfully.',
  806. NULL
  807. );
  808. ELSE
  809. INSERT INTO ph_alert (
  810. ID, alert_task_id,alert_task_seq, alert_type, alert_color,
  811. alert_state, alert_object_type, alert_object_name,
  812. alert_message, alert_action
  813. ) VALUES (
  814. 0,task_id, task_seq, 'ERROR', 'RED',
  815. 'NEW', 'SERVER','RETAIN BACKUP LEVEL 0',
  816. 'Setting retention of '|| backupGen ||' generations FAILED with error(see sysadmin:command_history.cmd_number=' ||ABS(rc),
  817. NULL
  818. );
  819. END IF
  820. END IF
  821. ELSE
  822. INSERT INTO ph_alert (
  823. ID, alert_task_id,alert_task_seq, alert_type, alert_color,
  824. alert_state, alert_object_type, alert_object_name,
  825. alert_message, alert_action
  826. ) VALUES (
  827. 0,task_id, task_seq, 'ERROR', 'RED',
  828. 'NEW', 'SERVER','BACKUP LEVEL '||backupLevel,
  829. 'Level '|| backupLevel ||' backup of server FAILED starting ON-Bar with error(see sysadmin:command_history.cmd_number=' ||ABS(rc),
  830. NULL
  831. );
  832. END IF
  833. END
  834. RETURN rc;
  835. END FUNCTION;
  836. {****************************************************}
  837. {*** Permission of db_admin ***}
  838. {*** ***}
  839. {*** Do not put ph_allow into this list ***}
  840. {****************************************************}
  841. GRANT SELECT ON command_history TO "db_monitor";
  842. GRANT SELECT ON ph_alert TO "db_monitor";
  843. GRANT SELECT ON ph_bg_jobs TO "db_monitor";
  844. GRANT SELECT ON ph_bg_jobs_results TO "db_monitor";
  845. GRANT SELECT ON ph_config TO "db_monitor";
  846. GRANT SELECT ON ph_group TO "db_monitor";
  847. GRANT SELECT ON ph_run TO "db_monitor";
  848. GRANT SELECT ON ph_task TO "db_monitor";
  849. GRANT SELECT ON ph_threshold TO "db_monitor";
  850. GRANT SELECT ON ph_version TO "db_monitor";
  851. GRANT SELECT ON storagepool TO "db_monitor";
  852. {* views *}
  853. GRANT SELECT ON locales_ext TO "db_admin";
  854. GRANT SELECT ON ph_alerts TO "db_admin";
  855. GRANT SELECT ON ph_bg_jobs_seq TO "db_admin";
  856. GRANT SELECT ON ph_config TO "db_admin";
  857. GRANT SELECT ON ph_allow_list TO "db_admin";
  858. GRANT "db_monitor" TO "db_admin";
  859. GRANT UPDATE, DELETE, INSERT ON ph_alert TO "db_admin";
  860. GRANT UPDATE, DELETE, INSERT ON ph_bg_jobs TO "db_admin";
  861. GRANT UPDATE, DELETE, INSERT ON ph_bg_jobs_results TO "db_admin";
  862. GRANT UPDATE, DELETE, INSERT ON ph_config TO "db_admin";
  863. GRANT UPDATE, DELETE, INSERT ON ph_group TO "db_admin";
  864. GRANT UPDATE, DELETE, INSERT ON ph_task TO "db_admin";
  865. GRANT UPDATE, DELETE, INSERT ON ph_threshold TO "db_admin";
  866. GRANT UPDATE, DELETE, INSERT ON storagepool TO "db_admin";
  867. CLOSE DATABASE;