UNVDB基础之数据库管理

常用的命令及解释

unvdb 常用命令

ud_sql 工具是 unvdb 提供的一个客户端程序。您能使用 ud_sql 工具管理 unvdb 数据库服务器。 本文整理了常用的 ud_sql 命令,以便您能够更加有效的管理unvdb 数据库服务器。

连接 UNVDB

要使用 ud_sql 工具管理 unvdb 服务器,请先连接到 unvdb 服务器。 命令如下:

ud_sql -d dbname -U  user -W

如果您需要连接一个远程的 unvdb 服务器,请使用如下命令:

ud_sql -h host -p port -d dbname -U user -W 

其中:

  • -h 参数用于指定远程 unvdb 服务器的主机名或者 IP 地址。 默认值为 localhost

  • -p 参数用于指定远程 unvdb 服务器的端口号。默认值为 5678。

ud_sql 常用命令

当您使用 ud_sql 登录进 unvdb 服务器以后,您就可以使用下面的命令管理服务器了。

列出所有的数据库

要列出当前 unvdb 数据库服务器中的所有数据库,请使用 \l 或者 \l+ 命令:

\l

或者

\l+
连接到数据库,选择数据库

连接数据库请使用 \c 或者 \connect 命令。

要使用当前用户连接到新的数据库,请使用如下命令:

\c dbname

要使用新的用户连接到当前数据库,请使用如下命令:

\c - username

您可以是用 \connect 替换上面命令中的 \c,他们是等效的。

列出数据库中的表

要列出当前数据库中的表,请使用 \dt 或者 \dt+ 命令:

\dt

或者

\dt+
显示表结构

要显示一个表的结构或定义,比如 列,约束等信息,请使用 \d 命令:

\d table_name

比如,要查看 product 表的结构,请使用如下命令:

\d product
testdb=# \d product
                                 Table "public.product"
    Column    |       Type        | Collation | Nullable |           Default
--------------+-------------------+-----------+----------+------------------------------
 id           | integer           |           | not null | generated always as identity
 product_name | character varying |           | not null |
 attributes   | hstore            |           |          |
Indexes:
    "product_pkey" PRIMARY KEY, btree (id)
列出可用模式

要列出当前连接的数据库的所有模式,请使用该 \dn 命令。

\dn
  List of schemas
  Name  |  Owner
--------+----------
 public |  unvdb
列出可用的函数

要列出当前数据库中的可用函数,请使用该 \df 命令。

\df
                                                    List of functions
 Schema |           Name           |  Result data type  |                   Argument data types                   | Type
--------+--------------------------+--------------------+---------------------------------------------------------+------
 public | akeys                    | text[]             | hstore                                                  | func
 public | avals                    | text[]             | hstore                                                  | func
 public | defined                  | boolean            | hstore, text                                            | func
 public | delete                   | hstore             | hstore, hstore                                          | func
 public | delete                   | hstore             | hstore, text                                            | func
 public | delete                   | hstore             | hstore, text[]                                          | func
 ....
(65 rows)
列出可用视图

要列出当前数据库中的可用视图,请使用该 \dv 命令。

\dv
列出用户及其角色

要列出所有用户及其分配的角色s,请使用 \du 命令:

\du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
  unvdb    | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
开启查询执行时间

要打开查询执行时间,请使用该 \timing 命令。

\timing
select * from product;
 id | product_name |                          attributes
----+--------------+--------------------------------------------------------------
  2 | Shirt B      | "Color"=>"White", "Style"=>"Business", "Season"=>"Spring"
  1 | Computer A   | "CPU"=>"2.5", "Disk"=>"1T", "Brand"=>"Dell", "Memory"=>"16G"
(2 rows)

Time: 0.281 ms

当您再次运行 \timing 命令,则会关闭查询执行时间。

查看命令历史

要显示命令历史记录,请使用该 \s 命令。

\s

如果要将命令历史保存到文件中,则需要在 \s 命令后指定文件名 ,如下所示:

\s filename
执行上一条命令

要想执行最近的一条命令, 请使用 \g 命令:

\g

\g 可让你避免重新输入上一条命令。

获取 SQL 命令的帮助

要获取 SQL 命令的说明,请使用 \h 命令,如下:

\h sql_command

比如,要获取 TRUNCATE 的帮助说明,请使用如下的命令:

\h TRUNCATE
Command:     TRUNCATE
Description: empty a table or set of tables
Syntax:
TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ]
    [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]

URL: https://www.uvndb.org/docs/22/sql-truncate.html
获取 ud_sql 的帮助

