服务器之家

服务器之家 > 正文

PostgreSQL教程(十七):客户端命令(1)

时间:2020-04-28 14:29     来源/作者:PostgreSQL教程网

零、口令文件:

    在给出其它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)

本次操作的登录用户名。

 

  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;
 

相关文章

热门资讯

沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意 2019-07-07
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
超A是什么意思 你好a表达的是什么
超A是什么意思 你好a表达的是什么 2019-06-06
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情 2019-06-22
返回顶部