PostgreSQL学习手册.docx
《PostgreSQL学习手册.docx》由会员分享,可在线阅读,更多相关《PostgreSQL学习手册.docx(23页珍藏版)》请在冰点文库上搜索。
PostgreSQL学习手册
零、口令文件:
在给出其它PostgreSQL客户端命令之前,我们需要先介绍一下PostgreSQL中的口令文件。
之所以在这里提前说明该文件,是因为我们在后面的示例代码中会大量应用该文件,从而保证我们的脚本能够自动化完成。
换句话说,如果在客户端命令执行时没有提供该文件,PostgreSQL的所有客户端命令均会被口令输入提示中断。
在当前用户的HOME目录下,我们需要手工创建文件名为.pgpass的口令文件,这样就可以在我们连接PostgreSQL服务器时,客户端命令自动读取该文件已获得登录时所需要的口令信息。
该文件的格式如下:
hostname:
port:
database:
username:
password
以上数据是用冒号作为分隔符,总共分为五个字段,分别表示服务器主机名(IP)、服务器监听的端口号、登录访问的数据库名、登录用户名和密码,其中前四个字段都可以使用星号(*)来表示匹配任意值。
见如下示例:
/>cat>.pgpass
*:
5432:
postgres:
postgres:
123456
CTRL+D
#.pgpass文件的权限必须为0600,从而防止任何全局或者同组的用户访问,否则这个文件将被忽略。
/>chmod0600.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=#CREATETABLESPACEmy_tablespaceLOCATION'/opt/PostgreSQL/mydata';
CREATETABLESPACE
#3.创建新数据库的owner。
postgres=#CREATEROLEmyuserLOGINPASSWORD'123456';
CREATEROLE
postgres=#\q
#4.创建新数据库,其中本次连接的登录用户为postgres,新数据库的owner为myuser,表空间为my_tablespace,新数据库名为mydatabase。
/>createdb-Upostgres-Omyuser-Dmy_tablespace-emydatabase
CREATEDATABASEmydatabaseOWNERmyuserTABLESPACEmy_tablespace;
#5.重新登录,通过查询系统表查看该数据库是否创建成功,以及表空间和所有者是否一致。
/>psql
postgres=#SELECTdatname,rolname,spcnameFROMpg_databasedb,pg_authidau,pg_tablespacetsWHEREdatname='mydatabase'ANDdatdba=ANDdattablespace=;
datname |rolname| spcname
------------+---------+---------------
mydatabase|myuser |my_tablespace
(1row)
二、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-Upostgres-emydatabase
DROPDATABASEmydatabase;
#通过查看系统表验证该数据库是否已经被删除。
/>psql
postgres=#SELECTcount(*)FROMpg_databaseWHEREdatname='mydatabase';
count
-------
0
(1row)
三、reindexdb:
为一个指定的PostgreSQL数据库重建索引。
reindexdb[connection-option...][--table|-ttable][--index|-iindex][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-ttesttable-e-Upostgrespostgres
REINDEXTABLEtesttable;
#仅重建指定索引testtable_idx
/>reindexdb-itesttable_idx-e-Upostgrespostgres
REINDEXINDEXtesttable_idx;
#重建指定数据库mydatabase的全部索引。
/>reindexdbmydatabase
四、vacuumdb:
收集垃圾并且分析一个PostgreSQL数据库。
vacuumdb[-options][--full|-f][--verbose|-v][--analyze|-z][-ttable[(column[,...])]][dbname]
vacuumdb[-options][--all|-a][--full|-f][--verbose|-v][--analyze|-z]
1.命令行选项列表:
选项
说明
-a(--all)
清理所有数据库。
-e(--echo)
回显vacuumdb生成的命令并且把它发送到服务器。
-f(--full)
执行完全清理。
-q(--quiet)
不显示响应。
-ttable[(column[,...])]
仅仅清理或分析指定的数据表,字段名只是在与--analyze选项联合使用时才需要声明。
-v(--verbose)
在处理过程中打印详细信息。
-z(--analyze)
计算用于规划器的统计值。
-h(--host=host)
指定PostgreSQL服务器的主机名。
-p(--port=port)
指定服务器的监听端口,如不指定,则为缺省的5432。
-U(--username=username)
本次操作的登录用户名。
-w(--no-password)
如果当前登录用户没有密码,可以指定该选项直接登录。
2.应用示例:
#清理整个数据库mydatabase。
/>vacuumdb-emydatabase
VACUUM;
#清理并分析postgres数据库中的testtable表。
/>vacuumdb-e--analyze--table'testtable'postgres
VACUUMANALYZEtesttable;
#清理并分析postgres数据库中的testtable表的i字段。
/>vacuumdb-e--analyze-t'testtable(i)'postgres
VACUUMANALYZEtesttable(i);
五、createuser:
定义一个新的PostgreSQL用户帐户,需要说明的是只有超级用户或者是带有CREATEROLE权限的用户才可以执行该命令。
如果希望创建的是超级用户,那么只能以超级用户的身份执行该命令,换句话说,带有CREATEROLE权限的普通用户无法创建超级用户。
该命令的使用方式如下:
createuser[option...][username]
1.命令行选项列表:
选项
说明
-cnumber
设置新创建用户的最大连接数,缺省为没有限制。
-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-Upostgresmyuser
Shallthenewrolebeasuperuser?
(y/n)n
Shallthenewrolebeallowedtocreatedatabases?
(y/n)y
Shallthenewrolebeallowedtocreatemorenewroles?
(y/n)n
CREATEROLEmyuserNOSUPERUSERCREATEDBNOCREATEROLEINHERITLOGIN;
#通过psql登录后查看系统视图,以验证该用户是否成功创建,以及新角色的权限是否正确。
/>psql
postgres=#SELECTrolname,rolsuper,rolinherit,rolcreaterole,rolcreatedb,rolcanloginFROMpg_rolesWHERErolname='myuser';
rolname|rolsuper|rolinherit|rolcreaterole|rolcreatedb|rolcanlogin
---------+----------+------------+---------------+-------------+-------------
myuser |f |t |f |t |t
(1row)
#为了保证自动化脚本不会被该命令的提示挂起,我们需要在执行该命令时指定所有没有缺省值的选项。
/>createuser-Upostgres-e-S-D-Rmyuser2
CREATEROLEmyuser2NOSUPERUSERNOCREATEDBNOCREATEROLEINHERITLOGIN;
#我们可以在创建用户时即刻指定该用户的密码,该操作由-P选项完成,然而这样的用法一定会挂起自动化脚本,
#因此我们可以采用一种折中的办法,即在创建用户时不指定密码,在自动化脚本执行成功后再手工该用户的密码。
/>createuser-P-s-emyuser3
Enterpasswordfornewrole:
Enteritagain:
CREATEROLEmyuser3PASSWORD'md5fe54c4f3129f2a766f53e4f4c9d2a698'SUPERUSERCREATEDBCREATEROLEINHERITLOGIN;
六、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-emyuser3
DROPROLEmyuser3;
#在删除指定用户时,该命令会给出提示信息,以免误操作。
/>dropuser-e-imyuser2
Role"myuser2"willbepermanentlyremoved.
Areyousure?
(y/n)y
DROPROLEmyuser2;
七、pg_dump:
pg_dump是一个用于备份PostgreSQL数据库的工具。
它甚至可以在数据库正在并发使用时进行完整一致的备份,而不会阻塞其它用户对数据库的访问。
该工具生成的转储格式可以分为两种,脚本和归档文件。
其中脚本格式是包含许多SQL命令的纯文本格式,这些SQL命令可以用于重建该数据库并将之恢复到生成此脚本时的状态,该操作需要使用psql来完成。
至于归档格式,如果需要重建数据库就必须和pg_restore工具一起使用。
在重建过程中,可以对恢复的对象进行选择,甚至可以在恢复之前对需要恢复的条目进行重新排序。
该命令的使用方式如下:
pg_dump[option...][dbname]
1.命令行选项列表:
选项
说明
-a(--data-only)
只输出数据,不输出模式(数据对象的定义)。
这个选项只是对纯文本格式有意义。
对于归档格式,你可以在调用pg_restore时指定选项。
-b(--blobs)
在dump中包含大对象。
-c(--clean)
在输出创建数据库对象的SQL命令之前,先输出删除该数据库对象的SQL命令。
这个选项只是对纯文本格式有意义。
对于归档格式,你可以在调用pg_restore时指定选项。
-C(--create)
先输出创建数据库的命令,之后再重新连接新创建的数据库。
对于此种格式的脚本,在运行之前是和哪个数据库进行连接就不这么重要了。
这个选项只是对纯文本格式有意义。
对于归档格式,你可以在调用pg_restore时指定选项。
-Eencoding
以指定的字符集创建该dump文件。
-ffile
输出到指定文件,如果没有该选项,则输出到标准输出。
-Fformat
p(plain):
纯文本格式的SQL脚本文件(缺省)。
c(custom):
输出适合于pg_restore的自定义归档格式。
这是最灵活的格式,它允许对装载的数据和对象定义进行重新排列。
这个格式缺省的时候是压缩的。
t(tar):
输出适合于pg_restore的tar归档文件。
使用这个归档允许在恢复数据库时重新排序和/或把数据库对象排除在外。
同i时也可能可以在恢复的时候限制对哪些数据进行恢复。
-nschema
只转储schema的内容。
如果没有声明该选项,目标数据库中的所有非系统模式都会被转储。
该选项也可以被多次指定,以指定不同pattern的模式。
-Nschema
不转储匹配schema的内容,其他规则和-n一致。
-o(--oids)
作为数据的一部分,为每个表都输出对象标识(OID)。
-O(--no-owner)
不输出设置对象所有权的SQL命令。
-s(--schema-only)
只输出对象定义(模式),不输出数据。
-Susername
指定关闭触发器时需要用到的超级用户名。
它只有在使用--disable-triggers的时候才有关系。
-ttable
只输出表的数据。
很可能在不同模式里面有多个同名表,如果这样,那么所有匹配的表都将被转储。
通过多次指定该参数,可以一次转储多张表。
这里还可以指定和psql一样的pattern,以便匹配更多的表。
(关于pattern,基本的使用方式是可以将它视为unix的通配符,即*表示任意字符,?
表示任意单个字符,.(dot)表示schema和object之间的分隔符,如a*.b*,表示以a开头的schema和以b开头的数据库对象。
如果没有.(dot),将只是表示数据库对象。
这里也可以使用基本的正则表达式,如[0-9]表示数字。
)
-Ttable
排除指定的表,其他规则和-t选项一致。
-x(--no-privileges)
不导出访问权限信息(grant/revoke命令)。
-Z0..9
声明在那些支持压缩的格式中使用的压缩级别。
(目前只有自定义格式支持压缩)
--column-inserts
导出数据用insertintotable_name(columns_list)values(values_list)命令表示,这样的操作相对其它操作而言是比较慢的,但是在特殊情况下,如数据表字段的位置有可能发生变化或有新的字段插入到原有字段列表的中间等。
由于columns_list被明确指定,因此在导入时不会出现数据被导入到错误字段的问题。
--inserts
导出的数据用insert命令表示,而不是copy命令。
即便使用insert要比copy慢一些,但是对于今后导入到其他非PostgreSQL的数据库是比较有意义的。
--no-tablespaces
不输出设置表空间的命令,如果带有这个选项,所有的对象都将恢复到执行pg_restore时的缺省表空间中。
--no-unlogged-table-data
对于不计入日志(unlogged)的数据表,不会导出它的数据,至于是否导出其Schema信息,需要依赖其他的选项而定。
-h(--host=host)
指定PostgreSQL服务器的主机名。
-p(--port=por