要了解 ud_sql 命令的详细用法,请使用 \? 命令

\?
从文件中执行 ud_sql 命令

如果要从文件执行 ud_sql 命令,请 \i 按如下方式使用命令:

\i filename
打开扩展显示

要为 SELECT 语句的结果集打开扩展显示,请使用 \x 命令。

\x
select * from product;
-[ RECORD 1 ]+-------------------------------------------------------------
id           | 2
product_name | Shirt B
attributes   | "Color"=>"White", "Style"=>"Business", "Season"=>"Spring"
-[ RECORD 2 ]+-------------------------------------------------------------
id           | 1
product_name | Computer A
attributes   | "CPU"=>"2.5", "Disk"=>"1T", "Brand"=>"Dell", "Memory"=>"16G"

扩展显示对于显示那些很长的列很有帮助。

如果您再次运行 \x 命令。则回关闭扩展显示。

退出 unvdb

要退出 ud_sql,您可以使用 \q 命令并按下 enter(回车) 退出 ud_sql。

\q

快捷键也是可以的 ctrl+D 退出当前。

在 unvdb 中列出所有数据库

unvdb 提供了两种方法列出 unvdb 服务器中的所有数据库:

  • ud_sql 工具中使用 \l 或者 \l+ 列出所有的数据库。

  • pg_database 表中查询所有的数据库。

使用 \l 列出数据库

本实例演示了使用 ud_sql 工具登录数据库并列出数据库的步骤。请按照如下步骤进行:

  1. 使用 unvdb 用户登录 unvdb 服务器:

    ud_sql -U unvdb 
    ud_sql (2.4)
    Type "help" for help.
    

    注意:您也可以使用其他任何具有相应的数据库权限的用户登录。

  2. 使用 \l 命令列出所有的数据库,如下:

    \l
    
                                   List of databases
        Name     | Owner | Encoding |   Collate   |    Ctype    | Access privileges 
    -------------+-------+----------+-------------+-------------+-------------------
     sakila      | unvdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | 
     template0   | unvdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/unvdb         +
                 |       |          |             |             | unvdb=CTc/unvdb
     template1   | unvdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/unvdb         +
                 |       |          |             |             | unvdb=CTc/unvdb
     test_new_db | unvdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | 
     unvdb       | unvdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | 
    
  3. 如果要查看更多关于数据库的信息,请使用 \l+ 命令,如下:

    \l+
    
                                                                     List of databas
    es
        Name     | Owner | Encoding |   Collate   |    Ctype    | Access privileges 
    |  Size   | Tablespace |                Description                 
    -------------+-------+----------+-------------+-------------+-------------------
    +---------+------------+--------------------------------------------
     sakila      | unvdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 |                   
    | 8561 kB | pg_default | 
     template0   | unvdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/unvdb         +
    | 8561 kB | pg_default | unmodifiable empty database
                 |       |          |             |             | unvdb=CTc/unvdb   
    |         |            | 
     template1   | unvdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/unvdb         +
    | 8561 kB | pg_default | default template for new databases
                 |       |          |             |             | unvdb=CTc/unvdb   
    |         |            | 
     test_new_db | unvdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 |                   
    | 8833 kB | pg_default | 
     unvdb       | unvdb | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 |                   
    | 8561 kB | pg_default | default administrative connection database
    

您可以看到, \l+ 的输出比 \l 多了 Size, TablespaceDescription 列。

pg_database 表中查询数据库

除了上面的 \l+\l 命令,您还可以从 pg_database 表中查询所有的数据库。

pg_database 表是 unvdb 内置的一个表,它存储了所有的数据库。

SELECT datname FROM pg_database;
  
   datname   
-------------
 unvdb
 template1
 template0
 sakila
 test_new_db
(5 rows)

在 unvdb 中复制一个数据库

在 unvdb 中,您可以使用以下几种方法复制数据库:

  1. 使用 CREATE DATABASE从模板数据库复制一个数据库。此方法仅适用于在同一个 unvdb 服务器内操作。

  2. 备份一个现有的数据库,并将其恢复到一个新的数据库。

从模板数据库复制数据库

有时候,为了数据的安全性,您在操作之前需要先将要操作数据库复制备份。 您可以使用 CREATE DATABASE 将此数据库复制为一个新数据库,如下:

CREATE DATABASE new_db
WITH TEMPLATE old_db;

此语句将 复制 old_db 数据库到 new_db 数据库。 old_db 必须是模板数据库才能被复制。如果它不是模板数据库,您可以使用 ALTER DATABASE 语句将此数据库修改为模板数据库,如下:

