### [PostgreSQL學習手冊(客戶端命令<一>)](http://www.cnblogs.com/stephen-liu74/archive/2012/05/30/2306493.html)
Posted on?2012-05-30 09:02?[Stephen_Liu](http://www.cnblogs.com/stephen-liu74/)?閱讀(1496) 評論(1)?[編輯](http://www.cnblogs.com/stephen-liu74/admin/EditPosts.aspx?postid=2306493)?[收藏](http://www.cnblogs.com/stephen-liu74/archive/2012/05/30/2306493.html#)?
**零、口令文件:
****
?? ?**在給出其它PostgreSQL客戶端命令之前,我們需要先介紹一下PostgreSQL中的口令文件。之所以在這里提前說明該文件,是因為我們在后面的示例代碼中會大量應用該文件,從而保證我們的腳本能夠自動化完成。換句話說,如果在客戶端命令執行時沒有提供該文件,PostgreSQL的所有客戶端命令均會被口令輸入提示中斷。
?? ?在當前用戶的HOME目錄下,我們需要手工創建文件名為 .pgpass的口令文件,這樣就可以在我們連接PostgreSQL服務器時,客戶端命令自動讀取該文件已獲得登錄時所需要的口令信息。該文件的格式如下:
?? ?**hostname:port:database:username:password**
?? ?以上數據是用冒號作為分隔符,總共分為五個字段,分別表示服務器主機名(IP)、服務器監聽的端口號、登錄訪問的數據庫名、登錄用戶名和密碼,其中前四個字段都可以使用星號(*)來表示匹配任意值。見如下示例:
?? ?*/> cat > .pgpass*
*?? ?*:5432:postgres:postgres:123456*
**?? ?CTRL+D**
*?? ?#.pgpass文件的權限必須為0600,從而防止任何全局或者同組的用戶訪問,否則這個文件將被忽略。*
?? ?*/> chmod 0600 .pgpass*
?? ?在學習后面的客戶端命令之前,我們需要根據自己的應用環境手工創建該文件,以便后面所有的示例代碼都會用到該口令文件,這樣它們就都可以以批處理的方式自動完成。**
一、createdb:**
?? ?創建一個新的PostgreSQL數據庫。該命令的使用方式如下:
?? ?createdb [option...] [dbname] [description]
?? ?1. 命令行選項列表:
| **選項** | **說明** |
|-----|-----|
| -D(--tablespace=tablespace) | 指定數據庫的缺省表空間。 |
| -e(--echo) | 回顯createdb生成的命令并且把它發送到服務器。 |
| -E(--encoding=encoding) | 指定用于此數據庫的字符編碼方式。 |
| -l(--locale=locale) | 指定用于此數據庫的本地化設置。 |
| -O(--owner=owner) | 指定新建數據庫的擁有者,如果未指定此選項,該值為當前登錄的用戶。 |
| -T(--template=template) | 指定創建此數據庫的模板數據庫。 |
| -h(--host=host) | 指定PostgreSQL服務器的主機名。 |
| -p(--port=port) | 指定服務器的偵聽端口,如不指定,則為缺省的5432。 |
| -U(--username=username) | 本次操作的登錄用戶名,如果-O選項沒有指定,此數據庫的Owner將為該登錄用戶。 |
| -w(--no-password) | 如果當前登錄用戶沒有密碼,可以指定該選項直接登錄。 |
??? 2. 應用示例:
????*#1. 以postgres的身份登錄。(詳情參照上面口令文件的內容)?? ?*
*?? ?/> psql*
*?? ?#2. 創建表空間。*
*?? ?postgres=# CREATE TABLESPACE my_tablespace LOCATION '/opt/PostgreSQL/9.1/mydata';*
?? ?CREATE TABLESPACE
*?? ?#3. 創建新數據庫的owner。*
*?? ?postgres=# CREATE ROLE myuser LOGIN PASSWORD '123456';*
?? ?CREATE ROLE
*?? ?postgres=# \q*
*?? ?#4. 創建新數據庫,其中本次連接的登錄用戶為postgres,新數據庫的owner為myuser,表空間為my_tablespace,新數據庫名為mydatabase。*
*?? ?/> createdb?**-U**?postgres?**-O**?myuser?**-D**?my_tablespace?**-e**?**mydatabase***
?? ?CREATE DATABASE mydatabase OWNER myuser TABLESPACE my_tablespace;
*?? ?#5. 重新登錄,通過查詢系統表查看該數據庫是否創建成功,以及表空間和所有者是否一致。*
*?? ?/> 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:**
?? ?刪除一個現有PostgreSQL數據庫。
?? ?dropdb [option...] dbname
??? 1. 命令行選項列表:
| **選項** | **說明** |
|-----|-----|
| -e(--echo) | 回顯dropdb生成的命令并且把它發送到服務器。 |
| -i(--interactive) | 在做任何破壞性動作前提示。 |
| -q(--quiet) | 不顯示響應。 |
| -h(--host=host) | 指定PostgreSQL服務器的主機名。 |
| -p(--port=port) | 指定服務器的監聽端口,如不指定,則為缺省的5432。 |
| -U(--username=username) | 本次操作的登錄用戶名。 |
| -w(--no-password) | 如果當前登錄用戶沒有密碼,可以指定該選項直接登錄。 |
??? 2. 應用示例:
*?? ?#以postgres的身份連接服務器,刪除mydatabase數據庫。*
*?? ?/> dropdb?**-U**?postgres?**-e**?**mydatabase***
?? ?DROP DATABASE mydatabase;
*?? ?#通過查看系統表驗證該數據庫是否已經被刪除。*
*?? ?/> psql*
*?? ?postgres=# SELECT count(*) FROM pg_database WHERE datname = 'mydatabase';*
?? ? count
?? ?-------
?? ????? 0
?? ?(1 row)
**三、reindexdb:**
?? ?為一個指定的PostgreSQL數據庫重建索引。
?? ?reindexdb [connection-option...] [--table | -t table ] [--index | -i index ] [dbname]
?? ?reindexdb [connection-option...] [--all | -a]
?? ?reindexdb [connection-option...] [--system | -s] [dbname]
??? 1. 命令行選項列表:
| **選項** | **說明** |
|-----|-----|
| -a(-all) | 重建整個數據庫的索引。 |
| -e(--echo) | 回顯reindexdb生成的命令并且把它發送到服務器。 |
| -i(--index=index) | 僅重建指定的索引。 |
| -q(--quiet) | 不顯示響應。 |
| -s(--system) | 重建數據庫系統表的索引。 |
| -t(--table=table) | 僅重建指定數據表的索引。 |
| -h(--host=host) | 指定PostgreSQL服務器的主機名。 |
| -p(--port=port) | 指定服務器的監聽端口,如不指定,則為缺省的5432。 |
| -U(--username=username) | 本次操作的登錄用戶名。 |
| -w(--no-password) | 如果當前登錄用戶沒有密碼,可以指定該選項直接登錄。 |
??? 2. 應用示例: ?
*?? ?#僅重建數據表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;?? ?
*?? ?#重建指定數據庫mydatabase的全部索引。*
*?? ?/> reindexdb mydatabase*
**四、vacuumdb:**
?? ?收集垃圾并且分析一個PostgreSQL數據庫。
?? ?vacuumdb [-options] [--full | -f] [--verbose | -v] [--analyze | -z] [-t table [(column [,...])]] [dbname]
?? ?vacuumdb [-options] [--all | -a] [--full | -f] [--verbose | -v] [--analyze | -z]
??? 1. 命令行選項列表:
| **選項** | **說明** |
|-----|-----|
| -a(--all) | 清理所有數據庫。 |
| -e(--echo) | 回顯vacuumdb生成的命令并且把它發送到服務器。 |
| -f(--full) | 執行完全清理。 |
| -q(--quiet) | 不顯示響應。 |
| -t?*table*?[(*column*[,...])] | 僅僅清理或分析指定的數據表,字段名只是在與--analyze選項聯合使用時才需要聲明。 |
| -v(--verbose) | 在處理過程中打印詳細信息。 |
| -z(--analyze) | 計算用于規劃器的統計值。 |
| -h(--host=host) | 指定PostgreSQL服務器的主機名。 |
| -p(--port=port) | 指定服務器的監聽端口,如不指定,則為缺省的5432。 |
| -U(--username=username) | 本次操作的登錄用戶名。 |
| -w(--no-password) | 如果當前登錄用戶沒有密碼,可以指定該選項直接登錄。 |
??? 2. 應用示例:
*??? #清理整個數據庫mydatabase。 ?*
*?? ?/> vacuumdb -e mydatabase*
?? ?VACUUM;
*?? ?#清理并分析postgres數據庫中的testtable表。*
*?? ?/> vacuumdb -e --analyze --table 'testtable' postgres*
?? ?VACUUM ANALYZE testtable;
*?? ?#清理并分析postgres數據庫中的testtable表的i字段。*
*?? ?/> vacuumdb -e --analyze -t 'testtable(i)' postgres*
?? ?VACUUM ANALYZE testtable(i);
**五、createuser:**
?? ?定義一個新的PostgreSQL用戶帳戶,需要說明的是只有超級用戶或者是帶有CREATEROLE權限的用戶才可以執行該命令。如果希望創建的是超級用戶,那么只能以超級用戶的身份執行該命令,換句話說,帶有CREATEROLE權限的普通用戶無法創建超級用戶。該命令的使用方式如下:
??? createuser [option...] [username]
??? 1. 命令行選項列表:
| **選項** | **說明** |
|-----|-----|
| -c?number | 設置新創建用戶的最大連接數,缺省為沒有限制。 |
| -d(--createdb) | 允許該新建用戶創建數據庫。 |
| -D(--no-createdb) | 禁止該新建用戶創建數據庫。 |
| -e(--echo) | 回顯createuser生成的命令并且把它發送到服務器。 |
| -E(--encrypted) | 對保存在數據庫里的用戶口令加密。如果沒有聲明, 則使用缺省值。 |
| -i(--inherit) | 新創建的角色將自動繼承它的組角色的權限。 |
| -I(--no-inherit) | 新創建的角色不會自動繼承它的組角色的權限。 |
| -l(--login) | 新角色將被授予登錄權限,該選項為缺省選項。 |
| -L(--no-login) | 新角色沒有被授予登錄權限。 |
| -N(--unencrypted) | 不對保存在數據庫里的用戶口令加密。如果沒有聲明, 則使用缺省值。 |
| -P(--pwprompt) | 如果給出該選項,在創建用戶時將提示設置口令。 |
| -r(--createrole) | 新角色被授予創建數據庫的權限。 |
| -R(--no-createrole) | 新角色沒有被授予創建數據庫的權限。 |
| -s(--superuser) | 新角色為超級用戶。 |
| -S(--no-superuser) | 新角色不是超級用戶。 |
| -h(--host=host) | 指定PostgreSQL服務器的主機名。 |
| -p(--port=port) | 指定服務器的監聽端口,如不指定,則為缺省的5432。 |
| -U(--username=username) | 本次操作的登錄用戶名。 |
| -w(--no-password) | 如果當前登錄用戶沒有密碼,可以指定該選項直接登錄。 |
??? 2. 應用示例:
*?? ?# 對于有些沒有缺省設置的選項,如-(d/D)、-(s/S)和-(r/R),如果在命令行中沒有直接指定,那么在執行該命令是將會給出提示信息。*
*?? ?# 需要注意的是該提示將會掛起自動化腳本,直到輸入后命令才會繼續執行。*
*?? ?/> 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登錄后查看系統視圖,以驗證該用戶是否成功創建,以及新角色的權限是否正確。*
*?? ?/> 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)
*?? ?# 為了保證自動化腳本不會被該命令的提示掛起,我們需要在執行該命令時指定所有沒有缺省值的選項。*
*?? ?/> createuser -U postgres -e -S -D -R myuser2*
?? ?CREATE ROLE myuser2 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;
*?? ?# 我們可以在創建用戶時即刻指定該用戶的密碼,該操作由-P選項完成,然而這樣的用法一定會掛起自動化腳本,*
*?? ?# 因此我們可以采用一種折中的辦法,即在創建用戶時不指定密碼,在自動化腳本執行成功后再手工該用戶的密碼。*
*?? ?/> createuser -P -s -e myuser3*
?? ?Enter password for new role:
?? ?Enter it again:
?? ?CREATE ROLE myuser3 PASSWORD 'md5fe54c4f3129f2a766f53e4f4c9d2a698' SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN;
**六、dropuser:**
?? ?刪除一個PostgreSQL用戶帳戶,需要說明的是只有超級用戶或帶有CREATEROLE權限的用戶可以執行該命令,如果要刪除超級用戶,只能通過超級用戶的身份執行該命令。該命令的使用方式如下:
??? dropuser [option...] [username]
??? 1. 命令行選項列表:
| 選項 | 說明 |
|-----|-----|
| -e(--echo) | 回顯dropuser生成的命令并且把它發送到服務器。 |
| -i(--interactive) | 在做任何破壞性動作前提示。 |
| -h(--host=host) | 指定PostgreSQL服務器的主機名。 |
| -p(--port=port) | 指定服務器的監聽端口,如不指定,則為缺省的5432。 |
| -U(--username=username) | 本次操作的登錄用戶名。 |
| -w(--no-password) | 如果當前登錄用戶沒有密碼,可以指定該選項直接登錄。 |
????2. 應用示例:
*?? ?# 直接刪除指定用戶。*
*?? ?/> dropuser -e myuser3*
?? ?DROP ROLE myuser3;
*?? ?# 在刪除指定用戶時,該命令會給出提示信息,以免誤操作。*
*?? ?/> dropuser -e -i myuser2*
?? ?Role "myuser2" will be permanently removed.
?? ?Are you sure? (y/n)?**y**
?? ?DROP ROLE myuser2;
分類:?[PostgreSQL](http://www.cnblogs.com/stephen-liu74/category/343171.html)
- 數據表
- 模式Schema
- 表的繼承和分區
- 常用數據類型
- 函數和操作符-一
- 函數和操作符-二
- 函數和操作符-三
- 索引
- 事物隔離
- 性能提升技巧
- 服務器配置
- 角色和權限
- 數據庫管理
- 數據庫維護
- 系統表
- 系統視圖
- SQL語言函數
- PL-pgSQL過程語言
- PostgreSQL 序列(SEQUENCE)
- PostgreSQL的時間-日期函數使用
- PostgreSQL 查看數據庫,索引,表,表空間大小
- 用以查詢某表的詳細 包含表字段的注釋信息
- PostgreSQL 系統表查看系統信息
- postgre存儲過程簡單實用方法
- PostgreSQL實用日常維護SQL
- PostgreSQL的時間函數使用整理
- 命令
- pg_ctl控制服務器
- initdb 初始化數據庫簇
- createdb創建數據庫
- dropdb 刪除數據庫
- createuser創建用戶
- dropuser 刪除用戶
- psql交互式工具
- psql命令手冊
- pg_dump 數據庫轉儲
- pg_restore恢復數據庫
- vacuumdb 清理優化數據庫
- reindexdb 數據庫重創索引
- createlang 安裝過程語言
- droplang 刪除過程語言
- pg_upgrade 升級數據庫簇
- 調試存儲過程
- 客戶端命令-一
- 客戶端命令-二
- 使用技巧
- PostgreSQL刪除重復數據
- postgresql 小技巧
- PostgreSQL的10進制與16進制互轉
- PostgreSQL的漢字轉拼音
- Postgres重復數據的更新一例
- PostgreSQL使用with一例
- PostgreSQL在函數內返回returning
- PostgreSQL中的group_concat使用
- PostgreSQL數據庫切割和組合字段函數
- postgresql重復數據的刪除
- PostgreSQL的遞歸查詢(with recursive)
- PostgreSQL函數如何返回數據集
- PostgreSQL分區表(Table Partitioning)應用 - David_Tang - 博客園
- PostgreSQL: function 返回結果集多列和單列的例子
- 利用pgAgent創建定時任務
- 淺談 PostgreSQL 類型轉換類似Oracle
- postgresql在windows(包括win7)下的安裝配置
- PostgreSQL簡介、安裝、用戶管理、啟動關閉、創建刪除數據庫 (2010-11-08 12-52-51)轉載▼標簽: 雜談分類: PostgreSQL
- PostgreSQL的generate_series函數應用
- PostgreSQL 8.3.1 全文檢索(Full Text Search)
- postgresql record 使用
- 備份恢復
- PostgreSQL基于時間點恢復(PITR)
- Postgresql基于時間點恢復PITR案例(二)
- Postgres邏輯備份腳本
- Postgres invalid command \N數據恢復處理