1、PostgreSQL学习手册零、口令文件: 在 给出其它PostgreSQL客户端命令之前,我们需要先介绍一下PostgreSQL中的口令文件。之所以在这里提前说明该文件,是因为我们在后面的示 例代码中会大量应用该文件,从而保证我们的脚本能够自动化完成。换句话说,如果在客户端命令执行时没有提供该文件,PostgreSQL的所有客户端命令 均会被口令输入提示中断。 在当前用户的HOME目录下,我们需要手工创建文件名为 .pgpass的口令文件,这样就可以在我们连接PostgreSQL服务器时,客户端命令自动读取该文件已获得登录时所需要的口令信息。该文件的格式如下: hostname:port:d
2、atabase:username:password 以上数据是用冒号作为分隔符,总共分为五个字段,分别表示服务器主机名(IP)、服务器监听的端口号、登录访问的数据库名、登录用户名和密码,其中前四个字段都可以使用星号(*)来表示匹配任意值。见如下示例: / cat .pgpass *:5432:postgres:postgres:123456 CTRL+D #.pgpass文件的权限必须为0600,从而防止任何全局或者同组的用户访问,否则这个文件将被忽略。 / chmod 0600 .pgpass 在学习后面的客户端命令之前,我们需要根据自己的应用环境手工创建该文件, 以便后面所有的示例代码都会
3、用到该口令文件,这样它们就都可以以批处理的方式自动完成。一、createdb: 创建一个新的PostgreSQL数据库。该命令的使用方式如下: createdb option. dbname description 1. 命令行选项列表:选项说明-D(-tablespace=tablespace)指定数据库的缺省表空间。-e(-echo)回显createdb生成的命令并且把它发送到服务器。-E(-encoding=encoding)指定用于此数据库的字符编码方式。-l(-locale=locale)指定用于此数据库的本地化设置。-O(-owner=owner)指定新建数据库的拥有者,如果未指定
4、此选项,该值为当前登录的用户。 -T(-template=template)指定创建此数据库的模板数据库。-h(-host=host)指定PostgreSQL服务器的主机名。-p(-port=port)指定服务器的侦听端口,如不指定,则为缺省的5432。-U(-username=username)本次操作的登录用户名,如果-O选项没有指定,此数据库的Owner将为该登录用户。-w(-no-password)如果当前登录用户没有密码,可以指定该选项直接登录。 2. 应用示例: #1. 以postgres的身份登录。(详情参照上面口令文件的内容) / psql #2. 创建表空间。 postgre
5、s=# CREATE TABLESPACE my_tablespace LOCATION /opt/PostgreSQL/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 myus
6、er -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 = AND dattablespa
7、ce = ; 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)指定服务器的监听端口,如不指定,则为缺省的
8、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
9、 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
10、(-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 REIN
11、DEX 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 vacuum
12、db -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服务器
13、的主机名。-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; #清理并分析postgr
14、es数据库中的testtable表的i字段。 / vacuumdb -e -analyze -t testtable(i) postgres VACUUM ANALYZE testtable(i);五、createuser: 定义一个新的PostgreSQL用户帐户,需要说明的是只有超级用户或者是带有CREATEROLE权限的用户才可以执行该命令。如果希望创建的是超级用户,那么只能以超级用户的身份执行该命令,换句话说,带有CREATEROLE权限的普通用户无法创建超级用户。该命令的使用方式如下: createuser option. username 1. 命令行选项列表:选项说明-c num
15、ber设置新创建用户的最大连接数,缺省为没有限制。-d(-createdb)允许该新建用户创建数据库。-D(-no-createdb)禁止该新建用户创建数据库。 -e(-echo)回显createuser生成的命令并且把它发送到服务器。-E(-encrypted)对保存在数据库里的用户口令加密。如果没有声明, 则使用缺省值。 -i(-inherit)新创建的角色将自动继承它的组角色的权限。-I(-no-inherit)新创建的角色不会自动继承它的组角色的权限。-l(-login)新角色将被授予登录权限,该选项为缺省选项。-L(-no-login)新角色没有被授予登录权限。-N(-unencry
16、pted)不对保存在数据库里的用户口令加密。如果没有声明, 则使用缺省值。-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
17、-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
18、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
19、| 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; # 我们可以在创建用户时即刻指定该用户的密
20、码,该操作由-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用户帐户,
21、需要说明的是只有超级用户或带有CREATEROLE权限的用户可以执行该命令,如果要删除超级用户,只能通过超级用户的身份执行该命令。该命令的使用方式如下: dropuser option. username 1. 命令行选项列表:选项说明-e(-echo)回显dropuser生成的命令并且把它发送到服务器。-i(-interactive)在做任何破坏性动作前提示。 -h(-host=host)指定PostgreSQL服务器的主机名。-p(-port=port)指定服务器的监听端口,如不指定,则为缺省的5432。-U(-username=username)本次操作的登录用户名。-w(-no-pas
22、sword)如果当前登录用户没有密码,可以指定该选项直接登录。 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;七、pg_dump: pg_dump是一个用于备份PostgreSQL数据库的工具。它甚至可以在数据库正在并发使用时进行完整一致的备份,而不
23、会阻塞其它用户对数据库的访 问。该工具生成的转储格式可以分为两种,脚本和归档文件。其中脚本格式是包含许多SQL命令的纯文本格式,这些SQL命令可以用于重建该数据库并将之恢复 到生成此脚本时的状态,该操作需要使用psql来完成。至于归档格式,如果需要重建数据库就必须和pg_restore工具一起使用。在重建过程中,可以 对恢复的对象进行选择,甚至可以在恢复之前对需要恢复的条目进行重新排序。该命令的使用方式如下: pg_dump option. dbname 1. 命令行选项列表:选项说明-a(-data-only)只输出数据,不输出模式(数据对象的定义)。这个选项只是对纯文本格式有意义。对于归档
24、格式,你可以在调用 pg_restore时指定选项。 -b(-blobs)在dump中包含大对象。-c(-clean)在输出创建数据库对象的SQL命令之前,先输出删除该数据库对象的SQL命令。这个选项只是对纯文本格式有意义。对于归档格式,你可以在调用 pg_restore时指定选项。 -C(-create)先输出创建数据库的命令,之后再重新连接新创建的数据库。对于此种格式的脚本,在运行之前是和哪个数据库进行连接就不这么重要了。这个选项只是对纯文本格式有意义。对于归档格式,你可以在调用pg_restore时指定选项。-E encoding以指定的字符集创建该dump文件。-f file输出到指定
25、文件,如果没有该选项,则输出到标准输出。-F formatp(plain): 纯文本格式的SQL脚本文件(缺省)。c(custom): 输出适合于pg_restore的自定义归档格式。 这是最灵活的格式,它允许对装载的数据和对象定义进行重新排列。这个格式缺省的时候是压缩的。t(tar):输出适合于 pg_restore的tar归档文件。使用这个归档允许在恢复数据库时重新排序和/或把数据库对象排除在外。同i时也可能可以在恢复的时候限制对哪些数据进行恢复。-n schema只转储schema的内容。如果没有声明该选项,目标数据库中的所有非系统模式都会被转储。该选项也可以被多次指定,以指定不同pat
26、tern的模式。-N schema不转储匹配schema的内容,其他规则和-n一致。-o(-oids)作为数据的一部分,为每个表都输出对象标识(OID)。-O(-no-owner)不输出设置对象所有权的SQL命令。-s(-schema-only)只输出对象定义(模式),不输出数据。 -S username指定关闭触发器时需要用到的超级用户名。它只有在使用-disable-triggers的时候才有关系。-t table只输出表的数据。很可能在不同模式里面有多个同名表,如果这样,那么所有匹配的表都将被转储。通过多次指定该参数,可以一次转储多张表。这里还可以指定和psql一样的pattern,以便
27、匹配更多的表。(关 于pattern,基本的使用方式是可以将它视为unix的通配符,即*表示任意字符,?表示任意单个字符,.(dot)表示schema和object 之间的分隔符,如a*.b*,表示以a开头的schema和以b开头的数据库对象。如果没有.(dot),将只是表示数据库对象。这里也可以使用基本的正 则表达式,如0-9表示数字。)-T table排除指定的表,其他规则和-t选项一致。-x(-no-privileges)不导出访问权限信息(grant/revoke命令)。-Z 0.9声明在那些支持压缩的格式中使用的压缩级别。 (目前只有自定义格式支持压缩)-column-inserts
28、导出数据用insert into table_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
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1