ALTER DATABASE old_db WITH IS_TEMPLATE true;

此方法仅能用在同一个 unvdb 数据库服务器内。如果您想在不同的unvdb 数据库服务器间复制数据库,请查看 unvdb 备份和恢复教程。

查看数据库中对象的大小

作为数据库管理者,您经常需要查看数据库的占用空间,这包括 数据库、表、索引和表空间的大小,以便为他们分配合理的存储空间。

unvdb 数据库大小

您可以使用 pg_database_size() 函数获取整个数据库的大小。例如,以下语句返回 testdb 数据库的大小:

SELECT pg_database_size('test_new_db');
 pg_database_size 
------------------
          9044771
(1 row)

pg_database_size() 函数以字节为单位返回数据库的大小,这不容易阅读。您可以使用 pg_size_pretty() 函数将字节转为更易于阅读值。如下:

SELECT pg_size_pretty(pg_database_size('test_new_db'));

该语句返回以下结果:

 pg_size_pretty 
----------------
 8833 kB
(1 row)

如果您想要要获取当前数据库服务器中所有数据库的大小,请使用以下语句:

SELECT datname,pg_size_pretty(pg_database_size(datname)) AS size FROM pg_database;
   
   datname   |  size   
-------------+---------
 unvdb       | 8561 kB
 template1   | 8561 kB
 template0   | 8561 kB
 sakila      | 8561 kB
 test_new_db | 8833 kB
(5 rows)

unvdb 表大小

您可以使用 pg_relation_size() 函数获取一个表的大小。例如,以下语句返回 actor 表的大小:

SELECT pg_size_pretty(pg_relation_size('testdb'));
 
 pg_size_pretty 
----------------
 8192 bytes

pg_relation_size() 函数返回表的数据的大小,不包含表中的索引的大小。如果要获取表的总的大小,请使用 pg_total_relation_size() 函数, 如下:

SELECT pg_size_pretty(pg_total_relation_size('testdb'));
 
 pg_size_pretty 
----------------
 24 kB

要获取数据库中所有的表的大小,您可以使用如下语句:

SELECT relname AS tablename, pg_size_pretty(pg_total_relation_size(relid)) AS size FROM pg_stat_user_tables WHERE schemaname = 'public';

   tablename   |    size    
---------------+------------
 testdb        | 24 kB
 jjj           | 0 bytes
 huaji         | 24 kB
 sales         | 24 kB
 users         | 40 kB
 student       | 24 kB
 student_score | 8192 bytes
(7 rows)

unvdb 索引大小

unvdb pg_indexes_size() 函数用于获取一个指定表上的索引的大小。例如,要获取 actor 表的所有索引的总大小,请使用以下语句:

SELECT pg_size_pretty(pg_indexes_size('huaji'));
 
 pg_size_pretty 
----------------
 16 kB
(1 row)

unvdb 表空间大小

unvdb pg_tablespace_size() 函数用于获取一个指定的表空间的大小。

以下语句返回 pg_default 表空间的大小:

SELECT pg_size_pretty (pg_tablespace_size('pg_default'));
 
 pg_size_pretty 
----------------
 42 MB
(1 row)

unvdb 值大小

unvdb pg_column_size() 函数用于获取指定的值占用的空间,例如:

以下语句返回一个 smallint 类型的值的大小:

select pg_column_size(1::smallint);

 pg_column_size
----------------
              2

以下语句返回一个 int 类型的值的大小:

select pg_column_size(1::int);
 
 pg_column_size
----------------
              4

以下语句返回一个 bigint 类型的值的大小:

select pg_column_size(1::bigint);
 
 pg_column_size
----------------
              8

在 unvdb 中列出数据库中的表

unvdb 提供了两种方法列出一个数据库中的所有表:

  • ud_sql 工具中使用 \dt 或者 \dt+ 列出当前当前数据库中的所有的表。

  • pg_tables 表中查询所有的表。

使用 \dt 列出数据库中的表

