零、口令文件:
在給出其它PostgreSQL客戶端命令之前,我們需要先介紹一下PostgreSQL中的口令文件。之所以在這里提前說明該文件,是因?yàn)槲覀冊(cè)诤竺娴氖纠a中會(huì)大量應(yīng)用該文件,從而保證我們的腳本能夠自動(dòng)化完成。換句話說,如果在客戶端命令執(zhí)行時(shí)沒有提供該文件,PostgreSQL的所有客戶端命令均會(huì)被口令輸入提示中斷。
在當(dāng)前用戶的HOME目錄下,我們需要手工創(chuàng)建文件名為 .pgpass的口令文件,這樣就可以在我們連接PostgreSQL服務(wù)器時(shí),客戶端命令自動(dòng)讀取該文件已獲得登錄時(shí)所需要的口令信息。該文件的格式如下:
復(fù)制代碼 代碼如下:
hostname:port:database:username:password
以上數(shù)據(jù)是用冒號(hào)作為分隔符,總共分為五個(gè)字段,分別表示服務(wù)器主機(jī)名(IP)、服務(wù)器監(jiān)聽的端口號(hào)、登錄訪問的數(shù)據(jù)庫名、登錄用戶名和密碼,其中前四個(gè)字段都可以使用星號(hào)(*)來表示匹配任意值。見如下示例:
復(fù)制代碼 代碼如下:
/> cat > .pgpass
*:5432:postgres:postgres:123456
CTRL+D
#.pgpass文件的權(quán)限必須為0600,從而防止任何全局或者同組的用戶訪問,否則這個(gè)文件將被忽略。
/> chmod 0600 .pgpass
在學(xué)習(xí)后面的客戶端命令之前,我們需要根據(jù)自己的應(yīng)用環(huán)境手工創(chuàng)建該文件,以便后面所有的示例代碼都會(huì)用到該口令文件,這樣它們就都可以以批處理的方式自動(dòng)完成。
一、createdb:
創(chuàng)建一個(gè)新的PostgreSQL數(shù)據(jù)庫。該命令的使用方式如下:
復(fù)制代碼 代碼如下:
createdb [option...] [dbname] [description]
1. 命令行選項(xiàng)列表:
選項(xiàng) |
說明 |
-D(--tablespace=tablespace) |
指定數(shù)據(jù)庫的缺省表空間。 |
-e(--echo) |
回顯createdb生成的命令并且把它發(fā)送到服務(wù)器。 |
-E(--encoding=encoding) |
指定用于此數(shù)據(jù)庫的字符編碼方式。 |
-l(--locale=locale) |
指定用于此數(shù)據(jù)庫的本地化設(shè)置。 |
-O(--owner=owner) |
指定新建數(shù)據(jù)庫的擁有者,如果未指定此選項(xiàng),該值為當(dāng)前登錄的用戶。 |
-T(--template=template) |
指定創(chuàng)建此數(shù)據(jù)庫的模板數(shù)據(jù)庫。 |
-h(--host=host) |
指定PostgreSQL服務(wù)器的主機(jī)名。 |
-p(--port=port) |
指定服務(wù)器的偵聽端口,如不指定,則為缺省的5432。 |
-U(--username=username) |
本次操作的登錄用戶名,如果-O選項(xiàng)沒有指定,此數(shù)據(jù)庫的Owner將為該登錄用戶。 |
-w(--no-password) |
如果當(dāng)前登錄用戶沒有密碼,可以指定該選項(xiàng)直接登錄。 |
2. 應(yīng)用示例:
復(fù)制代碼 代碼如下:
#1. 以postgres的身份登錄。(詳情參照上面口令文件的內(nèi)容)
/> psql
#2. 創(chuàng)建表空間。
postgres=# CREATE TABLESPACE my_tablespace LOCATION '/opt/PostgreSQL/9.1/mydata';
CREATE TABLESPACE
#3. 創(chuàng)建新數(shù)據(jù)庫的owner。
postgres=# CREATE ROLE myuser LOGIN PASSWORD '123456';
CREATE ROLE
postgres=# \q
#4. 創(chuàng)建新數(shù)據(jù)庫,其中本次連接的登錄用戶為postgres,新數(shù)據(jù)庫的owner為myuser,表空間為my_tablespace,新數(shù)據(jù)庫名為mydatabase。
/> createdb -U postgres -O myuser -D my_tablespace -e mydatabase
CREATE DATABASE mydatabase OWNER myuser TABLESPACE my_tablespace;
#5. 重新登錄,通過查詢系統(tǒng)表查看該數(shù)據(jù)庫是否創(chuàng)建成功,以及表空間和所有者是否一致。
/> psql
postgres=# SELECT datname,rolname,spcname FROM pg_database db, pg_authid au, pg_tablespace ts WHERE datname = 'mydatabase' AND datdba = au.oid AND dattablespace = ts.oid;
datname | rolname | spcname
------------+---------+---------------
mydatabase | myuser | my_tablespace
(1 row)
二、dropdb:
刪除一個(gè)現(xiàn)有PostgreSQL數(shù)據(jù)庫。
復(fù)制代碼 代碼如下:
dropdb [option...] dbname
1. 命令行選項(xiàng)列表:
選項(xiàng) |
說明 |
-e(--echo) |
回顯dropdb生成的命令并且把它發(fā)送到服務(wù)器。 |
-i(--interactive) |
在做任何破壞性動(dòng)作前提示。 |
-q(--quiet) |
不顯示響應(yīng)。 |
-h(--host=host) |
指定PostgreSQL服務(wù)器的主機(jī)名。 |
-p(--port=port) |
指定服務(wù)器的監(jiān)聽端口,如不指定,則為缺省的5432。 |
-U(--username=username) |
本次操作的登錄用戶名。 |
-w(--no-password) |
如果當(dāng)前登錄用戶沒有密碼,可以指定該選項(xiàng)直接登錄。 |
2. 應(yīng)用示例:
復(fù)制代碼 代碼如下:
#以postgres的身份連接服務(wù)器,刪除mydatabase數(shù)據(jù)庫。
/> dropdb -U postgres -e mydatabase
DROP DATABASE mydatabase;
#通過查看系統(tǒng)表驗(yàn)證該數(shù)據(jù)庫是否已經(jīng)被刪除。
/> psql
postgres=# SELECT count(*) FROM pg_database WHERE datname = 'mydatabase';
count
-------
0
(1 row)
三、reindexdb:
為一個(gè)指定的PostgreSQL數(shù)據(jù)庫重建索引。
復(fù)制代碼 代碼如下:
reindexdb [connection-option...] [--table | -t table ] [--index | -i index ] [dbname]
reindexdb [connection-option...] [--all | -a]
reindexdb [connection-option...] [--system | -s] [dbname]
1. 命令行選項(xiàng)列表:
選項(xiàng) |
說明 |
-a(-all) |
重建整個(gè)數(shù)據(jù)庫的索引。 |
-e(--echo) |
回顯reindexdb生成的命令并且把它發(fā)送到服務(wù)器。 |
-i(--index=index) |
僅重建指定的索引。 |
-q(--quiet) |
不顯示響應(yīng)。 |
-s(--system) |
重建數(shù)據(jù)庫系統(tǒng)表的索引。 |
-t(--table=table) |
僅重建指定數(shù)據(jù)表的索引。 |
-h(--host=host) |
指定PostgreSQL服務(wù)器的主機(jī)名。 |
-p(--port=port) |
指定服務(wù)器的監(jiān)聽端口,如不指定,則為缺省的5432。 |
-U(--username=username) |
本次操作的登錄用戶名。 |
-w(--no-password) |
如果當(dāng)前登錄用戶沒有密碼,可以指定該選項(xiàng)直接登錄。 |
2. 應(yīng)用示例:
復(fù)制代碼 代碼如下:
#僅重建數(shù)據(jù)表testtable上的全部索引。
/> reindexdb -t testtable -e -U postgres postgres
REINDEX TABLE testtable;
#僅重建指定索引testtable_idx
/> reindexdb -i testtable_idx -e -U postgres postgres
REINDEX INDEX testtable_idx;
#重建指定數(shù)據(jù)庫mydatabase的全部索引。
/> reindexdb mydatabase
四、vacuumdb:
收集垃圾并且分析一個(gè)PostgreSQL數(shù)據(jù)庫。
復(fù)制代碼 代碼如下:
vacuumdb [-options] [--full | -f] [--verbose | -v] [--analyze | -z] [-t table [(column [,...])]] [dbname]
vacuumdb [-options] [--all | -a] [--full | -f] [--verbose | -v] [--analyze | -z]
1. 命令行選項(xiàng)列表:
選項(xiàng) |
說明 |
-a(--all) |
清理所有數(shù)據(jù)庫。 |
-e(--echo) |
回顯vacuumdb生成的命令并且把它發(fā)送到服務(wù)器。 |
-f(--full) |
執(zhí)行完全清理。 |
-q(--quiet) |
不顯示響應(yīng)。 |
-t table [(column[,...])] |
僅僅清理或分析指定的數(shù)據(jù)表,字段名只是在與--analyze選項(xiàng)聯(lián)合使用時(shí)才需要聲明。 |
-v(--verbose) |
在處理過程中打印詳細(xì)信息。 |
-z(--analyze) |
計(jì)算用于規(guī)劃器的統(tǒng)計(jì)值。 |
-h(--host=host) |
指定PostgreSQL服務(wù)器的主機(jī)名。 |
-p(--port=port) |
指定服務(wù)器的監(jiān)聽端口,如不指定,則為缺省的5432。 |
-U(--username=username) |
本次操作的登錄用戶名。 |
-w(--no-password) |
如果當(dāng)前登錄用戶沒有密碼,可以指定該選項(xiàng)直接登錄。 |
2. 應(yīng)用示例:
復(fù)制代碼 代碼如下:
#清理整個(gè)數(shù)據(jù)庫mydatabase。
/> vacuumdb -e mydatabase
VACUUM;
#清理并分析postgres數(shù)據(jù)庫中的testtable表。
/> vacuumdb -e --analyze --table 'testtable' postgres
VACUUM ANALYZE testtable;
#清理并分析postgres數(shù)據(jù)庫中的testtable表的i字段。
/> vacuumdb -e --analyze -t 'testtable(i)' postgres
VACUUM ANALYZE testtable(i);
五、createuser:
定義一個(gè)新的PostgreSQL用戶帳戶,需要說明的是只有超級(jí)用戶或者是帶有CREATEROLE權(quán)限的用戶才可以執(zhí)行該命令。如果希望創(chuàng)建的是超級(jí)用戶,那么只能以超級(jí)用戶的身份執(zhí)行該命令,換句話說,帶有CREATEROLE權(quán)限的普通用戶無法創(chuàng)建超級(jí)用戶。該命令的使用方式如下:
復(fù)制代碼 代碼如下:
createuser [option...] [username]
1. 命令行選項(xiàng)列表:
選項(xiàng) |
說明 |
-c number |
設(shè)置新創(chuàng)建用戶的最大連接數(shù),缺省為沒有限制。 |
-d(--createdb) |
允許該新建用戶創(chuàng)建數(shù)據(jù)庫。 |
-D(--no-createdb) |
禁止該新建用戶創(chuàng)建數(shù)據(jù)庫。 |
-e(--echo) |
回顯createuser生成的命令并且把它發(fā)送到服務(wù)器。 |
-E(--encrypted) |
對(duì)保存在數(shù)據(jù)庫里的用戶口令加密。如果沒有聲明, 則使用缺省值。 |
-i(--inherit) |
新創(chuàng)建的角色將自動(dòng)繼承它的組角色的權(quán)限。 |
-I(--no-inherit) |
新創(chuàng)建的角色不會(huì)自動(dòng)繼承它的組角色的權(quán)限。 |
-l(--login) |
新角色將被授予登錄權(quán)限,該選項(xiàng)為缺省選項(xiàng)。 |
-L(--no-login) |
新角色沒有被授予登錄權(quán)限。 |
-N(--unencrypted) |
不對(duì)保存在數(shù)據(jù)庫里的用戶口令加密。如果沒有聲明, 則使用缺省值。 |
-P(--pwprompt) |
如果給出該選項(xiàng),在創(chuàng)建用戶時(shí)將提示設(shè)置口令。 |
-r(--createrole) |
新角色被授予創(chuàng)建數(shù)據(jù)庫的權(quán)限。 |
-R(--no-createrole) |
新角色沒有被授予創(chuàng)建數(shù)據(jù)庫的權(quán)限。 |
-s(--superuser) |
新角色為超級(jí)用戶。 |
-S(--no-superuser) |
新角色不是超級(jí)用戶。 |
-h(--host=host) |
指定PostgreSQL服務(wù)器的主機(jī)名。 |
-p(--port=port) |
指定服務(wù)器的監(jiān)聽端口,如不指定,則為缺省的5432。 |
-U(--username=username) |
本次操作的登錄用戶名。 |
-w(--no-password) |
如果當(dāng)前登錄用戶沒有密碼,可以指定該選項(xiàng)直接登錄。 |
2. 應(yīng)用示例:
復(fù)制代碼 代碼如下:
# 對(duì)于有些沒有缺省設(shè)置的選項(xiàng),如-(d/D)、-(s/S)和-(r/R),如果在命令行中沒有直接指定,那么在執(zhí)行該命令是將會(huì)給出提示信息。
# 需要注意的是該提示將會(huì)掛起自動(dòng)化腳本,直到輸入后命令才會(huì)繼續(xù)執(zhí)行。
/> createuser -U postgres myuser
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n
CREATE ROLE myuser NOSUPERUSER CREATEDB NOCREATEROLE INHERIT LOGIN;
# 通過psql登錄后查看系統(tǒng)視圖,以驗(yàn)證該用戶是否成功創(chuàng)建,以及新角色的權(quán)限是否正確。
/> psql
postgres=# SELECT rolname,rolsuper,rolinherit,rolcreaterole,rolcreatedb,rolcanlogin FROM pg_roles WHERE rolname = 'myuser';
rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin
---------+----------+------------+---------------+-------------+-------------
myuser | f | t | f | t | t
(1 row)
# 為了保證自動(dòng)化腳本不會(huì)被該命令的提示掛起,我們需要在執(zhí)行該命令時(shí)指定所有沒有缺省值的選項(xiàng)。
/> createuser -U postgres -e -S -D -R myuser2
CREATE ROLE myuser2 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;
# 我們可以在創(chuàng)建用戶時(shí)即刻指定該用戶的密碼,該操作由-P選項(xiàng)完成,然而這樣的用法一定會(huì)掛起自動(dòng)化腳本,
# 因此我們可以采用一種折中的辦法,即在創(chuàng)建用戶時(shí)不指定密碼,在自動(dòng)化腳本執(zhí)行成功后再手工該用戶的密碼。
/> createuser -P -s -e myuser3
Enter password for new role:
Enter it again:
CREATE ROLE myuser3 PASSWORD 'md5fe54c4f3129f2a766f53e4f4c9d2a698' SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN;
六、dropuser:
刪除一個(gè)PostgreSQL用戶帳戶,需要說明的是只有超級(jí)用戶或帶有CREATEROLE權(quán)限的用戶可以執(zhí)行該命令,如果要?jiǎng)h除超級(jí)用戶,只能通過超級(jí)用戶的身份執(zhí)行該命令。該命令的使用方式如下:
復(fù)制代碼 代碼如下:
dropuser [option...] [username]
1. 命令行選項(xiàng)列表:
選項(xiàng) |
說明 |
-e(--echo) |
回顯dropuser生成的命令并且把它發(fā)送到服務(wù)器。 |
-i(--interactive) |
在做任何破壞性動(dòng)作前提示。 |
-h(--host=host) |
指定PostgreSQL服務(wù)器的主機(jī)名。 |
-p(--port=port) |
指定服務(wù)器的監(jiān)聽端口,如不指定,則為缺省的5432。 |
-U(--username=username) |
本次操作的登錄用戶名。 |
2. 應(yīng)用示例:
復(fù)制代碼 代碼如下:
# 直接刪除指定用戶。
/> dropuser -e myuser3
DROP ROLE myuser3;
# 在刪除指定用戶時(shí),該命令會(huì)給出提示信息,以免誤操作。
/> dropuser -e -i myuser2
Role "myuser2" will be permanently removed.
Are you sure? (y/n) y
DROP ROLE myuser2;
您可能感興趣的文章:- PostgreSQL教程(十八):客戶端命令(2)
- PostgreSql新手必學(xué)入門命令小結(jié)
- 15個(gè)postgresql數(shù)據(jù)庫實(shí)用命令分享
- PostgreSQL copy 命令教程詳解