2013-06-19 27 views
3

我正在嘗試編寫一個自定義的pgbench腳本來對我設置的新postgres集羣進行基準測試。官方文檔使其看起來很簡單,但它看起來像定義變量並不總是被解釋,如果他們缺乏尾隨空白(或一些其他未公開的字符)。下面是我試圖運行腳本(testlist_bska.sql):如何引用自定義pgbench腳本中的變量?

\setrandom aid 100 50875000 
BEGIN; 
DROP TABLE IF EXISTS nppsmoke_tmp_:aid CASCADE; 
CREATE UNLOGGED TABLE nppsmoke_tmp_:aid (testname text NOT NULL); 
CREATE INDEX nppsmoke_tmp_idx_:aid ON nppsmoke_tmp_:aid (testname); 
COPY nppsmoke_tmp_:aid (testname) FROM '/tmp/testlist_p3_c.csv' WITH (FORMAT csv, ESCAPE '~'); 

INSERT INTO nppsmoke_testlist (testname) SELECT a.testname FROM nppsmoke_tmp_:aid a LEFT JOIN nppsmoke_testlist b ON b.testname = a.testname WHERE b.testname IS NULL; 
UPDATE nppsmoke_testlist set tstamp=now() WHERE testname IN (SELECT testname FROM nppsmoke_tmp_:aid); 
DELETE FROM nppsmoke_testlist WHERE age(now(),tstamp) > INTERVAL '12 months'; 
DROP TABLE nppsmoke_tmp_:aid CASCADE; 

COPY nppsmoke_testlist (id,testname) TO '/tmp/testlist_:aid' (DELIMITER ','); 
\shell /bin/cp -f /tmp/scrub_9sBO.sql /tmp/scrub_csv.":aid" 
\shell /bin/sed -i "s/,\"87692\",/,\":aid\",/g" /tmp/scrub_csv.":aid" 
COPY nppsmoketests (last_update,current_status,testid,suiteid,regressioncl,testcl,os,arch,build_type,branch,gpu,subtest,osversion) FROM '/tmp/scrub_sql.:aid ' with CSV HEADER ESCAPE '~'; 
\shell /bin/rm -f /tmp/testlist_:aid /tmp/scrub_csv.":aid" 
COMMIT; 

然而,當我調用此腳本時,出現以下輸出:

$ pgbench -U lfriedman -n -f testlist_bska.sql -t 1 nightly 
NOTICE: table "nppsmoke_tmp_39362939" does not exist, skipping 
Client 0 aborted in state 13: ERROR: could not open file "/tmp/scrub_csv.39362939 " for reading: No such file or directory 
transaction type: Custom query 
scaling factor: 1 
query mode: simple 
number of clients: 1 
number of threads: 1 
number of transactions per client: 1 
number of transactions actually processed: 0/1 
tps = 0.000000 (including connections establishing) 
tps = 0.000000 (excluding connections establishing) 

另一個突出的問題是我不知道如何讓sed命令正確替換87692的:aid變量的當前值。

回答

1

我結束了一個變通辦法,因爲我無法讓變量可靠地工作在\ shell命令中,如果它們沒有被包含在空格中。我所做的就是創建一個shell腳本這是通過\ shell命令調用,以傳遞給它的參數:

#!/bin/bash 

PATH=${PATH}:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/pgsql-9.3/bin:/root/bin 
NUM="$1" 
OPT="$2" 

if [[ ${OPT} == 'setup' ]] ; then 
     cp -f /tmp/scrub_9sBO.sql /tmp/scrub_csv.${NUM} && sed -i "s/87692/${NUM}/g" /tmp/scrub_csv.${NUM} 
elif [[ ${OPT} == 'del' ]] ; then 
     rm -f /tmp/testlist_${NUM} /tmp/scrub_csv.${NUM} 
fi 

這裏的下pgbench腳本的新版本:

\setrandom aid 100 50875000 
BEGIN; 
DROP TABLE IF EXISTS nppsmoke_tmp_:aid CASCADE; 
CREATE UNLOGGED TABLE nppsmoke_tmp_:aid (testname text NOT NULL); 
CREATE INDEX nppsmoke_tmp_idx_:aid ON nppsmoke_tmp_:aid (testname); 
COPY nppsmoke_tmp_:aid (testname) FROM '/tmp/testlist_p3_c.csv' WITH (FORMAT csv, ESCAPE '~'); 

INSERT INTO nppsmoke_testlist (testname) SELECT a.testname FROM nppsmoke_tmp_:aid a LEFT JOIN nppsmoke_testlist b ON b.testname = a.testname WHERE b.testname IS NULL; 
UPDATE nppsmoke_testlist set tstamp=now() WHERE testname IN (SELECT testname FROM nppsmoke_tmp_:aid); 
DELETE FROM nppsmoke_testlist WHERE age(now(),tstamp) > INTERVAL '12 months'; 
DROP TABLE nppsmoke_tmp_:aid CASCADE; 

COPY nppsmoke_testlist (id,testname) TO '/tmp/testlist_:aid' (DELIMITER ','); 
\shell /tmp/bm.sh :aid setup 
COPY nppsmoketests (last_update,current_status,testid,suiteid,regressioncl,testcl,os,arch,build_type,branch,gpu,subtest,osversion) FROM '/tmp/scrub_csv.:aid' with CSV HEADER ESCAPE '~'; 
\shell /tmp/bm.sh :aid del 
COMMIT;