本实例演示了使用 ud_sql 工具登录数据库并列出数据库中表的过程。请按照如下步骤进行:

  1. 使用 unvdb 用户登录unvdb 服务器:

    ud_sql -U unvdb 
    
    ud_sql (2.4)
    Type "help" for help.
    

    注意:您也可以使用其他任何具有相应的数据库权限的用户登录。

  2. 使用以下语句选择 testdb 数据库:

    \c testdb;
    

    如果还未创建数据库,请先运行如下语句:

    CREATE DATABASE testdb;
    
  3. 使用 \dt 命令列出 testdb 数据库中的所有的表,如下:

    \dt
    
               List of relations
     Schema |     Name      | Type  | Owner 
    --------+---------------+-------+-------
     public | huaji         | table | unvdb
     public | jjj           | table | unvdb
     public | sales         | table | unvdb
     public | student       | table | unvdb
     public | student_score | table | unvdb
     public | testdb        | table | unvdb
     public | users         | table | unvdb
    (7 rows)
    
  4. 如果要查看更多关于表的信息,请使用 \dt+ 命令,如下:

    \dt+
    
                                            List of relations
     Schema |     Name      | Type  | Owner | Persistence | Access method |    Size    | Description 
    --------+---------------+-------+-------+-------------+---------------+------------+-------------
     public | huaji         | table | unvdb | permanent   | heap          | 8192 bytes | 
     public | jjj           | table | unvdb | permanent   | heap          | 0 bytes    | 
     public | sales         | table | unvdb | permanent   | heap          | 8192 bytes | 
     public | student       | table | unvdb | permanent   | heap          | 8192 bytes | 
     public | student_score | table | unvdb | permanent   | heap          | 8192 bytes | 
     public | testdb        | table | unvdb | permanent   | heap          | 8192 bytes | 
     public | users         | table | unvdb | permanent   | heap          | 8192 bytes | 
    (7 rows)
    

您可以看到, \dt+ 的输入比 \dt 输出多了 Persistence, Access method, SizeDescription 列。

pg_tables 表中查询表

除了上面的 \dt\dt+ 命令,您还可以从 pg_tables 表中查询当前数据中的所有的表。

pg_tables 表是 unvdb 内置的一个表,它存储了数据库中的所有的表。

SELECT * FROM pg_tables WHERE schemaname = 'public';
 schemaname |   tablename   | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity 
------------+---------------+------------+------------+------------+----------+-------------+-------------
 public     | huaji         | unvdb      |            | t          | f        | f           | f
 public     | student       | unvdb      |            | t          | f        | f           | f
 public     | student_score | unvdb      |            | f          | f        | f           | f
 public     | sales         | unvdb      |            | t          | f        | f           | f
 public     | testdb        | unvdb      |            | t          | f        | t           | f
 public     | users         | unvdb      |            | t          | f        | f           | f
 public     | jjj           | unvdb      |            | f          | f        | f           | f
(7 rows)

在 unvdb 中查看表的定义或结构

unvdb 提供了两种方法查看一个现有的表的定义或者结构:

  • ud_skl 工具中使用 \d 或者 \d+ 列出当前数据库中的所有的表。

  • information_schema.columns 中查询表中的列。

使用 \d 查看表的信息

本实例演示了使用 psql 工具登录数据库并查看表信息的详细步骤。请按照如下步骤进行:

  1. 使用 unvdb 用户登录 unvdb 服务器:

    ud_sql -U unvdb 
    
    ud_sql (2.4)
    Type "help" for help.
    

    注意:您也可以使用其他任何具有相应的数据库权限的用户登录。

  2. 使用以下语句选择 testdb 数据库:

    \c testdb;
    

    如果还未创建数据库,请先运行如下语句:

    CREATE DATABASE testdb;
    
  3. 以下语句使用 \d 命令查看 test_date 表的结构,如下:

    \d testdb
                                                                  Table "public.testdb"
       Column   |          Type          | Collation | Nullable |                                       Default                                       
    ------------+------------------------+-----------+----------+-------------------------------------------------------------------------------------
     id         | integer                |           | not null | nextval('testdb_id_seq'::regclass)
     first_name | character varying(50)  |           |          | 
     last_name  | character varying(50)  |           |          | 
     full_name  | character varying(100) |           |          | generated always as ((((first_name::text || ' '::text) || last_name::text))) stored
    Indexes:
        "testdb_pkey" PRIMARY KEY, btree (id)
    Triggers:
        update_full_name BEFORE INSERT ON testdb FOR EACH ROW EXECUTE FUNCTION calculate_full_name()
    

    您可以看到,\d 输出了表的名字、表中的列,表中的约束等信息。

  4. 如果要查看更多关于 test_date 表的信息,请使用 \d+ 命令,如下:

    \d+ testdb
                                                                                             Table "public.testdb"
       Column   |          Type          | Collation | Nullable |                                       Default                                       | Storage  | Compression | Stats target | Description 
    ------------+------------------------+-----------+----------+-------------------------------------------------------------------------------------+----------+-------------+--------------+-------------
     id         | integer                |           | not null | nextval('testdb_id_seq'::regclass)                                                  | plain    |             |              | 
     first_name | character varying(50)  |           |          |                                                                                     | extended |             |              | 
     last_name  | character varying(50)  |           |          |                                                                                     | extended |             |              | 
     full_name  | character varying(100) |           |          | generated always as ((((first_name::text || ' '::text) || last_name::text))) stored | extended |             |              | 
    Indexes:
        "testdb_pkey" PRIMARY KEY, btree (id)
    Triggers:
        update_full_name BEFORE INSERT ON testdb FOR EACH ROW EXECUTE FUNCTION calculate_full_name()
    Access method: heap
    

    您可以看到, \d+ 的输入比 \d 输出多了 Compression, Stats targetDescription 列。

