postgresql腳本
A. Postgresql DBA(13) - 自頂往下的方法閱讀執行計劃
一般來說,閱讀執行計劃通常採用自底往上的方法,這好比從樹的某片葉埋鏈族子出發然後再到樹枝再到樹干、樹根這么一種方法來了解一顆樹,這種方法存在的問題是如果這顆樹很大,那麼就可能出現「只見葉子不見樹干」難以把握整體的情況。這時候可以結合自頂往下的方法進行閱讀,從而在整體把握整個執行計劃。
為了更好的理解和使用自頂往下的閱讀方法,需要預先掌握一些基礎知識.
計劃節點類型
為了方便起見,在此基礎上進行推廣,設置規則:如控制節點/物化節點的子節點為連接節點,則視為連接節點,否則視為非連接節點.
根據這條規則,可以把所有的節點分為兩類,即 連接節點 和 非連接節點 .
自頂往下的方法,顧名思義,從執行計劃的最頂端/最外層進行閱讀.
1.識別節點類型(非連接節點 vs 連接節點)
2.如喚鋒為非連接節點,則識別該節點的具體類型(數據表掃描...),該分支結束
3.如為連接節點,則識別連接的outer端和inner端
3.1 對outer端遞歸應用1/2/3步驟
3.2 對inner端遞歸應用1/2/3步驟
下面舉例說明,SQL腳本如下:
1.識別節點類型: Nested Loop -> 連接節點
3.連接節點:識別outer端彎弊,即通常所說的驅動表(這里是Nested Loop)和inner端(Index Scan).
3.1 outer端為連接節點,類型為Nested Loop
遞歸應用1/2/3步驟,解析該Nested Loop
3.1.1 outer端為Index Scan on t_dwxx
3.1.2 inner端為Index Scan on t_grxx
3.2 inner端,遞歸應用1/2/3步驟,即Index Scan on t_jfxx
採用自頂往下的方法,可以從"大局"上對執行計劃上進行把握,避免一開始就進入繁雜的細節之中.
PgSQL · 最佳實踐 · EXPLAIN 使用淺析
跟我一起讀postgresql源碼(九)
B. postgresql 有沒有定時清空數據表的腳本
沒有,PostgreSQL自身不兆猜脊帶JOB功兆鉛能,有腳族滲本也無法定時執行。
可以寫一個清空腳本,用操作系統的定時任務完成。
C. postgresql怎麼寫腳本
主要就是把除了template0和template1外的資料庫全部mp到指定目錄並打包
使用前把BACKUPDIR修改至你自己的備份目錄
一般來說你不用修改DUMPCMD,除非你的PostgreSQL安裝時的prefix指定到了其他地方,又或者你想加上其他的pg_mp參數
可以放在crontab里每天定時執行
可以考慮root來執行,因為一般root可以不通過密碼驗證直接使用資料庫pgsql用戶mp數據,一切都取決於你的pg_hba.conf和postgresql.conf設置,碰到問題自行判斷
想在Windows上運行需要自行稍微修改
#! /bin/sh
DATE=`date +%Y%m%d%H`
BACKUPDIR=/path/to/backup
DUMPCMD='/usr/local/bin/pg_mp -U pgsql -O -x'
if [ ! -d $BACKUPDIR ]; then
mkdir $BACKUPDIR
fi
for DB in `/usr/local/bin/psql -U pgsql -d template1 -c '\l' -q -t | /usr/bin/awk '{print $1}'`
do
FILENAME=${DATE}_${DB}
if [ $DB != 'template0' ] && [ $DB != 'template1' ]; then
echo "Backup $DB ..."
$DUMPCMD -f $BACKUPDIR/$FILENAME.sql $DB
/usr/bin/tar -C $BACKUPDIR -c -j -f $BACKUPDIR/$FILENAME.tar.bz2 $FILENAME.sql \
&& rm -f $BACKUPDIR/$FILENAME.sql
fi
done
sync
D. postgresql建表腳本,某欄位帶雙引號,為什麼
該欄位名是數中茄據庫的保留關鍵字。
比如 你建立了一個蘆跡表 table(date timestamp);
為了區陪培並別欄位名與關鍵字,所以就會將date加雙引號區別開。
E. postgresql資料庫用什麼命令執行腳本文件
命令行執行:psql -d 庫名 -f 文件名;
直接sql腳本加:psql 庫名 (-U 用戶名)<<!
直接運行腳本sh 或脊缺槐直接賦予執行許可權
trampwind(隨風) 於 2005-3-10 11:42:27
psql交互界面直接用: i 文件名;
執行SQL腳本
先要執行命令放 .sql 格式文櫻友扮余件 比 gcz_test.sql
執行 ./gcz_test.sql
F. postgreSql資料庫的sql腳本中,為什麼用\connect XXX;開頭,意義是什麼
\connect 後面依次跟 資料庫名 角色名 主機地址 埠號
用於在postgresql服務客戶端連接另一個唯一確定的陸燃postgresql資料庫,鉛悉芹其中資料庫名為槐畢必填
G. Linux下如何運行sql腳本
Linux運行sql腳本的具體操作步驟如下:
1、使用shell工具登陸到安裝postgresql的伺服器,切換到postgres用戶,postgresql默認的操作用戶,命令是:su - postgres,查看當前路徑是/var/lib/psql,創建一個test.sql腳本文件,命令是:vim test.sql。
H. shell怎麼連接postgresql(shell怎麼連接伺服器)
bash腳本里有三種方式訪問PostgreSQL資料庫
但前提是要設置密碼文件。當然對於有系統對應賬戶的資料庫角色可以繞過密碼登錄環節,如
1
$sudo-upostgrespsql
或
1
2
$sudosu-postgres
$psql
但是對於沒有系統賬戶對應的資料庫角色,如要使用腳本登錄則必須使用PostgreSQL密碼文件
heredoc方式
heredoc是一種很常用的方式,在bash環境下還可以使用變數替換,用法示例
1
2
3
psql-U${role}-h${host}-dmydb< CREATESCHEMA${role}; EOF 也可以在循環語句中,向資料庫批量插入數據,類似 1 2 3 4 5 6 for... do psql-U${role}-h${host}-dmydb< INSERTINTO${table}VALUES(${value1},${value2},...); EOF done 但這種方式,每次插入一條語句都重新登錄一次資料庫,效率肯定不咋地。 UPDATE(05/05/2014):既然可並數嘩以使用變數替換,可以將所有插入語句組合到一個變數中,然後就可以在一次登錄中批量插入數據了。 還可以用以下方式來獲取查詢結果 result=`psql-Urole-hlocalhost-dmydb< SELECT*FROMprocts; EOF` echo${result} 使用psql命令行選項-f執行sql腳本文件 1 psql-U${role}-h${host}-dmydb-f${scriptname} 使用psql命令行選項-c執行SQL語句或psql命令 psql的-c選項可以指定SQL語句或者psql命令,但二者不能混合,除非使用管道。如果命令參數中有多條SQL語句,則它畢雀們在一個事務里執行,除非使用BEGIN/COMMIT明確的指定事務。這與互動式使用psql終端不同,如果不明確指定事務,則每條SQL屬於一個單獨的事務並自動提交。只有最後一條絕行SQL語句的結果被返回。 I. postgresql資料庫用什麼命令執行腳本文件
在命令行下執行:psql -d 庫名 -f 文件名; J. postgresql的"函數"怎麼導出腳本
兩種方法:
也可直接在sql腳本開頭加:psql 庫名 (-U 用戶名)<<!
然後睜猛檔就可以直接運行這個腳本,sh 之或直接賦予可執行許可權。
trampwind(隨風) 於 2005-3-10 11:42:27
在psql交互界面中可以直接用: i 文件名;
來執行SQL腳本
先把要執知毀行的命令放到 .sql 格式的文件悉亂中 ,比如 gcz_test.sql
然後執行 ./gcz_test.sql。
方法一:查詢pg_proc:
osdba=# select prosrc from pg_proc where proname='get_username';
prosrc
--------------------------------------------------------
declare
ret text;
begin
SELECT name into ret from tang01 where id=userid;
return ret;
end;
(1 row)
方法二:調用pg_catalog.pg_get_functiondef函數:
osdba=# select pg_get_functiondef('get_username'::regproc);
pg_get_functiondef
----------------------------------------------------------------
CREATE OR REPLACE FUNCTION public.get_username(userid integer)
RETURNS text
LANGUAGE plpgsql
AS $function$
declare
ret text;
begin
SELECT name into ret from tang01 where id=userid;
return ret;
end;
$function$