从 information_schema 中查看表中的所有列

information_schema 是一个系统级的 Schema, 其中提供了一些视图可以查看表、列、索引、函数等信息。

information_schema.columns 目录包含有关所有表的列的信息。

以下语句从 information_schema.columns 中查询 test_date 表的所有的列:

SELECT table_name,column_name,data_type,column_default FROM information_schema.columns WHERE table_name = 'testdb';
 table_name | column_name |     data_type     |           column_default           
------------+-------------+-------------------+------------------------------------
 testdb     | id          | integer           | nextval('testdb_id_seq'::regclass)
 testdb     | first_name  | character varying | 
 testdb     | last_name   | character varying | 
 testdb     | full_name   | character varying | 
(4 rows)

以上语句返回了 testdb 表的所有的列的信息,包括 列名,数据类型,默认值。

在 unvdb 中复制一个表

本文介绍了在unvdb中复制表的几种方法

在 unvdb 中,您可以使用以下几种方法复制一个表到一个新表:

  1. 使用 CREATE TABLE ... AS TABLE ... 语句复制一个表。

  2. 使用 CREATE TABLE ... AS SELECT ... 语句复制一个表。

  3. 使用 SELECT ... INTO ... 语句复制一个表。

使用 CREATE TABLE ... AS TABLE ... 语句复制一个表

要将已有的 table_name 表复制为新表 new_table,包括表结构和数据,请使用以下语句:

CREATE TABLE new_table AS TABLE table_name;

如果仅复制表结构,不复制数据,请在以上 CREATE TABLE 语句中添加 WITH NO DATA 子句,如下所示:

CREATE TABLE new_table AS TABLE table_name WITH NO DATA;

使用 CREATE TABLE ... AS SELECT ... 语句复制一个表

您还可以使用 CREATE TABLE ... AS SELECT ... 语句复制一个表。 这种方法可以复制部分数据到新表中。

要将已有的 table_name 表复制为新表 new_table,包括表结构和数据,请使用以下语句:

CREATE TABLE new_table AS SELECT * FROM table_name;

如果您只需要复制部分满足条件的数据,请在 SELECT语句中添加 WHERE子句,如下:

CREATE TABLE new_table AS SELECT * FROM table_name WHERE contidion;

如果您只需要复制部分列到新表,请在 SELECT 语句中指定要复制的列的列表,如下:

CREATE TABLE new_table AS SELECT column1, column2, ... FROM table_name WHERE contidion;

如果您只需要复制表结构,请按如下方式使用 WHERE 子句:

CREATE TABLE new_table AS SELECT * FROM table_name WHERE 1 = 2;

这里在 WHERE 子句中使用了一个永远为假的条件。

使用 SELECT ... INTO ... 语句复制一个表

要使用 unvdb SELECT INTO 语句将已有的 table_name 表复制为新表 new_table,请使用以下语法:

SELECT * INTO new_table FROM table_name

如果您只需要复制部分满足条件的数据,请添加 WHERE 子句,如下:

SELECT * INTO new_table FROM table_name WHERE contidion;

如果您只需要复制部分列到新表,请在 SELECT 语句中指定要复制的列的列表,如下:

SELECT column1, column2, ... INTO new_table FROM table_name WHERE contidion;

注意,这几种方法都只能复制列的定义和数据,都不能将索引复制过去。

在 unvdb 备份和恢复数据库指南

unvdb 提供了 ud_dumpud_dumpall 工具,帮助您轻松地备份数据库,同时,unvdb 提供了 pg_restore 工具,帮助您轻松的恢复数据库。

作为数据库管理员,备份和恢复是必备的技能。

备份数据库的工具或命令:

  • ud_dump 工具用于备份单个 unvdb 数据库

  • ud_dumpall 工具用于备份 unvdb 服务器中的所有的数据库。

恢复数据库的工具或命令:

  • pg_restore 工具用于恢复由 ud_dump 工具产生的 tar 文档和目录文档。

  • ud_sql 工具可以导入 ud_dumpud_dumpall 工具产生的 SQL 脚本文件。

  • \i 命令可以导入 ud_dumpud_dumpall 工具产生的 SQL 脚本文件。

使用 ud_dump 备份一个数据库

unvdb 自带了 ud_dump 工具用于备份单个 unvdb 数据库。 以下是一个常用的备份命令:

ud_dump -U username -W -F t db_name > output.tar

说明:

  • -U username: 指定连接 unvdb 数据库服务器的用户。您可以在 username 位置使用自己的用户名。

  • -W: 强制 ud_dump 在连接到 unvdb 数据库服务器之前提示输入密码。按回车后, ud_dump 会提示输入 unvdb 用户密码。

  • -F : 指定输出文件的格式,它可以是以下格式之一:

    • c: 自定义格式

    • d: 目录格式存档

    • t: tar 文件包

    • p: SQL 脚本文件

  • db_name 是要备份的数据库的名字。

  • output.tar 是输出文件的路径。

使用 ud_dumpall 备份所有数据库

除了 ud_dump 工具,unvdb 还提供了可以一次备份所有数据库的 ud_dumpall 工具备份。 该ud_dumpall 工具的用法如下:

ud_dumpall -U username > output.sql

使用 ud_restore 恢复数据库

unvdb 提供了 ud_restore 工具用于恢复由 ud_dump 工具产生的 tar 文档和目录文档。

ud_restore 工具的用法如下:

ud_restore [option...] file_path
  • file_path 是要恢复的文件或者目录的路径。

  • option 是一些恢复数据时用到的参数,比如,数据库,主机,端口 等。 您可以使用如下选项:

参数 说明
-a --data-only 只恢复数据,而不恢复表模式(数据定义)。
-c --clean 创建数据库对象前先清理(删除)它们。
-C --create 在恢复数据库之前先创建它。
-d dbname --dbname=dbname 与数据库 dbname 联接并且直接恢复到该数据库中。
-e --exit-on-error 如果在向数据库发送 SQL 命令的时候碰到错误,则退出。缺省是继续执行并且在恢复 结束时显示一个错误计数。
-f filename --file=filename 声明生成的脚本的输出文件,或者出现-l 选项时用于列表的文件,缺省是标准输出。
-F format --format=format 声明备份文件的格式。
-i --ignore-version 忽略数据库版本检查。
-I index --index=index 只恢复命名的索引。
-l --list 列出备份的内容。这个操作的输出可以用 -L 选项限制和重排所恢复的项目。
-L list-file --use-list=list-file 只恢复在 list-file 里面的元素,以它们在文件中出现的顺序。
-n namespace --schema=schema 只恢复指定名字的模式里面的定义和/或数据。不要和 -s 选项混淆。这个选项可以和 -t 选项一起使用。
-O --no-owner 不要输出设置对象的权限,以便与最初的数据库匹配的命令。
-s --schema-only 只恢复表结构(数据定义)。不恢复数据,序列值将重置。
-S username --superuser=username 设置关闭触发器时声明超级用户的用户名。只有在设置了 –disable-triggers 的时候 才有用。
-t table --table=table 只恢复表指定的表的定义和/或数据。
-T trigger --trigger=trigger 只恢复指定的触发器。
-v --verbose 声明冗余模式。
-x --no-privileges --no-acl 避免 ACL 的恢复(grant/revoke 命令)
-X use-set-session-authorization --use-set-session-authorization 输出 SQL 标准的 SET SESSION AUTHORIZATION 命令,而不是 OWNER TO 命令。
-X disable-triggers --disable-triggers 这个选项只有在执行仅恢复数据的时候才相关。
-h host --host=host 声明服务器运行的机器的主机名。
-p port --port=port 声明服务器侦听的 TCP 端口或者本地的 Unix 域套接字文件扩展。
-U username 以给出用户身分联接。
-W 强制给出口令提示。如果服务器要求口令认证,那么这个应该自动发生。

最常用的 ud_restore 用法如下:

ud_restore -d db_name path_to_db_backup_file.tar

如何使用 ud_sql 恢复数据库

您可以使用 ud_sql 工具从一个 sql 文件中恢复数据。 以下是使用 ud_sql 从 sql 文件恢复数据的基本用法:

ud_sql -U username -f path_to_db_backup_file.sql

使用 \i 命令导入 sql 文件

您还可以 \i 命令导入 sql 文件。 以下演示了导入一个示例数据库的步骤:

  1. 启动 ud_sql工具并连接 unvdb 服务器:

    ud_sql -U unvdb
    

    根据提示输入 unvdb 用户的密码,然后按下回车键。

  2. 创建 sakila 数据库

    CREATE DATABASE sakila;
    
  3. 连接 sakila 数据库

    \c sakila;
    
  4. 分别使用以下两个语句以导入刚刚下载的两个文件 sakila-schema.sqlsakila-insert-data.sql

    \i /文件路径/sakila-schema.sql
    \i /文件路径/sakila-insert-data.sql
    

在 unvdb 中使用 EXPLAIN 查看语句的执行计划

在 unvdb 中,您可以使用 EXPLAIN 语句显示 unvdb 规划器为指定语句生成的执行计划,以确定该语句是否是一个高效的语句。

EXPLAIN 语法

以下是 EXPLAIN 语句的语法:

EXPLAIN [ ( option [, ...] ) ] statement;

其中 option 可以是以下之一:

  • ANALYZE [ boolean ]: 执行该命令并显示实际运行时间和其他统计信息。

    EXPLAIN ANALYZE SELECT * FROM users WHERE  notes  = 'x';
    
                                                QUERY PLAN                                            
    --------------------------------------------------------------------------------------------------
     Seq Scan on users  (cost=0.00..11.25 rows=1 width=756) (actual time=0.018..0.018 rows=0 loops=1)
       Filter: ((notes)::text = 'x'::text)
       Rows Removed by Filter: 2
     Planning Time: 0.088 ms
     Execution Time: 0.040 ms
    (5 rows)
    

    VERBOSE [ boolean ]: 显示有关计划的其他信息。

    EXPLAIN VERBOSE SELECT * FROM users WHERE  notes  = 'x';
    
                              QUERY PLAN                           
    ---------------------------------------------------------------
     Seq Scan on public.users  (cost=0.00..11.25 rows=1 width=756)
       Output: id, nickname, login_name, notes
       Filter: ((users.notes)::text = 'x'::text)
    (3 rows)
    
  • COSTS [ boolean ]: 包括有关每个计划节点的估计启动和总成本的信息,以及估计的行数和每行的估计宽度。

    EXPLAIN  (COSTS) SELECT * FROM users WHERE  notes  = 'x';
    
                           QUERY PLAN                       
    --------------------------------------------------------
     Seq Scan on users  (cost=0.00..11.25 rows=1 width=756)
       Filter: ((notes)::text = 'x'::text)
    (2 rows)
    
  • SETTINGS [ boolean ]: 包括有关配置参数的信息。

    EXPLAIN (SETTINGS) SELECT * FROM address WHERE postal_code = 'x';
    
                                        QUERY PLAN
    -----------------------------------------------------------------------------------------
    Index Scan using address_postal_code_idx on address  (cost=0.28..8.29 rows=1 width=161)
    Index Cond: ((postal_code)::text = 'x'::text)
    
  • BUFFERS [ boolean ]: 包括有关缓冲区使用情况的信息。

    EXPLAIN (BUFFERS) SELECT * FROM address WHERE postal_code = 'x';
    
                                        QUERY PLAN
    -----------------------------------------------------------------------------------------
    Index Scan using address_postal_code_idx on address  (cost=0.28..8.29 rows=1 width=161)
    Index Cond: ((postal_code)::text = 'x'::text)
    
  • WAL [ boolean ]: 包括有关 WAL 记录生成的信息。它必须和 ANALYZE 同时使用。

    EXPLAIN (ANALYZE, WAL) SELECT * FROM address WHERE postal_code = 'x';
    
                                                                QUERY PLAN
    -----------------------------------------------------------------------------------------------------------------------------------
    Index Scan using address_postal_code_idx on address  (cost=0.28..8.29 rows=1 width=161) (actual time=0.029..0.029 rows=0 loops=1)
    Index Cond: ((postal_code)::text = 'x'::text)
    Planning Time: 0.131 ms
    Execution Time: 0.043 ms
    
  • TIMING [ boolean ]: 在输出中包括实际启动时间和在每个节点中花费的时间。它必须和 ANALYZE 同时使用。

    EXPLAIN (ANALYZE, TIMING) SELECT * FROM address WHERE postal_code = 'x';
    
                                                                QUERY PLAN
    -----------------------------------------------------------------------------------------------------------------------------------
    Index Scan using address_postal_code_idx on address  (cost=0.28..8.29 rows=1 width=161) (actual time=0.018..0.018 rows=0 loops=1)
    Index Cond: ((postal_code)::text = 'x'::text)
    Planning Time: 0.082 ms
    Execution Time: 0.030 ms
    
  • SUMMARY [ boolean ]: 在查询计划之后包括摘要信息

    EXPLAIN (SUMMARY) SELECT * FROM address WHERE postal_code = 'x';
    
                                        QUERY PLAN
    -----------------------------------------------------------------------------------------
    Index Scan using address_postal_code_idx on address  (cost=0.28..8.29 rows=1 width=161)
    Index Cond: ((postal_code)::text = 'x'::text)
    Planning Time: 0.096 ms
    
  • FORMAT { TEXT | XML | JSON | YAML }: 指定输出格式,可以是文本、XML、JSON 或 YAML。

    EXPLAIN (FORMAT YAML) SELECT * FROM address WHERE postal_code = 'x';
    
                        QUERY PLAN
    -----------------------------------------------------
    - Plan:                                            +
        Node Type: "Index Scan"                        +
        Parallel Aware: false                          +
        Async Capable: false                           +
        Scan Direction: "Forward"                      +
        Index Name: "address_postal_code_idx"          +
        Relation Name: "address"                       +
        Alias: "address"                               +
        Startup Cost: 0.28                             +
        Total Cost: 8.29                               +
        Plan Rows: 1                                   +
        Plan Width: 161                                +
        Index Cond: "((postal_code)::text = 'x'::text)"
    
    EXPLAIN (FORMAT JSON) SELECT * FROM address  WHERE postal_code = 'x';
    
                           QUERY PLAN
    ---------------------------------------------------------
     [                                                      +
       {                                                    +
         "Plan": {                                          +
           "Node Type": "Index Scan",                       +
           "Parallel Aware": false,                         +
           "Async Capable": false,                          +
           "Scan Direction": "Forward",                     +
           "Index Name": "address_postal_code_idx",         +
           "Relation Name": "address",                      +
           "Alias": "address",                              +
           "Startup Cost": 0.28,                            +
           "Total Cost": 8.29,                              +
           "Plan Rows": 1,                                  +
           "Plan Width": 161,                               +
           "Index Cond": "((postal_code)::text = 'x'::text)"+
         }                                                  +
       }                                                    +
     ]
    

注意,所有选项中的 boolean 指定是否选择的选项应该被打开或关闭。您可以使用 TRUEON 、 或 1 启用该选项, 和 FALSEOFF 、 或 0 禁用它。如果省略布尔值,则默认为 TRUE .

重置 unvdb 超级用户的密码

在 unvdb 中, (默认用户) unvdb 是超级用户。如果您忘记了 密码,您可以按照以下步骤进行重置。

  1. 找到 unvdb 数据库服务器的配置文件 ud_hba.conf

    在 Linux 上,unvdb 数据库服务器的配置文件位于 /data/udb/ud_hba.conf。前提是按之前的安装过程才会在此目录下,如果不是请自行查找安装目录。

  2. 修改配置文件之前备份 配置文件,以便后面进行恢复。

    cp ud_hba.conf ud_hba.conf.bak
    
  3. 修改配置文件以信任本地连接不需要密码。 将配置文件中的 scram-sha-256 或者 md5 修改为 trust,如下:

    local   all             all                                     peer
    # IPv4 local connections:
    host    all             all             127.0.0.1/32            trust
    # IPv6 local connections:
    host    all             all             ::1/128                 trust
    # Allow replication connections from localhost, by a user with the
    # replication privilege.
    local   replication     all                                     peer
    host    replication     all             127.0.0.1/32            trust
    host    replication     all             ::1/128                 trust
    
  4. 重启 unvdb 数据库服务器。

    在 Windows 中, 您可以在服务列表窗口重启 数据库

    在 Linux 中,您可以使用 systemctl restart unvdb 命令重启 unvdb。

  5. 登录到 unvdb数据库服务器。

    ud_sql -U unvdb
    

    您并不需要输入密码。

  6. 使用以下命令修改 unvdb 用户的密码:

    ALTER USER unvdb WITH PASSWORD 'new_password';
    
  7. 恢复 ud_hba.conf 配置文件。 将 ud_hba.conf.bak 文件的内容覆盖 pg_hba.conf

  8. 重启 unvdb 数据库服务器。 当您登陆时, unvdb 应该会提示您输入密码。