客户端工具

1.clusterdb

clusterdb — 聚簇一个UXDB数据库

概要

clusterdb [connection-option...] [ --verbose | -v ] [--table | -t table ] ... [dbname ]

clusterdb [connection-option...] [ --verbose | -v ] --all | -a

描述

clusterdb 是一个用于对 UXDB数据库进行重新聚簇的实用程序。它会查找已经聚簇过的表,并在上次使用的相同索引上重新聚簇。从未聚簇过的表不受影响。

clusterdb 是 SQL 命令cluster的包装器。通过此实用程序聚簇数据库和通过其他访问服务器的方法聚簇数据库之间没有实质性区别。

选项

clusterdb接受以下命令行参数:

-a
--all
聚簇所有数据库。

[-d] dbname
[--dbname=]dbname
指定要聚簇的数据库的名称,当未使用 -a/--all时。如果未指定,则从环境变量UXDATABASE中读取数据库名称。如果未设置该变量,则使用连接指定的用户名。 dbname 可以是连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。

-e
--echo
回显clusterdb生成并发送到服务器的命令。

-q
--quiet
不显示进度消息。

-t table
--table=table
仅对 table 进行聚集。可以通过编写多个-t开关来聚集多个表。

-v
--verbose
在处理过程中打印详细信息。

-V
--version
打印clusterdb版本并退出。

-?
--help
显示有关clusterdb命令行参数的帮助信息,然后退出。

clusterdb还接受以下用于连接参数的命令行参数:

-h host
--host=host
指定运行服务器的计算机的主机名。如果值以斜杠开头,则用作Unix域套接字的目录。

-p port
--port=port
指定服务器侦听连接的TCP端口或本地Unix域套接字文件扩展名。

-U username
--username=username
要连接的用户名。

-w
--no-password
永远不要发出密码提示。如果服务器需要密码身份验证,并且没有其他方式(例如.uxpass文件)提供密码,则连接尝试将失败。此选项可用于批处理作业和脚本,其中没有用户输入密码。

-W
--password
强制clusterdb在连接到数据库之前提示输入密码。

此选项从不是必需的,因为clusterdb将自动提示输入密码,如果需要的话。如果服务器要求密码验证,则需要输入密码。但是,clusterdb将浪费一个连接尝试来确定服务器是否需要密码。在某些情况下,建议输入 -W 以避免额外的连接尝试。

--maintenance-db=dbname
指定要连接的数据库名称。如果未指定,则使用 uxdb数据库,或者如果不存在,则使用 template1。这可以是一个连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。此外,连接到其他数据库时,除数据库名称本身之外的连接字符串参数也将被重用。

环境变量

UXDATABASE
UXHOST
UXPORT
UXUSER
默认连接参数

UX_COLOR
指定是否在诊断消息中使用颜色。可能的值为 alwaysautonever

与大多数其他 UXDB 实用程序一样,此实用程序还使用由 libuxsql 支持的环境变量。

诊断

数据库服务器必须在目标主机上运行。此外,任何由libuxsql前端库使用的默认连接设置和环境变量都将适用。

示例

要聚集数据库 test

$ clusterdb test

要聚集名为 xyzzy 的数据库中的单个表 foo

$ clusterdb --table=foo xyzzy

2.createdb

createdb — 创建一个新的 UXDB 数据库

概要

createdb [connection-option...] [option...] [dbname [description ]]

描述

createdb 创建一个新的 UXDB 数据库。

通常情况下,执行此命令的数据库用户将成为新数据库的所有者。 但是,如果执行用户具有适当的权限,则可以通过 -O 选项指定不同的所有者。

createdb 是 SQL 命令 CREATE DATABASE 的包装器。通过这个工具和其他方法访问服务器来创建数据库之间没有实质性的区别。

选项

createdb 接受以下命令行参数:

dbname
指定要创建的数据库的名称。名称必须在此群集中的所有 UXDB 数据库中是唯一的。默认情况下,将创建一个与当前系统用户名称相同的数据库。

description
指定要与新创建的数据库关联的注释。

-D tablespace
--tablespace=tablespace
指定数据库的默认表空间。 (此名称将被处理为双引号标识符。)

-e
--echo
回显createdb生成并发送到服务器的命令。

-E encoding
--encoding=encoding
指定在此数据库中使用的字符编码方案。

-l locale
--locale=locale
指定在此数据库中使用的区域设置。这相当于同时指定--lc-collate--lc-ctype

--lc-collate=locale
指定在此数据库中使用的LC_COLLATE设置。

--lc-ctype=locale
指定在此数据库中使用的LC_CTYPE设置。

--icu-locale=locale
如果选择了ICU区域设置提供程序,则指定在此数据库中使用的ICU区域设置ID。

--locale-provider={libc|icu}
指定用于数据库默认排序规则的区域设置提供程序。

-O owner
--owner=owner
指定将拥有新数据库的数据库用户。(此名称将被处理为双引号标识符。)

-S template
--strategy=strategy
指定数据库创建策略。

-T template
--template=template
指定用于构建此数据库的模板数据库。(此名称将被处理为双引号标识符。)

-V
--version
打印createdb版本并退出。

-?
--help
显示有关createdb命令行参数的帮助信息,并退出。

选项-D-l-E-O-T对应于底层的选项。SQL 命令 CREATE DATABASE;有关它们的更多信息,请参见该页面。

createdb 还接受以下用于连接参数的命令行参数:

-h host
--host=host
指定运行服务器的机器的主机名。如果值以斜杠开头,则用作 Unix 域套接字的目录。

-p port
--port=port
指定服务器用于侦听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。

-U username
--username=username
连接的用户名。

-w
--no-password
永远不提示输入密码。如果服务器需要密码验证,而没有其他方式(如 .uxpass文件)提供密码,则连接尝试将失败。此选项可用于批处理作业和脚本,其中没有用户输入密码。

-W
--password
强制 createdb 在连接到数据库之前提示输入密码。

此选项并非必需,因为如果服务器要求密码验证,createdb将自动提示输入密码。但是,createdb将浪费一个连接尝试来确定服务器需要密码。在某些情况下,建议输入 -W避免额外的连接尝试。

--maintenance-db=dbname
指定创建新数据库时要连接的数据库的名称。如果未指定,则将使用 uxdb数据库;如果不存在(或者它是要创建的新数据库的名称),则使用template1。这可以是一个连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。

环境变量

UXDATABASE
如果设置,则创建数据库的名称,除非在命令行上被覆盖。

UXHOST
UXPORT
UXUSER
默认连接参数。如果未在命令行或 UXDATABASE 中指定,则 UXUSER还确定要创建的数据库名称。

UX_COLOR
指定是否在诊断消息中使用颜色。可能的值这个实用程序和大多数其他的UXDB实用程序一样,也使用了libuxsql支持的环境变量。

诊断

数据库服务器必须在目标主机上运行。此外,libuxsql前端库使用的任何默认连接设置和环境变量都将适用。

示例

要使用默认数据库服务器创建数据库demo

$ createdb demo

要使用主机eden上的服务器,端口5000,使用template0模板数据库创建数据库demo,以下是命令行命令和底层SQL命令:

$ createdb -p 5000 -h eden -T template0 -e demo
CREATE DATABASE demo TEMPLATE template0;

另请参阅

dropdb

3.createuser

createuser — 定义一个新的 UXDB 用户账户

概要

createuser [connection-option...] [option...] [ username ]

描述

createuser 创建一个新的 UXDB 用户(或更准确地说,一个角色)。 只有超级用户和具有 CREATEROLE权限的用户才能创建新用户,因此createuser必须由超级用户或具有 CREATEROLE 特权的用户调用。

如果您希望创建一个新的超级用户,必须以超级用户进行连接,而不仅仅是具有 CREATEROLE 权限。成为超级用户意味着能够绕过数据库中的所有访问权限检查,因此不应轻易授予超级用户访问权限。

createuser 是 SQL 命令 CREATE ROLE的包装器。 通过此实用程序和通过其他访问服务器的方法创建用户之间没有实际区别。

选项

createuser 接受以下命令行参数:

username
指定要创建的 UXDB 用户的名称。 此名称必须与此 UXDB 安装中的所有现有角色不同。

-c number
--connection-limit=number
为新用户设置最大连接数。 默认情况下不设置限制。

-d
--createdb
新用户将被允许创建数据库。

-D
--no-createdb
新用户将不被允许创建数据库。这是默认设置。

-e
--echo
回显createuser生成并发送到服务器的命令。

-E
--encrypted
此选项已过时,但仍被接受以保持向后兼容性。

-g role
--role=role
指示将立即将此角色添加为新成员的角色。可以通过编写多个-g开关来指定将此角色添加为成员的多个角色。

-i
--inherit
新角色将自动继承其成员角色的权限。这是默认设置。

-I
--no-inherit
新角色将不会自动继承其成员角色的权限。

--interactive
如果没有在命令行上指定用户名,提示缺少用户名。并且-d/-D-r/-R-s/-S选项任何属性没有在命令行被指定时,也会提示缺少属性(而不会使用缺省值)。

-l
--login
新用户将被允许登录(即,用户名可以用作初始会话用户标识符)。这是默认设置。

-L
--no-login
新用户将不被允许登录。(没有登录权限的角色仍然有用作为管理数据库权限的手段。)

-P
--pwprompt
如果给定,则createuser将提示输入新用户的密码。如果没有计划使用口令认证,则不需要此操作。

-r
--createrole
新用户将被允许创建新角色(即,此用户将具有CREATEROLE权限)。

-R
--no-createrole
新用户将不被允许创建新角色。这是默认设置。

-s
--superuser
新用户将成为超级用户。

-S
--no-superuser
新用户将不是超级用户。这是默认设置。

--security
检查输入密码是否满足强度要求,满足则通过,以下任意一条不满足则返回错误信息并退出。规定如下:

  1. 长度必须在8-99个字符之间(包括8、99)。
  2. 至少包含一个大写字母。
  3. 字少包含一个小写字母。
  4. 至少包含一个数字。
  5. 至少包含一个特殊字符。
  6. 首尾任意一处不能带有空格。

-V
--version
打印createuser版本并退出。

--replication
新用户将具有REPLICATION权限。

--no-replication
新用户将不具有REPLICATION权限。

-?
--help
显示有关createuser命令行参数的帮助信息,并退出。

createuser还接受以下用于连接参数的命令行参数:

-h host
--host=host
指定运行服务器的计算机的主机名。如果值以斜杠开头,则用作Unix域套接字的目录。

-p port
--port=port
指定服务器侦听连接的TCP端口或本地Unix域套接字文件扩展名。

-U username
--username=username
连接的用户名(不是要创建的用户名)。

-w
--no-password
永远不要发出密码提示。如果服务器需要密码验证,并且没有其他方式(例如.uxpass文件)可用密码,则连接尝试将失败。此选项可用于批处理作业和脚本,其中没有用户可输入密码。

-W
--password
强制createuser提示输入密码(用于连接到服务器,而不是新用户的密码)。

此选项从不是必需的,因为如果服务器要求密码验证,createuser将自动提示输入密码。但是,createuser将浪费一个连接尝试来了解服务器需要密码。在某些情况下,建议输入-W以避免额外的连接尝试。

环境变量

UXHOST
UXPORT
UXUSER
默认连接参数

UX_COLOR
指定是否在诊断消息中使用颜色。可能的值为alwaysautonever

像大多数其他UXDB实用程序一样,此实用程序还使用libuxsql支持的环境变量。

诊断

如有困难,请参见uxsql,了解可能出现的问题和错误消息的论述。数据库服务器必须在目标主机上运行。此外,libuxsql前端库使用的任何默认连接设置和环境变量也将适用。

示例

要在默认数据库服务器上创建用户joe

$ createuser joe

要在默认数据库服务器上创建用户joe,并提示输入一些其他属性:

$ createuser --interactive joe
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n

要使用在主机eden上的服务器,端口5000,明确指定属性创建相同的用户joe,查看底层命令:

$ createuser -h eden -p 5000 -S -D -R -e joe
CREATE ROLE joe NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;

要将用户joe创建为超级用户,并立即分配密码:

$ createuser -P -s -e joe
Enter password for new role: xyzzy
Enter it again: xyzzy
CREATE ROLE joe PASSWORD 'md5b5f5ba1a423792b526f799ae4eb3d59e' 
SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN;

在上面的示例中,新密码实际上没有被回显,但为了清晰起见,我们显示了输入的内容。如您所见,密码在发送到客户端之前被加密。

另请参阅

dropuser

4.dropdb

dropdb - 删除UXDB数据库

概要

dropdb [connection-option...] [option...] dbname

描述

dropdb 销毁现有的UXDB数据库。 执行此命令的用户必须是数据库超级用户或数据库所有者。

dropdb 是 SQL 命令 DROP DATABASE的包装器。 通过此实用程序和通过其他访问服务器的方法删除数据库之间没有实际区别。

选项

dropdb 接受以下命令行参数:

dbname
指定要删除的数据库的名称。

-e
--echo
回显 dropdb 生成并发送到服务器的命令。

-f
--force
在删除目标数据库之前,尝试终止所有现有连接。

-i
--interactive
在执行任何破坏性操作之前发出验证提示。

-V
--version
打印 dropdb 版本并退出。

--if-exists

如果数据库不存在,则不会抛出错误。在这种情况下会发出通知。

-?
--help

显示关于 dropdb 命令行参数的帮助信息,并退出。

dropdb 还接受以下用于连接参数的命令行参数:

-h host
--host=host
指定运行服务器的机器的主机名。如果值以斜杠开头,则用作 Unix 域套接字的目录。

-p port
--port=port
指定服务器侦听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。

-U username
--username=username
连接的用户名。

-w
--no-password
永远不会提示输入密码。如果服务器需要密码验证,而没有其他方式(如 .uxpass文件)提供密码,则连接尝试将失败。此选项可用于批处理作业和脚本,其中没有用户输入密码。

-W
--password
强制 dropdb 在连接到数据库之前提示输入密码。

此选项并非必需,因为如果服务器要求密码验证,则 dropdb 将自动提示输入密码。但是,dropdb将浪费一个连接尝试来确定服务器需要密码。在某些情况下,建议输入-W 避免额外的连接尝试。

--maintenance-db=dbname
指定要连接以删除目标数据库的数据库的名称。如果未指定,则将使用 uxdb数据库;如果不存在(或正在删除的是该数据库),则将使用template1。这可以是一个连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。

环境变量

UXHOST
UXPORT
UXUSER
默认连接参数

UX_COLOR
指定是否在诊断消息中使用颜色。可能的值为 alwaysautonever

这个实用程序和大多数其他的 UXDB 实用程序一样, 也使用了由 libuxsql 支持的环境变量。

诊断

如果出现问题,请参见uxsql,了解可能出现的问题和错误消息的论述。数据库服务器必须在目标主机上运行。此外,任何由 libuxsql 前端库使用的默认连接设置和环境变量都将适用。

示例

要在默认数据库服务器上销毁数据库 demo

$ dropdb demo

要使用主机为 eden,端口为 5000 的服务器销毁数据库 demo, 并进行验证和底层命令的查看:

$ dropdb -p 5000 -h eden -i -e demo
Database "demo" will be permanently deleted.
Are you sure? (y/n) y
DROP DATABASE demo;

另请参阅

createdb

5.dropuser

dropuser — 删除 UXDB 用户帐户

概要

dropuser [connection-option...] [option...] [ username ]

描述

dropuser 删除现有的 UXDB 用户。 只有超级用户和具有 CREATEROLE 权限的用户才能 删除UXDB 用户。(要删除超级用户,您必须自己是超级用户。)

dropuser 是 SQL 命令 DROP ROLE 的包装器。通过此实用程序和通过其他访问服务器的方法删除用户之间没有实际区别。

选项

dropuser 接受以下命令行参数:

username
指定要删除的 UXDB 用户的名称。 如果在命令行上没有指定名称并且使用了 -i/--interactive 选项,则会提示您输入名称。

-e
--echo
回显 dropuser 生成并发送到服务器的命令。

-i
--interactive
在实际删除用户之前提示确认,并提示输入用户名(如果在命令行上没有指定)。

-V
--version
打印 dropuser 版本并退出。

--if-exists
如果用户不存在,则不会抛出错误,而是发出通知。

-?
--help
显示有关 dropuser 命令行参数的帮助信息,然后退出。

dropuser 还接受以下用于连接参数的命令行参数:

-h host
--host=host
指定运行服务器的计算机的主机名。如果该值以斜杠开头,则用作 Unix 域套接字的目录。

-p port
--port=port
指定服务器侦听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。

-U username
--username=username
要连接的用户名(不是要删除的用户名)。

-w
--no-password
永远不要发出密码提示。如果服务器需要密码验证,并且没有其他方式(例如 .uxpass文件)提供密码,则连接尝试将失败。此选项可用于批处理作业和脚本,其中没有用户存在以输入密码。

-W
--password
强制 dropuser 在连接到数据库之前提示输入密码。

此选项从不是必需的,因为如果服务器要求密码验证,dropuser 将自动提示输入密码。但是,dropuser 将浪费一个连接尝试来确定服务器需要密码。在某些情况下,建议输入 -W避免额外的连接尝试。

环境变量

UXHOST
UXPORT
UXUSER
默认连接参数

UX_COLOR
指定是否在诊断消息中使用颜色。可能的值为 alwaysautonever

与大多数其他 UXDB 实用程序一样,此实用程序还使用由 libuxsql 支持的环境变量。

诊断

如有困难,请参阅uxsql了解可能出现的问题和错误消息的论述。数据库服务器必须在目标主机上运行。此外,libuxsql前端库使用的任何默认连接设置和环境变量都将适用。

示例

从默认数据库服务器中删除用户joe

$ dropuser joe

使用主机eden上的服务器,端口5000,进行验证并查看底层命令来删除用户joe

$ dropuser -p 5000 -h eden -i -e joe
Role "joe" will be permanently removed.
Are you sure? (y/n) y
DROP ROLE joe;

另请参阅

createuser

6.ecux

ecux — 嵌入式 SQL C 预处理器

概要

ecux [option...] filename...

描述

ecux 是用于 C 程序的嵌入式 SQL 预处理器。它通过将 SQL 调用替换为特殊的函数调用,将带有嵌入式 SQL 语句的 C程序转换为普通的 C 代码。然后可以使用任何 C 编译器工具链处理输出文件。

ecux 将命令行上给定的每个输入文件转换为相应的 C 输出文件。如果输入文件名没有任何扩展名,则假定为.uxc。文件的扩展名将被替换为 .c 以构造输出文件名。但是,可以使用-o选项覆盖输出文件名。

如果输入文件名只是 -,则 ecux 从标准输入读取程序(并写入标准输出,除非使用 -o 覆盖)。

本参考页面不描述嵌入式 SQL 语言。

选项

ecux 接受以下命令行参数:

-c
从 SQL 代码自动生成某些 C 代码。目前,这适用于 EXEC SQL TYPE

-C mode
设置兼容模式。 mode 可以是 INFORMIXINFORMIX_SEORACLE

-D symbol
定义 C 预处理器符号。

-h
处理头文件。当指定此选项时,输出文件扩展名变为.h而不是.c,默认输入文件扩展名为.uxh而不是.uxc。此外,-c选项被强制启用。

-i
同时解析系统包含文件。

-I directory
指定一个附加的包含路径,用于查找通过EXEC SQL INCLUDE包含的文件。默认值为.(当前目录)、/usr/local/include、在编译时定义的UXDB包含目录(默认为/usr/local/uxsql/include)和/usr/include,按此顺序。

-o filename
指定ecux应将所有输出写入给定的 filename 。写入-o -以将所有输出发送到标准输出。

-r option
选择运行时行为。 option 可以是以下之一:

  • no_indicator
    不使用指示器,而是使用特殊值表示空值。历史上有使用这种方法的数据库。

  • prepare
    在使用之前准备所有语句。Libecux将保留准备好的语句的缓存,并在再次执行语句时重用语句。如果缓存已满,libecux将释放最少使用的语句。

  • questionmarks
    允许问号作为占位符,以保持兼容性。很久以前这是默认值。

-t
打开事务的自动提交。在此模式下,每个SQL命令都会自动提交,除非它在显式事务块内。在默认模式下,只有在发出EXEC SQL COMMIT时才提交命令。

-v
打印附加信息,包括版本和“include”路径。

--version
打印ecux版本并退出。

-?
--help
显示有关ecux命令行参数的帮助信息,并退出。

注解

在编译预处理的C代码文件时,编译器需要能够在UXDB包含目录中找到ECUX头文件。因此,您可能需要在调用编译器时使用-I选项(例如,-I/usr/local/uxsql/include)。

使用嵌入SQL的C代码的程序必须链接到libecux库,例如使用链接器选项-L/usr/local/uxsql/lib -lecux

可以使用ux_config来找到适合安装的这些目录的值。

示例

如果您有一个名为prog1.uxc的嵌入式SQL C源文件,则可以使用以下命令序列创建可执行程序:

ecux prog1.uxc
cc -I/usr/local/uxsql/include -c prog1.c
cc -o prog1 prog1.o -L/usr/local/uxsql/lib -lecux

7.oid2name

oid2name — 解析一个UXDB数据目录中的OID和文件节点

概要

oid2name [option...]

描述

oid2name是一个帮助管理员检查被UXDB使用的文件结构的工具程序。要使用它,你需要熟悉数据库文件结构。

注意

名称“oid2name”是有历史原因的,它确实有些误导性,因为在你使用它的大部分时间里,你实际关心的是表的文件结点编号(在数据目录中是可见的文件名)。请确定你理解表OID和表文件结点之间的区别!

oid2name连接到一个目标数据库并且抽取OID、文件节点或者表名信息。你也可以让它显示数据库OID或表空间OID。

选项

oid2name接受下列命令行参数:

-f filenode
--filenode=filenode
显示具有文件结点filenode的表的信息。

-i
--indexes
在列举中包括索引和序列。

-o oid
--oid= oid
显示具有OID的表的信息 oid。

-q
--quiet
忽略头部(用于脚本)。

-s
--tablespaces
显示表空间OID。

-S
--system-objects
包括系统对象(位于 information_schema、ux_toast和ux_catalog模式中)。

-t tablename_pattern
--table=tablename_pattern
显示匹配tablename_pattern的表的信息。

-V
--version
打印oid2name版本并退出。

-x
--extended
为要显示的每个对象显示更多信息:表空间名、模式名以及OID。

-?
--help
显示有关oid2name命令行参数的帮助并退出。

oid2name也接受下列用于连接参数的命令行参数:

-d database
--dbname=database
要连接的数据库。

-h host
--host=host
数据库服务器的主机。

-p port
--port=port
数据库服务器的端口。

-U username
--username=username
用于连接的用户名。

要显示特定表,通过使用-o、-f和-t选择要显示哪个表。 -o采用一个 OID, -f采用一个文件节点, 而-t采用一个表名(实际上,它是一个LIKE模式,因此你可以用诸如foo%之类的东西)。 这些选项你想用多少就用多少,最后的列举将包括所有匹配任意一个这些选项的对象。但是注意这些选项只能显示由-d给定的数据库中的对象。

如果你没有给出任何-o、-f或者-t,但是给出了-d,它将列出由-d指定的数据库中的所有表。在这种模式下,-S和-i选项控制什么会被列出。

如果你也没有给出-d,它将显示一个数据库 OID 的列表。你也可以给出-s来得到一个表空间列表。

环境变量

UXHOST
UXPORT
UXUSER
默认连接参数。

和大部分其他UXDB工具相似,这个工具也使用libuxsql支持的环境变量。

注解

oid2name要求一个运行着的数据库服务器并且其系统目录没有损坏。因此它对于数据库损坏的情况用处有限。

示例

8.ux_amcheck

ux_amcheck — 检查一个或多个UXDB数据库中的损坏

概要

ux_amcheck [option...] [ dbname ]

描述

ux_amcheck支持运行amcheck的损坏检查函数,针对一个或多个数据库,具有选择要检查的模式、表和索引、要执行的检查类型以及是否并行执行检查的选项,如果并行执行,则建立和使用的并行连接数。

目前仅支持普通和 toast 表关系、材料化视图、序列和 btree 索引。其他关系类型会被静默跳过。

如果指定了dbname,则应该是要检查的单个数据库的名称,不应存在其他数据库选择选项。否则,如果存在任何数据库选择选项,则将检查所有匹配的数据库。如果不存在这样的选项,则将检查默认数据库。数据库选择选项包括--all--database--exclude-database。它们还包括--relation--exclude-relation--table--exclude-table--index--exclude-index,但仅当使用三部分模式(例如mydb*.myschema*.myrel*)时才使用这些选项。最后,当使用两部分模式(例如mydb*.myschema*)时,它们包括 --schema--exclude-schema

dbname 也可以是连接字符串。

选项

以下命令行选项控制检查内容:

-a
--all
检查所有数据库,除了通过--exclude-database排除的任何数据库。

-d pattern
--database=pattern
检查与指定pattern匹配的数据库,除了通过--exclude-database排除的任何数据库。此选项可以多次指定。

-D pattern
--exclude-database=pattern
排除与给定pattern匹配的数据库。此选项可以多次指定。

-i pattern
--index=pattern
检查与指定pattern匹配的索引,除非它们被排除。此选项可以多次指定。

这类似于--relation选项,但仅适用于索引,而不适用于其他关系类型。

-I pattern
--exclude-index=pattern
排除与指定pattern匹配的索引。此选项可以多次指定。

这类似于--exclude-relation选项,但仅适用于索引,而不适用于其他关系类型。

-r pattern
--relation=pattern
检查与指定pattern匹配的关系,除非它们被排除。此选项可以多次指定。

模式可以是未限定的,例如myrel*,也可以是模式限定的,例如myschema*.myrel*或数据库限定和模式限定,例如mydb*.myscheam*.myrel*。数据库限定模式将添加匹配的数据库到要检查的数据库列表中。

-R pattern
--exclude-relation=pattern
排除与指定pattern匹配的关系。此选项可以多次指定。

--relation一样,pattern可以是未限定的、模式限定的,或者是数据库和模式限定的。

-s pattern
--schema=pattern
检查与指定pattern匹配的模式中的表和索引,除非它们被排除在外。此选项可以多次指定。

要仅选择与特定模式匹配的模式中的表,请考虑使用类似于--table=SCHEMAPAT.* --no-dependent-indexes的内容。要仅选择索引,请考虑使用类似于--index=SCHEMAPAT.*的内容。

模式模式可以是数据库限定的。例如,您可以编写--schema=mydb*.myschema*以选择与匹配myschema*的数据库匹配的模式。

-S pattern
--exclude-schema=pattern
排除与指定pattern匹配的模式中的表和索引。此选项可以多次指定。

--schema一样,模式可以是数据库限定的。

-t pattern
--table=pattern
检查与指定pattern匹配的表,除非它们被排除在外。此选项可以多次指定。

这类似于--relation选项,但仅适用于表、材料化视图和序列,而不适用于索引。

-T pattern
--exclude-table=pattern
排除与指定pattern匹配的表。此选项可以多次指定。

这类似于--exclude-relation选项,但仅适用于表、材料化视图和序列,而不适用于索引。

--no-dependent-indexes
默认情况下,如果检查了一个表,则该表的任何btree索引也将被检查,即使它们没有被像--index--relation这样的选项明确选择。此选项抑制了该行为。

--no-dependent-toast
默认情况下,如果检查了一个表,则其toast表(如果有)也将被检查,即使它没有被像--table--relation这样的选项明确选择。此选项抑制了该行为。

--no-strict-names
默认情况下,如果--database的参数是未限定的,则将其视为数据库名称。此选项允许在未指定数据库名称的情况下使用模式。--table--index--relation 没有匹配到任何对象,这是一个致命错误。此选项将此错误降级为警告。

以下命令行选项控制表的检查:

--exclude-toast-pointers
默认情况下,每当在表中遇到 TOAST 指针时,都会执行查找以确保它们引用了TOAST表中的有效条目。这些检查可能非常缓慢,可以使用此选项跳过它们。

--on-error-stop
在报告表的第一页上发现损坏后,停止处理该表关系并移动到下一个表或索引。

请注意,索引检查始终在第一个损坏的页面后停止。此选项仅与表关系相关。

--skip=option
如果给出了 all-frozen,则表损坏检查将跳过所有标记为全部冻结的表中的页面。

如果给出了 all-visible,则表损坏检查将跳过所有标记为全部可见的表中的页面。

默认情况下,不跳过任何页面。可以指定为none,但由于这是默认值,因此不需要提及。

--startblock=block
从指定的块号开始检查。如果正在检查的表关系的块数少于此数字,则会出现错误。此选项不适用于索引,并且可能仅在检查单个表关系时有用。有关进一步注意事项,请参见--endblock

--endblock=block
在指定的块号处结束检查。如果正在检查的表关系的块数少于此数字,则会出现错误。此选项不适用于索引,并且可能仅在检查单个表关系时有用。如果同时检查常规表和TOAST 表,则此选项将应用于两者,但是在验证 TOAST 指针时仍可能访问更高编号的 TOAST 块,除非使用--exclude-toast-pointers 来禁止。

以下命令行选项控制 B 树索引的检查:

--heapallindexed
对于每个检查的索引,使用 amcheckheapallindexed 选项验证所有堆元组是否作为索引元组存在于索引中。

--parent-check
对于每个 B 树索引检查,使用 amcheckbt_index_parent_check 函数,在索引检查期间执行父/子关系的其他检查。

默认情况下,使用 amcheck 的 bt_index_check 函数,但请注意,使用 --rootdescend选项会隐式选择 bt_index_parent_check

--rootdescend
对于每个检查的索引,通过从根页面开始为每个元组执行新搜索,重新查找叶级别上的元组,以使用--rootdescendamcheckrootdescend 选项。

使用此选项还会隐式选择 --parent-check 选项。

这种验证形式最初是为了帮助开发 btree索引功能而编写的。它可能在帮助检测实际发生的损坏类型方面有限或甚至没有用处。它还可能导致在服务器上消耗更多的资源并且需要更长时间进行损坏检查。

警告

当指定 --parent-check 选项或 --rootdescend 选项时,对 B-tree索引执行的额外检查需要相对强的关系级别锁。这些检查是唯一会阻止并发数据修改的检查,包括INSERTUPDATEDELETE 命令。

以下命令行选项控制与服务器的连接:

-h hostname
--host=hostname
指定运行服务器的计算机的主机名。如果值以斜杠开头,则用作 Unix 域套接字的目录。

-p port
--port=port
指定服务器侦听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。

-U
--username=username
连接的用户名。

-w
--no-password
从不发出密码提示。如果服务器需要密码验证并且没有其他方式(如 .uxpass文件)提供密码,则连接尝试将失败。此选项可用于批处理作业和脚本,其中没有用户输入密码。

-W
--password
强制 ux_amcheck 在连接到数据库之前提示输入密码。

此选项从不是必需的,因为如果服务器要求密码验证,ux_amcheck 将自动提示输入密码。但是,ux_amcheck将浪费一个连接尝试来找出服务器需要密码。在某些情况下,输入 -W可以避免额外的连接尝试。

--maintenance-db=dbname
指定要用于发现要检查的数据库列表的数据库或连接字符串。如果既未使用--all也未使用包含数据库模式的任何选项,则不需要此类连接,此选项无效。否则,除了数据库名称之外的任何连接字符串参数都将在连接到正在检查的数据库时使用。如果省略此选项,则默认值为uxdb或者如果失败了,就是 template1

还有其他选项可用:

-e
--echo
将发送到服务器的所有 SQL 输出到标准输出。

-j num
--jobs=num
使用 num 个并发连接到服务器,或者每个要检查的对象使用一个连接,以较小者为准。

默认情况下,使用单个连接。

-P
--progress
显示进度信息。进度信息包括已完成检查的关系数以及这些关系的总大小。它还包括最终将要检查的关系总数以及这些关系的估计大小。

-v
--verbose
打印更多消息。特别地,这将为每个正在检查的关系打印一条消息,并增加显示服务器错误的详细程度。

-V
--version
打印 ux_amcheck 版本并退出。

--install-missing
--install-missing=schema 安装任何缺失的扩展,以便检查数据库。如果尚未安装,则每个扩展的对象将安装到给定的 schema 中,如果未指定,则安装到schema ux_catalog 中。

目前,唯一需要的扩展是 amcheck

-?
--help
显示有关 ux_amcheck 命令行参数的帮助信息,并退出。

注意

ux_amcheck 适用于UXDB 2122及更高版本。

9.ux_basebackup

ux_basebackup — 获取正在运行的UXDB数据库集群的基本备份

概要

ux_basebackup [option...]

描述

ux_basebackup用于获取正在运行的UXDB数据库集群的基本备份。备份是在不影响数据库的其他客户端的情况下进行的,并且可以用于时间点恢复和作为日志传送或流复制备用服务器的起点。

ux_basebackup在确保服务器自动进入和退出备份模式的同时,制作数据库集群文件的精确副本。备份始终针对整个数据库集群进行;不可能备份单个数据库或数据库对象。对于选择性备份,必须使用另一个工具,例如ux_dump

备份是通过使用复制协议的常规UXDB连接进行的。连接必须使用具有REPLICATION权限或超级用户的用户ID进行,ux_hba.conf必须允许复制连接。服务器还必须配置为设置max_wal_senders足够高,以提供备份加上WAL流(如果使用)至少一个WAL发送器。

可以同时运行多个ux_basebackup,但通常从性能角度来看,只需要进行一次备份并复制结果即可。

ux_basebackup不仅可以从主服务器中进行基本备份,还可以从备用服务器中进行备份。要从备用服务器中进行备份,请设置备用服务器以接受复制连接(即设置max_wal_sendershot_standby,并适当配置其ux_hba.conf)。您还需要在主服务器上启用full_page_writes

请注意,从备用服务器中进行备份存在一些限制:

  • 备份历史文件不会在备份的数据库集群中创建。

  • ux_basebackup 无法强制备用服务器在备份结束时切换到新的 WAL 文件。当您使用 -X none时,如果主服务器上的写入活动较少,则 ux_basebackup可能需要等待很长时间才能切换和归档备份所需的最后一个 WAL文件。在这种情况下,运行 ux_switch_wal 可能有用,以触发立即 WAL文件切换。

  • 如果在备份期间将备用服务器提升为主服务器,则备份将失败。

  • 备份所需的所有 WAL 记录必须包含足够的全页写入,这要求您在主服务器上启用 full_page_writes

每当 ux_basebackup 进行基本备份时,服务器的ux_stat_progress_basebackup视图将报告备份的进度。

选项

以下命令行选项控制输出的位置和格式:

-D directory
--uxdata=directory
设置要将输出写入的目标目录。如果目录不存在,ux_basebackup将创建此目录(以及任何缺少的父目录)。如果它已经存在,则必须为空。

当备份以 tar 格式进行时,目标目录可以指定为 -(破折号),导致 tar 文件被写入 stdout

此选项是必需的。

-F format
--format=format
选择输出格式。 format 可以是以下之一:

  • p
    plain

    将输出写为普通文件,与源服务器的数据目录和表空间具有相同的布局。当群集没有其他表空间时,整个数据库将放置在目标目录中。如果群集包含其他表空间,则主数据目录将放置在目标目录中,但所有其他表空间将放置在与源服务器上相同的绝对路径中。

    这是默认格式。

  • t
    tar

    将输出写入目标目录的 tar 文件中。主数据目录的内容将被写入名为 base.tar的文件中,每个其他表空间将被写入一个名为该表空间OID 的单独的 tar 文件中。

    如果目标目录指定为 -(破折号),则 tar内容将被写入标准输出,适合于管道传输到(例如)gzip。只有当集群没有其他表空间并且未使用WAL流时才允许这样做。

-R
--write-recovery-conf
在目标目录中创建一个standby.signal文件,并将连接设置附加到uxsinodb.auto.conf 文件中(或在使用 tar格式时在基本存档文件中)。这样可以使用备份的结果轻松设置备用服务器。

uxsinodb.auto.conf 文件将记录连接设置,如果指定,还将记录 ux_basebackup正在使用的复制槽,以便以后使用流复制时使用相同的设置。

-t target
--target=target
指示服务器将基本备份放置在何处。默认目标是 client,表示备份应发送到运行 ux_basebackup的计算机。如果将目标设置为server:/some/path,则备份将存储在运行服务器的计算机上的/some/path 目录中。在服务器上存储备份需要超级用户权限或具有 ux_write_server_files角色的权限。如果目标设置为blackhole,则内容将被丢弃,不会存储在任何地方。这只应用于测试目的,因为您不会得到实际的备份。

由于 WAL 流由 ux_basebackup 实现而不是由服务器实现,因此此选项不能与 -Xstream一起使用。由于这是默认设置,因此在指定此选项时,您必须同时指定 -Xfetch-Xnone

-T olddir=newdir
--tablespace-mapping=olddir=newdir
在备份期间将目录 olddir 中的表空间重定位到 newdir 。为了有效, olddir 必须与在源服务器上定义表空间的路径规范完全匹配。(但是,如果源服务器上没有表空间在 olddir 中,则不会出错。)同时, newdir 是接收主机文件系统中的目录。与主目标目录一样, newdir 不需要已经存在,但如果存在,则必须是一个目录。如果需要包含等号(=),则必须在其前面加上反斜杠。此选项可多次指定以备多个表空间。

如果以此方式重新定位表空间,则主数据目录中的符号链接将更新为指向新位置。因此,新数据目录已准备好用于具有所有更新位置的表空间的新服务器实例。

目前,此选项仅适用于普通输出格式;如果选择tar格式,则会忽略它。

--waldir=waldir
设置要写入WAL(预写式日志)文件的目录。默认情况下,WAL文件将放置在目标目录的ux_wal子目录中,但是可以使用此选项将它们放置在其他位置。 waldir 必须是绝对路径。与主目标目录一样, waldir 不需要已经存在,但如果它存在,则必须为空。只有当备份是普通文件模式时才能指定事务日志目录。

-X method
--wal-method=method
包括备份中所需的WAL(预写式日志)文件。这将包括备份期间生成的所有预写式日志。除非指定方法none,否则可以在目标目录中启动uxmaster而无需查看日志归档,从而使输出成为完全独立的备份。支持以下 method 收集预写式日志:

  • n
    none
    不在备份中包括预写式日志。

  • f
    fetch
    在备份结束时收集预写式日志文件。因此,必须将源服务器的wal_keep_size参数设置得足够高,以便在备份结束之前不会删除所需的日志数据。如果所需的日志数据在传输之前已被回收,则备份将失败并且无法使用。当使用tar格式时,预写式日志文件将包含在base.tar文件中。

  • s
    stream
    在创建备份时对事务日志进行流处理。此方法将打开第二个连接到服务器,并在运行备份时并行地开始流处理事务日志。因此,它将需要两个复制连接而不仅仅是一个。只要客户端可以跟上预写式日志数据,使用此方法就不需要在源服务器上保存额外的预写式日志。当使用tar格式时,预写式日志文件将写入名为ux_wal.tar的单独文件中(如果服务器版本早于10,则文件将命名为ux_xlog.tar)。这是默认值。

-z
--gzip
启用 tar 文件输出的 gzip 压缩,使用默认压缩级别。仅在使用 tar 格式时才可用压缩,并且所有 tar文件名都会自动添加后缀 .gz

-Z level
-Z [{client|server}-]method[: detail ]
--compress=level
--compress=[{client|server}-]method[: detail ]
请求备份压缩。如果包括 clientserver,则指定压缩的位置。在服务器上压缩将减少传输带宽,但会增加服务器 CPU消耗。默认情况下,除非使用了 --target,否则为client。在这种情况下,备份不会发送到客户端,因此只有服务器压缩是明智的。当使用默认的-Xstream 时,不会对 WAL 应用服务器端压缩。要压缩 WAL,请使用客户端压缩,或指定 -Xfetch

压缩方法可以设置为 gziplz4zstdnone(不压缩)。可以可选地指定压缩详细信息字符串。如果详细信息字符串是整数,则指定压缩级别。否则,它应该是逗号分隔的项目列表,每个项目的形式为keywordkeyword=value。目前,支持的关键字是 levelworkers

如果未指定压缩级别,则将使用默认压缩级别。如果仅指定级别而未提及算法,则如果级别大于 0,则使用 gzip 压缩,如果级别为0,则不使用压缩。

当使用 gziplz4zstd 的 tar 格式时,分别会自动添加后缀 .gz.lz4.zst到所有 tar 文件名。当使用 plain格式时,可能无法指定客户端压缩,但仍然可以请求服务器端压缩。如果这样做,服务器将压缩备份以进行传输,客户端将解压缩并提取它。

当此选项与 -Xstream 结合使用时,如果选择了客户端 gzip 压缩,则使用 gzipux_wal.tar进行压缩,但如果选择了任何其他压缩算法或选择了服务器端压缩,则不会进行压缩。

以下命令行选项控制备份的生成和程序的调用:

-c {fast|spread}
--checkpoint={fast|spread}
将检查点模式设置为快速(立即)或扩散(默认)。

-C
--create-slot
指定在开始备份之前应创建由--slot选项命名的复制槽。如果槽已经存在,则会引发错误。

-l label
--label=label
设置备份的标签。如果未指定,则使用默认值“ux_basebackup base backup”。

-n
--no-clean
默认情况下,当ux_basebackup因错误而中止时,它会删除它可能在发现无法完成作业之前创建的任何目录(例如目标目录和预写日志目录)。此选项禁止整理,因此对于调试非常有用。

请注意,无论哪种方式,表空间目录都不会被清理。

-N
--no-sync
默认情况下,ux_basebackup将等待所有文件都被安全地写入磁盘。此选项会导致ux_basebackup返回而不等待,这更快,但意味着随后的操作系统崩溃可能会使基本备份损坏。通常,此选项对于测试很有用,但在创建生产安装时不应使用。

-P
--progress
启用进度报告。打开此选项将在备份期间提供近似进度报告。由于数据库可能在备份期间发生更改,因此这只是一个近似值,可能不会准确地结束于100%。特别是当WAL日志包含在备份中时,无法提前估计数据的总量,在这种情况下,一旦超过不包括WAL的总估计,估计的目标大小将增加。

当这个选项被启用时,备份将从枚举整个数据库的大小开始,然后返回并发送实际内容。这可能使备份需要多花一些时间,特别是它在发送第一个数据之前花费的时间最长。

-r rate
--max-rate=rate
设置从源服务器收集数据的最大传输速率。这可以限制ux_basebackup对服务器的影响。值以每秒千字节为单位。使用后缀M表示每秒兆字节。也接受后缀k,但没有影响。有效值介于每秒32千字节和1024兆字节之间。

此选项始终影响数据目录的传输。仅当收集方法为fetch时,WAL文件的传输才会受到影响。

-S slotname
--slot=slotname
此选项仅可与-X stream一起使用。它导致WAL流使用指定的复制槽。如果基本备份旨在作为使用复制槽的流复制备用,那么备用应使用与primary_slot_name相同的复制槽名称。这确保了主服务器在基础备份结束和新的备机开始流式复制之间不会删除任何必要的WAL数据。除非使用了选项-C,否则指定的复制槽必须存在。如果未指定此选项且服务器支持临时复制槽,则自动使用临时复制槽进行WAL流式传输。

-v
--verbose
启用详细模式。在启动和关闭期间输出一些额外的步骤,并在启用进度报告时显示当前正在处理的确切文件名。

--manifest-checksums=algorithm
指定应用于备份清单中包含的每个文件的校验和算法。当前可用的算法为NONECRC32CSHA224SHA256SHA384SHA512。默认值为CRC32C。如果选择了NONE,备份清单将不包含任何校验和。否则,它将使用指定的算法包含备份中每个文件的校验和。此外,清单将始终包含其自身内容的SHA256校验和。与CRC32C相比,SHA算法需要更多的CPU资源,因此选择其中之一可能会增加完成备份所需的时间。使用SHA哈希函数为希望验证备份未被篡改的用户提供了每个文件的加密安全摘要,而CRC32C算法提供了一个计算速度更快的校验和;它能够捕捉由于意外更改而导致的错误,但不具有抵抗恶意修改的能力。请注意,为了对抗访问备份的对手,备份清单需要在其他地方安全地存储或以其他方式验证自备份以来未被修改。ux_verifybackup可用于根据备份清单检查备份的完整性。

--manifest-force-encode
强制备份清单中的所有文件名进行十六进制编码。如果未指定此选项,则仅对非UTF8文件名进行十六进制编码。此选项主要用于测试正确处理此情况的工具。

--no-estimate-size
防止服务器估计将要流式传输的备份数据的总量,导致ux_stat_progress_basebackup视图中的backup_total列始终为NULL。如果不使用此选项,则备份将从枚举整个数据库的大小开始,然后返回并发送实际内容。这可能会使备份花费稍微更长的时间,特别是在发送第一个数据之前需要更长的时间。如果估计时间太长,此选项很有用,可以避免这种估计时间。在使用--progress时,不允许使用此选项。

--no-manifest
禁用备份清单的生成。如果未指定此选项,则服务器将生成并发送备份清单。可以使用ux_verifybackup进行验证。清单是备份中存在的每个文件的列表,除了可能包括的任何WAL文件。它还存储每个文件的大小、最后修改时间和可选校验和。

--no-slot
防止为备份创建临时复制槽。

默认情况下,如果选择日志流式传输但没有使用-S选项给出槽名称,则会创建一个临时复制槽(如果源服务器支持)。

此选项的主要目的是允许在服务器没有空闲复制槽时进行基本备份。几乎总是首选使用复制槽,因为它可以防止服务器在备份期间删除所需的WAL。

--no-verify-checksums
禁用校验和验证,如果在获取基本备份的源服务器上启用了校验和。

默认情况下,将验证校验和,校验和失败将导致非零退出状态。但是,在这种情况下,基本备份不会被删除,就像使用了--no-clean选项一样。校验和验证失败也将在ux_stat_database视图中报告。

以下命令行选项控制与源服务器的连接:

-d connstr
--dbname=connstr
指定用于连接到服务器的参数,作为连接字符串;这些将覆盖任何冲突的命令行选项。

该选项称为--dbname,以保持与其他客户端应用程序的一致性,但是因为ux_basebackup不连接到群集中的任何特定数据库,所以连接字符串中的任何数据库名称都将被忽略。

-h host
--host=host
指定运行服务器的计算机的主机名。如果值以斜杠开头,则将其用作Unix域套接字的目录。默认值取自UXHOST环境变量(如果设置),否则将尝试进行Unix域套接字连接。

-p port
--port=port
指定服务器侦听连接的TCP端口或本地Unix域套接字文件扩展名。默认值为UXPORT环境变量(如果设置),或编译的默认值。

-s interval
--status-interval=interval
指定发送回源服务器的状态数据包之间的秒数。较小的值允许从服务器更准确地监视备份进度。

一个零值完全禁用周期性状态更新,尽管当服务器请求更新时仍会发送更新,以避免基于超时的断开连接。默认值为10秒。

-U username
--username=username
指定要连接的用户名。

-w
--no-password
防止发出密码提示。如果服务器需要密码身份验证并且没有其他方式(如.uxpass文件)提供密码,则连接尝试将失败。此选项可用于批处理作业和脚本,其中没有用户输入密码。

-W
--password
强制ux_basebackup在连接到源服务器之前提示输入密码。

此选项从未是必需的,因为如果服务器要求密码身份验证,ux_basebackup将自动提示输入密码。但是,ux_basebackup将浪费一个连接尝试来发现服务器需要密码。在某些情况下,输入-W值得避免额外的连接尝试。

还有其他选项可用:

-V
--version
打印ux_basebackup版本并退出。

-?
--help
显示有关ux_basebackup命令行参数的帮助,并退出。

环境变量

与大多数其他UXDB实用程序一样,此实用程序使用libuxsql支持的环境变量。环境变量UX_COLOR指定是否在诊断消息中使用颜色。可能的值为alwaysautonever

注解

在备份开始时,需要在源服务器上执行检查点。这可能需要一些时间(特别是如果未使用选项--checkpoint=fast),在此期间ux_basebackup将似乎处于空闲状态。

备份将包括数据目录和表空间中的所有文件,包括配置文件和任何第三方放置在目录中的附加文件,但不包括由UXDB管理的某些临时文件。但是,只复制常规文件和目录,除了保留用于表空间的符号链接。指向UXDB已知目录的符号链接将被复制为空目录。其他符号链接和特殊设备文件将被跳过。

在普通格式中,表空间将备份到它们在源服务器上具有的相同路径,除非使用选项--tablespace-mapping。没有对表空间进行任何更改的情况下,还可以将备份还原到源服务器上。

如果源服务器上的数据目录中有符号链接,可能需要使用--exclude-symlink选项来排除它们,以避免在备份中复制它们的目标文件。

如果源服务器上的数据目录中有大量小文件,则在备份期间可能会出现性能问题。在这种情况下,可以使用--tar选项将备份打包成tar格式,以便更快地传输备份文件。

在备份期间,源服务器上的数据目录和表空间将被锁定,因此在此期间无法对其进行更改。如果需要在备份期间对源服务器进行更改,则可以使用ux_ctl工具将源服务器切换到备份模式,以允许更改。在备份完成后,必须使用相同的工具将源服务器切换回正常模式。

如果使用相同的主机运行纯格式基本备份选项,则如果使用表空间,则不起作用,因为备份必须写入与原始表空间相同的目录位置。

当使用tar格式时,用户需要在启动使用数据的UXDB服务器之前解压每个tar文件。如果有其他表空间,则需要在正确的位置解压缩它们的tar文件。在这种情况下,这些表空间的符号链接将根据包含在base.tar文件中的tablespace_map文件的内容由服务器创建。

如果在源群集上启用了组权限,则ux_basebackup将保留数据文件的组权限。

示例

要创建mydbserver服务器的基本备份并将其存储在本地目录/usr/local/uxsql/data中:

$ ux_basebackup -h mydbserver -D /usr/local/uxsql/data

要创建本地服务器的备份,并为每个表空间创建一个压缩的tar文件,并将其存储在目录backup中,在运行时显示进度报告:

$ ux_basebackup -D backup -Ft -z -P 

要创建单个表空间本地数据库的备份并使用bzip2压缩:

$ ux_basebackup -D - -Ft -X fetch | bzip2 \> backup.tar.bz2

(如果数据库中有多个表空间,则此命令将失败。) 要创建本地数据库的备份,其中表空间在/opt/ts中重新定位为./backup/ts:

$ ux_basebackup -D backup/data -T /opt/ts=$(pwd)/backup/ts

要创建本地服务器的备份,并为每个表空间创建一个tar文件,压缩级别为gzip:9,并将其存储在目录backup中:

$ ux_basebackup -D backup -Ft
--compress=gzip:9

另请参阅

ux_dump

10.uxbench

uxbench — 在 UXDB 上运行基准测试

概要

uxbench -i [option...] [ dbname ]

uxbench [option...] [ dbname ]

描述

uxbench 是在 UXDB 上运行基准测试的简单程序。它重复运行相同的SQL命令序列,可能在多个并发数据库会话中运行,然后计算平均事务速率(每秒事务数)。默认情况下,uxbench测试基于 TPC-B 的一个场景,涉及每个事务五个 SELECTUPDATEINSERT命令。但是,编写自己的事务脚本文件很容易测试其他情况。

uxbench 的典型输出如下所示:

transaction type: <builtin: TPC-B (sort of)>
scaling factor: 10
query mode: simple
number of clients: 10
number of threads: 1
maximum number of tries: 1
number of transactions per client: 1000
number of transactions actually processed: 10000/10000
number of failed transactions: 0 (0.000%)
latency average = 11.013 ms
latency stddev = 7.351 ms
initial connection time = 45.758 ms
tps = 896.967014 (without initial connection time)

前七行报告了一些最重要的参数设置。第六行报告了具有串行化或死锁错误的事务的最大尝试次数(有关更多信息,请参见失败和串行化/死锁重试)。第八行报告了已完成和预期的事务数(后者仅是每个客户端的事务数和客户端数的乘积);除非运行时间超过了指定的测试时间,否则它们将相等。未完成或某些 SQL 命令失败。(在 -T模式下,仅打印实际事务数。)下一行报告由于串行化或死锁错误而失败的事务数(有关更多信息,请参见失败和串行化/死锁重试)。最后一行报告每秒事务数。

默认的类似 TPC-B 的事务测试需要预先设置特定的表。应使用 uxbench 带有 -i(初始化)选项调用以创建和填充这些表。(当您测试自定义脚本时,您不需要此步骤,而是需要执行您的测试所需的任何设置。)初始化如下:

uxbench -i [ other-options ] dbname

其中 dbname 是要测试的已创建数据库的名称。(您还可能需要 -h-p-U选项来指定如何连接到数据库服务器。)

注意

uxbench -i 创建四个表uxbench_accountsuxbench_branchesuxbench_historyuxbench_tellers,破坏任何具有这些名称的现有表。 如果您有具有这些名称的表,请非常小心使用另一个数据库!

在默认的比例因子为 1 的情况下,表最初包含以下行数:

table                   # of rows
-----------------------
uxbench_branches        1
uxbench_tellers         10
uxbench_accounts        100000
uxbench_history         0

您可以(并且对于大多数目的,可能应该)使用 -s(比例因子)选项增加行数。此时也可以使用 -F(填充因子)选项。

一旦您完成了必要的设置,就可以使用不包括 -i 的命令运行基准测试,即

uxbench [ options ] dbname

在几乎所有情况下,您都需要一些选项才能进行有用的测试。最重要的选项是 -c(客户端数)、-t(事务数)、-T(时间限制)和-f(指定自定义脚本文件)。有关完整列表,请参见下文。

选项

以下内容分为三个子部分。不同的选项用于数据库初始化和运行基准测试,但某些选项在两种情况下都很有用。

  • 初始化选项

    uxbench 接受以下命令行初始化参数:

    dbname
    指定要测试的数据库的名称。如果未指定,则使用环境变量 UXDATABASE。如果未设置,则使用连接的用户名。

    -i
    --initialize
    需要调用初始化模式。

    -I init_steps
    --init-steps=init_steps
    仅执行一组选择的正常初始化步骤。 init_steps 指定要执行的初始化步骤,每个步骤使用一个字符调用,按指定顺序调用每个步骤。默认值为dtgvp。可用的步骤包括:

    • d (删除)
      删除任何现有的 uxbench 表。

    • t (创建表)
      创建标准 uxbench 场景使用的表,即 uxbench_accountsuxbench_branchesuxbench_historyuxbench_tellers

    • gG (生成数据,客户端或服务器端)
      生成数据并将其加载到标准表中,替换任何已经存在的数据。

      使用 g (客户端数据生成),在 uxbench 客户端中生成数据,然后将其发送到服务器。这通过 COPY大量使用客户端/服务器带宽。对于 UXDB 的版本 14 或更高版本,uxbench 使用FREEZE 选项加速后续的 VACUUM,除非启用了分区。使用 g 会导致在为 uxbench_accounts表生成数据时,每生成 100,000 行数据就打印一条消息。

      使用 G (服务器端数据生成),仅从 uxbench客户端发送小查询,然后在服务器上实际生成数据。不需要大量带宽,但服务器将执行更多的工作。使用- G 会导致在生成数据时不打印任何进度消息。

      默认的初始化行为使用客户端数据生成 (等效于 g)。

    • v (清理)
      在标准表上调用 VACUUM

    • p (创建主键)
      在标准表上创建主键索引。

    • f (创建外键)
      在标准表之间创建外键约束。(请注意,此步骤默认不执行。)

    -F fillfactor
    --fillfactor=fillfactor
    使用给定的填充因子创建 uxbench_accountsuxbench_tellersuxbench_branches 表。默认值为 100。

    -n
    --no-vacuum
    在初始化期间不执行清理操作。(即使在 -I 中指定了 v初始化步骤,此选项也会禁止清理操作。)

    -q
    --quiet
    将日志记录切换到安静模式,每5秒钟只产生一条进度消息。默认日志记录每100,000行打印一条消息,这通常会每秒输出许多行(特别是在良好的硬件上)。

    如果在-I中指定了G,则此设置无效。

    -s scale_factor
    --scale=scale_factor
    将生成的行数乘以比例因子。 例如,-s 100将在uxbench_accounts表中创建10,000,000行。默认值为1。当比例为20,000或更大时,用于保存帐户标识符(aid列)的列将切换到使用较大的整数(bigint),以便足够大以容纳帐户标识符的范围。

    --foreign-keys
    在标准表之间创建外键约束。(如果初始化步骤序列中没有,则此选项将添加f步骤。)

    --index-tablespace=index_tablespace
    在指定的表空间中创建索引,而不是默认表空间。

    --partition-method=NAME
    使用 NAME 方法创建分区的uxbench_accounts表。预期值为rangehash。此选项要求将--partitions设置为非零值。如果未指定,则默认为range

    --partitions=NUM
    为缩放后的帐户数量创建 NUM 个大小相近的分区的uxbench_accounts表。默认值为0,表示不分区。

    --tablespace=tablespace
    在指定的表空间中创建表,而不是默认表空间。

    --unlogged-tables
    将所有表创建为非记录表,而不是永久表。

  • 基准测试选项

    uxbench接受以下命令行基准测试参数:

    -b scriptname[@weight]
    --builtin=scriptname[@weight]
    将指定的内置脚本添加到要执行的脚本列表中。可用的内置脚本有:tpcb-likesimple-updateselect-only。接受内置名称的无歧义前缀。 使用特殊名称list,显示内置脚本列表并立即退出。

    可选地,在@后面写入整数权重,以指定脚本的相对权重。 调整选择此脚本与其他脚本的概率。 默认权重为1。 详见下文。

    -c clients
    --client=clients
    模拟的客户端数量,即并发数据库会话的数量。默认为1。

    -C
    --connect
    为每个事务建立新连接,而不是仅在每个客户端会话中建立一次连接。 这对于测量连接开销很有用。

    -d
    --debug
    打印调试输出。

    -D varname=value
    --define=varname=value
    为自定义脚本定义变量(详见下文)。 允许使用多个-D选项。

    -f filename[@weight]
    --file=filename[@weight]
    将从 filename 读取的事务脚本添加到要执行的脚本列表中。

    可选地,在@后面写入整数权重,以调整选择此脚本与其他脚本的概率。 默认权重为1。(为了使用包含@字符的脚本文件名,附加一个权重,以避免歧义,例如filen@me@1。)详见下文。

    -j threads
    --jobs=threads
    uxbench中的工作线程数。 在多CPU机器上使用多个线程可能会有所帮助。 客户端尽可能均匀地分布在可用线程中。 默认为1。

    -l
    --log
    将每个事务的信息写入日志文件。 详见下文。

    -L limit
    --latency-limit=limit
    持续时间超过 limit 毫秒的事务将被单独计数和报告为late

    当使用限流(--rate=...)时,落后于计划的超过 limit 毫秒的事务,因此无法满足延迟限制,将不会发送到服务器。它们将被单独计数和报告为skipped

    当使用--max-tries选项时,由于序列化异常或死锁而失败的事务,如果所有尝试的总时间大于 limit 毫秒,则不会重试。要仅限制尝试的时间而不是它们的数量,请使用--max-tries=0。通过默认情况下,选项--max-tries设置为1,具有串行化/死锁错误的事务不会重试。有关重试此类事务的更多信息,请参见失败和串行化/死锁重试

    -M querymode
    --protocol=querymode
    用于向服务器提交查询的协议:

    • simple:使用简单查询协议。
    • extended:使用扩展查询协议。
    • prepared:使用带有预处理语句的扩展查询协议。

    prepared模式下,uxbench从第二个查询迭代开始重用解析分析结果,因此uxbench运行速度比其他模式快。

    默认值为简单查询协议。

    -n
    --no-vacuum
    在运行测试之前不执行清理操作。如果您正在运行不包括标准表uxbench_accountsuxbench_branchesuxbench_historyuxbench_tellers的自定义测试方案,则此选项是必需的

    -N
    --skip-some-updates
    运行内置的simple-update脚本。 -b simple-update的速记方式。

    -P sec
    --progress=sec
    sec 秒显示进度报告。报告包括自运行以来的时间、自上次报告以来的TPS、事务延迟平均值、标准差以及自上次报告以来失败的事务数。在限制速率(-R)下,延迟是相对于事务计划开始时间而不是实际事务开始时间计算的,因此它还包括平均计划滞后时间。当使用--max-tries启用事务在串行化/死锁错误后重试时,报告包括重试事务的数量和所有重试的总和。

    -r
    --report-per-command
    在基准测试完成后,为每个命令报告以下统计信息:每个语句的平均延迟(从客户端的角度计算的执行时间)、失败次数以及此命令中在串行化或死锁错误后重试的次数。仅当--max-tries选项不等于1时,报告显示重试统计信息。

    -R rate
    --rate=rate
    执行针对指定速率的事务,而不是尽可能快地运行(默认值)。速率以每秒事务数给出。如果目标速率高于最大可能速率,则速率限制不会影响结果。

    通过沿着泊松分布的时间线启动事务来定位速率。预期的启动时间表基于客户端首次启动的时间,而不是上一个事务结束的时间。这种方法意味着当事务超过其原始计划结束时间时,后续事务有可能再次赶上。

    当限制速率时,运行结束时报告的事务延迟是从计划的开始时间计算的,因此它包括每个事务等待前一个事务完成的时间。等待时间称为计划滞后时间,其平均值和最大值也分别报告。相对于实际事务开始时间的事务延迟,即在数据库中执行事务的时间,可以通过从报告的延迟中减去计划滞后时间来计算。

    如果--latency-limit--rate一起使用,则事务可能会落后太多,以至于当前一个事务结束时,它已经超过了延迟限制,因为延迟是从计划的开始时间计算的。这样的事务不会发送到服务器,而是被跳过并单独计数。

    高计划滞后时间表明系统无法以所选的客户端和线程数以指定的速率处理事务。当平均事务执行时间长于每个事务之间的计划间隔时,每个连续的事务都会落后,计划滞后时间会随着测试运行时间的增加而不断增加。当发生这种情况时,您必须降低指定的事务速率。

    -s scale_factor
    --scale=scale_factor
    在uxbench的输出中报告指定的比例因子。对于内置测试,这是不必要的;正确的比例因子将通过计算uxbench_branches表中的行数来检测到。但是,当仅测试自定义基准时(-f选项),除非使用此选项,否则比例因子将报告为1。

    -S
    --select-only
    运行内置的仅选择脚本。-b select-only的速记方式。

    -t transactions
    --transactions=transactions
    每个客户端运行的事务数。默认值为10。

    -T seconds
    --time=seconds
    运行测试的时间,而不是每个客户端的固定事务数。 -t-T是互斥的。

    -v
    --vacuum-all
    在运行测试之前,对所有四个标准表进行清理。如果既没有-n也没有-v,则uxbench将清理所有表。

    --aggregate-interval=seconds
    聚合间隔的长度(以秒为单位)。只能与-l选项一起使用。使用此选项,日志包含每个间隔的摘要数据,如下所述。

    --failures-detailed
    在每个事务和聚合日志以及主要和每个脚本报告中报告失败,按以下类型分组:

    • 序列化失败
    • 死锁失败

    有关更多信息,请参见失败和串行化/死锁重试

    --log-prefix=prefix
    设置由--log创建的日志文件的文件名前缀。默认值为uxbench_log

    --max-tries=number_of_tries
    启用具有序列化/死锁错误的事务的重试,并设置这些尝试的最大数量。此选项可以与--latency-limit选项结合使用,该选项限制所有事务尝试的总时间;此外,您不能使用无限次数的尝试(--max-tries=0)而不使用--latency-limit--time。默认值为1,具有序列化/死锁错误的事务不会重试。有关重试此类事务的更多信息,请参见失败和串行化/死锁重试

    --progress-timestamp
    在显示进度(选项-P)时,使用时间戳(Unix纪元)而不是自运行开始以来的秒数。单位为秒,小数点后精确到毫秒。这有助于比较由各种工具生成的日志。

    --random-seed=seed
    设置随机生成器种子。种子系统随机数生成器,然后产生一个初始生成器状态序列,每个线程一个。 seed的值可以是:time(默认值,种子基于当前时间),rand(使用强随机源,如果没有可用的则失败),或无符号十进制整数值。随机生成器从uxbench脚本(random...函数)显式调用或隐式调用(例如,选项--rate使用它来调度事务)。当显式设置时,用于种子的值会显示在终端上。任何允许的seed值也可以通过环境变量UXBENCH_RANDOM_SEED提供。为确保提供的种子影响所有可能的用途,请将此选项放在第一位或使用环境变量。显式设置种子允许精确地重现uxbench运行,就随机数而言。由于随机状态是每个线程管理的,这意味着完全相同的随机数序列将在完全相同的线程数上运行。

    如果每个线程只有一个客户端且没有外部或数据依赖关系,则对于相同的调用,uxbench运行是相同的。从统计学的角度来看,完全重现运行是一个坏主意,因为它可能会隐藏性能变化或不当地提高性能,例如,通过命中与先前运行相同的页面。然而,它也可能对调试非常有帮助,例如重新运行导致错误的棘手情况。明智地使用。

    --sampling-rate= rate
    采样率,用于将数据写入日志以减少生成的日志量。如果给出此选项,则仅记录指定比例的事务。1.0 表示将记录所有事务,0.05 表示仅记录5% 的事务。

    记住在处理日志文件时考虑采样率。例如,当计算 TPS 值时,您需要相应地乘以数字(例如,使用 0.01 采样率,您只会得到实际 TPS的 1/100)。

    --show-script= scriptname
    在 stderr 上显示内置脚本 scriptname 的实际代码,并立即退出。

    --verbose-errors
    打印有关所有错误和失败(不重试的错误)的消息,包括哪个重试限制被超过以及在序列化/死锁故障的情况下超过了多少。(请注意,在这种情况下,输出可能会显著增加。)。有关更多信息,请参见失败和串行化/死锁重试

  • 常用选项

    uxbench 还接受以下常见命令行参数作为连接参数:

    -h hostname
    --host= hostname
    数据库服务器的主机名

    -p port
    --port= port
    数据库服务器的端口号

    -U login
    --username= login
    要连接的用户名

    -V
    --version
    打印 uxbench 版本并退出。

    -?
    --help
    显示有关 uxbench 命令行参数的帮助信息,并退出。

退出状态

成功运行将以状态 0 退出。退出状态 1表示静态问题,例如无效的命令行选项或永远不应发生的内部错误。在开始基准测试时发生的早期错误,例如初始连接失败,也会以状态1退出。运行过程中出现的错误,例如数据库错误或脚本中的问题,将导致退出状态 2。在后一种情况下,uxbench 将打印部分结果。

环境变量

UXDATABASE
UXHOST
UXPORT
UXUSER
默认连接参数。

与大多数其他UXDB实用程序一样, 此实用程序使用libuxsql支持的环境变量。

环境变量UX_COLOR指定是否在诊断消息中使用颜色。可能的值为 alwaysautonever

注解

  • uxbench实际执行的“事务”是什么?

    uxbench从指定列表中随机选择测试脚本进行执行。 这些脚本可以包括使用-b指定的内置脚本和使用-f指定的用户提供的脚本。每个脚本可以在@后面给出相对权重,以更改其选择概率。 默认权重为1。 权重为0的脚本将被忽略。

    默认的内置事务脚本(也可以使用-b tpcb-like调用)在随机选择的aidtidbiddelta上执行每个事务七个命令。该场景受TPC-B基准测试的启发,但实际上并不是TPC-B,因此得名。

    1. BEGIN;
    2. UPDATE uxbench_accounts SET abalance = abalance + :delta WHERE aid= :aid;
    3. SELECT abalance FROM uxbench_accounts WHERE aid = :aid;
    4. UPDATE uxbench_tellers SET tbalance = tbalance + :delta WHERE tid =:tid;
    5. UPDATE uxbench_branches SET bbalance = bbalance + :delta WHERE bid= :bid;
    6. INSERT INTO uxbench_history (tid, bid, aid, delta, mtime) VALUES(:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
    7. END;

    如果选择内置的simple-update(也是-N), 则事务中不包括步骤4和5。这将避免这些表上的更新争用,但会使测试用例更不像TPC-B。

    如果选择内置的select-only(也是-S), 则只会发出SELECT

  • 自定义脚本

    uxbench支持通过替换默认事务脚本(如上所述), 使用从文件中读取的事务脚本(-f选项)运行自定义基准测试场景。在这种情况下,一个“事务”计为一个脚本文件的执行。

    脚本文件包含一个或多个以分号结尾的SQL命令。空行和以--会被忽略。脚本文件也可以包含由uxbench自己解释的“元命令”,如下所述。

    脚本文件有一个简单的变量替换功能。变量名必须由字母(包括非拉丁字母)、数字和下划线组成,第一个字符不能是数字。变量可以通过命令行-D选项(如上所述)或下面解释的元命令进行设置。除了由-D命令行选项预设的任何变量外,还有一些自动预设的变量,列在表 uxbench自动变量中。使用-D指定的值优先于自动预设值。设置后,可以通过写 :variablename 将变量的值插入到SQL命令中。在运行多个客户端会话时,每个会话都有自己的变量集。uxbench支持在一个语句中使用多达255个变量。

    表 uxbench自动变量

    变量描述
    client_id标识客户端会话的唯一编号(从零开始)
    default_seed默认情况下哈希和伪随机排列函数中使用的种子
    random_seed随机生成器种子(除非使用-D覆盖)
    scale当前比例因子

    脚本文件元命令以反斜杠(\)开头,通常延伸到行末,尽管它们可以通过写反斜杠返回来继续到其他行。元命令的参数由空格分隔。支持以下元命令:

    \gset [prefix] \aset [prefix]
    这些命令可用于结束SQL查询,取代终止分号(;)。

    当使用\gset命令时,预期前面的SQL查询将返回一行,其列存储在以列名命名的变量中,并在提供前缀的情况下加上前缀。

    当使用\aset命令时,所有组合的SQL查询(由\;分隔)将其列存储到以列名称命名的变量中,并在提供的情况下以 prefix 为前缀。如果查询未返回行,则不进行分配,可以测试变量是否存在以检测此情况。如果查询返回多行,则保留最后一个值。

    \gset\aset不能在管道模式下使用,因为命令需要查询结果,而此时查询结果尚不可用。

    以下示例将第一个查询的最终帐户余额放入变量 abalance 中,并使用第三个查询中的整数填充变量 p_twop_three 。第二个查询的结果被丢弃。最后两个组合查询的结果存储在变量 fourfive 中。

    UPDATE uxbench_accounts
    SET abalance = abalance + :delta
    WHERE aid = :aid
    RETURNING abalance \gset
    -- compound of two queries
    SELECT 1 \;
    SELECT 2 AS two, 3 AS three \gset p_
    SELECT 4 AS four \; SELECT 5 AS five \aset
    

    \if expression
    \elif expression
    \else
    \endif
    这组命令实现了可嵌套的条件块,类似于uxsql\if expression 。条件表达式与\set相同,非零值被解释为true。

    \set varname expression
    将变量 varname 设置为从 expression 计算的值。表达式可以包含NULL常量、布尔常量TRUEFALSE、整数常量(如5432)、双精度常量(如3.14159)、对变量: variablename 的引用、运算符及其通常的SQL优先级和结合性、函数调用、SQL通用条件表达式和括号。

    函数和大多数运算符在NULL输入时返回NULL

    对于条件目的,非零数值为TRUE,零数值和NULLFALSE

    过大或过小的整数和双精度常量以及整数算术运算符(+-*/)会在溢出时引发错误。

    如果没有为CASE提供最终的ELSE子句,,默认值为NULL

    示例:

    \set ntellers 10 * :scale
    \set aid (1021 * random(1, 100000 * :scale)) % \
    (100000 * :scale) + 1
    \set divx CASE WHEN :x <> 0 THEN :y/:x ELSE NULL END
    

    \sleep number [ us | ms | s ]
    使脚本执行在指定的时间内休眠,单位可以是微秒(us)、毫秒(ms)或秒(s)。如果省略单位,则默认为秒。 number 可以是整数常量或具有整数值的: variablename 变量引用。

    示例:

    \sleep 10 ms
    

    \setshell varname command [ argument ... ]
    将变量 varname 设置为具有给定 argument (s)的shell命令 command 的结果。该命令必须通过其标准输出返回整数值。

    command 和每个 argument 都可以是文本常量或:variablename 变量的引用。如果要使用以冒号开头的 argument ,请在 argument 的开头写一个额外的冒号。

    示例:

    \setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon
    

    \shell command [ argument ... ]
    \setshell相同,但忽略命令的结果。

    示例:

    \shell command literal_argument :variable ::literal_starting_with_colon
    

    \startpipeline
    \endpipeline
    这些命令限定了 SQL语句管道的开始和结束。在管道模式下,语句被发送到服务器,而不等待前面语句的结果。管道模式需要使用扩展查询协议。

  • 内置运算符

    \set中出现的表达式中,uxbench中列出的算术、位、比较和逻辑运算符列在表 uxbench运算符中。这些运算符按递增优先级顺序列出。除非另有说明,否则接受两个数字输入的运算符将在任一输入为double 时产生 double 值,否则它们将产生整数结果。

    表 uxbench运算符

    运算符描述示例
    boolean OR booleanboolean逻辑或5 or 0TRUE
    boolean AND booleanboolean逻辑与3 and 0FALSE
    NOT booleanboolean逻辑非not falseTRUE
    boolean IS [NOT] (NULL|TRUE|FALSE)boolean布尔值测试1 is nullFALSE
    value ISNULL|NOTNULLboolean空值测试1 notnullTRUE
    number = numberboolean等于5 = 4FALSE
    number <> numberboolean不等于5 <> 4TRUE
    number != numberboolean不等于5 != 5FALSE
    number < numberboolean小于5 < 4FALSE
    number <= numberboolean小于等于5 <= 4FALSE
    number > numberboolean大于5 > 4TRUE
    number >= numberboolean大于等于5 >= 4TRUE
    integer | integerinteger按位或1 | 23
    integer # integerinteger按位异或1 # 32
    integer & integerinteger按位与1 & 31
    ~ integerinteger按位非~ 1-2
    integer << integerinteger按位左移1 << 24
    integer >> integerinteger按位右移8 >> 22
    number + numbernumber加法5 + 49
    number - numbernumber减法3 - 2.01.0
    number * numbernumber乘法5 * 420
    number / numbernumber除法(如果两个输入都是整数,则将结果截断为零)5 / 31
    integer % integerinteger模(余数)3 % 21
    - numbernumber取反- 2.0-2.0

  • 内置函数

  • 函数描述示例
    abs ( number ) → 与输入类型相同绝对值abs(-17)17
    debug ( number ) → 与输入类型相同将参数打印到 stderr,并返回参数。debug(5432.1)5432.1
    double ( number ) → double转换为双精度浮点数。double(5432)5432.0
    exp ( number ) → double指数函数(e 的幂次方)exp(1.0)2.718281828459045
    greatest ( number [, ... ] ) → 如果任何参数是double,则为double,否则为integer选择参数中的最大值。greatest(5, 4, 3, 2)5
    hash ( value [, seed ] ) → integer这是hash_murmur2的别名。hash(10, 5432)-5817877081768721676
    hash_fnv1a ( value [, seed ] ) → integer计算FNV-1a哈希。hash_fnv1a(10, 5432)-7793829335365542153
    hash_murmur2 ( value [, seed ] ) → integer计算MurmurHash2哈希。hash_murmur2(10, 5432)-5817877081768721676
    int ( number ) → integer强制转换为整数。int(5.4 + 3.8)9
    least ( number [, ... ] ) → 如果任何参数是double,则为double,否则为integer选择参数中的最小值。least(5, 4, 3, 2.1)2.1
    ln ( number ) → double自然对数ln(2.718281828459045)1.0
    mod ( integer, integer ) → integer模数(余数)mod(54, 32)22
    permute ( i, size [, seed ] ) → integer在范围 [0, size) 内对 i 进行排列。这是 i 在新位置的值(模 size)。参数化的整数伪随机排列 0...size-1,由下面的 seed 参数确定。permute(0, 4)03之间的整数
    pi () → doubleπ的近似值pi()3.14159265358979323846
    pow ( x, y ) → double
    power ( x, y ) → double
    xy次方pow(2.0, 10)1024.0
    random ( lb, ub ) → integer[lb, ub] 范围内计算均匀分布的随机整数。random(1, 10)110之间的整数
    random_exponential ( lb, ub, parameter ) → integer[lb, ub] 范围内计算指数分布的随机整数,见下文。random_exponential(1, 10, 3.0)110之间的整数
    random_gaussian ( lb, ub, parameter ) → integer[lb, ub] 范围内计算高斯分布的随机整数,见下文。random_gaussian(1, 10, 2.5)110之间的整数
    random_zipfian ( lb, ub, parameter ) → integer[lb, ub] 范围内计算Zipfian分布的随机整数,见下文。random_zipfian(1, 10, 1.5)110之间的整数
    sqrt ( number ) → double平方根sqrt(2.0)1.414213562

    random函数使用均匀分布生成值,即所有值在指定范围内具有相等的概率。random_exponentialrandom_gaussianrandom_zipfian函数函数需要一个额外的双参数,确定分布的精确形状。

    • 对于指数分布,parameter通过在parameter处截断快速下降的指数分布,然后投影到边界之间的整数来控制分布。 要精确,有

      f(x) = exp(-parameter \* (x - min) / (max - min + 1)) / (1 - exp(-parameter))
      

      然后,值 iminmax之间(包括边界)以概率绘制: f(i) - f(i + 1)。直观地说,parameter越大,访问min附近的值越频繁,访问max附近的值越不频繁。parameter越接近0,访问分布越平坦(更均匀)。分布的粗略近似是在范围内最频繁的1%值,靠近min,绘制parameter%的时间。parameter值必须严格为正。

    • 对于高斯分布,该区间映射到标准正态分布(经典的钟形高斯曲线),左侧截断为-parameter,右侧截断为+parameter。区间中间的值更可能被绘制。要精确,如果PHI(x)是标准正态分布的累积分布函数,则平均值为(max + min)/ 2.0,则

      f(x) = PHI(2.0 \* parameter \*(x-mu)/(max-min + 1))/(2.0 \* PHI(parameter)-1)
      

      然后,在minmax之间(包括边界)的值以概率绘制: f(i + 0.5)-f(i-0.5)。直观地说,parameter越大,绘制靠近区间中间的值的频率越高,绘制靠近minmax边界的值的频率越低。约67%的值从中间的1.0 / parameter绘制,即相对于平均值的0.5 / parameter,95%在中间2.0 / parameter,即相对于平均值的1.0 / parameter;例如,如果parameter为4.0,则67%的值从区间的中间四分之一(1.0 / 4.0)绘制(即从3.0 / 8.05.0 / 8.0),95%从区间的中间一半(2.0 / 4.0)绘制(第二个和第三个四分位数)。允许的最小parameter值为2.0。

    • random_zipfian生成有界的Zipfian分布。 parameter定义分布的偏斜程度。parameter越大,越频繁地绘制更接近区间开头的值。分布是这样的,假设范围从1开始,抽取 k 的概率与抽取 k+1 的概率之比为((k+1)/k)** parameter 。例如,random_zipfian(1, ..., 2.5)产生的值1的频率约为(2/1)**2.5 = 5.66次,比2更频繁,而2本身的频率比3更频繁,是(3/2)**2.5 = 2.76倍,依此类推。

      uxbench的实现基于“非均匀随机变量生成”,Luc Devroye,p.550-551,Springer 1986。由于该算法的限制, parameter 值限制在[1.001,1000]范围内。

    注意

    在设计选择行的非均匀基准时,请注意所选行可能与其他数据(例如来自序列的ID或物理行排序)相关联,这可能会扭曲性能测量结果。为避免这种情况,您可能希望使用permute函数或其他具有类似效果的附加步骤来洗牌所选行并消除这些相关性。

    哈希函数hashhash_murmur2hash_fnv1a接受一个输入值和一个可选的种子参数。如果未提供种子,则使用:default_seed的值,该值在未通过命令行-D选项设置的情况下随机初始化。

    permute接受一个输入值、一个大小和一个可选的种子参数。它生成一个伪随机排列的整数范围[0,size),并返回输入值在排列值中的索引。所选的排列由种子参数参数化,默认为:default_seed,如果未指定。与哈希函数不同,permute确保输出值中没有冲突或空洞。在区间之外的输入值被解释为模大小。如果大小不是正数,则函数会引发错误。permute可用于分散非均匀随机函数(如random_zipfianrandom_exponential)的分布,以便更频繁地绘制的值不是轻而易举地相关。例如,以下uxbench脚本模拟了社交媒体和博客平台的可能真实工作负载,其中少数帐户生成过多的负载:

    \set size 1000000
    \set r random_zipfian(1, :size, 1.07)
    \set k 1 + permute(:r, :size)
    

    在某些情况下,需要几个不相关的不同分布,这时可选的种子参数就派上用场了:

    \set k1 1 + permute(:r, :size, :default_seed + 123)
    \set k2 1 + permute(:r, :size, :default_seed + 321)
    

    也可以使用hash近似类似的行为:

    \set size 1000000
    \set r random_zipfian(1, 100 * :size, 1.07)
    \set k 1 + abs(hash(:r)) % :size
    

    但是,由于hash会生成冲突,因此有些值将无法到达,而其他值将比原始分布预期更频繁地出现。

    例如,内置TPC-B类事务的完整定义是:

    \set aid random(1, 100000 * :scale)
    \set bid random(1, 1 * :scale)
    \set tid random(1, 10 * :scale)
    \set delta random(-5000, 5000)
    BEGIN;
    UPDATE uxbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
    SELECT abalance FROM uxbench_accounts WHERE aid = :aid;
    UPDATE uxbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
    UPDATE uxbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
    INSERT INTO uxbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
    END;
    

    该脚本允许每个事务迭代引用不同的、随机选择的行。(这个例子也说明了为什么每个客户端会话都需要有自己的变量——否则它们将不会独立地触及不同的行。)

  • 对每个事务做日志

    使用-l选项(但不使用--aggregate-interval选项),uxbench会将每个事务的信息写入日志文件。日志文件的名称将为prefix.nnn,其中prefix默认为uxbench_log,nnn是uxbench进程的PID。可以使用--log-prefix选项更改前缀。如果-j选项为2或更高,则有多个工作线程,每个线程都有自己的日志文件。第一个工作线程将使用与标准单个工作线程相同的名称作为其日志文件。其他工作线程的附加日志文件将命名为prefix.nnn.mmm,其中mmm是从1开始的每个工作线程的顺序号。

    日志文件中的每一行描述一个事务。它包含以下以空格分隔的字段:

    client_id
    标识运行事务的客户端会话

    transaction_no
    计算该会话运行的事务数

    time
    事务的经过时间,以微秒为单位

    script_no
    标识用于事务的脚本文件(当使用-f或-b指定多个脚本时有用)

    time_epoch
    事务完成时间,作为Unix纪元时间戳

    time_us
    事务完成时间的小数秒部分,以微秒为单位

    schedule_lag
    事务开始延迟,即事务的计划开始时间与实际开始时间之间的差异,以微秒为单位(仅在指定了--rate时存在)

    retries
    在事务期间发生串行化或死锁错误后的重试次数(仅在--max-tries不等于1时存在)

    当同时使用--rate和--latency-limit时,跳过的事务的time将报告为skipped。如果事务以失败结束,则其time将报告为failed。如果使用--failures-detailed选项,则失败事务的time将报告为serialization或deadlock,具体取决于失败类型(有关更多信息,请参见失败和串行化/死锁重试)。

    下面是单客户端运行生成的日志文件片段:

    0 199 2241 0 1175850568 995598
    0 200 2465 0 1175850568 998079
    0 201 2513 0 1175850569 608
    0 202 2038 0 1175850569 2663
    

    另一个例子是使用--rate=100--latency-limit=5(注意额外的 schedule_lag 列):

    0 81 4621 0 1412881037 912698 3005
    0 82 6173 0 1412881037 914578 4304
    0 83 skipped 0 1412881037 914578 5217
    0 83 skipped 0 1412881037 914578 5099
    0 83 4722 0 1412881037 916203 3108
    0 84 4142 0 1412881037 918023 2333
    0 85 2465 0 1412881037 919759 740
    

    在这个例子中,事务82已经迟到了,因为它的延迟(6.173毫秒)超过了5毫秒的限制。接下来的两个事务被跳过,因为它们在开始之前就已经迟到了。

    以下示例显示了带有故障和重试的日志文件片段,最大尝试次数设置为10(注意额外的 retries 列):

    3 0 47423 0 1499414498 34501 3
    3 1 8333 0 1499414498 42848 0
    3 2 8358 0 1499414498 51219 0
    4 0 72345 0 1499414498 59433 6
    1 3 41718 0 1499414498 67879 4
    1 4 8416 0 1499414498 76311 0
    3 3 33235 0 1499414498 84469 3
    0 0 failed 0 1499414498 84905 9
    2 0 failed 0 1499414498 86248 9
    3 4 8307 0 1499414498 92788 0
    

    如果使用--failures-detailed选项,则故障类型将在 time 中报告,如下所示:

    3 0 47423 0 1499414498 34501 3
    3 1 8333 0 1499414498 42848 0
    3 2 8358 0 1499414498 51219 0
    4 0 72345 0 1499414498 59433 6
    1 3 41718 0 1499414498 67879 4
    1 4 8416 0 1499414498 76311 0
    3 3 33235 0 1499414498 84469 3
    0 0 serialization 0 1499414498 84905 9
    2 0 serialization 0 1499414498 86248 9
    3 4 8307 0 1499414498 92788 0
    

    在能够处理大量事务的硬件上运行长时间测试时,日志文件可能会变得非常大。可以使用--sampling-rate选项仅记录随机样本的事务。

  • 聚合日志

    使用--aggregate-interval选项,日志文件使用不同的格式。每个日志行描述一个聚合间隔。它包含以下以空格分隔的字段:

    interval_start
    聚合间隔的开始时间,作为Unix纪元时间戳

    num_transactions
    间隔内的事务数量

    sum_latency
    事务延迟的总和

    sum_latency_2
    事务延迟的平方和

    min_latency
    最小交易延迟时间

    max_latency
    最大交易延迟时间

    sum_lag
    交易开始延迟时间总和 (除非指定了 --rate

    sum_lag_2
    交易开始延迟时间平方总和 (除非指定了 --rate

    min_lag
    最小交易开始延迟时间 (除非指定了 --rate

    max_lag
    最大交易开始延迟时间 (除非指定了 --rate

    skipped
    由于开始时间过晚而跳过的交易数 (除非指定了 --rate--latency-limit

    retried
    重试的交易数 (除非 --max-tries 等于一)

    retries
    由于序列化或死锁错误而重试的次数 (除非 --max-tries 等于一)

    serialization_failures
    发生序列化错误并且未重试的交易数 (除非指定了 --failures-detailed

    deadlock_failures
    发生死锁错误并且未重试的交易数 (除非指定了--failures-detailed

    以下是使用这些选项生成的示例输出:

    uxbench --aggregate-interval=10 --time=20 --client=10 --log --rate=1000 --latency-limit=10 --failures-detailed --max-tries=10 test
    
    1650260552 5178 26171317 177284491527 1136 44462 2647617 7321113867 0 9866 64 7564 28340 4148 0
    1650260562 4808 25573984 220121792172 1171 62083 3037380 9666800914 0 9998 598 7392 26621 4527 0
    

    请注意,虽然普通(未聚合的)日志格式显示了每个交易使用的脚本,但聚合格式没有。因此,如果您需要每个脚本的数据,则需要自行聚合数据。

  • 每个语句的报告

    使用 -r 选项,uxbench 为每个语句收集以下统计信息:

    • latency — 每个语句的经过时间。 uxbench报告所有成功运行的语句的平均值。

    • 此语句中失败的次数。有关更多信息,请参见失败和串行化/死锁重试

    • 在此语句中发生序列化或死锁错误后的重试次数。声明。有关更多信息,请参见失败和串行化/死锁重试

    仅当--max-tries选项不等于1时,报告才显示重试统计信息。

    所有值都是为每个客户端执行的每个语句计算的,并在基准测试完成后报告。

    对于默认脚本,输出将类似于以下内容:

    starting vacuum...end.
    transaction type: <builtin: TPC-B (sort of)>
    scaling factor: 1
    query mode: simple
    number of clients: 10
    number of threads: 1
    maximum number of tries: 1
    number of transactions per client: 1000
    number of transactions actually processed: 10000/10000
    number of failed transactions: 0 (0.000%)
    number of transactions above the 50.0 ms latency limit: 1311/10000 (13.110 %)
    latency average = 28.488 ms
    latency stddev = 21.009 ms
    initial connection time = 69.068 ms
    tps = 346.224794 (without initial connection time)
    statement latencies in milliseconds and failures:
      0.012  0  \set aid random(1, 100000 * :scale)
      0.002  0  \set bid random(1, 1 * :scale)
      0.002  0  \set tid random(1, 10 * :scale)
      0.002  0  \set delta random(-5000, 5000)
      0.319  0  BEGIN;
      0.834  0  UPDATE uxbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
      0.641  0  SELECT abalance FROM uxbench_accounts WHERE aid = :aid;
      11.126  0  UPDATE uxbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
      12.961  0  UPDATE uxbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
      0.634  0  INSERT INTO uxbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
      1.957  0  END;
    

    使用可串行化的默认事务隔离级别(UXOPTIONS ='-c default_transaction_isolation = serializable'uxbench ...)的默认脚本的另一个输出示例:

    starting vacuum...end.
    transaction type: <builtin: TPC-B (sort of)>
    scaling factor: 1
    query mode: simple
    number of clients: 10
    number of threads: 1
    maximum number of tries: 10
    number of transactions per client: 1000
    number of transactions actually processed: 6317/10000
    number of failed transactions: 3683 (36.830%)
    number of transactions retried: 7667 (76.670%)
    total number of retries: 45339
    number of transactions above the 50.0 ms latency limit: 106/6317 (1.678 %)
    latency average = 17.016 ms
    latency stddev = 13.283 ms
    initial connection time = 45.017 ms
    tps = 186.792667 (without initial connection time)
    statement latencies in milliseconds, failures and retries:
      0.006     0      0  \set aid random(1, 100000 * :scale)
      0.001     0      0  \set bid random(1, 1 * :scale)
      0.001     0      0  \set tid random(1, 10 * :scale)
      0.001     0      0  \set delta random(-5000, 5000)
      0.385     0      0  BEGIN;
      0.773     0      1  UPDATE uxbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
      0.624     0      0  SELECT abalance FROM uxbench_accounts WHERE aid = :aid;
      1.098   320   3762  UPDATE uxbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
      0.582  3363  41576  UPDATE uxbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
      0.465     0      0  INSERT INTO uxbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
      1.933     0      0  END;
    

    如果指定了多个脚本文件,则所有统计信息都将分别报告每个脚本文件。

    请注意,收集用于每个语句延迟计算所需的附加定时信息会增加一些开销。这将减慢平均执行速度并降低计算的TPS。减速的量因平台和硬件而异。启用延迟报告和禁用延迟报告时比较平均TPS值是衡量计时开销是否显着的好方法。

  • 失败和串行化/死锁重试

    执行 uxbench 时,有三种主要类型的错误:

    • 主程序错误。它们是最严重的,总是导致立即退出 uxbench 并显示相应的错误消息。它们包括:

      • 在 uxbench 开始时的错误(例如,无效的选项值);
      • 在初始化模式中的错误(例如,用于内置脚本的创建表的查询失败);
      • 在启动线程之前的错误(例如,无法连接到数据库服务器,元命令中的语法错误,线程创建失败);
      • 内部uxbench 错误(理论上不应该发生...)。
    • 当线程管理其客户端时出现的错误(例如,客户端无法启动与数据库服务器的连接/用于连接客户端和数据库服务器的套接字已失效)。在这种情况下,该线程的所有客户端都停止工作,而其他线程继续工作。

    • 直接客户端错误。只有在出现内部 uxbench 错误(理论上不应该发生...)时,它们才会导致立即退出 uxbench并显示相应的错误消息。否则,在最坏的情况下,它们只会导致失败的客户端中止,而其他客户端继续运行(但某些客户端错误会在不中止客户端的情况下处理并单独报告,详见下文)。在本节的后面,假定讨论的错误只是直接客户端错误,而不是内部uxbench 错误。

    如果发生严重错误,例如与数据库服务器的连接丢失或到达脚本结束而未完成最后一个事务,则会中止客户端的运行。此外,如果由于除串行化或死锁错误以外的原因导致SQL 或元命令执行失败,则会中止客户端。否则,如果 SQL命令因串行化或死锁错误而失败,则不会中止客户端。在这种情况下,当前事务将回滚,其中还包括将客户端变量设置为此事务运行之前的状态(假定一个事务脚本只包含一个事务;有关更多信息,请参见uxbench实际执行的“事务”是什么?)。在回滚后,具有串行化或死锁错误的事务将重复执行,直到成功完成或达到最大尝试次数(由--max-tries 选项指定)/最大重试时间(由 --latency-limit 选项指定)/基准测试结束(由 --time选项指定)。如果最后一次尝试运行失败,则将报告此事务失败,但不会中止客户端并继续工作。

    注意

    如果不指定 --max-tries选项,则在发生串行化或死锁错误后,事务将永远不会重试,因为其默认值为 1。使用无限次尝试--max-tries=0)和--latency-limit 选项仅限制最大尝试时间。您还可以使用 --time选项来限制基准测试的时间。无限次尝试下的基准测试持续时间。

    当重复包含多个事务的脚本时要小心:脚本总是完全重试,因此成功的事务可能会执行多次。

    当重复使用 shell 命令进行事务时要小心。与 SQL 命令的结果不同,shell 命令的结果不会回滚,除了 \setshell命令的变量值。

    成功事务的延迟包括事务执行的整个时间,包括回滚和重试。延迟仅针对成功的事务和命令进行测量,而不针对失败的事务或命令进行测量。

    主要报告包含失败事务的数量。如果 --max-tries 选项不等于1,则主要报告还包含与重试相关的统计信息:重试的总事务数和总重试次数。每个脚本报告都从主要报告继承所有这些字段。如果--max-tries 选项不等于 1,则每个语句报告仅显示重试统计信息。

    如果您想在每个事务和聚合日志以及主要和每个脚本报告中按基本类型分组失败,请使用 --failures-detailed选项。如果您还想通过类型区分所有错误和失败(不重试的错误),包括超过重试限制的限制以及序列化/死锁失败的超过限制的数量,请使用--verbose-errors 选项。

  • 良好的实践

    使用 uxbench 生成完全无意义的数字非常容易。以下是一些指南,可帮助您获得有用的结果。

    首先,永远不要相信仅运行几秒钟的测试。使用 -t-T选项,使运行至少持续几分钟,以平均噪声。在某些情况下,您可能需要数小时才能获得可重现的数字。最好尝试运行测试几次,以了解您的数字是否可重现。

    对于默认的类似 TPC-B的测试方案,初始化比例因子(-s)应至少与您打算测试的最大客户端数(-c)一样大;否则,您将主要测量更新争用。在uxbench_branches 表中只有 -s 行,每个事务都想要更新其中的一行,因此 -c 值超过 -s将不可避免地导致大量事务被阻塞等待其他事务。

    默认的测试方案还非常敏感于自表格初始化以来的时间:在表格中累积死行和死空间会改变结果。要了解结果,您必须跟踪更新的总数以及何时进行清理。如果启用了自动清理,则可能会导致测量性能的不可预测变化。

    uxbench 的一个限制是,当尝试测试大量客户端会话时,它本身可能成为瓶颈。这可以通过在与数据库服务器不同的机器上运行 uxbench来缓解,尽管低网络延迟将是必不可少的。甚至可能有用同时在几个客户端机器上运行几个 uxbench实例,针对同一个数据库服务器。

  • 安全性

    如果不受信任的用户可以访问尚未采用的数据库安全模式使用模式,不要在该数据库中运行uxbench。uxbench使用未限定的名称并且不操作搜索路径。

11.ux_config

ux_config — 检索已安装的UXDB版本的信息

概要

ux_config [option...]

描述

ux_config实用程序打印当前安装的UXDB版本的配置参数。例如,它旨在被软件包使用,以便与UXDB进行接口,以便找到所需的头文件和库。

选项

要使用ux_config,请提供以下一个或多个选项:

--bindir
打印用户可执行文件的位置。例如,使用此选项查找uxsql程序。这通常也是ux_config程序所在的位置。

--docdir
打印文档文件的位置。

--mddir
打印md文档文件的位置。

--includedir
打印客户端接口的C头文件的位置。

--pkgincludedir
打印其他C头文件的位置。

--includedir-server
打印用于服务器编程的C头文件的位置。

--libdir
打印目标代码库的位置。

--pkglibdir
打印动态加载模块的位置,或服务器将搜索它们的位置。(其他架构相关的数据文件也可能安装在此目录中。)

--localedir
打印区域支持文件的位置。(如果在构建UXDB时未配置区域支持,则为空字符串。)

--mandir
打印手册页的位置。

--sharedir
打印体系结构无关的支持文件的位置。

--sysconfdir
打印系统范围的配置文件的位置。

--uxxs
打印扩展 makefile 的位置。

--configure
打印在构建UXDB时给configure脚本的选项。这可以用于重现相同的配置,或查找二进制包是使用哪些选项构建的。(注意然而,二进制包通常包含供应商特定的自定义 补丁。)另请参见下面的示例。

--cc
打印用于构建UXDB的CC变量的值。这显示了使用的C编译器。

--cppflags
打印用于构建UXDB的CPPFLAGS变量的值。这显示了需要的C编译器开关 在预处理时(通常为-I开关)。

--cflags
打印用于构建UXDB的CFLAGS变量的值。这显示了C编译器开关。

--cflags_sl
打印用于构建UXDB的CFLAGS_SL变量的值。这显示了额外的C编译器开关 用于构建共享库。

--ldflags
打印用于构建UXDB的LDFLAGS变量的值。这显示了链接器开关。

--ldflags_ex
打印用于构建UXDB的LDFLAGS_EX变量的值。这显示了链接器开关 仅用于构建可执行文件。

--ldflags_sl
打印用于构建UXDB的LDFLAGS_SL变量的值。这显示了链接器开关 仅用于构建共享库。

--libs
打印用于构建UXDB的LIBS变量的值。这通常包含外部库的-l 开关链接到UXDB中。

--version
打印UXDB的版本。

-?
--help
显示有关ux_config命令行的帮助 参数,并退出。

如果提供了多个选项,则按照给定的顺序打印信息,每行一个项目。如果没有提供选项,则打印所有可用信息,并带有标签。

示例

要复制当前 UXDB 安装的构建配置,请运行以下命令:

eval ./configure `ux_config --configure`

ux_config --configure 的输出包含 shell 引号,因此可以正确表示带有空格的参数。因此,使用 eval可以获得正确的结果。

12.ux_dump

ux_dump — 将UXDB数据库导出为脚本文件或其他归档文件

概要

ux_dump [connection-option...] [option...] [dbname ]

描述

ux_dump是用于备份UXDB数据库的实用程序。即使数据库正在并发使用,它也可以进行一致的备份。ux_dump不会阻止其他用户访问数据库(读者或写者)。

ux_dump仅转储单个数据库。要备份整个集群,或要备份所有集群中的公共对象(如角色和表空间),请使用ux_dumpall

可以以脚本或归档文件格式输出转储。脚本转储是包含重建数据库所需的SQL命令的纯文本文件,以使其恢复到保存时的状态。要从这样的脚本中恢复,请将其提供给uxsql。脚本文件可用于在其他计算机和其他架构上重建数据库;通过一些修改,甚至可以在其他SQL数据库产品上重建。

必须使用替代归档文件格式与ux_restore一起重建数据库。它们允许ux_restore选择性地恢复内容,甚至可以在恢复之前重新排序项目。归档文件格式旨在在架构之间进行移植。

与其中一个归档文件格式结合使用并与ux_restore结合使用时,ux_dump提供了一种灵活的归档和传输机制。ux_dump可用于在其他计算机和其他架构上重建数据库;通过一些修改,甚至可以在其他SQL数据库产品上重建。

备份整个数据库,然后可以使用 ux_restore来检查归档并/或选择要恢复的数据库的哪些部分。最灵活的输出文件格式是“custom”格式(-Fc)和“directory”格式(-Fd)。它们允许选择和重新排序所有归档项,支持并行恢复,并默认进行压缩。“directory”格式是唯一支持并行转储的格式。

在运行 ux_dump 时,应检查输出中是否有任何警告(在标准错误上打印),特别是考虑到下面列出的限制。

选项

以下命令行选项控制输出的内容和格式。

dbname
指定要转储的数据库的名称。如果未指定,则使用环境变量 UXDATABASE。如果未设置,则使用连接指定的用户名。

-a
--data-only
仅转储数据,而不是模式(数据定义)。表数据、大对象和序列值都会被转储。

出于历史原因,此选项类似于但不完全等同于指定 --section=data

-b
--blobs
在转储中包括大对象。这是默认行为,除非指定了 --schema--table--schema-only。因此,-b 开关仅在请求特定模式或表的转储中添加大对象时有用。请注意,BLOB被视为数据,因此在使用 --data-only 时将被包括,但在使用 --schema-only 时不会被包含。

-B
--no-blobs
在转储中排除大对象。

当同时给出 -b-B 时,行为是在转储数据时输出大对象,请参阅 -b 文档。

-c
--clean
在输出创建命令之前输出清理(删除)数据库对象的命令。如果未指定--if-exists,则还原可能会生成一些不致命的错误消息,如果任何对象不存在于目标数据库中。

在发出归档(非文本)输出文件时,此选项将被忽略。对于归档格式,可以在调用 ux_restore时指定该选项。

-C
--create
从创建数据库本身的命令开始输出,并重新连接到创建的数据库。(对于这种形式的脚本,在运行脚本之前连接到目标安装中的任何数据库都没有关系。)如果也指定了--clean,则脚本会在重新连接到数据库之前删除并重新创建目标数据库。

使用 --create 选项,还会输出包括数据库的注释(如果有的话)以及任何特定于此数据库的配置变量设置,即任何提到此数据库的ALTER DATABASE ... SET ...ALTER ROLE ... IN DATABASE ... SET ... 命令。除非指定了 --no-acl,否则也会转储数据库本身的访问权限。在发出存档(非文本)输出文件时,此选项将被忽略。对于存档格式,您可以在调用ux_restore 时指定该选项。

使用 -e pattern--extension=pattern 选项,只转储与 pattern 匹配的扩展。当未指定此选项时,将转储目标数据库中的所有非系统扩展。可以通过编写多个 -e开关来选择多个扩展。参数 pattern 根据与 uxsql 的 \d 命令相同的规则解释为模式(请参阅模式),因此也可以通过在模式中编写通配符字符来选择多个扩展。使用通配符时,请注意如有必要引用模式以防止shell 展开通配符。 如果指定了 --extension,则包括由 ux_extension_config_dump注册的任何配置关系。

注意

当指定了 -e 时,ux_dump不会尝试转储所选扩展可能依赖的任何其他数据库对象。因此,无法保证特定扩展的转储结果可以成功地恢复到干净的数据库中。

使用 -E encoding--encoding=encoding选项,以指定的字符集编码创建转储。默认情况下,转储将在数据库编码中创建。(另一种获得相同结果的方法是将UXCLIENTENCODING 环境变量设置为所需的转储编码。)

-f file--file=file选项,将输出发送到指定的文件。对于基于文件的输出格式,可以省略此参数,此时将使用标准输出。但是,在目录输出格式中必须给出此参数,其中它指定目标目录而不是文件。在这种情况下,目录由ux_dump 创建,并且之前必须不存在。

-F format--format=format 选择输出的格式。 format 可以是以下之一:

  • p
    plain
    输出一个纯文本的 SQL 脚本文件(默认选项)。

  • c
    custom
    输出一个自定义格式的归档文件,适用于输入到 ux_restore 中。与目录输出格式一起,这是最灵活的输出格式,因为它允许在恢复期间手动选择和重新排序归档项。此格式默认也进行了压缩。

  • d
    directory
    输出一个目录格式的归档文件,适用于输入到 ux_restore 中。这将创建一个目录,其中每个被转储的表和 blob都有一个文件,以及一个所谓的目录文件,以机器可读的格式描述转储的对象,ux_restore可以读取。目录格式的归档文件可以使用标准的 Unix工具进行操作;例如,未压缩的归档文件中的文件可以使用gzip 工具进行压缩。此格式默认也进行了压缩,并且还支持并行转储。

  • t
    tar
    输出一个 tar 格式的归档文件,适用于输入到 ux_restore 中。tar 格式与目录格式兼容:提取 tar格式的归档文件会产生一个有效的目录格式的归档文件。然而,tar 格式不支持压缩。此外,在使用 tar格式时,表数据项的相对顺序不能在恢复期间更改。

-j njobs
--jobs=njobs
通过同时转储 njobs 个表来并行运行转储。此选项可能会减少执行转储所需的时间,但也会增加数据库服务器的负载。您只能在目录输出格式中使用此选项,因为这是唯一一个多个进程可以同时写入其数据的输出格式。

ux_dump 将打开 njobs + 1 个连接到数据库,因此请确保您的max_connections设置足够高,以容纳所有连接。

在运行并行转储时请求数据库对象的排他锁可能会导致转储失败。原因是 ux_dump 领导进程会请求共享锁(ACCESS SHARE)在工作进程稍后要转储的对象上,以确保在转储运行时没有人删除它们并使它们消失。如果另一个客户端然后请求一个表的排他锁,那个锁将不会被授予,但将排队等待领导进程的共享锁被释放。因此,对表的任何其他访问也不会被授予,并且将在排他锁请求之后排队。这包括尝试转储表的工作进程。如果没有任何预防措施,这将是一个经典的死锁情况。为了检测到这种冲突,ux_dump工作进程请求另一个共享锁,以确保领导进程不会在转储期间释放共享锁。如果请求的共享锁无法获得,则工作进程将退出并显示错误消息。

使用NOWAIT选项进行共享锁定。如果工作进程未被授予此共享锁,则在此期间其他人必须已请求了排他锁,因此无法继续进行转储,因此ux_dump别无选择,只能中止转储。

要执行并行转储,数据库服务器需要支持同步快照,这是UXDB引入的主服务器和功能。使用此功能,数据库客户端可以确保它们看到相同的数据集,即使它们使用不同的连接。ux_dump -j使用多个数据库连接;它使用领导进程连接到数据库,然后再为每个工作进程连接一次。如果没有同步快照功能,则不能保证不同的工作进程在每个连接中看到相同的数据,这可能导致备份不一致。

-n pattern
--schema=pattern
仅转储与 pattern 匹配的模式;这将选择模式本身及其包含的所有对象。如果未指定此选项,则将转储目标数据库中的所有非系统模式。可以通过编写多个-n开关来选择多个模式。 pattern 参数根据uxsql的\d命令使用的相同规则解释(请参见下面的模式),因此也可以通过在模式中编写通配符字符来选择多个模式。使用通配符时,请注意如有必要引用模式以防止shell扩展通配符;请参见下面的示例

注意

当指定-n时,ux_dump不会尝试转储所选模式可能依赖的任何其他数据库对象。因此,无法保证特定模式的转储结果可以成功地恢复到干净的数据库中。

注意

当指定-n时,不会转储诸如blob之类的非模式对象。您可以使用--blobs开关将blob添加回转储中。

-N pattern
--exclude-schema=pattern
不要转储与 pattern 匹配的任何模式。该模式根据与-n相同的规则进行解释。可以多次给出-N以排除与多个模式匹配的模式。

当同时给出-n-N时,行为是仅转储与至少一个-n开关匹配但没有-N开关匹配的模式。如果-N出现而没有-n,则排除与-N匹配的模式,否则是正常转储。

-O
--no-owner
不输出命令以设置对象的所有权以匹配原始数据库。默认情况下,ux_dump会发出ALTER OWNERSET SESSION AUTHORIZATION语句来设置创建的数据库对象的所有权。除非由超级用户(或启动脚本的所有对象的相同用户)启动,否则这些语句将在运行脚本时失败。为了创建一个可以被任何用户恢复的脚本,但是会给该用户所有对象的所有权,请指定-O

在发出存档(非文本)输出文件时,此选项将被忽略。对于存档格式,可以在调用ux_restore时指定该选项。

-R
--no-reconnect
此选项已过时,但仍然被接受以实现向后兼容性。

-s
--schema-only
仅转储对象定义(模式),而不是数据。

此选项是--data-only的相反。由于历史原因,它类似于但不完全相同于指定--section=pre-data --section=post-data

(不要将其与--schema选项混淆,该选项在不同的含义上使用单词“模式”)。

要仅排除数据库中一部分表的表数据,请参见--exclude-table-data

-S username
--superuser=username
指定在禁用触发器时使用的超级用户名称。这仅在使用--disable-triggers时才相关。(通常最好将其省略,而是以超级用户身份启动生成的脚本。)

-t pattern
--table=pattern
仅转储名称与 pattern 匹配的表。可以通过编写多个-t开关来选择多个表。参数 pattern 根据与uxsql的\d命令使用的相同规则解释为模式(请参见下面的模式),因此也可以通过在模式中编写通配符字符来选择多个表。使用通配符时,请注意引用模式以防止shell扩展通配符;请参见下面的示例

除了表之外,此选项还可用于转储匹配的视图、材料化视图、外部表和序列的定义。它不会转储视图或材料化视图的内容,并且只有在使用--include-foreign-data指定相应的外部服务器时,才会转储外部表的内容。

当使用-t时,-n-N开关无效,因为无论这些开关如何选择表,都将转储由-t选择的表,而不会转储非表对象。

注意

当指定-t时,ux_dump不会尝试转储所选表之外的任何其他数据库对象。因此,特定表的转储结果可能无法成功地恢复到一个干净的数据库中。

-T pattern
--exclude-table=pattern
不转储与 pattern 匹配的任何表。该模式的解释方式与-t相同。-T可以多次使用以排除与多个模式匹配的表。

当同时使用-t-T时,行为是仅转储与至少一个-t开关匹配但没有-T开关的表。如果-T出现而没有-t,则与-T匹配的表将被排除在否则是正常转储的内容之外。

--transform-table
将分布表/参考表转换成普通表。

-v
--verbose
指定详细模式。这将导致ux_dump将详细的对象注释和开始/停止时间输出到转储文件,并将进度消息输出到标准错误。重复该选项会导致额外的调试级别消息出现在标准错误中。

-V
--version
打印ux_dump版本并退出。

-x
--no-privileges
--no-acl
防止转储访问权限(grant/revoke命令)。

-Z 0..9
--compress=0..9
指定要使用的压缩级别。零表示不压缩。 对于自定义和目录存档格式,这指定了单个表数据段的压缩,而默认情况下是以适度的水平压缩。对于纯文本输出,设置非零压缩级别会导致整个输出文件被压缩,就像它已经通过gzip一样;但默认情况下不压缩。tar存档格式目前根本不支持压缩。

--binary-upgrade
此选项供原地升级实用程序使用。不建议或支持其他用途。

--column-inserts
--attribute-inserts
将数据作为带有显式列名的INSERT命令转储(INSERT INTO table (column, ...) VALUES...)。这将使恢复非常缓慢;它主要用于制作可以加载到非UXDB数据库中的转储。在恢复过程中的任何错误都只会导致丢失与有问题的INSERT相关的行,而不是整个表内容。

--disable-dollar-quoting
此选项禁用函数体的美元引用。并强制使用 SQL 标准字符串语法进行引用。

--disable-triggers
此选项仅在创建仅数据转储时相关。它指示ux_dump在恢复数据时包括命令以临时禁用目标表上的触发器。如果表上有引用完整性检查或其他触发器,您不希望在数据恢复期间调用它们,则使用此选项。

目前,为 --disable-triggers 发出的命令必须由超级用户执行。因此,您还应该使用-S指定超级用户名称,或者最好小心地以超级用户身份启动生成的脚本。

在发出存档(非文本)输出文件时,此选项将被忽略。对于存档格式,您可以在调用 ux_restore 时指定该选项。

--enable-row-security
此选项仅在转储具有行安全性的表的内容时相关。默认情况下,ux_dump 将设置row_security为关闭状态,以确保从表中转储所有数据。如果用户没有足够的权限绕过行安全性,则会抛出错误。此参数指示ux_dump 将 row_security设置为打开状态,允许用户转储他们可以访问的表内容的部分。

请注意,如果您当前使用此选项,则可能还希望将转储格式设置为 INSERT,因为在恢复期间,COPY FROM 不支持行安全性。

--exclude-table-data=pattern不要转储与 pattern 匹配的任何表的数据。该模式的解释方式与 -t 的规则相同。可以多次给出--exclude-table-data 以排除与多个模式匹配的表。当您需要特定表的定义,但不需要其中的数据时,此选项很有用。

要排除数据库中所有表的数据,请参见 --schema-only

--extra-float-digits=ndigits
在转储浮点数据时,使用指定的 extra_float_digits 值,而不是最大可用精度。备份目的的例行转储不应使用此选项。

--if-exists
在清理数据库对象时使用条件命令(即添加 IF EXISTS 子句)。除非也指定了 --clean,否则此选项无效。

--include-foreign-data=foreignserver
转储与匹配 foreignserver 模式的外部服务器的任何外部表的数据。可以通过编写多个--include-foreign-data 开关来选择多个外部服务器。此外, foreignserver 参数根据 uxsql 的\d 命令使用的相同规则解释(请参见下面的模式)。因此,可以通过在模式中编写通配符字符来选择多个外部服务器。使用通配符时,如果需要防止shell扩展通配符,请小心引用模式;请参见下面的示例。唯一的例外是不允许空模式。

注意

当指定--include-foreign-data时,ux_dump不会检查外部表是否可写。因此,无法保证外部表转储的结果可以成功还原。

--inserts
将数据转储为INSERT命令(而不是COPY)。这将使还原非常缓慢;它主要用于制作可以加载到非UXDB数据库中的转储。任何还原期间的错误都将导致只有属于有问题的INSERT的行丢失,而不是整个表内容。请注意,如果您重新排列了列顺序,则还原可能会完全失败。--column-inserts选项对列顺序更改是安全的,但速度更慢。

--load-via-partition-root
在为表分区转储数据时,使COPYINSERT语句的目标为包含它的分区层次结构的根,而不是分区本身。这会导致在加载数据时为每行重新确定适当的分区。当在行不总是落入与原始服务器上相同的分区的服务器上还原数据时,这可能很有用。例如,如果分区列的类型为文本,并且两个系统具有用于对分区列进行排序的不同排序规则的定义。

最好不要在使用此选项制作的存档中还原时使用并行性,因为ux_restore将不知道给定存档数据项将加载数据到哪个分区。这可能会导致由于并行作业之间的锁冲突而导致效率低下,或者甚至可能由于在加载所有相关数据之前设置了外键约束而导致还原失败。

--lock-wait-timeout=timeout
不要永远等待在转储开始时获取共享表锁。如果在指定的 timeout 内无法锁定表,则失败。超时可以以SET statement_timeout接受的任何格式指定。(允许的格式因您正在转储的服务器版本而异,但所有版本都接受以毫秒为单位的整数。)

--no-comments
不转储注释。

--no-publications
不转储发布。

--no-security-labels
不转储安全标签。

--no-subscriptions
不转储订阅。

--no-sync
默认情况下,ux_dump将等待所有文件都安全写入磁盘。此选项使ux_dump返回而不等待,这更快,但意味着后续的操作系统崩溃可能会使部分数据丢失。垃圾堆损坏。一般来说,此选项对于测试很有用,但在从生产安装中转储数据时不应使用。

--no-table-access-method
不输出选择表访问方法的命令。使用此选项,所有对象都将使用恢复期间默认的表访问方法创建。

在发出存档(非文本)输出文件时,此选项将被忽略。对于存档格式,您可以在调用ux_restore时指定该选项。

--no-tablespaces
不输出选择表空间的命令。使用此选项,所有对象都将在恢复期间默认的表空间中创建。

在发出存档(非文本)输出文件时,此选项将被忽略。对于存档格式,您可以在调用ux_restore时指定该选项。

--no-toast-compression
不输出设置TOAST压缩方法的命令。使用此选项,所有列都将使用默认的压缩设置进行恢复。

--no-unlogged-table-data
不转储未记录的表和序列的内容。此选项对于是否转储表和序列定义(模式)没有影响;它仅抑制转储表和序列数据。从待机服务器转储时,总是排除未记录的表和序列中的数据。

--on-conflict-do-nothing
ON CONFLICT DO NOTHING添加到INSERT命令中。除非还指定了--inserts--column-inserts--rows-per-insert,否则此选项无效。

--quote-all-identifiers
强制引用所有标识符。建议在从其UXDB主要版本不同的服务器转储数据库或将输出加载到不同主要版本的服务器时使用此选项。默认情况下,ux_dump仅引用其自己主要版本中的保留字标识符。这有时会导致与其他版本的服务器处理时可能具有略有不同的保留字集的兼容性问题。使用--quote-all-identifiers可以防止此类问题,但代价是更难阅读的转储脚本。

--rows-per-insert=nrows
将数据转储为INSERT命令(而不是COPY)。控制每个INSERT命令的最大行数。指定的值必须是大于零的数字。在还原过程中发生任何错误都将导致仅丢失属于有问题的INSERT的行,而不是整个表内容。

--section=sectionname
只转储制定的部分。section名称可以是pre-data、data或post-data。可以多次指定此选项以选择多个部分。默认是转储所有节。

数据部分包含实际的表数据、大对象内容和序列值。后数据项包括索引、触发器、规则的定义,除了经过验证的检查约束条件之外,还有其他限制条件。预数据项包括所有其他数据定义项。

--serializable-deferrable
使用serializable事务进行转储,以确保使用的快照与后来的数据库状态一致;但是,通过等待事务流中不存在任何异常的点来实现这一点,以确保不会出现转储失败或导致其他事务回滚的风险,从而避免serialization_failure

此选项对于仅用于灾难恢复的转储没有好处。当原始数据库继续更新时,它对于用于加载数据库副本以进行报告或其他只读负载共享的转储很有用。没有它,转储可能反映一个与最终提交的事务的任何串行执行不一致的状态。例如,如果使用批处理技术,则批处理可能在转储中显示为关闭,而其中的所有项目都未出现。

如果在启动ux_dump时没有活动的读写事务,则此选项将没有影响。如果有活动的读写事务,则转储的开始可能会延迟不确定的时间长度。一旦运行,使用或不使用该开关的性能相同。

--snapshot=snapshotname
在制作数据库转储时使用指定的同步快照。

当需要将转储与逻辑复制槽或并发会话同步时,此选项很有用。

在并行转储的情况下,使用此选项定义的快照名称而不是获取新快照。

--strict-names
要求每个扩展(-e/--extension)、模式(-n/--schema)和表(-t/--table)限定符至少匹配要转储的数据库中的一个扩展/模式/表。请注意,如果扩展/模式/表限定符都没有找到匹配项,则ux_dump将生成错误,即使没有--strict-names

此选项对-N/--exclude-schema-T/--exclude-table--exclude-table-data没有影响。未能匹配任何对象的排除模式不被视为错误。

--use-set-session-authorization 输出SQL标准的SET SESSION AUTHORIZATION命令,而不是ALTER OWNER命令来确定对象所有权。这使得转储更符合标准,但根据转储中对象的历史记录,可能无法正确还原。此外,使用SET SESSION AUTHORIZATION的转储肯定需要超级用户权限才能正确还原,而ALTER OWNER则需要较低的权限。

-?
--help
显示关于 ux_dump 命令行参数的帮助信息,并退出。

以下命令行选项控制数据库连接参数。

-d dbname
--dbname=dbname
指定要连接的数据库的名称。这相当于在命令行上指定 dbname 作为第一个非选项参数。 dbname 可以是一个连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。

-h host
--host=host
指定运行服务器的计算机的主机名。如果值以斜杠开头,则用作 Unix 域套接字的目录。如果设置了 UXHOST环境变量,则使用默认值,否则将尝试进行 Unix 域套接字连接。

-p port
--port=port
指定服务器侦听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。如果设置了 UXPORT环境变量,则默认为该值,否则为编译时默认值。

-U username
--username=username
要连接的用户名。

-w
--no-password
永远不要发出密码提示。如果服务器需要密码验证,而通过其他方式(如.uxpass文件)无法获得密码,则连接尝试将失败。此选项在没有用户可以输入密码的批处理作业和脚本中很有用。

-W
--password
在连接到数据库之前,强制ux_dump提示输入密码。

此选项从不是必须的,因为如果服务器要求密码身份验证,则 ux_dump 将自动提示输入密码。但是,ux_dump将浪费一个连接尝试来了解服务器需要密码。在某些情况下,建议输入 -W 避免额外的连接尝试。

--role=rolename
指定要用于创建转储的角色名称。此选项使 ux_dump 在连接到数据库后发出 SET ROLE rolename 命令。当经过身份验证的用户(由 -U指定)缺少权限时,它非常有用。ux_dump需要特定权限的角色,但可以切换到具有所需权限的角色。一些安装程序禁止直接登录超级用户,使用此选项可以在不违反策略的情况下进行转储。

-K
指定备份时的加密密钥,将数据库文件加密备份,密钥为长度为8-16、至少包含一个字母和数字、且第一个和最后一个字符不为空的串。-K必须与-Fc参数一起使用,指明只有的自定义格式归档时才能使用加密功能。该选项仅适用uxdb安全模式下运行。

环境变量

UXDATABASE
UXHOST
UXOPTIONS
UXPORT
UXUSER
默认连接参数。

UX_COLOR
指定是否在诊断消息中使用颜色。可能的值为alwaysautonever

与大多数其他UXDB实用程序一样,此实用程序还使用libuxsql支持的环境变量。

诊断

ux_dump在内部执行SELECT语句。如果您在运行ux_dump时遇到问题,请确保您能够使用例如uxsql从数据库中选择信息。此外,libuxsql前端库使用的任何默认连接设置和环境变量也将适用。

ux_dump的数据库活动通常由累积统计系统收集。如果不希望这样做,可以通过UXOPTIONSALTER USER命令将参数track_counts设置为false。

注解

如果您的数据库群集对template1数据库有任何本地添加,请小心将ux_dump的输出还原到真正的空数据库中;否则,由于添加对象的重复定义,您可能会遇到错误。要创建一个没有任何本地添加的空数据库,请从template0而不是template1复制,例如:

CREATE DATABASE foo WITH TEMPLATE template0;

当选择数据专用转储并使用选项--disable-triggers时,ux_dump会发出命令,在插入数据之前禁用用户表上的触发器,然后在插入数据后重新启用它们。如果还原在中途停止,则系统目录可能处于错误状态。

由于ux_dump用于将数据传输到较新版本的UXDB,因此建议在从转储文件还原后运行ANALYZE以确保最佳性能。

ux_dump 可以加载到比其版本更新的 UXDB 服务器版本中。 ux_dump 也可以从比其版本旧的 UXDB服务器中转储。但是,ux_dump 无法从比其主要版本更新的 UXDB服务器中转储;它将拒绝尝试,而不是冒着制作无效转储的风险。 此外,不能保证 ux_dump的输出可以加载到旧主要版本的服务器中,即使该转储是从该版本的服务器中获取的。将转储文件加载到旧服务器可能需要手动编辑转储文件以删除旧服务器不理解的语法。在跨版本情况下,建议使用--quote-all-identifiers 选项,因为它可以防止由于不同 UXDB 版本中保留字列表的差异而引起的问题。

在转储逻辑复制订阅时,ux_dump 将生成使用 connect = false 选项的 CREATE SUBSCRIPTION命令,以便恢复订阅时不会进行远程连接以创建复制插槽或进行初始表复制。这样,可以在不需要访问远程服务器的情况下恢复转储。然后由用户以适当的方式重新激活订阅。如果涉及的主机已更改,则可能必须更改连接信息。在启动新的完整表复制之前,截断目标表可能也是适当的。如果用户打算在刷新期间复制初始数据,则必须使用two_phase = false 创建插槽。在初始同步之后,如果订阅最初是使用 two_phase = true选项创建的,则订阅者将自动启用 two_phase 选项。

示例

要将名为 mydb 的数据库转储到 SQL 脚本文件中:

$ ux_dump mydb > db.sql

要将这样的脚本重新加载到名为 newdb 的(新创建的)数据库中:

$ uxsql -d newdb -f db.sql

要将数据库转储为自定义格式的存档文件:

$ ux_dump -Fc mydb > db.dump

要将数据库转储为目录格式的存档:

$ ux_dump -Fd mydb -f dumpdir

要以 5 个工作进程并行将数据库转储为目录格式的存档:

$ ux_dump -Fd mydb -j 5 -f dumpdir

要将存档文件重新加载到名为 newdb 的(新创建的)数据库中:

$ ux_restore -d newdb db.dump

要将存档文件重新加载到与其转储的同一数据库中,丢弃该数据库的当前内容:

$ ux_restore -d uxdb --clean --create db.dump

要转储名为 mytab的单个表:

$ ux_dump -t mytab mydb > db.sql

要转储以emp开头的所有表,位于detroit模式中,但不包括名为employee_log的表:

$ ux_dump -t 'detroit.emp*' -T detroit.employee_log mydb > db.sql

要转储以eastwest开头且以gsm结尾的所有模式,但不包括名称包含单词test的模式:

$ ux_dump -n 'east*gsm' -n 'west*gsm' -N '*test*' mydb > db.sql

使用正则表达式符号来合并开关:

$ ux_dump -n '(east|west)*gsm' -N '*test*' mydb > db.sql

要转储除以ts_开头的表之外的所有数据库对象:

$ ux_dump -T 'ts_*' mydb > db.sql

要在-t和相关开关中指定大写或混合大小写名称,需要将名称加上双引号;否则,它将被折叠为小写(请参见下面的模式)。但是,双引号对于shell来说是特殊的,因此它们必须被引用。因此,要转储具有混合大小写名称的单个表,需要类似于以下内容:

$ ux_dump -t "\"MixedCaseName\"" mydb > mytab.sql

另请参阅

ux_dumpallux_restoreuxsql

13.ux_dumpall

ux_dumpall — 将 UXDB 数据库群集提取到脚本文件中

概要

ux_dumpall [connection-option...] [option...]

描述

ux_dumpall 是一个实用程序,用于将群集中所有 UXDB 数据库(“转储”)写入一个脚本文件中。该脚本文件包含可用作输入的SQL 命令,以便恢复数据库。它通过调用群集中每个数据库的ux_dump来实现此目的。 ux_dumpall还会转储所有数据库共有的全局对象,即数据库角色、表空间和配置参数的权限授予。(ux_dump不会保存这些对象。)

由于ux_dumpall从所有数据库读取表,因此您很可能需要连接为数据库超级用户才能生成完整的转储。此外,您需要超级用户权限才能执行保存的脚本,以允许添加角色和创建数据库。

SQL脚本将写入标准输出。使用-f/--file选项或shell运算符将其重定向到文件中。

ux_dumpall 需要多次连接到 UXDB服务器(每个数据库一次)。如果使用密码身份验证,它将每次请求密码。在这种情况下,拥有~/.uxpass 文件很方便。

选项

以下命令行选项控制输出的内容和格式。

-a
--data-only
仅转储数据,不包括模式(数据定义)。

-c
--clean
包括 SQL 命令以清除(删除)重新创建之前的数据库。也会添加角色和表空间的 DROP 命令。

-E
--encoding=encoding
在指定的字符集编码中创建转储。默认情况下,转储是在数据库编码中创建的。(获得相同结果的另一种方法是将UXCLIENTENCODING 环境变量设置为所需的转储编码。)

-f
--file=file
将输出发送到指定的文件。如果省略此选项,则使用标准输出。

-g
--globals-only
仅转储全局对象(角色和表空间),不包括数据库。

-O
--no-owner
不输出命令以设置对象的所有权以匹配原始数据库。默认情况下,ux_dumpall发出 ALTER OWNER 或 SET SESSION AUTHORIZATION语句以设置创建的模式元素的所有权。除非由超级用户(或启动脚本的拥有所有对象的用户)启动脚本,否则这些语句将在运行脚本时失败。要创建可以由任何用户还原但将使该用户拥有所有对象的脚本,请指定-O。

-r
--roles-only
仅转储角色,不包括数据库或表空间。

-s
--schema-only
仅转储对象定义(模式),不包括数据。

-S
--superuser=superuser
指定在禁用触发器时要使用的超级用户名称。这仅在使用--disable-triggers时才相关。(通常最好将其省略,而是以超级用户身份启动生成的脚本。)

-t
--tablespaces-only
仅转储表空间,不包括数据库或角色。

-v
--verbose
指定详细模式。这将导致ux_dumpall将开始/停止时间输出到转储文件,并将进度消息输出到标准错误。重复该选项会导致额外的调试级别消息出现在标准错误上。该选项也会传递给ux_dump。

-V
--version
打印ux_dumpall的版本并退出。

-x
--no-privileges
--no-acl
防止转储访问权限(grant/revoke命令)。

--binary-upgrade
此选项供原地升级工具使用。不建议或支持其他用途。

--column-inserts
--attribute-inserts
将数据转储为带有显式列名的INSERT命令(INSERT INTO table (column, ...) VALUES...)。这将使恢复非常缓慢;它主要用于制作可以加载到非UXDB数据库中的转储。

--disable-dollar-quoting
此选项禁用函数体的美元引用,并强制使用SQL标准字符串语法对其进行引用。

--disable-triggers
此选项仅在创建仅数据转储时相关。它指示ux_dumpall在恢复数据时包括命令以临时禁用目标表上的触发器。如果您在表上具有引用完整性检查或其他触发器,而不想在数据恢复期间调用它们,请使用此选项。

目前,为--disable-triggers发出的命令必须由超级用户执行。因此,您还应该使用-S指定超级用户名称,或者最好小心地以超级用户身份启动生成的脚本。

--exclude-database=pattern
不要转储名称与 pattern 匹配的数据库。可以通过编写多个--exclude-database开关来排除多个模式。根据与uxsql的\d命令相同的规则解释 pattern 参数(请参见下面的模式),因此还可以通过在模式中编写通配符字符来排除多个数据库。在使用通配符时,请小心引用模式,以防止shell通配符扩展。

--extra-float-digits=ndigits
在转储浮点数据时使用指定的extra_float_digits值,而不是最大可用精度。备份目的的常规转储不应使用此选项。

--if-exists
使用条件命令(即添加IF EXISTS子句)删除数据库和其他对象。除非也指定了--clean,否则此选项无效。

--inserts
将数据转储为INSERT命令(而不是COPY)。这将使恢复非常缓慢;主要用于创建可以加载到非UXDB数据库中的转储。请注意,如果您重新排列了列顺序,则还原可能会完全失败。--column-inserts选项更安全,但速度更慢。

--load-via-partition-root
在为表分区转储数据时,让COPYINSERT语句以包含它的分区层次结构的根为目标,而不是分区本身。这将导致在加载数据时为每一行重新确定适当的分区。在恢复服务器上的数据时,这可能很有用,因为服务器上的行并不总是位于与原始服务器上相同的分区中。例如,如果分区列的类型为文本,并且两个系统具有不同的用于对分区列进行排序的排序规则的定义。

--lock-wait-timeout=timeout
不要永远等待在转储开始时获取共享表锁。相反,如果不能在指定的超时内锁定表,则失败。超时可以以SET statement_timeout接受的任何格式指定(允许的值取决于从其转出的服务器版本)。

--no-comments
不要转储注释。

--no-publications
不要转储发布。

--no-role-passwords
不要转储角色密码。还原时,角色将具有空密码,并且密码验证将始终失败,直到设置密码。由于在指定此选项时不需要密码值,因此角色信息是从目录视图ux_roles而不是ux_authid读取的。因此,如果某些安全策略限制了对ux_authid的访问,则此选项也有所帮助。

--no-security-labels
不要转储安全标签。

--no-subscriptions
不要转储订阅。

--no-sync
默认情况下,ux_dumpall将等待所有文件都安全写入磁盘。此选项使ux_dumpall在不等待的情况下返回,这更快,但意味着后续操作系统崩溃可能会使转储文件损坏。通常,此选项对于测试很有用,但在从生产安装中转储数据时不应使用。

--no-table-access-method
不输出选择表访问方法的命令。使用此选项,将使用还原期间默认的任何表访问方法创建所有对象。

--no-tablespaces
不输出创建表空间的命令,也不为对象选择表空间。使用此选项,所有对象将在恢复期间的缺省表空间中创建。

--no-toast-compression
不输出设置TOAST压缩方法的命令。使用此选项,将使用默认的压缩设置还原所有列。

--no-unlogged-table-data
不转储未记录表的内容。此选项没有作用于是否转储表定义(模式);它仅抑制转储表数据。

--on-conflict-do-nothing
INSERT命令中添加ON CONFLICT DO NOTHING。除非也指定了--inserts--column-inserts选项,否则此选项无效。

--quote-all-identifiers
强制引用所有标识符。当从UXDB主版本与ux_dumpall不同的服务器转储数据库时,或者当输出打算加载到不同主版本的服务器时,建议使用此选项。默认情况下,ux_dumpall只引用其主版本中的保留字标识符。在处理保留字集略有不同的其他版本的服务器时,这有时会导致兼容性问题。使用--quote-all-identifiers可以避免这些问题,但代价是更难阅读的转储脚本。

--rows-per-insert=nrows
将数据转储为INSERT命令(而不是COPY)。控制每个INSERT命令的最大行数。指定的值必须是大于零的数字。在还原过程中发生任何错误都只会导致丢失问题INSERT的一部分行,而不是整个表内容。

--use-set-session-authorization
输出SQL标准的SET SESSION AUTHORIZATION命令,而不是ALTER OWNER命令来确定对象所有权。这使得转储更符合标准,但根据转储中对象的历史记录,可能无法正确还原。

-?
--help
显示有关ux_dumpall命令行参数的帮助信息,并退出。

以下命令行选项控制数据库连接参数。

-d connstr
--dbname=connstr
指定用于连接到服务器的参数,作为连接字符串;这些将覆盖任何冲突的命令行选项。

该选项称为--dbname,以保持与其他客户端应用程序的一致性,但由于ux_dumpall需要连接到许多数据库,因此将忽略连接字符串中的数据库名称。使用-l选项指定用于初始连接的数据库名称,该选项将转储全局对象并发现应转储哪些其他数据库。

-h host
--host=host
指定运行数据库服务器的计算机的主机名。如果值以斜杠开头,则用作Unix域套接字的目录。默认值如果设置了,将从UXHOST环境变量中获取连接信息,否则将尝试使用Unix域套接字连接。

-l dbname
--database=dbname
指定要连接的数据库的名称,以便转储全局对象并发现应转储的其他数据库。如果未指定,则将使用uxdb数据库,如果不存在,则使用template1

-p port
--port=port
指定服务器侦听连接的TCP端口或本地Unix域套接字文件扩展名。如果设置了,则默认为UXPORT环境变量,否则为编译时默认值。

-U username
--username=username
要连接的用户名。

-w
--no-password
从不发出密码提示。如果服务器需要密码验证,并且没有其他方式(如.uxpass文件)提供密码,则连接尝试将失败。此选项在没有用户可以输入密码的批处理作业和脚本中很有用。

-W
--password
在连接到数据库之前,强制ux_dumpall提示输入密码。

此选项不是必须的,因为如果服务器要求输入密码,ux_dumpall将自动提示输入密码。但是,ux_dumpall将浪费一个连接尝试来找出服务器需要密码。在某些情况下,建议输入-W以避免额外的连接尝试。

请注意,每个要转储的数据库都会再次出现密码提示。通常,最好设置~/.uxpass文件,而不是依赖手动输入密码。

--role=rolename
指定要用于创建转储的角色名称。此选项会导致ux_dumpall在连接到数据库后发出SET ROLE rolename 命令。当通过-U指定的已认证用户缺少ux_dumpall所需的权限时,它很有用,但可以切换到具有所需权限的角色。一些安装有不允许直接登录超级用户的策略,使用此选项可以在不违反策略的情况下进行转储。

环境变量

UXHOST
UXOPTIONS
UXPORT
UXUSER

默认连接参数

UX_COLOR

指定是否在诊断消息中使用颜色。可能的值为alwaysautonever

此实用程序与大多数其他UXDB实用程序一样,还使用libuxsql支持的环境变量。

注解

由于ux_dumpall在内部调用ux_dump,因此一些诊断消息将引用ux_dump。

即使您的意图是将转储脚本还原到新的集群中,--clean选项也可能很有用。使用--clean授权脚本删除并重新创建内置的uxdbtemplate1数据库,确保这些数据库将保留与源集群相同的属性(例如,区域设置和编码)。如果没有该选项,这些数据库将保留其现有的数据库级属性以及任何现有内容。

还原后,最好对每个数据库运行ANALYZE,以便优化器具有有用的统计信息。您还可以运行vacuumdb -a -z以分析所有数据库。

不应期望转储脚本完全无错误地运行。特别是,因为脚本将为源集群中存在的每个角色发出CREATE ROLE,所以对于超级用户,它肯定会得到一个“role already exists”错误,除非目标集群使用不同的超级用户名称。此错误是无伤大雅的,应该忽略。使用--clean选项可能会产生有关不存在对象的其他不致命错误消息,尽管您可以通过添加--if-exists来将其最小化。

ux_dumpall要求在还原之前存在所有所需的表空间目录;否则,非默认位置的数据库创建将失败。

示例

要转储所有数据库:

$ ux_dumpall > db.out

要从此文件还原数据库,可以使用:

$ uxsql -f db.out uxdb

在此处连接到哪个数据库并不重要,因为由ux_dumpall创建的脚本文件将包含创建和连接到保存的数据库的适当命令。一个例外是,如果您指定了--clean,则必须最初连接到uxdb数据库;脚本将立即尝试删除其他数据库,而您连接的数据库将无法删除。

14.ux_isready

ux_isready — 检查UXDB服务器的连接状态

概要

ux_isready [connection-option...] [option...]

描述

ux_isready是一个用于检查UXDB数据库服务器连接状态的实用程序。退出状态指定连接检查的结果。

选项

-d dbname
--dbname=dbname
指定要连接的数据库的名称。 dbname 可以是连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。

-h hostname
--host=hostname
指定运行服务器的计算机的主机名。如果值以斜杠开头,则用作Unix域套接字的目录。

-p port
--port=port
指定服务器侦听连接的TCP端口或本地Unix域套接字文件扩展名。默认值为UXPORT环境变量的值,如果未设置,则为编译时指定的端口,通常为5432。

-q
--quiet
不显示状态消息。这在脚本编写时很有用。

-t seconds
--timeout=seconds
在返回服务器未响应之前尝试连接的最大秒数。设置为0禁用。默认值为3秒。

-U username
--username=username
以用户 username 连接到数据库,而不是默认用户。

-V
--version
打印ux_isready版本并退出。

-?
--help
显示ux_isready命令行参数的帮助信息,并退出。

退出状态

如果服务器正常接受连接,则ux_isready将返回0到shell;如果服务器拒绝连接(例如在启动期间),则返回1;如果连接尝试没有响应,则返回2;如果没有尝试连接(例如由于无效参数),则返回3

环境变量

ux_isready,像大多数其他UXDB实用程序一样,还使用libuxsql支持的环境变量。

环境变量UX_COLOR指定是否在诊断消息中使用颜色。可能的值为alwaysautonever

注解

获取服务器状态时,不需要提供正确的用户名、密码或数据库名称值;但是,如果提供了不正确的值,则服务器将记录连接失败的尝试。

示例

标准用法:

$ ux_isready
/tmp:5432 - accepting connections
$ echo $?
0

使用连接参数运行到正在启动的UXDB集群:

$ ux_isready -h localhost -p 5433
localhost:5433 - rejecting connections
$ echo $?
1

使用连接参数运行到不响应的UXDB集群:

$ ux_isready -h someremotehost
someremotehost:5432 - no response
$ echo $?
2

15.ux_probackup

ux_probackup — 用于管理UXDB数据库集群的备份和恢复的实用程序

概要

ux_probackup [option...]

  • 查看ux_probackup命令的详细信息。

    [uxdb@local65 bin]$./ux_probackup  --help
    ux_probackup - utility to manage backup/recovery of UXDB database.
    
    ux_probackup help [COMMAND]
    
    ux_probackup version
    
    ux_probackup init -B backup-path
    
    ux_probackup set-config -B backup-path --instance=instance_name
                   [-D uxdata-path]
                   [--external-dirs=external-directories-paths]
                   [--log-level-console=log-level-console]
                   [--log-level-file=log-level-file]
                   [--log-filename=log-filename]
                   [--error-log-filename=error-log-filename]
                   [--log-directory=log-directory]
                   [--log-rotation-size=log-rotation-size]
                   [--log-rotation-age=log-rotation-age]
                   [--retention-redundancy=retention-redundancy]
                   [--retention-window=retention-window]
                   [--wal-depth=wal-depth]
                   [--compress-algorithm=compress-algorithm]
                   [--compress-level=compress-level]
                   [--archive-timeout=timeout]
                   [-d dbname] [-h host] [-p port] [-U username]
                   [--remote-proto] [--remote-host]
                   [--remote-port] [--remote-path] [--remote-user]
                   [--ssh-options]
                   [--restore-command=cmdline] [--archive-host=destination]
                   [--archive-port=port] [--archive-user=username]
                   [--help]
    
    ux_probackup set-backup -B backup-path --instance=instance_name
                   -i backup-id [--ttl=interval] [--expire-time=timestamp]
                   [--note=text]
                   [--help]
    
    ux_probackup show-config -B backup-path --instance=instance_name
                   [--format=format]
                   [--help]
    ux_probackup delete -B backup-path --instance=instance_name
                   [-j num-threads] [--progress]
                   [--retention-redundancy=retention-redundancy]
                   [--retention-window=retention-window]
                   [--wal-depth=wal-depth]
                   [-i backup-id | --delete-expired | --merge-expired | --status=backup_status]
                   [--delete-wal]
                   [--dry-run]
                   [--help]
    
    ux_probackup add-instance -B backup-path -D uxdata-path
                   --instance=instance_name
                   [--external-dirs=external-directories-paths]
                   [--remote-proto] [--remote-host]
                   [--remote-port] [--remote-path] [--remote-user]
                   [--ssh-options]
                   [--help]
     	      .
                  .
                  .
                  .
                  .
    
  • 查看具体的参数的描述信息。

    以添加备份实例add-instance命令的详细信息为例。

    [uxdb@local65 bin]$ ux_probackup add-instance --help
    ux_probackup add-instance -B backup-path -D uxdata-path
                   --instance=instance_name
                   [-E external-directory-path]
                   [--remote-proto] [--remote-host]
                   [--remote-port] [--remote-path] [--remote-user]
                   [--ssh-options]
    
    -B, --backup-path=backup-path    location of the backup storage area
    -D, --uxdata=uxdata-path         location of the database storage area
        --instance=instance_name     name of the new instance
    -E  --external-dirs=external-directories-paths
                                     backup some directories not from uxdata 
                                     (example: --external-dirs=/tmp/dir1:/tmp/dir2)
    
    Remote options:
        --remote-proto=protocol      remote protocol to use
                                     available options: 'ssh', 'none' (default: ssh)
        --remote-host=destination    remote host address or hostname
        --remote-port=port           remote host port (default: 22)
        --remote-path=path           path to directory with ux_probackup binary on remote host
                                     (default: current binary path)
        --remote-user=username       user name for ssh connection (default: current user)
        --ssh-options=ssh_options    additional ssh options (default: none)
                                     (example: --ssh-options='-c cipher_spec -F configfile')
    

描述

ux_probackup旨在执行UXDB实例的定期备份,能够在发生故障时还原服务器。

与其他备份解决方案相比,ux_probackup具有以下优点,可实施不同的备份策略并处理大量数据:

  • 增量备份:页面级增量备份可以节省磁盘空间,加快备份和还原速度。使用三种不同的增量模式,可以根据数据流计划备份策略。

  • 增量还原:页面级增量还原允许通过在目标目录中重用有效的未更改页面来极大地加快还原速度。

  • 合并:使用此功能,可以实施“增量更新的备份”策略,而无需进行定期的完整备份。

  • 验证:自动数据一致性检查和按需备份验证,无需实际数据恢复。

  • 验证:使用checkdb命令按需验证UXDB实例。

  • 保留:根据保留策略管理WAL存档和备份。可以根据恢复时间或要保留的备份数量来配置保留策略,也可以time to live为特定备份指定(TTL)。过期的备份可以合并或删除。

  • 并行化:在多个并行线程上运行备份,还原,合并,删除,验证和验证过程。

  • 压缩:以压缩状态存储备份数据以节省磁盘空间。

  • 重复数据删除:通过不复制未更改的非数据文件(例如_vm)来节省磁盘空间_fsm。

  • 远程操作:备份位于远程系统上的UXDB实例或远程还原备份,

  • 从备用服务器进行备份:通过从备用服务器进行备份来避免主服务器上的额外负载。

  • 外部目录:备份位于UXDB data directory(UXDATA)外部的文件和目录,例如脚本,配置文件,日志或SQL转储文件。

  • 备份目录:以纯文本或JSON格式获取备份列表和相应的元信息。

  • 存档目录:以纯文本或JSON格式获取所有WAL时间轴的列表以及相应的元信息。

  • 部分还原:仅还原指定的数据库或从还原中排除指定的数据库。

要管理备份数据,ux_probackup创建一个备份目录。该目录存储所有带有附加元信息的备份文件,以及时间点恢复所需的WAL存档。可以将不同实例的备份存储在单个备份目录的单独子目录中。

使用ux_probackup,可以进行完整或增量备份:

  • Full备份包含从头还原数据库集群所需的所有数据文件。

  • Incremental备份仅存储自上次备份以来已更改的数据,它允许减小备份大小并加快备份操作。支持以下增量备份模式:

    • PAGE备份。在此模式下,ux_probackup从上一次进行完整备份或增量备份开始扫描存档中的所有WAL文件。新创建的备份仅包含WAL记录中提到的页面。这要求自上次备份以来,所有WAL文件都存在于WAL存档中。如果这些文件的大小可与数据库集群文件的总大小相媲美,则加速会更小,但备份仍会占用较少的空间。

    • DELTA备份。在这种模式下,ux_probackup读取UXDATA目录中的所有数据文件,仅复制那些自上次备份以来已更改的页面。连续归档对于它的运行不是必需的。同样,此模式可能会施加等于Full备份的只读I/O压力。

    • PTRACK备份。在这种模式下,UXDB会实时跟踪页面更改。连续归档对于它的运行不是必需的。每次更新关系页面时,都会在PTRACK此关系的特殊位图中标记该页面。由于一页仅需要PTRACK分叉中的一位,因此此类位图非常小。跟踪意味着数据库服务器操作会花费一些开销,但是会大大加快增量备份的速度。

无论选择哪种备份类型,所有使用ux_probackup WAL交付的备份都支持以下WAL交付策略:

  • Autonomous backups通过复制协议传输所有WAL文件,以便在进行备份时将集群还原到一致状态。即使未设置连续归档,所需的WAL段也包含在备份中。

  • Archive backups 依靠连续归档。

ux_probackup当前具有以下限制:

  • 从中进行备份的服务器和还原的服务器必须与block_size和wal_block_size参数兼容,并且具有相同的主要发行版号。

  • 目前不支持在Windows上通过ssh进行远程备份。

  • 通过ssh运行远程操作时,远程和本地ux_probackup版本必须相同。

选项

--instance
指定instance的名称。

--remote-host
指定远程备份实例IP。

--remote-port
指定远程备份实例SSH端口(默认值:22)。

--remote-user
指定远程SSH用户。

--remote-path
指定远程备份实例ux_probackup工具所在路径。

-B
备份路径位置。

-D
uxdata数据库实例的路径。

-b
指定备份模式(backup mode=FULL|PAGE|DELTA|PTRACK)。

-j
并行的线程数。

--archive-host
到存档主机的ssh连接的目标地址或主机名。

--archive-port
ssh连接到存档主机的端口端口(默认值:22)。

--archive-user
到存档主机的ssh连接的用户名(默认值:UXDB user)。

-k --key-path=PATH
指定wal加密参数文件路径,wal加密参数文件请参见《优炫数据库管理系统安全功能手册》“数据保密性”章节中的“ux_waldump解析加密wal日志”的“导出WAL加密信息”小节。

示例

  • 初始化备份目录

    ./ux_probackup init -B /home/uxdb/data/probackup
    
    [uxdb@local65 bin]$ ./ux_probackup init -B /home/uxdb/data/probackup
    INFO: Backup catalog '/home/uxdb/data/probackup' successfully inited
    

    查看备份目录。

    [uxdb@local65 probackup]$ pwd
    /home/uxdb/data/probackup
    [uxdb@local65 probackup]$ ls
    backups  wal
    [uxdb@local65 probackup]$
    
  • 添加需要备份实例信息

    一个备份目录下可添加多个实例,可以是本地实例也可以是远程实例。

    1. 初始化数据库实例。

      [uxdb@local65 bin]$ ./initdb -W -D test
      
    2. 添加备份实例。

      [uxdb@local65 bin]$ ux_probackup add-instance -B /home/uxdb/data/probackup -D 	/home/uxdb/uxdbinstall/dbsql/bin/test/ --instance=test1
      

      命令执行成功之后,在备份路径下的backups目录下会有test1目录,该目录下是备份实例的备份配置文件,记录备份实例的相关信息。

      [uxdb@local65 probackup]$ pwd
      /home/uxdb/data/probackup
      [uxdb@local65 probackup]$ ls
      backups  wal
      [uxdb@local65 probackup]$ cd backups/
      [uxdb@local65 backups]$ ls
      test1
      [uxdb@local65 backups]$ cd test1/
      [uxdb@local65 test1]$ ls
      ux_probackup.conf
      
    3. 修改本地备份实例的配置文件uxsinodb.conf。

      max_wal_senders = 10 #根据实际场景设置合理值,此处使用默认值10
      wal_level = 'replica'
      archive_mode = 'on'
      archive_command = '/home/uxdb/uxdbinstall/dbsql/bin/ux_probackup archive-push -B /home/uxdb/data/probackup --instance test1 --wal-file-path=%p --wal-file-name=%f    '
      
    4. 启动数据库并创建测试表。

      ./ux_ctl -D test/ start
      ./uxsql
      
      uxdb=#create table tl(id int)
      CREATE TABLE
      uxdb=#insert into t1 values (1);
      INSERT 0 1
      uxdb=#insert into t1 values (2);
      INSERT 0 1
      uxdb=#insert into tl values (3);
      INSERT 0 1
      uxdb=#insert into t1 values (4);
      INSERT 0 1
      uxdb=#insert into t1 values (5);
      INSERT 0 1
      uxdb=#insert into t1 values(6);
      INSERT 0 1
      uxdb=#insert into t1 values (7);
      INSERT 0 1
      uxdb=#insert into t1 values (8);
      INSERT 0 1
      uxdb=#select count(*)from t1;
      count
      -------
      8
      (1 row)
      uxdb=#
      
  • 显示备份实例的配置信息

    [uxdb@local65 bin]$ ./ux_probackup show-config -B /home/uxdb/data/probackup --instance test1
    
    [uxdb@local65 bin]$ ./ux_probackup show-config -B /home/uxdb/data/probackup --instance test1
    # Backup instance information
    pgdata = /home/uxdb/uxdbinstall/dbsql/bin/test
    system-identifier = 6886013058702885863
    xlog-seg-size = 16777216
    # Connection parameters
    uxdatabase = uxdb
    # Replica parameters
    replica-timeout = 5min
    # Archive parameters
    archive-timeout = 5min
    # Logging parameters
    log-level-console = INFO
    log-level-file = OFF
    log-filename = ux_probackup.log
    log-rotation-size = 0TB
    log-rotation-age = 0
    # Retention parameters
    retention-redundancy = 0
    retention-window = 0
    wal-depth = 0
    # Compression parameters
    compress-algorithm = none
    compress-level = 1
    # Remote access parameters
    remote-proto = ssh
    [uxdb@local65 bin]$
    
  • 全量备份

    [uxdb@local65 bin]$ ./ux_probackup backup -B /home/uxdb/data/probackup 	--instance=test1 -b full
    
    [uxdb@local65 bin]$ ./ux_probackup backup -B /home/uxdb/data/probackup --instance test1 -b full
    INFO: Backup start, ux_probackup version: 2.4.4, instance: test1, backup ID: QILA2N, backup mode: FULL, wal mode: ARCHIVE, remote: false, compress-algorithm: none, compress-level: 1
    Password: 
    WARNING: Current UXDB role is superuser. It is not recommended to run backup or checkdb as superuser.
    INFO: Wait for WAL segment /home/uxdb/data/probackup/wal/test1/000000010000000000000003 to be archived
    INFO: UXDATA size: 51MB
    INFO: Start transferring data files
    INFO: Data files are transferred, time elapsed: 3s
    INFO: wait for ux_stop_backup()
    INFO: ux_stop_backup() successfully executed
    INFO: Syncing backup files to disk
    INFO: Backup files are synced, time elapsed: 1s
    INFO: Validating backup QILA2N
    INFO: Backup QILA2N data files are valid
    INFO: Backup QILA2N resident size: 51MB
    INFO: Backup QILA2N completed
    
    [uxdb@local65 bin]$
    

    如果不想多次手动输入密码,可以通过.uxpass进行免密操作,查看备份路径下的内容。

    [uxdb@local65 test1]$ pwd
    /home/uxdb/data/probackup/backups/test1
    [uxdb@local65 test1]$ ls
    QILA2N  ux_probackup.conf
    [uxdb@local65 test1]$ cd QILA2N/
    [uxdb@local65 QILA2N]$ ls
    backup_content.control  backup.control  database  page_header_map
    [uxdb@local65 QILA2N]$ cd database/
    [uxdb@local65 database]$ ls
    backup_label       database_map     ux_commit_ts    ux_notify           ux_stat
    base               global           ux_dynshmem     ux_replslot         ux_stat_tmp
    current_logfiles   log              ux_hba.conf     ux_serial           ux_subtrans
    uxsinodb.auto.conf ux_ident.conf    ux_logical      ux_snapshots        ux_tblspc
    uxsinodb.conf      ux_multixact     ux_twophase     UX_VERSION          ux_wal
    ux_xact
    [uxdb@local65 test1]$
    
  • 增量备份

    增量备份有3种模式:PAGE、DELTA和PTRACK。

    • backup mode=PAGE

      [uxdb@local65 bin]$ ./ux_probackup backup -B /home/uxdb/data/probackup 	--instance=test1 -b page
      
      [uxdb@local65 bin]$ ./ux_probackup backup -B /home/uxdb/data/probackup --instance test1 -b page
      INFO: Backup start, ux_probackup version: 2.4.4, instance: test1, backup ID: QILADO, backup mode: PAGE, wal mode: ARCHIVE, remote: false, compress-algorithm: none, compress-level: 1
      Password: 
      WARNING: This UXsinoDB instance was initialized without data block checksums. ux_probackup have no way to detect data block corruption without them. Reinitialize UXDATA with option '--data-checksums'
      WARNING: Current UXsinoDB role is superuser. It is not recommended to run backup or checkdb as superuser.
      INFO: Wait for WAL segment /home/uxdb/data/probackup/wal/test1/000000010000000000000006 to be archived
      INFO: Parent backup: QILA2N
      INFO: UXDATA size: 51MB
      INFO: Extracting pagemap of changed blocks
      INFO: Pagemap successfully extracted, time elapsed: 0 sec
      INFO: Start transferring data files
      INFO: Data files are transferred, time elapsed: 0 sec
      INFO: wait for ux_stop_backup()
      INFO: ux_stop_backup() successfully executed
      INFO: Wait for LSN 0/70000F0 in archived WAL segment /home/uxdb/data/probackup/wal/test1/000000010000000000000007
      INFO: Syncing backup files to disk
      INFO: Backup files are synced, time elapsed: 0 sec
      INFO: Validating backup QILADO
      INFO: Backup QILADO data files are valid
      INFO: Backup QILADO resident size: 172kB
      INFO: Backup QILADO completed
      

      查看备份内容:

      [uxdb@local65 test1]$ ls
      QILA2N  QILADO  ux_probackup.conf
      [uxdb@local65 test1]$ cd QILADO/
      [uxdb@local65 QILADO]$ ls
      backup_content.control  backup.control  database  page_header_map
      [uxdb@local65 QILADO]$ cd database/
      [uxdb@local65 database]$ ls
      backup_label      database_map    log             ux_commit_ts    ux_dynshmem
      ux_logical        ux_multixact    ux_notify       ux_replslot     ux_serial
      ux_snapshots      ux_stat         ux_stat_tmp     ux_subtrans     ux_tblspc
      ux_twophase       ux_wal          ux_xact         base            global
      [uxdb@local65 test1]$
      
    • backup mode=DELTA

      [uxdb@local65 bin]$ ./ux_probackup backup -B /home/uxdb/data/probackup 	--instance=test1 -b delta
      
      [uxdbalocal65 bin]$./ux_probackup backup -B /home/uxdb/data/probackup--instance=testlb-DELTA
      INFO:Backup start.ux_probackup version:2.4.4,instance:test1.backup ID:QILAJ1,backup mode:DELTA
      wal mode:ARCHIVE,remote:false,compress-algorithm:none,
      compress-level:1
      Password:
      ATA with option '--data-checksums'
      WARNING:Current UXsinoDB role is superuser.It is not recommended to run backup or checkdb as superuser.
      INFO:Wait for WAL segment /home/uxdb/data/probackup/wal/test1/000000010000000000000009 to be archived
      INFO:Parent backup:QILADO
      INFO:UXDATA size:51MB
      INFO:Start transferring data files
      INFO:Data files are transferred,time elapsed:
      INFO:wait for ux_stop_backup()
      INFO:ux_stop backup()successfully executed
      INFO:Syncing backup files to disk
      INFO:Backup files are synced,time elapsed:0
      INFO:Validating backup QILAJ1
      INFO:Backup QILAJ1 data files are valid
      INFO:Backup QILA]1 resident size:140kB
      INFO:Backup QILA]1 completed
      [uxdbalocal65 bin]$
      

      查看备份内容:

      [uxdb@local65 QILA2N]$ cd ../QILAJ1/
      [uxdb@local65 QILAJ1]$ ls
      backup_content.control  backup.control  database
      [uxdb@local65 QILAJ1]$ cd database/
      [uxdb@local65 database]$ ls
      backup_label      database_map    log             ux_commit_ts    ux_dynshmem
      ux_logical        ux_multixact    ux_notify       ux_replslot     ux_serial
      ux_snapshots      ux_stat         ux_stat_tmp     ux_subtrans     ux_tblspc
      ux_twophase       ux_wal          ux_xact         base            global
      [uxdb@local65 database]$
      
    • backup mode=PTRACK

      备份模式为PTRACK时需要在初始化数据库实例时有数据块校验和,因此需要重新初始化数据库实例。

      1. 初始化数据库。

        ./initdb -k -W -D  data
        
      2. 添加需要备份实例的信息。

        ux_probackup add-instance -B /home/uxdb/data/probackup -D 	/home/uxdb/uxdbinstall/dbsql/bin/data/ --instance=data1
        
      3. 修改实例data的UXDB.conf文件。

        max_wal_senders = 10 #根据实际场景设置合理值,此处使用默认值10
        wal_level = 'replica'
        archive_mode = 'on'
        archive_command = '/home/uxdb/uxdbinstall/dbsql/bin/ux_probackup archive-push -B /home/uxdb/data/probackup --instance data1 --wal-file-path=%p --wal-file-name=%f    '
        
      4. 启动数据库创建测试表。

        uxdb=# create table t1(id int);
        CREATE TABLE
        uxdb=# insert into t1 values (11);
        INSERT 0 1
        uxdb=# insert into t1 values (12);
        INSERT 0 1
        uxdb=# insert into t1 values (13);
        INSERT 0 1
        uxdb=# insert into t1 values (14);
        INSERT 0 1
        uxdb=# insert into t1 values (15);
        INSERT 0 1
        uxdb=# insert into t1 values (16);
        INSERT 0 1
        uxdb=# insert into t1 values (17);
        INSERT 0 1
        uxdb=# select count(*) from t1;
         count 
        -------
             7
        (1 row)
        
      5. 先对data实例进行一次全备操作。

        [uxdb@local65 bin]$ ./ux_probackup backup -B /home/uxdb/data/probackup 	--instance=data1 -b full
        
        [uxdb@local65 bin]$./ux_probackup backup -B /home/uxdb/data/probackup --instance=datal -b full
        INFO:Backup start,ux_probackup  version:2.4.4,instance:data1,backup ID:QIMIZR,backup mode:FULL,wal mode:ARCHIVE,remote:false,compress-algorithm:none,compress-level:1
        Password:
        WARNING:Current UXsinoDB role is superuser.It is not recommended to run backup or checkdb as superuser
        INFO:Wait for WAL segment /home/uxdb/data/probackup/wal/datal/000000010000000000000002 to be archived
        INFO:UXDATA size:51MB
        INFO:Start transferring data files
        INFO:Data files are transferred,time elapsed:1s
        INFO:wait for ux_stop_backup()
        INFO:ux_stop backup()successfully executed
        INFO:Syncing backup files to disk
        INFO:
        Backup files are synced,time elapsed:
        INFO:
        Validating backup QIMTZR
        INFO:Backup QIMTZR data files are valid
        INFO:Backup QIMTZR resident size:51MB
        INFO:Backup QIMTZR completed
        [uxdb@local65 bin]$
        
      6. 数据库测试表t1中再次插入3条数据。

        uxdb=# insert into t1 values (19);
        INSERT 0 1
        uxdb=# insert into t1 values (20);
        INSERT 0 1
        uxdb=# insert into t1 values (21);
        INSERT 0 1
        uxdb=# select count(*) from t1;
         count 
        -------
            10
        (1 row)
        
      7. 以ptrack模式进行增量备份。

        [uxdb@local65 bin]$ ./ux_probackup backup -B /home/uxdb/data/probackup 	--instance=data1 -b ptrack
        
        [uxdb@local65 bin]$ ./ux_probackup backup -B /home/uxdb/data/probackup --instance datal -b ptrack
        INFO: Backup start, ux_probackup version: 2.4.4, instance: datal, backup ID: QIMU7Z, backup mode: PTRACK, wal mode: ARCHIVE, remote: false, compress-algorithm: none, compress-level: 1
        Password: 
        WARNING: Current UXsinoDB role is superuser. It is not recommended to run backup or checkdb as superuser
        ERROR: This UXsinoDB instance does not support ptrack
        WARNING: Backup QIMU7Z is running, setting its status to ERROR
        

        该问题的原因是使用ptrack模式备份时依赖ptrack这个插件,暂不提供。

  • 查看备份信息

    [uxdb@local65 bin]$ ./ux_probackup show -B /home/uxdb/data/probackup
    
    [uxdb@local65 bin]$ ./ux_probackup show -B /home/uxdb/data/probackup
    backup  INSTANCE 'test1'
    ID,Recovery Time,Mode,WAL Mode,TLI,Time,Data,WAL,Status
    QILAJ1,2020-10-22 14:11:33,DELTA,ARCHIVE,1/1,9s,140kB,16MB,OK
    QILADO,2020-10-22 14:07:56,PAGE,ARCHIVE,1/1,10s,172kB,16MB,OK
    QILA2N,2020-10-22 14:01:47,FULL,ARCHIVE,1/0,13s,51MB,16MB,OK
    [uxdb@local65 bin]$ 
    
  • 验证备份

    [uxdb@local65 bin]$ ./ux_probackup validate -B 	/home/uxdb/data/probackup --instance=test1
    
    [uxdb@local65 bin]$ ./ux_probackup validate -B 	/home/uxdb/data/probackup --instance=test1
    INFO: Validate backups of the instance "testl'
    WARNING: Backup QILCGE has missing parent 0
    WARNING: Backup QILBL8 has missing parent
    INFO: Validating backup QILAJ1
    INFO: Backup QILAJ1 data files are valid
    INFO: Backup QILAJ1 WAL segments are valid
    INFO: Validating backup QILADO
    INFO: Backup QILADO data files are valid
    INFO: Backup QILADO WAL segments are valid
    INFO: Validating backup QILA2N
    INFO: Backup QILA2N data files are valid
    INFO: Backup QILA2N WAL segments are valid
    WARNING: Some backups are not valid
    [uxdb@local65 bin]$
    
  • 并行备份

    [uxdb@local65 bin]$./ux_probackup backup -B /home/uxdb/data/probackup 	--instance=data1 -b full -j 4
    
    [uxdb@local65 bin]$./ux_probackup backup -B /home/uxdb/data/probackup --instance datal -b full -j 4
    INFO: Backup start, ux_probackup version: 2.4.4, instance: datal, backup ID: QINE9H, backup mode: FULL, wal mode: ARCHIVE, remote: false, compress-algorithm: none, compress-level: 1
    Password: 
    WARNING: Current UXsinoDB role is superuser. It is not recommended to run backup or checkdb as superuser.
    INFO: Wait for WAL segment /home/uxdb/data/probackup/wal/datal/000000010000000000000005 to be archived
    INFO: UXDATA size: 51MB
    INFO: Start transferring data files
    INFO: Data files are transferred, time elapsed: 4s
    INFO: wait for ux_stop_backup()
    INFO: ux_stop_backup() successfully executed
    INFO: Wait for LSN 0/60000B8 in archived WAL segment /home/uxdb/data/probackup/wal/datal/000000010000000000000006
    INFO: Syncing backup files to disk
    INFO: Backup files are synced, time elapsed: 0
    INFO: Validating backup QINE9H
    INFO: Backup QINE9H data files are valid
    INFO: Backup QINE9H resident size: 51MB
    INFO: Backup QINE9H completed
    
  • 恢复 恢复时数据库实例目录必须要为空,即恢复新创建的实例目录下,或者需要将源实例目录重命名。

    1. 根据备份集恢复到一个空的实例目录下。 a. 在uxdbinstall/dbsql/bin目录下创建restore目录,恢复到该目录下。

      [uxdb@local65 bin]$./ux_probackup restore -B /home/uxdb/data/probackup --instance=test1 -D /home/uxdb/uxdbinstall/dbsql/bin/restore -j 4
      
      [uxdb@local65 bin]$./ux_probackup restore -B /home/uxdb/data/probackup --instance=test1 -D /home/uxdb/uxdbinstall/dbsql/bin/restore -j 4
      WARNING:Skipping backup QILCGE,because it has non-valid status:ERROR
      WARNING:Skipping backup QILBL8,because it has non-valid status:ERROR
      INFO:Validating parents for backup QILAJ1
      INFO:Validating backup QILA2N
      INFO:Backup QILA2N data files are valid
      INFO:Validating backup QILADO
      INFO:Backup QILADO data files are valid
      INFO:Validating backup QILAJ1
      INFO:Backup QILAJ1 data files are valid
      INFO:Backup QILAJ1 WAL segments are valid
      INFO:Backup QILAJ1 is valid.
      INFO:Restoring the database from backup at 2020-10-22 14:11:25+08
      INFO:Start restoring backup files.UXDATA size:51MB
      INFO:Backup files are restored.Transfered bytes:51MB,time elapsed:0
      INFO:Restore incremental ratio (less is better):100%(51MB/51MB)
      INFO:Syncing restored files to disk
      INFO:Restored backup files are synced,time elapsed:0
      INFO:Restore of backup QILAJ1 completed.
      [uxdb@local65bin】$
      

      b. 启动恢复后的数据库。

      启动时会提示没有权限,需要修改restore目录的权限。

      chmod 0700 restore/
      

      启动需要使用绝对路径,否则启动失败。

      ./ux_ctl -D /home/uxdb/uxdbinstall/dbsql/bin/restore/ start
      

      c. 连接数据库查看t1表的内容。

      [uxdb@local65 bin]$./uxsql
      Password for user uxdb:
      uxsq1(2.1.1.3)
      Type "help"for help.
      
      uxdb=#select from t1;
      id
      2
      3
      4
      5
      6
      7
      8
      11
      12
      13
      14
      15
      (13 rows)
      uxdb=#
      
    2. 按时间点恢复。 以将数据库实例test从备份中恢复到时间点2020-10-24 14:47:33为例。

      a. 停掉test实例,并将其重命名。

      [uxdb@local65 bin]$ ./ux_ctl -D test/ stop
      [uxdb@local65 bin]$ mv test test_bak
      [uxdb@local65 bin]$  ./ux_probackup restore -B /home/uxdb/data/probackup --instance=test1  --recovery-target-time='2020-10-24 14:47:33'
      

      恢复命令执行之后可以看到bin目录下除了之前重命名之后的test_bak目录之外,还有恢复后的实例test目录。

      [uxdb@local65 bin]$ ls
      clusterdb       dropuser         reindexdb        ux_config        ux_diagnose
      createdb        ecux             removedb         ux_controldata   ux_hba_conf
      createuser      initdb           test             test_bak             ux_ctl
      dropdb          oid2name         ux_archivecleanup uxdb           ux_probackup
      ux_basebackup   ux_checksums     ux_bench         ux_dump          ux_restore
      ux_sql          ux_vacuumdb      ux_ident_conf...
      

      b. 启动数据库(必须用绝对路径)。

      [uxdb@local65 bin]$ ./ux_ctl -D /home/uxdb/uxdbinstall/dbsql/bin/test start
      

      查看表数据库。

      [uxdb@local65 bin]$ ./uxsql
      Password for user uxdb: 
      uxsql (2.1.1.3)
      Type "help" for help.
      
      uxdb=# select * from t1;
       id 
      ----
        1
        2
        3
        4
        5
        6
        7
        8
       11
       12
       13
       14
       15
      (13 rows)
      
  • 远程操作

    1. 配置ssh秘钥 在两台机器上分别生成ssh,默认保存在~/.ssh目录中。

      环境:本地机器 192.71.0.88,远程机器 192.71.0.86。

      在本地机器上执行:

      ssh-keygen -t rsa
      cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys65
      chmod 600 ~/.ssh/authorized_keys65
      
      [uxdb@local65 ~]$ ssh-keygen -t rsa
      Generating public/private rsa key pair.
      Enter file in which to save the key (/home/uxdb/.ssh/id_rsa): 
      Enter passphrase (empty for no passphrase): 
      Enter same passphrase again: 
      Your identification has been saved in /home/uxdb/.ssh/id_rsa.
      Your public key has been saved in /home/uxdb/.ssh/id_rsa.pub.
      The key fingerprint is:
      SHA256:jRTABkDns5cEGgrE01thWxD5sSOVWnSFpUD21an7mVw uxdb@local65
      The key's randomart image is:
      +---[RSA 2048]----+
      | ... (略) ...    |
      +----[SHA256]-----+
      
      [uxdb@local65 ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
      [uxdb@local65 ~]$ chmod 600 ~/.ssh/authorized_keys
      

      在远程机器上执行:

      ssh-keygen -t rsa
      cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys64
      chmod 600 ~/.ssh/authorized_keys64
      
      Overwrite(y/n)? y
      Enter passphrase (empty for no passphrase): 
      Enter same passphrase again: 
      Your identification has been saved in /home/uxdb/.ssh/id_rsa.
      Your public key has been saved in /home/uxdb/.ssh/id_rsa.pub.
      The key fingerprint is:
      SHA256:LUHahx10HOu9614RraKmt9u8WxcyWhx0/uY/8QPqeg4 uxdb@local64
      The key's randomart image is:
      +---[RSA 2048]----+
      |      ...        |
      |      (略)       |
      +----[SHA256]-----+
      
      [uxdb@local64 ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
      [uxdb@local64 ~]$ chmod 600 ~/.ssh/authorized_keys
      
    2. 复制公钥 分别将本地机器的公钥复制到远程机器,远程机器的公钥复制到本地机器。

      scp ~/.ssh/authorized_keys65 192.71.0.86:~/.ssh/
      
      [uxdb@local65 ~]$ scp ~/.ssh/authorized_keys 192.71.0.86:~/.ssh/
      The authenticity of host '192.71.0.86 (192.71.0.86)' can't be established.
      ECDSA key fingerprint is SHA256:/swLcTLPAm+UhocyDZxkEANxMWm0dDTnWBJgXbY40Pw.
      Are you sure you want to continue connecting (yes/no)? yes
      Warning: Permanently added '192.71.0.86' (ECDSA) to the list of known hosts.
      uxdb@192.71.0.86's password: 
      authorized_keys                                100%  402     0.4KB/s   00:00 
      
      [uxdb@local65 ~]$
      
      [uxdb@local64 ~]$ scp ~/.ssh/authorized_keys 192.71.0.88:~/.ssh/
      The authenticity of host '192.71.0.88 (192.71.0.88)' can't be established.
      ECDSA key fingerprint is SHA256:/sWLCTLPAm+UhocyDZxkEANxMWmOdDTnWBJgXbY40Pw.
      Are you sure you want to continue connecting (yes/no)? yes
      Warning: Permanently added '192.71.0.88' (ECDSA) to the list of known hosts.
      uxdb@192.71.0.88's password: 
      authorized_keys                                100%  402     0.4KB/s   00:00 
      
      [uxdb@local64 ~]$
      
    3. 配置公钥

      在两台机器上配置公钥并验证。

      mv ~/.ssh/authorized_keys64 ~/.ssh/authorized_keys
      
      
      [uxdb@local65 ~]$mv ~/.ssh/authorized keys64 ~/.ssh/authorized keys
      [uxdb@local65~]$
      
      [uxdb@local64 ~]mv ~/.ssh/authorized_keys65 ~/.ssh/authorized_keys
      [uxdbalocal64 ~]
      

      验证是否成功。

      [uxdb@l0cal65~]$ ssh 192.71.0.86
      Last1ogin:Sat Oct 2416:20:05 2020 from 192.71.1.101
      [uxdb@local64 ~]$
      
    4. 配置远程实例 修改远程实例的配置文件uxsinodb.conf。

      max_wal_senders = 10 #根据实际场景设置合理值,此处使用默认值10
      wal_level = 'replica'
      archive_mode = 'on'
      archive_command = '/home/uxdb/uxdbinstall/dbsql/bin/ux_probackup archive-push -B /home/uxdb/data/probackup --instance test2 --remote-user=uxdb --remote-host=192.71.0.88 --remote-port=22  --remote-path=/home/uxdb/uxdbinstall/dbsql/bin/ --wal-file-path=%p --wal-file-name=%f    '
      
    5. 添加远程实例 本地机器执行命令:

      ux_probackup add-instance -B /home/uxdb/data/probackup -D 	/home/uxdb/uxdbinstall/dbsql/bin/test/ --instance=test2  	--remote-host=192.71.0.86 --remote-port=22 --remote-user=uxdb 	--remote-path=/home/uxdb/uxdbinstall/dbsql/bin/
      
    6. 全量备份

    [uxdb@local65 bin]$ ./ux_probackup backup -B /home/uxdb/data/probackup 	--instance=test2 --remote-user=uxdb --remote-host=192.71.0.86 --remote-port=22 --remote-path=/home/uxdb/uxdbinstall/dbsql/bin/ -b full
    
    [uxdb@local65 bin]$ ./ux_probackup backup -B /home/uxdb/data/probackup --instance=test2 \
    --remote-user=uxdb \
    --remote-host=192.71.0.86 \
    --remote-port=22 \
    --remote-path=/home/uxdb/data/probackup \
    -b full
    
    INFO: Backup start, ux_probackup version: 2.4.4, instance: test2, backup ID: QISC7U, backup mode: FULL, wal mode: ARCHIVE, remote: true, compress-algorithm: none, compress-level: 1
    Password: 
    WARNING: This UXsinoDB instance was initialized without data block checksums.
    WARNING: Current UXsinoDB role is superuser. It is not recommended to run backup or checkdb as superuser.
    INFO: Wait for WAL segment /home/uxdb/data/probackup/wal/test2/000000010000000000000022 to be archived
    INFO: Start transferring data files
    INFO: Data files are transferred, time elapsed: 2s
    INFO: ux_stop_backup() successfully executed
    INFO: Wait for LSN 0/230000B8 in archived WAL segment /home/uxdb/data/probackup/wal/test2/000000010000000000000023
    INFO: Syncing backup files to disk
    INFO: Backup files are synced, time elapsed: 1s
    INFO: Validating backup QISC7U
    INFO: Backup QISC7U data files are valid
    INFO: Backup QISC7U resident size: 51MB
    INFO: Backup QISC7U completed
    
    1. 增量备份
    [uxdb@local65 bin]$ ./ux_probackup backup -B /home/uxdb/data/probackup 	--instance=test2 --remote-user=uxdb --remote-host=192.71.0.86 	--remote-port=22 --remote-path=/home/uxdb/uxdbinstall/dbsql/bin/ -b page
    
    [uxdb@local65 bin]$ ./ux_probackup backup -B /home/uxdb/data/probackup --instance=test2 \
    --remote-user=uxdb \
    --remote-host=192.71.0.86 \
    --remote-port=22 \
    --remote-path=/home/uxdb/data/probackup \
    -b page
    
    INFO: Backup start, ux_probackup version: 2.4.4, instance: test2, backup ID: QISEM5, backup mode: PAGE, wal mode: ARCHIVE, remote: true, compress-algorithm: none, compress-level: 1
    Password: 
    WARNING: This UXsinoDB instance was initialized without data block checksums.
    WARNING: Current UXsinoDB role is superuser. It is not recommended to run backup or checkdb as superuser.
    INFO: Wait for WAL segment /home/uxdb/data/probackup/wal/test2/000000010000000000000026 to be archived
    INFO: Parent backup: QISC7U
    INFO: UXDATA size: 51MB
    INFO: Extracting pagemap of changed blocks
    INFO: Pagemap successfully extracted, time elapsed: 0 sec
    INFO: Start transferring data files
    INFO: Data files are transferred, time elapsed: 1s
    INFO: wait for ux_stop_backup()
    INFO: ux_stop_backup() successfully executed
    INFO: Wait for LSN 0/270000B8 in archived WAL segment /home/uxdb/data/probackup/wal/test2/000000010000000000000027
    INFO: Syncing backup files to disk
    INFO: Backup files are synced, time elapsed: 0
    INFO: Validating backup QISEM5
    INFO: Backup QISEM5 data files are valid
    INFO: Backup QISEM5 resident size: 204kB
    INFO: Backup QISEM5 completed
    
    1. 远程恢复

      恢复到2020-10-26 09:32:25时间节点。

      uxdb=# select * from student;
       id 
      ----
       55
       55
        5
       55
      (4 rows)
      
      uxdb=# select now();
                    now              
      -------------------------------
       2020-10-26 09:32:25.532345+08
      (1 row)
      

      停止远程机器上的实例test,并进行重命名。

       ./ux_ctl -D test stop
       mv test test.bak
    

    本地机器执行恢复命令。

       ./ux_probackup restore -B /home/uxdb/data/probackup --instance=test2  	--recovery-target-time='2020-10-26 09:32:25' --remote-user=uxdb 	--remote-host=192.71.0.86 --remote-port=22 	--remote-path=/home/uxdb/uxdbinstall/dbsql/bin/ 	--archive-host=192.71.0.88 --archive-port=22 --archive-user=uxdb
    
    [uxdb@local65 bin]$ ./ux_probackup restore -B /home/uxdb/data/probackup --instance=test2 \
    --recovery-target-time='2020-10-26 09:32:25' \
    --remote-user=uxdb --remote-host=192.71.0.86 --remote-port=22 \
    --remote-path=/home/uxdb/data/probackup \
    --archive-user=uxdb --archive-host=192.71.0.88 --archive-port=22
    
    INFO: Validating backup QISC7U
    INFO: Backup QISC7U data files are valid
    INFO: Backup validation completed successfully on time 2020-10-26 10:09:21+08, xid 510 and LSN 0/24000250
    INFO: Backup QISC7U is valid.
    INFO: Restoring the database from backup at 2020-10-26 09:31:06+08
    INFO: Start restoring backup files. UXDATA size: 51MB
    INFO: Backup files are restored. Transfered bytes: 51MB, time elapsed: 3s
    INFO: Restore incremental ratio (less is better): 100% (51MB/51MB)
    INFO: Syncing restored files to disk
    INFO: Restored backup files are synced, time elapsed: 1s
    INFO: Restore of backup QISC7U completed.
    

    远程机器查看恢复后的实例数据。

    [uxdbalocal64 bin]s ls
    clusterdb	dropuser	reindexdb ux_archivecleanup ux_config	ux_diagnose uxmaster	ux_resetwal 
    uxsql	ux_upgrade	createdb	ecux	removedb	ux_basebackup	ux_controldata ux_dump	ux_probackup 
    ux_restore	ux_standby	ux_waldump	createuser	initdb	test	uxbench	ux_ctl	ux_dumpall	
    ux_receivewal	ux_rewind	ux_test_fsync	vacuumdb	dropdb	oid2name	test.bak	ux_checksums	
    uxdb	ux_isready	ux_recvlogical ux_rman	ux test timing	vacuumlo
    

    启动恢复后的实例时必须以绝对路径启动。

    [uxdb@local64 bin]$ ./ux_ctl -D /home/uxdb/uxdbinstall/dbsql/bin/test start
    [uxdb@local64 bin]$ ./uxsql 
    
    uxmaster status starting
    uxmaster status starting
    uxmaster status starting
    uxmaster status starting
    uxmaster status starting
    uxmaster status ready
    done
    server started
    [uxdb@local64 bin]$./uxsql
    Password for user uxdb:
    uxsql(2.1.1.3)
    Type "help"for help.
    uxdb=#select from student
    id
    55
    55
    55
    55
    (4roWs
    uxdb=#
    

注意
恢复时间节点有限制范围,只能使执行备份的时间范围内,时间范围外恢复失败。

16.ux_receivewal

ux_receivewal - 从运行中的UXDB集群中流式传输预写式日志

概述

ux_receivewal [option...]

描述

ux_receivewal用于从运行中的UXDB集群中流式传输预写式日志。预写式日志使用流式复制协议进行流式传输,并写入本地文件目录。此目录可用作执行时间点恢复的归档位置。

ux_receivewal实时流式传输预写式日志,就像在服务器上生成时一样,并且不像archive_command和archive_library那样等待段完成。因此,在使用ux_receivewal时不需要设置archive_timeout。

与UXDB备用服务器的WAL接收器不同,ux_receivewal默认仅在关闭WAL文件时刷新WAL数据。必须指定选项--synchronous以实时刷新WAL数据。由于ux_receivewal不应用WAL,因此不应将其设置为同步备用服务器,当synchronous_commit等于remote_apply时。如果这样做,它将看起来是一个永远无法追上的备用服务器,并将导致事务提交阻塞。为避免这种情况,您应该配置适当的值synchronous_standby_names,或为ux_receivewal指定不匹配的application_name,或者在使用ux_receivewal时将synchronous_commit设置为off

synchronous_commit的值更改为remote_apply之外的其他值。

预写式日志对常规UXDB连接进行流处理,并使用复制协议。连接必须由具有REPLICATION权限或超级用户进行,ux_hba.conf必须允许复制连接。服务器还必须将max_wal_senders设置得足够高,以便至少为流处理预留下一个可用的会话。

预写式日志流的起始点是在ux_receivewal启动时计算的:

  1. 首先,扫描写入WAL段文件的目录,并找到最新的已完成段文件,使用下一个WAL段文件的开头作为起始点。

  2. 如果无法使用上一种方法计算起始点,并且使用了复制槽,则会发出额外的READ_REPLICATION_SLOT命令以检索槽的restart_lsn以用作起始点。此选项仅在从UXDB 2122及更高版本的预写式日志流时可用。

  3. 如果无法使用上一种方法计算起始点,则使用服务器从IDENTIFY_SYSTEM命令报告的最新WAL刷新位置。

如果连接丢失或者最初无法建立连接,并且出现非致命性错误,则ux_receivewal将无限期重试连接,并尽快重新建立流。要避免此行为,请使用-n参数。

在没有致命错误的情况下,ux_receivewal将一直运行,直到收到SIGINT信号(Control+C)终止。

选项

-D directory
--directory=directory
要将输出写入的目录。

此参数是必需的。

-E lsn
--endpos=lsn
当接收到指定的LSN时自动停止复制并以正常退出状态0退出。

如果有一个LSN恰好等于 lsn 的记录,则将处理该记录。

--if-not-exists
当指定了--create-slot并且具有指定名称的槽已存在时,不要出错。

-n
--no-loop
不要在连接错误上循环。相反,立即以错误退出。

--no-sync
此选项导致ux_receivewal不强制WAL数据刷新到磁盘。这更快,但意味着一个后续操作系统崩溃可能会导致WAL段损坏。通常,此选项对于测试很有用,但在生产部署中进行WAL归档时不应使用。

此选项与--synchronous不兼容。

-s interval
--status-interval=interval
指定发送回服务器的状态数据包之间的秒数。这样可以更轻松地监视服务器的进度。值为零完全禁用周期性状态更新,尽管在服务器请求时仍会发送更新,以避免超时断开连接。默认值为10秒。

-S slotname
--slot=slotname
要求ux_receivewal使用现有的复制槽。当使用此选项时,ux_receivewal将向服务器报告刷新位置,指示已将每个段同步到磁盘,以便服务器可以在不需要的情况下删除该段。

当ux_receivewal的复制客户端在服务器上配置为同步备机时,使用复制槽将向服务器报告刷新位置,但仅在关闭WAL文件时才会这样做。因此,该配置将导致主服务器上的事务等待很长时间,实际上无法正常工作。必须另外指定选项--synchronous(参见下文)才能使其正常工作。

--synchronous
在接收到WAL数据后立即将其刷新到磁盘。无论--status-interval如何,也立即向服务器发送状态数据包。

如果在服务器上将ux_receivewal的复制客户端配置为同步备机,则应指定此选项,以确保及时向服务器发送反馈。

-v
--verbose
启用详细模式。

-Z level
-Z method [:detail ]
--compress=level
--compress=method[:detail ]
启用写入前日志的压缩。

压缩方法可以设置为gziplz4(如果UXDB使用--with-lz4编译)或none(不压缩)。

可以选择指定压缩详细信息字符串。如果详细信息字符串是整数,则指定压缩级别。否则,它应该是一个逗号分隔的项目列表,每个项目的形式为keywordkeyword=value。目前,唯一支持的关键字是level

如果未指定压缩级别,则将使用默认压缩级别。如果仅指定级别而未提及算法,则如果级别大于0,则使用gzip压缩,如果级别为0,则不使用压缩。

在使用gzip时,所有文件名都会自动添加后缀.gz,而在使用lz4时,后缀.lz4会被添加。

以下命令行选项控制数据库连接参数。

-d connstr
--dbname=connstr
指定用于连接服务器的参数,作为连接字符串;这些将覆盖任何冲突的命令行选项。

为了与其他客户端应用程序保持一致,该选项称为--dbname,但因为ux_receivewal不连接群集中的任何特定数据库,所以连接字符串中的数据库名称将被忽略。

-h host
--host=host
指定服务器运行的计算机的主机名。如果值以斜杠开头,则用作Unix域套接字的目录。默认值取自UXHOST环境变量(如果设置),否则将尝试进行Unix域套接字连接。

-p port
--port=port
指定服务器侦听连接的TCP端口或本地Unix域套接字文件扩展名。如果设置了UXPORT环境变量,则默认为该变量,否则为编译时默认值。

-U username
--username=username
连接的用户名。

-w
--no-password
永远不会发出密码提示。如果服务器需要密码身份验证并且没有其他方式(例如.uxpass文件)提供密码,则连接尝试将失败。此选项可用于批处理作业和脚本,其中没有用户可输入密码。

-W
--password
强制ux_receivewal在连接到数据库之前提示输入密码。

此选项不是必须的,因为如果服务器要求输入密码,ux_receivewal将自动提示输入密码。但是,ux_receivewal将浪费一个连接尝试来找出服务器需要密码。在某些情况下,建议输入-W以避免额外的连接尝试。

ux_receivewal可以执行以下两个操作之一,以控制物理复制插槽:

--create-slot
创建一个新的物理复制槽,名称为--slot指定的名称,然后退出。

--drop-slot
删除名称为--slot指定的复制槽,然后退出。

还有其他选项可用:

-V
--version
打印ux_receivewal的版本并退出。

-?
--help
显示关于ux_receivewal命令行参数的帮助信息,然后退出。

退出状态

当SIGINT信号终止ux_receivewal时,它将以状态0退出。(这是正常结束它的方式。因此不是错误。)对于致命错误或其他信号,退出状态将为非零。

环境变量

与大多数其他UXDB实用程序一样,此实用程序使用libuxsql支持的环境变量。

环境变量UX_COLOR指定是否在诊断消息中使用颜色。可能的值为alwaysautonever

注解

当使用ux_receivewal而不是archive_command或archive_library作为主要的WAL备份方法时,强烈建议使用复制槽。否则,服务器可以在备份之前回收或删除写入前日志文件,因为它没有任何信息,无论是来自archive_command、archive_library还是复制槽,关于WAL流已经归档了多远。但是,请注意,如果接收器无法跟上获取WAL数据,复制槽将填满服务器的磁盘空间。

如果在源集群上启用了组权限,则ux_receivewal将保留接收到的WAL文件的组权限。

示例

要从位于mydbserver的服务器流式传输写入前日志,并将其存储在本地目录/usr/local/uxsql/archive中:

$ ux_receivewal -h mydbserver -D /usr/local/uxsql/archive

另请参阅

ux_basebackup

17.ux_recvlogical

ux_recvlogical — 控制UXDB逻辑解码流

概要

ux_recvlogical [option...]

描述

ux_recvlogical控制逻辑解码复制插槽并从这些复制插槽流式传输数据。

它创建一个复制模式连接,因此受到与ux_receivewal相同的限制,以及逻辑复制的限制。

ux_recvlogical没有逻辑解码SQL接口的查看和获取模式的等效项。它在接收数据时懒惰地发送重放确认,并在干净退出时发送。要查看插槽上的挂起数据而不使用它,请使用ux_logical_slot_peek_changes

选项

必须指定以下选项之一以选择操作:

--create-slot
使用由--plugin指定的输出插件,为由--dbname指定的数据库创建一个名为--slot的新逻辑复制插槽。

可以使用--create-slot--two-phase来启用准备事务的解码。

--drop-slot
删除由--slot指定的复制插槽,然后退出。

--start
从指定的逻辑复制插槽开始流式传输更改。通过--slot连接,直到被信号终止。如果服务器端更改流以服务器关闭或断开连接结束,则在循环中重试,除非指定了--no-loop

流格式由创建插槽时指定的输出插件确定。

连接必须是与创建插槽使用的相同的数据库。

--create-slot--start可以一起指定。--drop-slot不能与其他操作组合使用。

以下命令行选项控制输出的位置和格式以及其他复制行为:

-E lsn
--endpos=lsn
--start模式下,当接收到指定的LSN时自动停止复制并以正常退出状态0退出。如果在非--start模式下指定,则会引发错误。

如果有一个LSN恰好等于 lsn 的记录,则该记录将被输出。

--endpos选项不知道事务边界,可能会在事务的中途截断输出。任何部分输出的事务都不会被消耗,并将在下次从插槽读取时重新播放。单个消息永远不会被截断。

-f filename
--file=filename
将接收和解码的事务数据写入此文件。使用-表示stdout。

-F interval_seconds
--fsync-interval=interval_seconds
指定ux_recvlogical应该多久发出一次fsync()调用,以确保输出文件被安全地刷新到磁盘。

服务器偶尔会请求客户端执行刷新并将刷新位置报告给服务器。此设置除了执行刷新更频繁之外,还可以执行此操作。

指定间隔0会完全禁用发出fsync()调用,同时仍向服务器报告进度。在这种情况下,在发生崩溃时可能会丢失数据。

-I lsn
--startpos=lsn
--start模式下,从给定的LSN开始复制。在其他模式下忽略。

--if-not-exists
当指定--create-slot并且具有指定名称的插槽已经存在时,不要出错。

-n
--no-loop
当与服务器的连接丢失时,不要在循环中重试,只需退出。

-o name[=value ]
--option=name[=value ]
将选项 name 传递给输出插件,如果指定,则使用选项值 value 。存在哪些选项及其效果取决于所使用的输出插件。

-P plugin
--plugin=plugin
创建插槽时,使用指定的逻辑解码输出插件。如果插槽已经存在,则此选项无效。

-s interval_seconds
--status-interval=interval_seconds
此选项具有与ux_receivewal中同名选项相同的效果。请参见那里的描述。

-S slot_name
--slot=slot_name
--start模式下,使用现有的逻辑复制插槽 slot_name 。在--create-slot模式下,创建此名称的插槽。在--drop-slot模式下,删除此名称的插槽。

-t --two-phase
启用准备事务的解码。此选项只能与--create-slot一起指定。

-v --verbose
启用详细模式。

以下命令行选项控制数据库连接参数。

-d dbname
--dbname=dbname
要连接的数据库。有关详细信息,请参见操作的描述。如果 dbname 是连接字符串,则连接字符串参数将覆盖任何冲突的命令行选项。默认为用户名。

-h hostname-or-ip
--host=hostname-or-ip
指定运行服务器的计算机的主机名。如果值以斜杠开头,则将其用作Unix域套接字的目录。默认值取自UXHOST环境变量(如果设置),否则将尝试进行Unix域套接字连接。

-p port
--port=port
指定服务器监听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。默认为 UXPORT 环境变量(如果设置)或编译时的默认值。

-U user
--username=user
要连接的用户名。默认为当前操作系统用户名。

-w
--no-password
永远不要发出密码提示。如果服务器需要密码验证,而通过其他方式(如.uxpass文件)无法获得密码,则连接尝试将失败。此选项在批处理作业和脚本中很有用,因为没有用户可以输入密码。

-W
--password
强制 ux_recvlogical 在连接到数据库之前提示输入密码。

此选项不是必须的,因为如果服务器要求输入密码,ux_recvlogical 将自动提示输入密码。但是,ux_recvlogical将浪费一个连接尝试来确定服务器需要密码。在某些情况下,建议输入 -W 避免额外的连接尝试。

还有以下其他选项可用:

-V
--version
打印 ux_recvlogical 的版本并退出。

-?
--help
显示有关 ux_recvlogical 命令行参数的帮助信息,然后退出。

环境变量

与大多数其他 UXDB 实用程序一样,此实用程序使用 libuxsql 支持的环境变量。

环境变量 UX_COLOR 指定是否在诊断消息中使用颜色。可能的值为 alwaysautonever

注解

如果在源群集上启用了组权限,则 ux_recvlogical 将保留接收到的 WAL 文件的组权限。

另请参阅

ux_receivewal

18.ux_restore

ux_restore — 从由 ux_dump 创建的归档文件中恢复一个 UXDB 数据库

概要

ux_restore [connection-option...] [option...] [ filename ]

描述

ux_restore 是一个用于从非纯文本格式中创建的归档中恢复 UXDB数据库的实用程序。它将发出必要的命令以重建数据库,使其恢复到保存时的状态。归档文件还允许ux_restore 选择性地恢复内容,甚至可以在恢复之前重新排序项目。归档文件旨在跨架构移植。

ux_restore 可以在两种模式下运行。如果指定了数据库名称,ux_restore将连接到该数据库并将归档内容直接恢复到数据库中。否则,将创建一个包含重建数据库所需SQL 命令的脚本,并将其写入文件或标准输出。此脚本输出等效于 ux_dump 的纯文本输出格式。因此,一些控制输出的选项类似于ux_dump 选项。

显然,ux_restore 无法恢复归档文件中不存在的信息。例如,如果使用“将数据转储为 INSERT 命令”选项创建了归档,则ux_restore 将无法使用 COPY 语句加载数据。

选项

ux_restore 接受以下命令命令行参数。

filename
指定要恢复的归档文件(或目录,对于目录格式的归档)的位置。 如果未指定,则使用标准输入。

-a
--data-only
仅恢复数据,不恢复模式(数据定义)。 如果归档中存在表数据、大对象和序列值,则会恢复它们。

出于历史原因,此选项类似于但不完全等同于指定 --section=data

-c
--clean
在重新创建数据库对象之前清除(删除)它们。 (除非使用--if-exists,否则如果目标数据库中不存在某些对象,则可能会生成一些无伤大雅的错误消息。)

-C
--create
在恢复到数据库之前创建数据库。 如果也指定了 --clean,则在连接到数据库之前删除并重新创建目标数据库。

使用 --create,ux_restore还会恢复数据库的注释(如果有),以及特定于此数据库的任何配置变量设置,即任何提到此数据库的ALTER DATABASE ... SET ...ALTER ROLE ... IN DATABASE ... SET... 命令。 除非指定了 --no-acl,否则还会恢复数据库本身的访问权限。

使用此选项时,使用 -d 命名的数据库仅用于发出初始的 DROP DATABASECREATE DATABASE命令。所有数据都将恢复到归档中出现的数据库名称中。

-d dbname
--dbname=dbname
连接到数据库 dbname 并直接恢复到数据库中。 dbname 可以是连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。

-e
--exit-on-error
如果在向数据库发送 SQL 命令时遇到错误,则退出。默认情况下,会继续执行,并在恢复结束时显示错误计数。

-f filename
--file=filename
指定生成脚本的输出文件,或与 -l 一起使用时的列表。使用 - 表示 stdout。

-F format
--format=format
指定归档的格式。不需要指定格式,因为 ux_restore 将自动确定格式。如果指定了格式,它可以是以下之一:

  • c
    custom
    存档是 ux_dump 的自定义格式。

  • d
    directory
    存档是目录存档。

  • t
    tar
    存档是 tar 存档。

-I index
--index=index
仅还原指定名称的索引定义。可以使用多个 -I 开关指定多个索引。

-j number-of-jobs
--jobs=number-of-jobs
并行运行 ux_restore 的最耗时步骤,包括加载数据、创建索引或创建约束,最多使用 number-of-jobs 个并发会话。此选项可以大大缩短将大型数据库还原到运行在多处理器机器上的服务器的时间。在发出脚本而不是直接连接到数据库服务器时,此选项将被忽略。

每个作业是一个进程或一个线程,具体取决于操作系统,并使用单独的连接到服务器。

此选项的最佳值取决于服务器、客户端和网络的硬件设置。因素包括 CPU 核心数和磁盘设置。一个好的起点是服务器上的 CPU核心数,但在许多情况下,比该值更大的值也可以导致更快的还原时间。当然,值太高会因抖动而导致性能下降。

此选项仅支持自定义和目录存档格式。输入必须是常规文件或目录(例如,不是管道或标准输入)。此外,多个作业不能与选项--single-transaction 一起使用。

-l
--list
列出存档的目录。此操作的输出可以用作 -L 选项的输入。请注意,如果与 -l 一起使用过滤开关(例如 -n-t),它们将限制所列出的项目。

-L list-file
--use-list=list-file
仅还原在 list-file 中列出的存档元素,并按照它们在文件中出现的顺序还原它们。请注意,如果与 -L一起使用过滤开关(例如 -n-t),它们将进一步限制所还原的项目。

通常通过编辑先前 -l 操作的输出来创建 list-file 。可以移动或删除行,也可以通过在行首放置分号 (;)来注释行。有关示例,请参见下文。

-n schema
--schema=schema
仅还原指定模式中的对象。可以使用多个-n选项指定多个模式。可以与-t选项结合使用,以仅还原特定表。

-N schema
--exclude-schema=schema
不还原指定模式中的对象。可以使用多个-N选项指定要排除的多个模式。

当对同一模式名称同时使用-n-N时,-N选项优先,模式将被排除。

-O
--no-owner
不输出命令以匹配原始数据库的对象所有权。默认情况下,ux_restore会发出ALTER OWNERSET SESSION AUTHORIZATION语句,以设置创建的模式元素的所有权。除非使用超级用户(或拥有脚本中所有对象的相同用户)进行与数据库的初始连接,否则这些语句将失败。使用-O,可以使用任何用户名进行初始连接,该用户将拥有所有创建的对象。

-P function-name(argtype [, ...])
--function=function-name(argtype [, ...])
仅还原指定的函数。请小心拼写函数名称和参数,确保与转储文件的目录表中的完全一致。可以使用多个-P选项指定多个函数。

-R
--no-reconnect
此选项已过时,但仍然接受以实现向后兼容性。

-s
--schema-only
仅还原模式(数据定义),而不是数据,只要存档中存在模式条目。

此选项是--data-only的相反。出于历史原因,它类似于但不完全等同于指定--section=pre-data --section=post-data

(不要将其与--schema选项混淆,该选项在不同的意义上使用单词“schema”。)

-S username
--superuser=username
指定在禁用触发器时要使用的超级用户用户名。仅当使用--disable-triggers时才相关。

-t table
--table=table
仅还原指定表的定义和数据。为此,“table”包括视图、物化视图、序列和外部表。可以通过写多个-t开关来选择多个表。此选项可以与-n选项结合使用,以指定特定模式中的表。

-K
指定文件恢复时解密密钥,恢复通过ux_dump工具加密备份的文件,密钥为长度为8-16、至少包含一个字母和数字、且第一个和最后一个字符不为空的串。恢复时指定的密钥必须和备份时指定的密钥相同才能正确恢复。-K必须与-Fc参数一起使用,指明只有的自定义格式归档时才能使用解密恢复功能。自动进行文件完整性校验,若备份文件被篡改,则恢复失败。该选项仅适用uxdb安全模式下运行。

注意

当指定-t时,ux_restore不会尝试恢复所选表可能依赖的任何其他数据库对象。因此,不能保证将特定表还原到干净的数据库中将成功。

注意

此标志的行为与ux_dump的-t标志不完全相同。目前,在ux_restore中没有通配符匹配的规定,也不能在其-t中包含模式名称。而且,虽然ux_dump的-t标志也会转储所选表的子对象(如索引),但ux_restore的-t标志不包括这些子对象。

-T trigger
--trigger=trigger
仅还原命名触发器。可以使用多个-T开关指定多个触发器。

-v
--verbose
指定详细模式。这将导致ux_restore将详细的对象注释和开始/停止时间输出到输出文件,并将进度消息输出到标准错误。重复该选项会导致额外的调试级别消息出现在标准错误中。

-V
--version
打印ux_restore版本并退出。

-x
--no-privileges
--no-acl
防止恢复访问权限(grant/revoke命令)。

-1
--single-transaction
将还原作为单个事务执行(即,在BEGIN/COMMIT中包装发出的命令)。这确保所有命令都成功完成,或者不应用任何更改。此选项意味着--exit-on-error。对于分布式备份恢复场景,部分场景下会出现分布式死锁,此时去掉该参数即可正常恢复。

--disable-triggers
此选项仅在执行仅数据还原时才相关。它指示ux_restore在恢复数据时执行命令以临时禁用目标表上的触发器。如果表上有引用完整性检查或其他触发器,您不希望在数据还原期间调用它们,则使用此选项。

目前,为--disable-triggers发出的命令必须由超级用户执行。因此,您还应该使用-S指定超级用户名称,或者最好作为UXDB超级用户运行ux_restore。

--enable-row-security
此选项仅在恢复具有行安全性的表的内容时才相关。默认情况下,ux_restore 将设置row_security为off,以确保所有数据都被恢复到表中。如果用户没有足够的权限来绕过行安全性,则会抛出错误。此参数指示 ux_restore将 row_security设置为on,允许用户尝试启用行安全性来恢复表的内容。如果用户没有将转储中的行插入到表中的权限,则仍可能失败。

请注意,此选项当前还需要转储以 INSERT 格式为基础,因为 COPY FROM 不支持行安全性。

--if-exists
使用条件命令(即添加 IF EXISTS 子句)删除数据库对象。除非也指定了--clean,否则此选项无效。

--merge
ux_restore数据恢复操作过程中,当数据存在着唯一约束或主键约束冲突时,使用merge启用数据冲突处理机制。不使用此参数时,数据冲突正常报错。--merge = conflictUpdate表示更新冲突数据;--merge = conflictIgnore表示忽略数据,保留原有数据。

--no-comments
不输出恢复注释的命令,即使存档包含它们。

--no-data-for-failed-tables
默认情况下,即使表的创建命令失败(例如,因为它已经存在),也会恢复表数据。使用此选项,将跳过此类表的数据。如果目标数据库已经包含所需的表内容,则此行为很有用。例如,UXGIS等 UXDB 扩展的辅助表可能已经加载到目标数据库中;指定此选项可防止将重复或过时的数据加载到其中。

此选项仅在直接恢复到数据库时有效,而不是在生成SQL脚本输出时有效。

--no-publications
不输出恢复发布的命令,即使存档包含它们。

--no-security-labels
不输出恢复安全标签的命令,即使存档包含它们。

--no-subscriptions
不输出恢复订阅的命令,即使存档包含它们。

--no-table-access-method
不输出选择表访问方法的命令。使用此选项,将使用恢复期间默认的访问方法创建所有对象。

--no-tablespaces
不输出选择表空间的命令。使用此选项,将使用恢复期间默认的表空间创建所有对象。

--section=sectionname
仅恢复指定的部分。部分名称可以是 pre-datadatapost-data。此选项可以多次指定以选择多个部分。默认情况下,将恢复所有部分。

数据部分包含实际的表数据以及大对象定义。后数据项包括索引、触发器、规则和约束的定义,除了已验证的检查约束。预数据项包括所有其他数据定义项。

--strict-names
要求备份文件中的每个模式 (-n/--schema) 和表 (-t/--table) 限定符至少与一个模式/表匹配。

--use-set-session-authorization
输出 SQL 标准的 SET SESSION AUTHORIZATION 命令, 而不是 ALTER OWNER命令来确定对象所有权。 这使得备份更符合标准,但是根据备份中对象的历史,可能无法正确还原。

-?
--help
显示关于 ux_restore 命令行参数的帮助信息,并退出。

ux_restore 还接受以下用于连接参数的命令行参数:

-h host
--host=host
指定运行服务器的机器的主机名。如果值以斜杠开头,则用作 Unix 域套接字的目录。 默认值取自 UXHOST环境变量(如果设置),否则尝试进行 Unix 域套接字连接。

-p port
--port=port
指定服务器侦听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。 默认值为 UXPORT环境变量(如果设置),或编译时的默认值。

-U username
--username=username
连接的用户名。

-w
--no-password
不要提示输入密码。如果服务器需要密码验证,而没有其他方式(如 .uxpass 文件)提供密码,则连接尝试将失败。此选项在批处理作业和脚本中很有用,其中没有用户输入密码。

-W
--password
强制 ux_restore 在连接到数据库之前提示输入密码。

此选项从未是必需的,因为如果服务器要求密码验证,ux_restore 将自动提示输入密码。 但是,ux_restore将浪费一个连接尝试来发现服务器需要密码。 在某些情况下,输入 -W 可以避免额外的连接尝试。

--role=rolename
指定用于执行还原的角色名称。 此选项会导致 ux_restore 发出 SET ROLE rolename 命令来设置角色。连接到数据库后的命令。当认证用户(由-U指定)缺少ux_restore所需的权限时,它非常有用,但可以切换到具有所需权限的角色。一些安装程序不允许直接登录超级用户,使用此选项可以在不违反策略的情况下执行还原操作。

环境变量

UXHOST
UXOPTIONS
UXPORT
UXUSER
默认连接参数

UX_COLOR
指定是否在诊断消息中使用颜色。可能的值为alwaysautonever

与大多数其他UXDB实用程序一样,此实用程序还使用libuxsql支持的环境变量。但是,在未提供数据库名称时,它不会读取UXDATABASE

诊断

当使用-d选项指定直接数据库连接时,ux_restore会在内部执行SQL语句。如果您在运行ux_restore时遇到问题,请确保您能够使用例如uxsql从数据库中选择信息。此外,任何libuxsql前端库使用的默认连接设置和环境变量都将适用。

注解

如果您的安装程序对template1数据库进行了任何本地添加,请小心将ux_restore的输出加载到真正的空数据库中;否则,由于添加对象的重复定义,您可能会遇到错误。要创建一个没有任何本地添加的空数据库,请从template0而不是template1复制,例如:

CREATE DATABASE foo WITH TEMPLATE template0;

下面详细介绍了ux_restore的限制。

  • 当将数据还原到现有表并使用--disable-triggers选项时,ux_restore会发出命令,在插入数据之前禁用用户表上的触发器,然后发出命令在插入数据后重新启用它们。如果还原在中途停止,则系统目录可能处于错误的状态。

  • ux_restore无法有选择地还原大对象;例如,仅针对特定表的大对象。如果归档包含大对象,则将还原所有大对象,如果它们通过-L-t或其他选项被排除,则不会还原任何大对象。有关详细信息,请参见ux_dump文档。

恢复后,最好对每个恢复的表运行ANALYZE,以便优化器具有有用的统计信息。

示例

假设我们已经将名为 mydb 的数据库转储到一个自定义格式的转储文件中:

$ ux_dump -Fc mydb > db.dump

要删除数据库并从转储重新创建它:

$ dropdb mydb
$ ux_restore -C -d uxdb db.dump

-d 开关中的数据库名称可以是群集中存在的任何数据库;ux_restore 仅使用它来为 mydb 发出 CREATE DATABASE 命令。使用 -C,数据始终恢复到转储文件中出现的数据库名称中。

要将转储还原到名为 newdb 的新数据库中:

$ createdb -T template0 newdb
$ ux_restore -d newdb db.dump

请注意,我们不使用 -C,而是直接连接到要还原的数据库。还要注意,我们从 template0 而不是 template1克隆新数据库,以确保它最初为空。

要重新排序数据库项,首先需要转储存档的目录:

$ ux_restore -l db.dump > db.list

列表文件由标题和每个项目的一行组成,例如:

;
; Archive created at Mon Sep 14 13:55:39 2009
;     dbname: DBDEMOS
;     TOC Entries: 81
;     Compression: 9
;     Dump Version: 1.10-0
;     Format: CUSTOM
;     Integer: 4 bytes
;     Offset: 8 bytes
;     Dumped from database version: 8.3.5
;     Dumped by ux_dump version: 8.3.8
;
;
; Selected TOC Entries:
;
3; 2615 2200 SCHEMA - public pasha
1861; 0 0 COMMENT - SCHEMA public pasha
1862; 0 0 ACL - public pasha
317; 1247 17715 TYPE public composite pasha
319; 1247 25899 DOMAIN public domain0 pasha

分号开头的是注释,行首的数字是分配给每个项目的内部存档 ID。

文件中的行可以被注释掉、删除和重新排序。例如:

10; 145433 TABLE map_resolutions uxdb
;2; 145344 TABLE species uxdb
;4; 145359 TABLE nt_header uxdb
6; 145402 TABLE species_records uxdb
;8; 145416 TABLE ss_old uxdb

可以用作 ux_restore 的输入,并且只会按照顺序恢复项目 10 和 6:

$ ux_restore -L db.list db.dump

参见

ux_dumpux_dumpalluxsql

19.ux_rman

ux_rman — 备份工具,支持全量,增量和差异备份

概要

ux_rman [option] [init | backup | restore | show [DATE] | show detail [DATE] | validate [DATE] | delete DATE | purge...]

描述

ux_rman是一个实用程序,用于备份和还原数据库。 它对整个数据库集群进行存档WAL和服务器日志物理备份,支持全量,增量和差异备份。

ux_rman目前仅支持Linux系统。

选项

  • 命令选项

    -D
    --uxdata=PATH
    数据存储目录的路径。

    -A
    --arclog-path=PATH
    归档WAL日志的路径。

    -S
    --srvlog-path=PATH
    存储服务器日志的路径。

    -B
    --backup-path=PATH
    备份数据的存储路径。

    -c
    --check
    检查。

    -v
    --verbose
    显示详细信息。

    -P
    --progress
    显示已处理文件的进度。

  • 备份选项

    -b
    --backup-mode=MODE
    全量、差异、增量和归档备份,可选参数:full、difference、incremental和archive。

    -s
    --with-serverlog
    备份服务器日志文件。

    -Z
    --compress-data
    使用zlib压缩数据备份。

    -C
    --smooth-checkpoint
    备份前进行平滑检查点。

    -F
    --full-backup-on-error
    切换到完全备份模式。

    注意

    此选项仅用于“--backup-mode=incremental或archive”。

    --keep-data-generations=NUM
    保留NUM代完整数据备份。

    --keep-data-days=NUM
    保持足够的数据备份以恢复到N天前。

    --keep-arclog-files=NUM
    保留NUM个已归档的WAL日志。

    --keep-arclog-days=DAY
    保持存档的WAL在DAY天内修改。

    --keep-srvlog-files=NUM
    保留NUM个服务器日志。

    --keep-srvlog-days=DAY
    保留在DAY天内修改的服务器日志。

    --standby-host=HOSTNAME
    从待机状态进行备份时备用主机。

    --standby-port=PORT
    从待机状态进行备份时的备用端口。

  • 恢复选项

    --recovery-target-time
    恢复进行的时间戳。

    --recovery-target-xid
    恢复继续进行的事务ID。

    --recovery-target-inclusive
    是否在目标恢复完成之后就停止。

    --recovery-target-timeline
    恢复到特定的时间。

    --hard-copy
    复制archivelog而不是符号链接。

  • 目录选项

    -a
    --show-all
    显示已删除的备份。

  • 删除选项

    -f
    --force
    强制删除比规定日期更早的备份。

  • 连接选项

    -d
    --dbname=DBNAME
    连接指定数据库。

    -h
    --host=HOSTNAME
    数据库主机。

    -P
    --port=PORT
    数据库端口。

    -U
    --username=USERNAME
    数据库用户名。

    -w
    --no-password
    不提示密码。

    -W
    --password
    强制提示密码。

  • 通用选项

    -q
    --quiet
    不显示任何info和debug信息。

    --debug
    查看debug信息。

    --help
    查看帮助信息。

    --version
    查看版本信息。

环境变量

BACKUP_PATH
备份路径。

例如:

export BACKUP_PATH=/home/uxdb/backup

来设置备份路径。

注意

如果不设置环境变量,则涉及路径的命令都需要添加 “-B backup_path” 指定备份路径。

操作

  • 初始化操作

    1. 创建归档目录。

      mkdir /home/uxdb/archivedir
      
    2. 修改目标数据库配置文件。

      vi uxsinodb.conf
      
      archive_mode = on
      # 启用归档功能;可选值为 off, on, 或 always
      # (更改此参数需要重启数据库服务)
      archive_command = 'test ! -f /home/uxdb/archivedir/%f && cp %p /home/uxdb/archivedir/%f'
      # 执行归档的 Shell 命令。
      # 逻辑:检查目标路径是否存在同名文件,若不存在则将 WAL 段 (%p) 复制到归档目录 (%f)。
      archive_timeout = 1800
      # 强制归档的时间阈值(秒)。
      # 如果 1800 秒(30 分钟)内没有填满一个 WAL 段,则强制切换并归档。
      # 设置为 0 则禁用此功能。
      
    3. 重启数据库。

    4. 初始化备份目录。

      ux_rman -D PATH init
      

      PATH是备份目标(实例)的路径,例如:/home/uxdb/uxdbinstall/dbsql/bin/test。

      初始化成功后,如图所示:

      [uxdb@localhost bin]$ux_rman -D /home/uxdb/uxdbinstall/dbsql/bin/debug init
      INFO:ARCLOG PATH is set to '/home/uxdb/archivedir
      INFO:SRVLOG PATH is set to '/home/uxdb/uxdbinstall/dbsql/bin/debug/ux_log'
      

      初始化成功后,进入备份目录可以看到ux_rman配置文件ux_rman.ini ,初始配置文件内容如图所示:

      ARCLOG_PATH='/home/uxdb/archivedir'
      SRVLOG_PATH='/home/uxdb/uxdbinstall/dbsql/bin/debug/ux_log'
      

      可以在此文件中添加其他配置参数。

      COMPRESS_DATA = YES
      KEEP_ARCLOG_FILES = 10
      KEEP_ARCLOG_DAYS = 10
      KEEP_DATA_GENERATIONS = 3
      KEEP_DATA_DAYS = 120
      KEEP_SRVLOG_FILES = 10
      KEEP_SRVLOG_DAYS = 10
      
  • 备份操作

    • 完全备份:每天执行一次,备份所有数据。优点是恢复简单(只需当天的完全备份),但每次备份数据量大、耗时久。
    • 差异备份:每周执行一次,备份自上次完全备份以来所有变化的数据。随着时间推移,差异备份文件会越来越大(因为累积了所有变化),恢复时需要上周日的完全备份加上当天的差异备份。
    • 增量备份:每周执行一次,只备份自上次任何备份(完全或增量)以来变化的数据。每次增量备份文件小、速度快,但恢复时需要上周日的完全备份和之后所有增量备份(按顺序)。

    下面的PATH指的是备份目标(实例)的路径,例如:/home/uxdb/uxdbinstall/dbsql/bin/test。

    • 全量备份

      ux_rman -D PATH backup --backup-mode=full --progress
      

      备份成功后,提示信息:

      [uxdb@localhost bin]$ ./ux_rman -D /home/uxdb/uxdata
      Password: 
      INFO: copying database files
      Processed 1044 of 1044 files, skipped 0
      INFO: copying archived WAL files
      Processed 3 of 3 files, skipped 0
      INFO: backup complete
      

      再次全备时,若备份目录中存在已校验的早期备份,则再次全备会跳过已备份的WAL日志以减少I/O操作。所以建议再次全备时手动将已存在的早期备份转移到其他目录。

    • 增量备份

      ux_rman -D PATH backup --backup-mode=incremental --progress 
      

      备份成功后,提示信息:

      [uxdb@localhost bin]$ ./ux_rman -D /home/uxdb/debug backup --backup-mode=incremental
      Password: 
      INFO: copying database files
      Processed 1047 of 1047 files, skipped 991
      INFO: copying archived WAL files
      Processed 8 of 8 files, skipped 3
      INFO: backup complete
      INFO: Please execute 'ux_rman validate' to verify the files are correctly copied.
      
    • 归档备份(增量模式)

      ux_rman -D PATH backup --backup-mode=archive --progress
      

      备份成功后,提示信息:

      [uxdb@localhost bin]$ ./ux_rman -D /home/uxdb/debug backup --backup-mode=archive --progress
      Password: 
      INFO: copying archived WAL files
      Processed 11 of 11 files, skipped 8
      INFO: backup complete
      INFO: Please execute 'ux_rman validate' to verify the files are correctly copied.
      
    • 差异备份

      ux_rman -D PATH backup --backup-mode=difference --progress
      

      备份成功后,提示信息:

      [uxdb@localhost bin]$ ./ux_rman -D /home/uxdb/uxdata backup --backup-mode=differential --progress
      Password: 
      INFO: copying database files
      Processed 1048 of 1048 files, skipped 1012
      INFO: copying archived WAL files
      Processed 31 of 31 files, skipped 6
      INFO: backup complete
      INFO: Please execute 'ux_rman validate' to verify the files are correctly copied.
      
  • 校验操作

    每次备份完成后必须进行校验操作,否则此次备份不可以作为下一次备份的基础,且不可用于还原操作。

    ux_rman validate
    
    [uxdb@localhost bin]$ ./ux_rman validate
    INFO: validate: "2019-09-25 16:27:38" archive log files by CRC
    INFO: backup "2019-09-25 16:27:38" is valid
    
  • 恢复操作

    恢复时可选择原地恢复或异地恢复,原地恢复时需要停止数据库服务,以免发生意外造成数据丢失。

    ux_rman restore -D PATH --recovery-target-time TIME
    

    恢复到指定时间点TIME之前,原地恢复时,PATH为原库路径;异地恢复时,PATH为备库路径。

    [uxdb@localhost bin]$ ./ux_rman restore -D /home/uxdb/debug --recovery-target-time "2019-09-25 16:25:03"
    INFO: the recovery target timeline ID is not given
    INFO: use timeline ID of current database cluster as recovery target: 1
    INFO: calculating timeline branches to be used to recovery target point
    INFO: searching latest full backup which can be used as restore start point
    INFO: found the full backup can be used as base in recovery: "2019-09-25 16:18:14"
    INFO: copying online WAL files and server log files
    INFO: clearing restore destination
    INFO: validate: "2019-09-25 16:18:14" backup and archive log files by SIZE
    INFO: backup "2019-09-25 16:18:14" is valid
    INFO: restoring database files from the full mode backup "2019-09-25 16:18:14"
    INFO: searching incremental backup to be restored
    INFO: searching backup which contained archived WAL files to be restored
    INFO: backup "2019-09-25 16:18:14" is valid
    INFO: restoring WAL files from backup "2019-09-25 16:18:14"
    INFO: backup "2019-09-25 16:25:03" is valid
    INFO: restoring WAL files from backup "2019-09-25 16:25:03"
    INFO: validate: "2019-09-25 16:27:38" archive log files by SIZE
    INFO: backup "2019-09-25 16:27:38" is valid
    INFO: restoring WAL files from backup "2019-09-25 16:27:38"
    INFO: restoring online WAL files and server log files
    INFO: generating recovery.conf
    INFO: restore complete
    HINT: Recovery will start automatically when the Uxsinodb server is started.
    

20.ux_verifybackup

ux_verifybackup - 验证UXDB群集的基本备份的完整性

概要

ux_verifybackup [option...]

描述

ux_verifybackup用于检查使用ux_basebackup备份的数据库群集备份的完整性,该备份在备份时由服务器生成backup_manifest。备份必须以“plain”格式存储;可以在提取后检查“tar”格式备份。

需要注意的是,ux_verifybackup执行的验证不能包括运行服务器时尝试使用备份时执行的每个检查。即使使用此工具,您仍应执行测试还原并验证生成的数据库是否按预期工作,以及它们是否似乎包含正确的数据。但是,ux_verifybackup可以检测由于存储问题或用户错误而经常发生的许多问题。

备份验证分为四个阶段。首先,ux_verifybackup读取backup_manifest文件。如果该文件不存在、无法读取、格式不正确或未通过其自身内部校验和的验证,则ux_verifybackup将以致命错误终止。

其次,ux_verifybackup将尝试验证当前存储在磁盘上的数据文件与服务器打算发送的数据文件完全相同,但有一些例外情况,这些例外情况将在下面描述。将检测到多余和缺少的文件,但有一些例外情况。此步骤将忽略uxsinodb.auto.confstandby.signalrecovery.signal的存在或缺失,以及对它们的任何修改,因为预计这些文件可能已经在备份过程中创建或修改。它也不会抱怨目标目录中的backup_manifest文件或ux_control文件的存在或缺失。

第三,ux_verifybackup将验证ux_control文件的内容是否与备份时生成的ux_control文件的内容相同。如果不同,则ux_verifybackup将终止并报告错误。

最后,ux_verifybackup 将检查备份期间生成的 WAL 日志文件是否存在于备份中。如果缺少任何 WAL日志文件,则ux_verifybackup 将终止并报告错误。

如果所有这些检查都通过,则ux_verifybackup 将输出一条消息,指示备份已通过验证。

如果您使用了ux_basebackup--xlog-method=stream选项,则ux_verifybackup将尝试验证备份期间生成的 WAL 日志流是否与备份中的 WAL日志流完全相同。如果不同,则ux_verifybackup将终止并报告错误。

如果您使用了ux_basebackup--xlog-method=fetch选项,则ux_verifybackup将尝试验证备份期间生成的 WAL 日志文件是否存在于备份中。如果缺少任何 WAL日志文件,则ux_verifybackup 将终止并报告错误。

ux_verifybackup可以与ux_basebackup一起使用,也可以与其他备份工具一起使用,只要它们生成的备份包含backup_manifest文件。

有关备份的更多信息,请参见ux_basebackup

选项

ux_verifybackup 接受以下命令行参数:

-e
--exit-on-error
一旦检测到备份问题,就立即退出。如果未指定此选项,则 ux_verifybackup将继续检查备份,即使检测到问题,也将报告检测到的所有问题作为错误。

-i path
--ignore=path
在比较实际存在于备份中的数据文件列表与 backup_manifest文件中列出的文件列表时,忽略指定的文件或目录,应表示为相对路径名。如果指定了目录,则此选项影响以该位置为根的整个子树。如果相对路径名与指定的路径名匹配,则将抑制有关额外文件、缺少文件、文件大小差异或校验和不匹配的投诉。此选项可以多次指定。

-m path
--manifest-path=path
使用指定路径的备份清单文件,而不是位于备份目录根目录中的文件。

-n
--no-parse-wal
不尝试解析写前日志数据,这些数据将在恢复备份时需要。

-q
--quiet
备份成功验证时不打印任何内容。

-s
--skip-checksums
不验证数据文件的校验和。仍将检查文件的存在与否以及文件的大小。这样做速度更快,因为不需要读取文件本身。

-w path
--wal-directory=path
尝试解析存储在指定目录中的 WAL 文件,而不是在 ux_wal 中。如果备份存储在与 WAL 存档不同的位置,则可能会有用。

还有其他选项可用:

-V
--version
打印 ux_verifybackup 的版本并退出。

-?
--help
显示有关 ux_verifybackup 命令行参数的帮助信息,并退出。

示例

创建服务器 mydbserver 的基本备份并验证备份的完整性:

$ ux_basebackup -h mydbserver -D /usr/local/uxsql/data
$ ux_verifybackup /usr/local/uxsql/data

创建服务器 mydbserver 的基本备份,将备份清单移动到备份目录之外的某个地方,然后验证备份:

$ ux_basebackup -h mydbserver -D /usr/local/uxsql/backup1234
$ mv /usr/local/uxsql/backup1234/backup_manifest /my/secure/location/backup_manifest.1234
$ ux_verifybackup -m /my/secure/location/backup_manifest.1234 /usr/local/uxsql/backup1234

在忽略手动添加到备份目录中的文件的同时验证备份,同时跳过校验和验证:

$ ux_basebackup -h mydbserver -D /usr/local/uxsql/data
$ edit /usr/local/uxsql/data/note.to.self
$ ux_verifybackup --ignore=note.to.self --skip-checksums /usr/local/uxsql/data

另请参阅

ux_basebackup

21.uxsql

uxsql — UXDB 交互式终端

概要

uxsql [option...] [ dbname [ username ]]

描述

uxsql 是一个基于终端的前端,用于连接 UXDB。它允许您交互式地输入查询,将其发送到UXDB,并查看查询结果。或者,输入可以来自文件或命令行参数。此外,uxsql提供了许多元命令和各种类似于 shell 的功能,以便编写脚本和自动化各种任务。

选项

-a
--echo-all
将所有非空输入行打印到标准输出,因为它们被读取。(这不适用于交互式读取的行。)这相当于将变量 ECHO 设置为 all

-A
--no-align
切换到未对齐的输出模式。(默认输出模式为 aligned。)这相当于 \pset format unaligned

-b
--echo-errors
将失败的 SQL 命令打印到标准错误输出。这相当于将变量 ECHO 设置为 errors

-c command
--command=command
指定 uxsql 要执行的命令。命令字符串 command 。此选项可以与-f选项重复和任意顺序组合使用。当指定-c-f时,uxsql不会从标准输入读取命令;相反,在处理所有-c-f选项后,它会终止。

command 必须是一个完全可由服务器解析的命令字符串(即,它不包含任何uxsql特定的功能),或者是一个单个反斜杠命令。因此,您不能在-c选项中混合使用SQL和uxsql元命令。要实现这一点,您可以使用重复的-c选项或将字符串管道传递到uxsql,例如:

uxsql -c '\x' -c 'SELECT * FROM foo;'

或者

echo '\x \\ SELECT * FROM foo;' | uxsql

\\是分隔符元命令。)

传递给-c的每个SQL命令字符串都作为单个请求发送到服务器。因此,即使字符串包含多个SQL命令,服务器也将其作为单个事务执行,除非字符串中包含显式的BEGIN/COMMIT命令将其分成多个事务。

如果不希望在一个事务中执行多个命令,请使用重复的-c命令或将多个命令馈送到uxsql的标准输入,例如使用echo,如上所示,或通过shell here-document,例如:

uxsql <<EOF
\x
SELECT * FROM foo;
EOF

--csv
切换到CSV(逗号分隔值)输出模式。这相当于\pset format csv

-d dbname
--dbname=dbname
指定要连接的数据库的名称。这相当于在命令行上指定 dbname 作为第一个非选项参数。 dbname 可以是连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。

-e
--echo-queries
将发送到服务器的所有SQL命令复制到标准输出中。这相当于将变量ECHO设置为queries

-E
--echo-hidden
回显由\d和其他反斜杠命令生成的实际查询。您可以使用此功能来研究uxsql的内部操作。这相当于将变量ECHO_HIDDEN设置为on

-f filename
--file=filename
从文件 filename 中读取命令,而不是标准输入。此选项可以与-c选项任意组合和重复使用。当指定-c-f时,uxsql不会从标准输入读取命令;相反,在按顺序处理所有-c-f选项后,它会终止。除此之外,此选项与元命令\i基本相同。

如果 filename-(连字符),则会读取标准输入,直到EOF指示或\q元命令。这可用于将交互式输入与来自文件的输入交错使用。但是请注意,在这种情况下不使用Readline(就像已指定-n一样)。

使用此选项与编写uxsql < filename有微妙的不同。通常,两者都会按预期执行,但使用-f启用了一些不错的功能,例如带有行号的错误消息。此外,使用此选项的可能性略微降低了启动开销。另一方面,使用shell的输入重定向变体(理论上)保证产生与手动输入完全相同的输出。

--merge
uxsql工具使用-f filename 选项执行数据恢复操作过程中,当数据备份文件与目标表存在着唯一约束或主键约束冲突时,使用merge参数启用数据冲突处理机制。不使用此参数时,数据冲突正常报错。--merge=conflictUpdate表示更新冲突数据;--merge=conflictIgnore表示忽略数据,保留原有数据。这个参数必须与 -f同时使用。

-F separator
--field-separator=separator
separator 用作未对齐输出的字段分隔符。这相当于\pset fieldsep\f

-h hostname
--host=hostname
指定运行服务器的计算机的主机名。如果值以斜杠开头,则将其用作Unix域套接字的目录。

-H
--html
切换到md输出模式。这相当于\pset format html\H命令。

-l
--list
列出所有可用的数据库,然后退出。其他非连接选项将被忽略。这类似于元命令\list

使用此选项时,uxsql将连接到数据库uxdb,除非在命令行上命名了不同的数据库(选项-d或非选项参数,可能通过服务条目,但不通过环境变量)。

-L filename
--log-file=filename
将所有查询输出写入文件 filename ,除了正常的输出目标之外。

-n
--no-readline
不使用Readline进行行编辑,也不使用命令历史记录(请参见下面的命令行编辑部分)。

-o filename
--output=filename
将所有查询输出放入文件 filename 中。这相当于命令\o

-p port
--port=port
指定服务器侦听连接的TCP端口或本地Unix域套接字文件扩展名。默认值为UXPORT环境变量的值,如果未设置,则为编译时指定的端口,通常为5432。

-P assignment
--pset=assignment
指定打印选项,格式为\pset。请注意,在这里,您必须使用等号而不是空格分隔名称和值。例如,要将输出格式设置为LaTeX,可以编写-P format=latex

-q
--quiet
指定uxsql应该安静地工作。默认情况下,它会打印欢迎消息和各种信息输出。如果使用此选项,则不会发生任何事情。这对于-c选项很有用。这相当于将变量QUIET设置为on

-R separator
--record-separator=separator
使用 separator 作为未对齐输出的记录分隔符。这相当于\pset recordsep

-s
--single-step
以单步模式运行。这意味着在将每个命令发送到服务器之前,用户都会收到提示,可以取消执行。使用此选项调试脚本。

-S
--single-line
以单行模式运行,其中换行符终止SQL命令,分号也是如此。

注意

此模式是为那些坚持使用它的人提供的,但不一定鼓励使用它。特别是,如果在一行上混合使用SQL和元命令,则执行顺序可能对经验不足的用户不太清楚。

-t
--tuples-only
关闭列名和结果行计数页脚的打印,等等。这相当于\t\pset tuples_only

-T table_options
--table-attr=table_options
指定要放置在md table标记内的选项。有关详细信息,请参阅\pset tableattr

-U username
--username=username
作为用户 username 连接到数据库,而不是默认用户。(当然,您必须有权限这样做。)

-v assignment
--set=assignment
--variable=assignment
执行变量赋值,就像\set元命令一样。请注意,您必须在命令行上使用等号分隔名称和值(如果有)。要取消变量,请省略等号。要设置一个空值变量,请使用等号,但省略值。这些赋值是在命令行处理期间完成的,因此反映连接状态的变量稍后将被覆盖。

-V
--version
打印uxsql版本并退出。

-w
--no-password
不要提示输入密码。如果服务器需要输入密码,而其他来源(如.uxpass文件)中没有密码,则连接尝试将失败。此选项可用于批处理作业和脚本,其中没有用户存在以输入密码。

请注意,此选项将保持设置整个会话,因此它会影响元命令\connect的使用以及初始连接尝试。

-W
--password
强制uxsql在连接到数据库之前提示输入密码,即使不会使用密码。

如果服务器需要输入密码,而其他来源(如.uxpass文件)中没有密码,则uxsql无论如何都会提示输入密码。但是,uxsql将浪费一个连接尝试来找出服务器需要密码。在某些情况下,建议输入-W以避免额外的连接尝试。

请注意,此选项将保持设置整个会话,因此它会影响元命令\connect的使用以及初始连接尝试。

-x
--expanded
打开扩展表格式模式。这相当于\x\pset expanded

-X,
--no-uxsqlrc
不要读取启动文件(系统范围内的uxsqlrc文件和用户的~/.uxsqlrc文件)。

-Y password
--uxsql-password=password
指定连接数据库时要使用的密码。

-z
--field-separator-zero
将未对齐输出的字段分隔符设置为零字节。这相当于\pset fieldsep_zero

-0
--record-separator-zero
将未对齐输出的记录分隔符设置为零字节。这对于与xargs -0等接口很有用。这相当于\pset recordsep_zero

-1
--single-transaction
此选项只能与一个或多个-c-f选项组合使用。它会导致uxsql在第一个这样的选项之前发出BEGIN命令,并在最后一个选项之后发出COMMIT命令,从而将所有命令包装成一个单独的事务。如果任何命令失败并且设置了变量ON_ERROR_STOP,则会发送ROLLBACK命令。这确保所有命令都成功完成,或者不应用任何更改。

如果命令本身包含BEGINCOMMITROLLBACK,则此选项将不会产生预期的效果。此外,如果单个命令无法在事务块内执行,则指定此选项将导致整个事务失败。

-?
--help[=topic]
显示关于uxsql的帮助信息并退出。可选的 topic 参数(默认为options)选择要解释的uxsql的哪个部分:commands描述uxsql的反斜杠命令;options描述可以传递给uxsql的命令行选项;variables显示有关uxsql配置变量的帮助信息。

退出状态

uxsql返回0到shell,如果它正常完成,则返回1,如果发生自己的致命错误(例如,内存不足,文件未找到),则返回2,如果与服务器的连接出现问题并且会话不是交互式的,则返回3,如果在脚本中发生错误并设置了变量ON_ERROR_STOP,则返回3。

用法

  • 连接到数据库

    uxsql是一个常规的UXDB客户端应用程序。为了连接到数据库,您需要知道目标数据库的名称、服务器的主机名和端口号,以及要连接的用户名。可以通过命令行选项告诉uxsql这些参数,即-d-h-p-U。如果找到不属于任何选项的参数,它将被解释为数据库名称。(如果已经给出数据库名称,则为用户名)。并非所有这些选项都是必需的;有些有用的默认值。如果省略主机名,则uxsql 将通过 Unix 域套接字连接到本地主机上的服务器,或通过 TCP/IP 连接到没有 Unix 域套接字的机器上的localhost。默认端口号在编译时确定。由于数据库服务器使用相同的默认值,因此在大多数情况下不需要指定端口。默认用户名是您的操作系统用户名,数据库名称也是如此。请注意,您不能仅使用任何用户名连接到任何数据库。您的数据库管理员应该已经告知您的访问权限。

    当默认值不完全正确时,您可以通过设置环境变量 UXDATABASEUXHOSTUXPORTUXUSER的适当值来节省一些输入。还可以方便地拥有一个~/.uxpass 文件,以避免经常输入密码。

    指定连接参数的另一种方法是在 conninfo 字符串或 URI中,它们用于替代数据库名称。这种机制使您对连接具有非常广泛的控制权。例如:

    $ uxsql "service=myservice sslmode=require"
    $ uxsql uxsinodb://dbmaster:5433/mydb?sslmode=require
    

    这样,您还可以使用 LDAP 进行连接参数查找。

    如果由于任何原因(例如权限不足、服务器未在目标主机上运行等)无法建立连接,则 uxsql 将返回错误并终止。

    如果标准输入和标准输出都是终端,则 uxsql 将客户端编码设置为 “auto”,这将从区域设置(Unix 系统上的 LC_CTYPE环境变量)中检测到适当的客户端编码。如果这不按预期工作,则可以使用环境变量 UXCLIENTENCODING覆盖客户端编码。

  • 输入 SQL 命令

    在正常操作中,uxsql 提供了一个提示符,其中包含当前连接到的数据库的名称,后面跟着字符串 =>。例如:

    $ uxsql testdb
    uxsql (15.1)
    Type "help" for help.
    
    testdb=>
    

    在提示符处,用户可以输入 SQL命令。通常情况下,当到达命令终止分号时,输入行将被发送到服务器。换行符不终止命令。因此,为了清晰起见,命令可以分散在几行上。如果命令已发送并且执行没有错误,则命令的结果将显示在屏幕上。

    如果不可信用户对还没有采用安全方案使用模式的一个而数据库拥有访问,在会话开始时从search_path 中删除公开可写的模式。可以在连接字符串中添加 options=-csearch_path=,或在其他 SQL命令之前发出 SELECT ux_catalog.set_config('search_path', '',false)。这个考虑不仅适用于 uxsql,而且适用于执行任意 SQL 命令的每个接口。

    每当执行一个命令时,uxsql 还会轮询由 LISTENNOTIFY生成的异步通知事件。

    虽然 C 风格的块注释会被传递到服务器进行处理和删除,但 SQL 标准注释会被 uxsql 删除。

  • 元命令

    在 uxsql 中输入以未引用的反斜杠开头的任何内容都是由 uxsql 自身处理的 uxsql 元命令。这些命令使得 uxsql在管理或脚本编写方面更加有用。元命令通常称为斜杠或反斜杠命令。

    uxsql 命令的格式是反斜杠,紧随其后是命令动词,然后是任何参数。参数与命令动词及彼此之间由任意数量的空格字符分隔。

    要在参数中包含空格,可以用单引号引用它。要在参数中包含单引号,请在单引号文本中写入两个单引号。任何包含在单引号中的内容都受到类似 C的替换的影响,用于替换\n(新行)、\t(制表符)、\b(退格)、\r(回车)、\f(换页符)、\ digits (八进制)和\ xdigits (十六进制)。在单引号文本中,反斜杠前面的任何其他字符都会引用该单个字符,无论它是什么。

    如果在参数中出现了未引用的冒号(:),后跟一个 uxsql 变量名,则会按照下面的 SQL插值中所述的方式替换为变量的值。那里描述的形式 :'variable_name' 和:"variable_name" 也适用。 :{?variable_name} 语法允许测试变量是否已定义。它被替换为 TRUE 或FALSE。用反斜杠转义冒号可保护它免受替换。

    在参数中,用反引号括起来的文本被视为传递给 shell的命令行。命令的输出(去除任何尾随换行符)替换了反引号文本。在用反引号括起来的文本中,不会进行任何特殊的引用或其他处理,除了出现:variable_name 的地方,其中 variable_name 是 uxsql变量名,将被替换为变量的值。此外,出现:'variable_name'会被替换为变量的值,适当地加上引号以成为单个shell命令参数。(除非你非常确定变量中的内容,否则后一种形式几乎总是更好。)因为回车和换行字符不能在所有平台上安全地加上引号,所以当这些字符出现在值中时,:'variable_name'形式会打印错误消息并不会替换变量的值。

    一些命令需要一个 SQL 标识符(如表名)作为参数。这些参数遵循 SQL的语法规则:未加引号的字母被强制转换为小写,而双引号(")则保护字母免受大小写转换,并允许将空格合并到标识符中。在双引号内,成对的双引号会在生成的名称中缩减为单个双引号。例如,FOO"BAR"BAZ被解释为 fooBARbaz,而 "A weird"" name" 变成了 A weird" name

    参数解析在行末或找到另一个未加引号的反斜杠时停止。未加引号的反斜杠被视为新元命令的开头。特殊序列\\(两个反斜杠)标记了参数的结束,并继续解析 SQL 命令(如果有的话)。这样,SQL 和 uxsql命令可以自由混合在一行中。但是,在任何情况下,元命令的参数都不能超出行的末尾。

    许多元命令作用于当前查询缓冲区。这只是一个缓冲区,保存了已键入但尚未发送到服务器执行的任何 SQL命令文本。这将包括先前的输入行以及出现在元命令之前的任何文本。

    以下元命令已定义:

    \a
    如果当前表格输出格式未对齐,则将其切换为对齐。如果它不是未对齐的,则将其设置为未对齐。此命令保留了向后兼容性。有关更通用的解决方案,请参见\pset

    \c\connect [ -reuse-previous=on|off ] [ dbname [ username ] [ host ] [ port ] | conninfo ]
    建立到UXDB 服务器的新连接。可以使用位置语法(一个或多个数据库名称、用户、主机和端口)或使用 conninfo 连接字符串来指定要使用的连接参数。如果没有给出参数,则使用与之前相同的参数进行新连接。

    dbnameusernamehostport 中的任何一个指定为 - 等效于省略该参数。

    新连接可以重用上一个连接的连接参数;不仅包括数据库名称、用户、主机和端口,还包括其他参数。设置如 sslmode 等。默认情况下,参数在位置语法中被重用,但在给出 conninfo 字符串时不会重用。传递第一个参数-reuse-previous=on-reuse-previous=off会覆盖该默认设置。如果重用参数,则任何未明确指定为位置参数或在 conninfo 字符串中的参数都将从现有连接的参数中获取。一个例外是,如果使用位置语法从其先前的值更改 host 设置,则现有连接参数中存在的任何 hostaddr 设置都将被删除。此外,仅当用户、主机和端口设置未更改时,才会重用现有连接使用的任何密码。当命令既不指定也不重用特定参数时,使用libuxsql默认设置。

    如果新连接成功建立,则关闭先前的连接。如果连接尝试失败(用户名错误、访问被拒绝等),则如果uxsql处于交互模式,则保留先前的连接。但是,在执行非交互式脚本时,旧连接将关闭并报告错误。这可能会或可能不会终止脚本;如果不终止,则所有访问数据库的命令都将失败,直到成功执行另一个\connect命令。选择这种区别是为了方便用户避免打字错误,同时还是脚本不会意外地在错误的数据库上操作的安全机制。请注意,每当\connect命令尝试重用参数时,重用的值是最后一个成功连接的值,而不是任何后续失败尝试的值。但是,在非交互式\connect失败的情况下,不允许稍后重用任何参数,因为脚本可能会期望从失败的\connect中重用的值。

    示例:

    => \c mydb myuser host.dom 6432
    => \c service=foo
    => \c "host=localhost port=5432 dbname=mydb connect_timeout=10 sslmode=disable"
    => \c -reuse-previous=on sslmode=require    -- 仅更改sslmode
    => \c uxsinodb://tom@localhost/mydb?application_name=myapp
    

    \C [ title ]
    设置作为查询结果打印的任何表的标题,或取消任何这样的标题。此命令等效于\pset title title。(此命令的名称源自“标题”,因为它以前仅用于设置md表中的标题。)

    \cd [ directory ]
    将当前工作目录更改为 directory 。如果没有参数,则更改为当前用户的主目录。

    提示

    要打印当前工作目录,请使用\! pwd

    \conninfo
    输出有关当前数据库连接的信息。

    \copy { table [ ( column_list ) ] } from{ 'filename' | program 'command' | stdin | pstdin } [ [ with ] ( option [, ...] ) ] [ where condition ]
    \copy { table [ ( column_list ) ] | ( query ) } to { 'filename' | program 'command' | stdout | pstdout } [ [ with ] ( option [, ...] ) ]
    执行前端(客户端)复制。这是一个操作,它运行一个 SQL COPY命令,但是服务器不读取或写入指定的文件,uxsql读取或写入文件,并在服务器和本地文件系统之间路由数据。这意味着文件的可访问性和权限是本地用户的,而不是服务器的,不需要SQL 超级用户权限。

    当指定 program 时, command 由 uxsql 执行,并将从或到 command 传递的数据路由到服务器和客户端之间。同样,执行权限是本地用户的,而不是服务器的,不需要SQL 超级用户权限。

    对于 \copy ... from stdin,数据行从发出命令的相同源读取,直到读取 \. 或流达到 EOF。此选项对于在 SQL脚本文件中行内填充表格非常有用。对于 \copy ... to stdout,输出发送到与 uxsql 命令输出相同的位置,并且不打印COPY count 命令状态(因为它可能与数据行混淆)。要读取/写入 uxsql 的标准输入/输出,而不考虑当前命令源或 \o选项,请编写 from pstdinto pstdout

    此命令的语法类似于 SQL COPY 命令。除了数据源/目的地之外的所有选项都与COPY 指定的选项相同。因此,特殊的解析规则适用于 \copy 元命令。与大多数其他元命令不同,整个剩余行始终被视为 \copy的参数,不执行变量插值或反引号扩展。

    提示

    获得与 \copy ... to 相同结果的另一种方法是使用 SQL COPY ... TO STDOUT 命令,并以 \g filename\g |program 结束。与 \copy 不同,此方法允许命令跨越多行;还可以使用变量插值和反引号扩展。

    提示

    这些操作不如使用文件或程序数据源或管道的 SQL COPY命令高效。因为所有数据都必须通过客户端/服务器连接传递。对于大量数据,可能更喜欢使用SQL命令。

    \copyright
    显示UXDB的版权和分发条款。

    \crosstabview [colV [colH [colD [sortcolH ]]]]
    执行当前查询缓冲区(类似于\g)并在交叉表格中显示结果。查询必须返回至少三列。由 colV 标识的输出列成为垂直标题,由 colH 标识的输出列成为水平标题。 colD 标识要在网格中显示的输出列。 sortcolH 标识水平标题的可选排序列。

    每个列规范可以是列号(从1开始)或列名。列名适用于通常的SQL大小写折叠和引用规则。如果省略,则 colV 被视为列1, colH 被视为列2。 colH 必须与 colV 不同。如果未指定 colD ,则查询结果中必须恰好有三列,并且既不是 colV 也不是 colH 的列被视为 colD

    垂直标题显示为最左侧的列,其中包含按查询结果顺序但删除重复项的 colV 列中找到的值。

    水平标题显示为第一行,其中包含删除重复项的 colH 列中找到的值。默认情况下,这些按查询结果的顺序出现。但是,如果给出可选的 sortcolH 参数,则它标识必须是整数数字的列, colH 的值将按照相应的 sortcolH 值排序出现在水平标题中。

    在交叉表格内,对于 colH 的每个不同值xcolV 的每个不同值y,位于交点(x,y)的单元格包含查询结果行中 colH 的值为xcolV 的值为ycolD列的值。如果没有这样的行,则单元格为空。如果有多个这样的行,则报告错误。

    \d[S+] [ pattern ]
    对于与 pattern 匹配的每个关系(表、视图、材料化视图、索引、序列或外部表)或复合类型,显示所有列、它们的类型、表空间(如果不是默认值)和任何特殊属性,如NOT NULL或默认值。还显示相关的索引、约束、规则和触发器。对于外部表,还显示相关的外部服务器。(“匹配模式”在下面的模式中定义。)

    对于某些类型的关系,\d为每个列显示附加信息:序列的列值、索引的索引表达式和外部表的外部数据包装器选项。

    命令形式\d+是相同的,只是显示更多信息:显示与表的列相关的任何注释,以及表中OID的存在,如果关系是视图,则显示视图定义,非默认的副本标识设置以及如果关系具有访问方法,则显示访问方法名称。

    默认情况下,只显示用户创建的对象;提供模式或S修饰符以包括系统对象。

    注意

    如果使用\d而没有 pattern 参数,则相当于\dtvmsE,它将显示所有可见表、视图、材料化视图、序列和外部表的列表。这纯粹是一种方便措施。

    \da[S] [ pattern ]
    列出聚合函数及其返回类型和它们操作的数据类型。如果指定了 pattern ,则只显示名称与模式匹配的聚合。默认情况下,只显示用户创建的对象;提供模式或S修饰符以包括系统对象。

    \dA[+] [ pattern ]
    列出访问方法。如果指定了 pattern ,则只显示名称与模式匹配的访问方法。如果在命令名称后附加了+,则列出每个访问方法及其关联的处理程序函数和描述。

    \dAc[+] [access-method-pattern[input-type-pattern]]
    列出操作符类。如果指定了 access-method-pattern ,则只列出与名称匹配该模式的访问方法关联的操作符类。如果指定了 input-type-pattern ,则只列出与名称匹配该模式的输入类型关联的操作符类。如果在命令名称后附加了+,则列出每个操作符类及其关联的操作符族和所有者。

    \dAf[+] [access-method-pattern[input-type-pattern]]
    列出操作符族。如果指定了 access-method-pattern ,则仅列出与名称匹配该模式的访问方法相关的操作符族。如果指定了 input-type-pattern ,则仅列出与名称匹配该模式的输入类型相关的操作符族。如果在命令名称后附加+,则每个操作符族都会列出其所有者。

    \dAo[+] [access-method-pattern[operator-family-pattern]]
    列出与操作符族相关联的操作符。如果指定了 access-method-pattern ,则仅列出与名称匹配该模式的访问方法相关的操作符族成员。如果指定了 operator-family-pattern ,则仅列出与名称匹配该模式的操作符族成员。如果在命令名称后附加+,则每个操作符都会列出其排序操作符族(如果它是排序操作符)。

    \dAp[+] [access-method-pattern[operator-family-pattern]]
    列出与操作符族相关联的支持函数。如果指定了 access-method-pattern ,则仅列出与名称匹配该模式的访问方法相关的操作符族函数。如果指定了 operator-family-pattern ,则仅列出与名称匹配该模式的操作符族函数。如果在命令名称后附加+,则会以详细方式显示函数及其实际参数列表。

    \db[+] [ pattern ]
    列出表空间。如果指定了 pattern ,则仅显示名称与该模式匹配的表空间。如果在命令名称后附加+,则每个表空间都会列出其关联选项、磁盘大小、权限和描述。

    \dc[S+] [ pattern ]
    列出字符集编码之间的转换。如果指定了 pattern ,则仅列出名称与该模式匹配的转换。默认情况下,仅显示用户创建的对象;提供模式或S修饰符以包括系统对象。如果在命令名称后附加+,则每个对象都会列出其关联描述。

    \dconfig[+] [ pattern ]
    列出服务器配置参数及其值。如果指定了 pattern ,则只列出名称与模式匹配的参数。如果没有指定 pattern ,则只列出设置为非默认值的参数。(使用\dconfig *查看所有参数。)如果在命令名称后附加了+,则每个参数都将列出其数据类型、可以设置参数的上下文以及访问权限(如果授予了非默认访问权限)。

    \dC[+] [ pattern ]
    列出类型转换。 如果指定了 pattern ,则只列出源类型或目标类型与模式匹配的转换。如果在命令名称后附加了+,则每个对象都将列出其关联的描述。

    \dd[S] [ pattern ]
    显示constraintoperator classoperator familyruletrigger类型的对象的描述。其他所有注释可以通过相应对象类型的反斜杠命令查看。

    \dd显示与 pattern 匹配的对象的描述,或者如果没有给出参数,则显示适当类型的可见对象。但是,在任何情况下,只列出具有描述的对象。默认情况下,只显示用户创建的对象;提供模式或S修饰符以包括系统对象。

    可以使用COMMENT SQL命令为对象创建描述。

    \dD[S+] [ pattern ]
    列出域。如果指定了 pattern ,则只显示名称与模式匹配的域。默认情况下,只显示用户创建的对象;提供模式或S修饰符以包括系统对象。如果在命令名称后附加了+,则每个对象都将列出其关联的权限和描述。

    \ddp [ pattern ]
    列出默认访问权限设置。为每个已更改内置默认权限设置的角色(和模式,如果适用)显示一个条目。如果指定了 pattern ,则只列出角色名称或模式名称与模式匹配的条目。

    使用ALTER DEFAULT PRIVILEGES命令设置默认访问权限。

    \dE[S+] [ pattern ]
    \di[S+] [ pattern ]
    \dm[S+] [ pattern ]
    \ds[S+] [ pattern ]
    \dt[S+] [ pattern ]
    \dv[S+] [ pattern ]
    在这组命令中,字母Eimstv分别代表外部表、索引、物化视图、序列、表和视图。您可以按任意顺序指定任何或所有这些字母,以获取这些类型的对象的列表。例如,\dti列出表和索引。如果在命令名称后附加了+,则每个对象都会列出其持久性状态(永久、临时或未记录)、磁盘上的物理大小以及关联的描述(如果有)。如果指定了 pattern ,则仅列出名称与该模式匹配的对象。默认情况下,仅显示用户创建的对象;提供模式或S修饰符以包括系统对象。

    \des[+] [ pattern ]
    列出外部服务器(助记符:“外部服务器”)。如果指定了 pattern ,则仅列出名称与该模式匹配的服务器。如果使用\des+形式,则会显示每个服务器的完整描述,包括服务器的访问权限、类型、版本、选项和描述。

    \det[+] [ pattern ]
    列出外部表(助记符:“外部表”)。如果指定了 pattern ,则仅列出表名或模式名与该模式匹配的条目。如果使用\det+形式,则还会显示通用选项和外部表描述。

    \deu[+] [ pattern ]
    列出用户映射(助记符:“外部用户”)。如果指定了 pattern ,则仅列出用户名与该模式匹配的映射。如果使用\deu+形式,则还会显示有关每个映射的其他信息。

    注意

    \deu+ 可能会显示远程用户的用户名和密码,因此应注意不要泄露它们。

    \dew[+] [ pattern ]
    列出外部数据包装器(助记符:“外部包装器”)。 如果指定了 pattern ,则只列出名称与模式匹配的外部数据包装器。如果使用形式\dew+,还会显示外部数据包装器的访问权限、选项和描述。

    \df[anptwS+] [ pattern [ arg_pattern ... ] ]
    列出函数及其结果数据类型、参数数据类型和函数类型,这些函数被归类为“agg”(聚合)、“normal”、procedure”、“trigger”或“window”。要仅显示特定类型的函数,请将相应的字母anptw 添加到命令中。如果指定了 pattern ,则仅显示名称与模式匹配的函数。任何其他参数都是类型名称模式,它们与函数的第一个、第二个等参数的类型名称匹配。(匹配函数可以具有比您指定的更多的参数。为了防止这种情况,请将破折号 - 写为最后一个 arg_pattern 。)默认情况下,仅显示用户创建的对象;提供模式或 S修饰符以包括系统对象。如果使用形式\df+,还会显示有关每个函数的其他信息,包括波动性、并行安全性、所有者、安全分类、访问权限、语言、源代码和描述。

    \dF[+] [ pattern ]
    列出文本搜索配置。如果指定了 pattern ,则仅显示名称与模式匹配的配置。如果使用形式\dF+,则会显示每个配置的完整描述,包括底层文本搜索解析器和每个解析器令牌类型的字典列表。

    \dFd[+] [ pattern ]
    列出文本搜索字典。如果指定了 pattern ,则仅显示名称与模式匹配的字典。如果使用形式\dFd+,则会显示有关每个选定字典的其他信息,包括底层文本搜索模板和选项值。

    \dFp[+] [ pattern ]
    列出文本搜索解析器。如果指定了 pattern ,则仅显示名称与模式匹配的解析器。仅显示名称与模式匹配的解析器。如果使用形式\dFp+,则显示每个解析器的完整描述,包括底层函数和已识别的标记类型列表。

    \dFt[+] [ pattern ]
    列出文本搜索模板。如果指定了 pattern ,则仅显示名称与模式匹配的模板。如果使用形式\dFt+,则显示有关每个模板的其他信息,包括底层函数名称。

    \dg[S+] [ pattern ]
    列出数据库角色。(由于“用户”和“组”的概念已统一为“角色”,因此此命令现在等同于\du。)默认情况下,仅显示用户创建的角色;提供S修饰符以包括系统角色。如果指定了 pattern ,则仅列出名称与模式匹配的角色。如果使用形式\dg+,则显示有关每个角色的其他信息;目前,这会为每个角色添加注释。

    \dl[+]
    这是\lo_list的别名,用于显示大对象列表。如果在命令名称后附加了+,则会列出每个大对象及其关联的权限(如果有)。

    \dL[S+] [ pattern ]
    列出过程语言。如果指定了 pattern ,则仅列出名称与模式匹配的语言。默认情况下,仅显示用户创建的语言;提供S修饰符以包括系统对象。如果在命令名称后附加了+,则会列出每种语言及其调用处理程序、验证器、访问权限以及是否为系统对象。

    \dn[S+] [ pattern ]
    列出模式(命名空间)。如果指定了 pattern ,则仅列出名称与模式匹配的模式。默认情况下,仅显示用户创建的对象;提供模式或S修饰符以包括系统对象。如果在命令名称后附加了+,则会列出每个对象及其关联的权限和描述(如果有)。

    \do[S+] [ pattern [ arg_pattern [ arg_pattern ] ] ]
    列出具有其操作数和结果类型的运算符。如果指定了 pattern ,则仅列出名称与模式匹配的运算符。如果指定了一个 arg_pattern ,则仅列出右参数类型名称与该模式匹配的前缀运算符。如果指定了两个 arg_pattern ,则仅列出左参数类型名称与第一个模式匹配且右参数类型名称与第二个模式匹配的中缀运算符。指定了类型名称的二元运算符才会被列出,其参数类型名称与这些模式匹配。(或者,对于一元运算符的未使用参数,写入-。) 默认情况下,只显示用户创建的对象;提供模式或S修饰符以包括系统对象。如果在命令名称后附加+,则会显示有关每个运算符的其他信息,目前仅显示底层函数的名称。

    \dO [S +] [ pattern ]
    列出排序规则。 如果指定了 pattern ,则仅列出名称与模式匹配的排序规则。默认情况下,仅显示用户创建的对象;提供模式或S修饰符以包括系统对象。如果在命令名称后附加+,则每个排序规则都会列出其关联的描述(如果有)。请注意,仅显示与当前数据库编码可用的排序规则,因此在同一安装的不同数据库中,结果可能会有所不同。

    \dp [ pattern ]
    列出具有其关联访问权限的表、视图和序列。 如果指定了 pattern ,则仅列出名称与模式匹配的表、视图和序列。GRANTREVOKE命令用于设置访问权限。

    \dP [itn +] [ pattern ]
    列出分区关系。 如果指定了 pattern ,则仅列出名称与模式匹配的条目。可以附加修饰符t(表)和i(索引),过滤要列出的关系类型。默认情况下,列出分区表和索引。

    如果使用了修饰符n(“嵌套”),或者指定了模式,则包括非根分区关系,并显示一个列,显示每个分区关系的父项。

    如果在命令名称后附加+,则还会显示每个关系分区大小的总和,以及关系的描述。如果将n+组合使用,则会显示两个大小:一个包括直接附加的叶分区的总大小,另一个显示所有分区的总大小,包括间接附加的子分区。

    \drds [ role-pattern [ database-pattern]]
    列出定义的配置设置。这些设置可以是特定于角色、特定于数据库或两者兼而有之。 使用 role-patterndatabase-pattern 用于选择相应的角色和数据库。如果省略或指定了*,则列出所有设置,包括那些不特定于角色或数据库的设置。ALTER ROLEALTER DATABASE命令用于定义每个角色和每个数据库的配置设置。

    \dRp[+] [ pattern ]
    列出复制发布。如果指定了 pattern ,则只列出名称与模式匹配的发布。如果在命令名称后附加了+,则还会显示与每个发布相关的表和模式。

    \dRs[+] [ pattern ]
    列出复制订阅。如果指定了 pattern ,则只列出名称与模式匹配的订阅。如果在命令名称后附加了+,则还会显示订阅的其他属性。

    \dT[S+] [ pattern ]
    列出数据类型。如果指定了 pattern ,则只列出名称与模式匹配的类型。如果在命令名称后附加了+,则会列出每个类型的内部名称和大小、如果是enum类型,则列出其允许的值以及其关联的权限。默认情况下,只显示用户创建的对象;提供模式或S修饰符以包括系统对象。

    \du[S+] [ pattern ]
    列出数据库角色。(由于“用户”和“组”的概念已统一为“角色”,因此此命令现在等同于\dg。)默认情况下,只显示用户创建的角色;提供S修饰符以包括系统角色。如果指定了 pattern ,则只列出名称与模式匹配的角色。如果使用\du+形式,则会显示有关每个角色的其他信息;目前,这会添加每个角色的注释。

    \dx[+] [ pattern ]
    列出已安装的扩展。如果指定了 pattern ,则只列出名称与模式匹配的扩展。如果使用\dx+形式,则列出每个匹配扩展所属的所有对象。

    \dX [ pattern ]
    列出扩展统计信息。如果指定了 pattern ,则只列出名称与模式匹配的扩展统计信息。列出了每种模式的扩展统计信息。

    每种扩展统计信息的状态都显示在以其统计类型命名的列中(例如Ndistinct)。defined表示在创建统计信息时请求了该信息,而NULL表示未请求。如果您想知道是否运行了ANALYZE并且规划器可以使用统计信息,则可以使用ux_stats_ext

    \dy[+] [ pattern ]
    列出事件触发器。 如果指定了 pattern ,则只列出名称与模式匹配的事件触发器。如果在命令名称后附加了+,则每个对象都会列出其关联的描述。

    \e\edit [ filename ] [ line_number ]
    如果指定了 filename ,则编辑该文件;编辑器退出后,文件的内容将复制到当前查询缓冲区中。如果没有给出 filename ,则将当前查询缓冲区复制到临时文件中,然后以相同的方式进行编辑。或者,如果当前查询缓冲区为空,则将最近执行的查询复制到临时文件中,并以相同的方式进行编辑。

    如果您编辑了文件或上一个查询,并在不修改文件的情况下退出编辑器,则查询缓冲区将被清除。否则,查询缓冲区的新内容将根据uxsql的常规规则重新解析,将整个缓冲区视为单个行。任何完整的查询都会立即执行;也就是说,如果查询缓冲区包含或以分号结尾,则会执行并从查询缓冲区中删除该点之前的所有内容。剩下的内容将重新显示。键入分号或\g发送它,或\r通过清除查询缓冲区来取消它。

    将缓冲区视为单个行主要影响元命令:无论元命令跨越多少行,缓冲区中元命令之后的任何内容都将被视为元命令的参数。(因此,您不能以这种方式制作使用元命令的脚本。请使用\i。)

    如果指定了行号,则uxsql将在文件或查询缓冲区的指定行上定位光标。请注意,如果给出单个全数字参数,则uxsql假定它是行号,而不是文件名。

    提示

    有关如何配置和自定义编辑器,请参见下面的环境变量

    \echo text [ ... ]
    将评估的参数打印到标准输出,用空格分隔,并在末尾加上换行符。这可以用于在脚本的输出中插入信息。例如:

    => \echo `date`
    Tue Oct 26 21:40:57 CEST 1999
    

    如果第一个参数是未引用的-n,则不会写入尾随换行符(也不会写入第一个参数)。

    提示

    如果使用\o命令重定向输出,请确保在需要输出的内容之前使用\echo命令。

    查询输出时,您可能希望使用\qecho命令,而不是此命令。另请参见\warn命令。

    \ef [ function_description [ line_number ] ]
    此命令获取并编辑命名函数或过程的定义,以CREATE OR REPLACE FUNCTIONCREATE OR REPLACE PROCEDURE命令的形式呈现。编辑方式与\edit相同。如果您在不保存的情况下退出编辑器,则该语句将被丢弃。如果您保存并退出编辑器,则更新后的命令将立即执行,如果您添加了分号。否则,它将被重新显示;键入分号或\g以发送它,或键入\r以取消。

    目标函数可以仅通过名称指定,也可以通过名称和参数指定,例如foo(integer, text)。如果有多个同名函数,则必须给出参数类型。

    如果未指定函数,则会呈现一个空白的CREATE FUNCTION模板供编辑。

    如果指定了行号,则uxsql将光标定位在函数体的指定行上。(请注意,函数体通常不从文件的第一行开始。)

    与大多数其他元命令不同,整个剩余行始终被视为\ef的参数,不执行变量插值或反引号扩展。

    提示

    有关如何配置和自定义编辑器,请参见下面的环境变量

    \encoding [ encoding ]
    设置客户端字符集编码。如果没有参数,则此命令显示当前编码。

    \errverbose
    以最大详细程度重复最近的服务器错误消息,就像VERBOSITY设置为verboseSHOW_CONTEXT设置为always一样。

    \ev [ view_name [ line_number ] ]
    此命令获取并编辑命名视图的定义,以CREATE OR REPLACE VIEW命令的形式呈现。编辑方式与\edit相同。如果您在不保存的情况下退出编辑器,则该语句将被丢弃。如果您保存并退出编辑器,则更新后的命令将立即执行,如果您添加了分号。否则,它将被重新显示;键入分号或\g以发送它,或键入\r以取消。

    如果未指定视图,则会呈现一个空白的CREATE VIEW模板供编辑。

    如果指定了行号,则uxsql将光标定位在视图定义的指定行上。

    与大多数其他元命令不同,整个剩余行始终被视为\ev的参数,不执行变量插值或反引号扩展。

    \f [ string ]
    设置未对齐查询输出的字段分隔符。默认值为竖线 (|)。它等同于 \pset fieldsep

    \g [ (option=value [...]) ] [ filename ]
    \g [ (option=value [...]) ] [ |command ]
    将当前查询缓冲区发送到服务器进行执行。

    如果 \g 后面有括号,则括号中是一个以空格分隔的 option=value 格式选项子句列表,这些子句的解释方式与\pset option value 命令相同,但仅在此查询的持续时间内生效。在此列表中,不允许在 =符号周围使用空格,但在选项子句之间需要空格。如果省略了 =value ,则以与没有显式 value\pset option 相同的方式更改命名的 option

    如果给出了 filename|command 参数,则查询的输出将被写入命名文件或管道传输到给定的 shell命令,而不是像通常一样显示它。仅当查询成功返回零个或多个元组时,才会将文件或命令写入,而不是在查询失败或为非数据返回的 SQL命令时。

    如果当前查询缓冲区为空,则最近发送的查询将被重新执行。除了这种行为,没有任何参数的 \g 本质上等同于分号。带有参数的 \g 提供了“一次性” 的替代方法,可以额外允许对通常由 \pset 设置的输出格式选项进行一次性调整。

    当最后一个参数以 | 开头时,整个剩余行都被视为要执行的 command ,其中不执行变量插值或反引号扩展。其余部分只是按字面意义传递给shell。

    \gdesc
    显示当前查询缓冲区结果的描述(即列名和数据类型)。查询实际上不会被执行;但是,如果它包含某种类型的语法错误,则会以正常方式报告该错误。

    如果当前查询缓冲区为空,则将描述最近发送的查询。

    \getenv uxsql_var env_var
    获取环境变量 env_var 的值,并将其分配给 uxsql 变量 uxsql_var 。如果在 uxsql 进程的环境中未定义 env_var ,则会引发错误。环境变量, uxsql_var 不会改变。例如:

    => \getenv home HOME
    => \echo :home
    /home/uxdb
    

    \gexec
    将当前查询缓冲区发送到服务器,然后将查询输出的每行的每个列(如果有)视为要执行的 SQL 语句。例如,要在 my_table的每个列上创建索引:

    => SELECT format('create index on my_table(%I)', attname)
    -> FROM ux_attribute
    -> WHERE attrelid = 'my_table'::regclass AND attnum > 0
    -> ORDER BY attnum
    -> \gexec
    CREATE INDEX
    CREATE INDEX
    CREATE INDEX
    CREATE INDEX
    

    生成的查询按返回行的顺序执行,并在每行内从左到右执行,如果有多个列,则忽略 NULL字段。生成的查询以字面形式发送到服务器进行处理,因此它们不能是uxsql 元命令,也不能包含 uxsql 变量引用。如果任何单个查询失败,则继续执行剩余的查询,除非设置了ON_ERROR_STOP。每个查询的执行都受到 ECHO 处理。(在使用 \gexec 时,通常建议将ECHO 设置为 allqueries。)查询日志记录、单步模式、计时和其他查询执行功能也适用于每个生成的查询。

    如果当前查询缓冲区为空,则重新执行最近发送的查询。

    \gset [ prefix ]
    将当前查询缓冲区发送到服务器,并将查询的输出存储到 uxsql 变量中(请参见下面的环境变量)。要执行的查询必须返回恰好一行。行的每个列都存储在单独的变量中,变量名与列名相同。例如:

    => SELECT 'hello' AS var1, 10 AS var2
    -> \gset
    => \echo :var1 :var2
    hello 10
    

    如果指定了 prefix ,则该字符串将添加到查询的列名前缀以创建要使用的变量名:

    => SELECT 'hello' AS var1, 10 AS var2
    -> \gset result_
    => \echo :result_var1 :result_var2
    hello 10
    

    如果列结果为 NULL,则相应的变量未设置而不是被设置。

    如果查询失败或未返回一行,则不会更改任何变量。

    如果当前查询缓冲区为空,则重新执行最近发送的查询。

    \gx [ (option=value [...]) ] [ filename ]
    \gx [ (option=value [...]) ] [ |command ]
    \gx 等同于 \g,但它强制将此查询的输出模式扩展,就像包括 expanded=on\pset 选项列表中一样。另请参见\x

    \h\help [ command ]
    提供指定 SQL 命令的语法帮助。如果未指定 command ,则 uxsql 将列出所有可用的语法帮助命令。如果 command 是一个星号 (*),则显示所有 SQL 命令的语法帮助。

    与大多数其他元命令不同,整个剩余行始终被视为 \help 的参数,不执行变量插值或反引号扩展。

    注意

    为了简化输入,由几个单词组成的命令不必用引号括起来。因此,输入 \help alter table 是可以的。

    \H\html
    打开html查询输出格式。如果已经打开了html格式,则切换回默认的对齐文本格式。此命令用于兼容性和方便,但有关设置其他输出选项,请参见\pset

    \i\include filename
    从文件 filename 中读取输入,并执行它,就像在键盘上键入一样。

    如果 filename-(连字符),则读取标准输入,直到 EOF 指示或 \q元命令。这可用于将交互式输入与文件输入交错使用。请注意,仅在最外层级别处处于活动状态时,才会使用Readline 行为。

    注意

    如果要在屏幕上看到读取的行,则必须将变量 ECHO 设置为 all

    \if expression
    \elif expression
    \else
    \endif
    此命令组实现可嵌套的条件块。条件块必须以 \if 开始,并以 \endif 结束。在两者之间可以有任意数量的 \elif子句,其后可以选择跟随一个单独的 \else子句。普通查询和其他类型的反斜杠命令可能会(并且通常会)出现在形成条件块的命令之间。

    \if\elif 命令读取它们的参数并将它们作为布尔表达式进行评估。如果表达式的结果为true,则处理将继续正常进行;否则,直到到达匹配的\elif\else\endif 之前,行将被跳过。一旦 \if\elif 测试成功,同一块中后面的\elif 命令的参数将不会被评估,但会被视为 false。在 \else 之后的行仅在没有早期匹配的 \if\elif成功时才会被处理。

    \if\elif 命令的 expression 参数会像任何其他反斜杠命令参数一样受到变量插值和反引号扩展的影响。之后,它会像开/关选项变量的值一样进行评估。因此,有效值是任何不含歧义、不区分大小写的匹配项,例如:truefalse10onoffyesno。例如,tTtR 都将被视为 true

    不能正确评估为 true 或 false 的表达式将生成警告并被视为false。

    被跳过的行会正常解析以识别查询和反斜杠命令,但查询不会发送到服务器,条件语句之外的反斜杠命令(\if\elif\else\endif)将被忽略。条件命令仅检查有效嵌套。跳过的行中的变量引用不会被扩展,反引号扩展也不会执行。

    给定条件块的所有反斜杠命令必须出现在同一个源文件中。如果在主输入文件或 \include 的文件上达到 EOF 之前,所有本地 \if块都没有被关闭,则 uxsql 将引发错误。

    以下是一个示例:

    -- 检查数据库中两个单独记录的存在并将
    -- 结果存储在不同的 uxsql 变量中
    SELECT
      EXISTS(SELECT 1 FROM customer WHERE customer_id = 123) as is_customer,
      EXISTS(SELECT 1 FROM employee WHERE employee_id = 456) as is_employee
    \gset
    \if :is_customer
      SELECT * FROM customer WHERE customer_id = 123;
    \elif :is_employee
      \echo 'is not a customer but is an employee'
      SELECT * FROM employee WHERE employee_id = 456;
    \else
      \if yes
        \echo 'not a customer or employee'
      \else
        \echo 'this will never print'
      \endif
    \endif
    

    \ir\include_relative filename
    \ir 命令类似于 \i,但是以不同的方式解析相对文件名。当在交互模式下执行时,这两个命令的行为相同。但是,当从脚本中调用时,\ir将文件名解释为相对于脚本所在的目录,而不是当前工作目录。

    \l[+]\list[+] [ pattern ]
    列出服务器中的数据库,并显示它们的名称、所有者、字符集编码和访问权限。 如果指定了 pattern ,则只列出名称与该模式匹配的数据库。

    如果在命令名称后附加了+,则还会显示数据库大小、默认表空间和描述。 (只有当前用户可以连接的数据库才有大小信息。)

    \lo_export loid filename
    从数据库中读取具有OID loid 的大型对象,并将其写入 filename 。请注意,这与服务器函数lo_export略有不同,后者使用运行数据库服务器的用户的权限在服务器文件系统上操作。

    提示

    使用\lo_list查找大型对象的OID。

    \lo_import filename [ comment ]
    将文件存储到UXDB大型对象中。可选地,将给定的注释与对象关联。例如:

    foo=> \lo_import '/home/peter/pictures/photo.xcf' 'a picture of me'
    lo_import 152801
    

    响应指示大型对象接收到对象ID152801,可以使用它来访问新创建的大型对象。为了易读性,建议始终将人类可读的注释与每个对象关联起来。可以使用\lo_list命令查看OID和注释。

    请注意,此命令与服务器端lo_import略有不同,因为它作为本地用户在本地文件系统上操作,而不是作为服务器的用户和文件系统。

    \lo_list[+]
    显示当前存储在数据库中的所有UXDB大型对象以及为它们提供的任何注释。如果在命令名称后附加了+,则每个大型对象都会列出其关联的权限(如果有)。

    \lo_unlink loid
    从数据库中删除具有OID loid 的大型对象。

    提示

    使用\lo_list查找大型对象的OID。

    \o\out [ filename ]
    \o\out [ |command ]
    安排将未来的查询结果保存到文件 filename 或将未来的结果管道传输到shell命令 command 。如果未指定参数,则查询输出将重置为标准输出。

    如果参数以|开头,则整个剩余行都被视为要执行的 命令 ,其中不执行变量插值或反引号扩展。剩余行只是直接传递给shell。

    “查询结果”包括从数据库服务器获取的所有表、命令响应和通知,以及查询数据库的各种反斜杠命令的输出(如\d),但不包括错误消息。

    提示

    要在查询结果之间插入文本输出,请使用\qecho

    \p\print
    将当前查询缓冲区打印到标准输出。如果当前查询缓冲区为空,则打印最近执行的查询。

    \password [ username ]
    更改指定用户(默认为当前用户)的密码。此命令提示输入新密码,对其进行加密,并将其作为ALTER ROLE命令发送到服务器。这确保新密码不会以明文形式出现在命令历史记录、服务器日志或其他地方。

    \prompt [ text ] name
    提示用户提供文本,并将其分配给变量 name 。可以指定可选提示字符串 text 。(对于多个单词的提示,请用单引号括起来。)

    默认情况下,\prompt使用终端进行输入和输出。但是,如果使用了-f命令行开关,则\prompt使用标准输入和标准输出。

    \pset [ option [ value ] ]
    此命令设置影响查询结果表输出的选项。 option 指示要设置的选项。根据所选选项, value 的语义会有所不同。对于某些选项,省略 value 会导致该选项被切换或取消设置,具体取决于特定选项的描述。如果没有提到这样的行为,则省略 value 只会显示当前设置。

    \pset没有任何参数会显示所有打印选项的当前状态。

    可调整的打印选项包括:

    border
    value 必须是一个数字。通常,数字越高,表格的边框和线条就越多,但具体取决于特定格式。在md格式中,这将直接转换为border=...属性。在大多数其他格式中,只有值0(无边框)、1(内部分隔线)和2(表框)有意义,值大于2将被视为border = 2。在latexlatex-longtable格式中,还允许使用值3在数据行之间添加分隔线。

    columns
     设置wrapped格式的目标宽度,也是确定输出是否足够宽以需要分页器或在展开自动模式下切换到垂直显示的宽度限制。零(默认值)会导致目标宽度由环境变量COLUMNS或检测到的屏幕宽度控制,如果未设置COLUMNS。此外,如果columns为零,则wrapped格式仅影响屏幕输出。如果columns为非零,则文件和管道输出也会被包装到该宽度。

    csv_fieldsep
     指定要在CSV输出格式中使用的字段分隔符。如果分隔符字符出现在字段的值中,则该字段将按照标准CSV规则在双引号内输出。默认值为逗号。

    expanded(或x
     如果指定了 value ,则必须是onoff,这将启用或禁用扩展模式,或auto。如果省略了 value ,则命令在打开和关闭设置之间切换。启用扩展模式时,查询结果以两列显示,左侧为列名,右侧为数据。如果数据在正常的“水平”模式下无法适合屏幕,则此模式很有用。在自动设置中,当查询输出具有多个列且宽度大于屏幕时,将使用扩展模式;否则,将使用常规模式。自动设置仅在对齐和包装格式中有效。在其他格式中,它始终表现为扩展模式关闭。

    fieldsep
     指定要在未对齐的输出格式中使用的字段分隔符。这样,可以创建例如制表符分隔的输出,其他程序可能更喜欢。要将制表符设置为字段分隔符,请键入\pset fieldsep '\t'。默认字段分隔符为'|'(竖杠)。

    fieldsep_zero
     将未对齐的输出格式中使用的字段分隔符设置为零字节。

    footer
     如果指定了 value ,则必须是onoff,这将启用或禁用表格页脚的显示(( n 行)计数)。如果省略了 value ,则命令切换页脚显示打开或关闭。

    format
     将输出格式设置为alignedasciidoccsvhtmllatexlatex-longtabletroff-msunalignedwrapped之一。允许唯一缩写。

    aligned格式是标准的、人类可读的、漂亮格式的文本输出;这是默认值。

    unaligned格式将一行的所有列写在一行上,由当前活动的字段分隔符分隔。这对于创建可能打算阅读的输出很有用其他程序可以使用制表符或逗号分隔格式导入数据。但是,如果分隔符字符出现在列的值中,则不会被特殊处理。因此,对于这种情况,CSV格式可能更适合。

    CSV格式将列值用逗号分隔,并应用RFC4180中描述的引用规则。此输出与服务器的COPY命令的CSV格式兼容。除非tuples_only参数为on,否则将生成带有列名的标题行。不打印标题和页脚。每行以系统相关的行尾字符结尾,通常是Unix系统的单个换行符(\n)或Microsoft Windows的回车和换行符(\r\n)。可以使用pset csv_fieldsep选择逗号以外的字段分隔符。

    wrapped格式类似于aligned,但将宽数据值换行以使输出适合目标列宽度。目标宽度如columns选项下所述确定。请注意,uxsql不会尝试包装列标题标题。因此,如果列标题所需的总宽度超过目标,则wrapped格式的行为与aligned相同。

    asciidochtmllatexlatex-longtabletroff-ms格式输出的表格旨在包含在使用相应标记语言的文档中。它们不是完整的文档!这在md中可能不是必需的,但在LaTeX中,您必须有一个完整的文档包装器。latex格式使用LaTeX的tabular环境。latex-longtable格式需要LaTeX longtable和booktabs包。

    linestyle
     选项设置边框线绘制样式为ascii、old-ascii或unicode之一。允许唯一的缩写。默认设置为ascii。此选项仅影响aligned和wrapped输出格式。

    ascii样式使用纯ASCII字符。数据中的换行符使用右侧边缘的+符号显示。当wrapped格式将数据从一行换行到下一行而没有换行符时,第一行的右侧边缘显示一个点(.),并在下一行的左侧边缘再次显示一个点。

    old-ascii样式使用纯ASCII字符,使用在UXDB之前版本中使用的格式样式。数据中的换行符使用冒号代替左侧列分隔符。当数据从一行换行到下一行而没有换行符时,使用分号;符号用于代替左侧列分隔符。

    unicode 样式使用 Unicode盒线字符。数据中的换行符使用回车符号显示在右边的边缘。当数据从一行换行到下一行时,如果没有换行符,第一行的右边缘会显示省略号符号,并在下一行的左边缘再次显示省略号符号。

     当 border 设置大于零时,linestyle 选项还确定用于绘制边框线的字符。普通的 ASCII字符可以在任何地方使用,但是在识别 Unicode 字符的显示器上,Unicode字符看起来更好。

    null
     设置要打印的字符串以代替空值。默认情况下,不打印任何内容,这很容易被误认为空字符串。例如,可以使用 \pset null '(null)'

    numericlocale
     如果指定了 value ,则必须是 onoff,这将启用或禁用显示特定于语言环境的字符,以分隔小数点左侧的数字组。如果省略了 value ,则该命令在常规和特定于语言环境的数字输出之间切换。

    pager
     控制查询和 uxsql 帮助输出的分页程序的使用。如果设置了环境变量 UXSQL_PAGERPAGER,则将输出导出到指定的程序。否则,使用平台相关的默认程序(例如more)。

     当使用 \watch 命令重复执行查询时,在 Unix 系统上使用环境变量 UXSQL_WATCH_PAGER查找分页程序。这是单独配置的,因为它可能会混淆传统的分页程序,但可以用于将输出发送到了解uxsql 输出格式的工具(例如 psux --stream)。

     当 pager 选项为 off 时,不使用分页程序。当 pager 选项为 on时,适当时使用分页程序,即当输出到终端并且无法适合屏幕时。\pset pager 没有 value 时切换分页使用情况。

    pager_min_lines
     如果将 pager_min_lines 设置为大于页面高度的数字,则只有在有至少这么多行输出时,才会调用分页程序。默认设置为 0。

    recordsep
     指定在未对齐的输出格式中使用的记录(行)分隔符。默认值为换行符。

    recordsep_zero
     将未对齐的输出格式中使用的记录分隔符设置为零字节。

    tableattr(或 T
     在 html格式中,这指定了要应用于表格的属性。要放置在table标记内。例如,这可以是cellpaddingbgcolor。请注意,您可能不想在此处指定border,因为\pset border已经处理了它。如果没有给出 value ,则取消设置表属性。

     在latex-longtable格式中,这控制包含左对齐数据类型的每个列的比例宽度。它被指定为以空格分隔的值列表,例如'0.2 0.2 0.6'。未指定的输出列使用最后指定的值。

    title(或C
     为随后打印的任何表设置表标题。这可用于为您的输出提供描述性标签。如果没有给出 value ,则取消设置标题。

    tuples_only(或t
     如果指定了 value ,则它必须是onoff,这将启用或禁用仅元组模式。如果省略 value ,则该命令在常规输出和仅元组输出之间切换。常规输出包括额外的信息,例如列标题、标题和各种页脚。在仅元组模式下,只显示实际的表数据。

    unicode_border_linestyle
     将unicode线条样式的边框绘制样式设置为singledouble之一。

    unicode_column_linestyle
     将unicode线条样式的列绘制样式设置为singledouble之一。

    unicode_header_linestyle
     将unicode线条样式的标题绘制样式设置为singledouble之一。

     这些不同格式的示例可以在下面的示例中看到。

    提示

    \pset有各种快捷命令。请参见\a\C\f\H\t\T\x

    \q\quit
    退出uxsql程序。在脚本文件中,只有该脚本的执行被终止。

    \qecho text [ ... ]
    此命令与\echo相同,只是输出将写入查询输出通道,如\o所设置的那样。

    \r\reset
    重置(清除)查询缓冲区。

    \s [filename]
    将uxsql的命令行历史记录打印到 filename 中。

    如果省略 filename ,则历史记录将写入标准输出(如果适用,则使用分页器)。如果uxsql没有使用Readline支持构建,则无法使用此命令。

    \set [ name [ value [ ... ] ]]
    将uxsql变量 name 设置为 value ,如果给出多个值,则设置为所有值的连接。如果只给出一个参数,则将变量设置为空字符串值。要取消设置变量,请使用\unset命令。

    \set没有任何参数会显示所有当前设置的uxsql变量的名称和值。

    有效的变量名称可以包含字母,数字和下划线。有关详细信息,请参见下面的变量。变量名称区分大小写。

    某些变量是特殊的,因为它们控制uxsql的行为或自动设置以反映连接状态。这些变量在下面的变量中有记录。

    注意

    此命令与SQL命令SET无关。

    \setenv name [ value ]
    将环境变量 name 设置为 value ,如果未提供 value ,则取消设置环境变量。例如:

    testdb=> \setenv PAGER less
    testdb=> \setenv LESS -imx4F
    

    \sf[+] function_description
    此命令获取并显示命名函数或过程的定义,以CREATE OR REPLACE FUNCTIONCREATE OR REPLACE PROCEDURE命令的形式。定义将打印到当前查询输出通道,如\o所设置。

    目标函数可以仅通过名称指定,也可以通过名称和参数指定,例如foo(integer, text)。如果有多个同名函数,则必须给出参数类型。

    如果在命令名称后附加了+,则输出行将编号,函数体的第一行为第1行。

    与大多数其他元命令不同,整个剩余行始终被视为\sf的参数,不执行变量插值或反引号扩展。

    \sv[+] view_name
    此命令获取并显示命名视图的定义,以CREATE OR REPLACE VIEW命令的形式。定义将打印到当前查询输出通道,如\o所设置。

    如果在命令名称后附加了+,则输出行从1开始编号。

    与大多数其他元命令不同,整个剩余行始终被视为始终被视为\sv的参数,参数中不执行变量插值或反引号扩展。

    \t
    切换输出列名标题和行数脚注的显示。此命令等同于\pset tuples_only,提供方便。

    \T table_options
    指定要放置在table标记中的属性,以md输出格式。此命令等同于\pset tableattr table_options

    \timing [ on | off ]
    带参数时,打开或关闭显示每个SQL语句所需时间的功能。没有参数时,在打开和关闭之间切换显示。显示以毫秒为单位;超过1秒的时间也以分钟:秒的格式显示,必要时添加小时和天字段。

    \unset name
    取消设置(删除)uxsql变量 name

    大多数控制uxsql行为的变量无法取消设置;相反,\unset命令被解释为将它们设置为默认值。请参阅下面的变量

    \w\write filename
    \w\write |command
    将当前查询缓冲区写入文件 filename 或将其传输到shell命令 command 。如果当前查询缓冲区为空,则写入最近执行的查询。

    如果参数以|开头,则整个剩余行都被视为要执行的 command ,其中不执行变量插值或反引号扩展。其余部分只是以字面意义传递给shell。

    \warn text [ ... ]
    此命令与\echo相同,只是输出将写入uxsql的标准错误通道,而不是标准输出。

    \watch [ seconds ]
    重复执行当前查询缓冲区(如\g所做的那样),直到被中断或查询失败。在执行之间等待指定的秒数(默认为2)。每个查询结果都显示一个标题,其中包括\pset title字符串(如果有),查询开始时的时间和延迟间隔。

    如果当前查询缓冲区为空,则重新执行最近发送的查询。

    \x [ on | off | auto ]
    设置或切换扩展表格格式模式。因此,它等同于\pset expanded

    \z [ pattern ]
    列出带有其关联访问权限的表、视图和序列。如果指定了 pattern ,则只列出名称与模式匹配的表、视图和序列。

    这是\dp(“显示权限”)的别名。

    \! [ command ]
    如果没有参数,则转到子shell;当子shell退出时,uxsql会恢复。如果有参数,则执行shell命令 command

    与大多数其他元命令不同,整个剩余行始终被视为\!的参数,不执行变量插值或反引号扩展。其余部分的行只是按字面意义传递给shell。

    \? [ topic ]
    显示帮助信息。可选的 topic 参数(默认为commands)选择要解释的uxsql的哪个部分:commands描述uxsql的反斜杠命令;options描述可以传递给uxsql的命令行选项;variables显示有关uxsql配置变量的帮助信息。

    \;
    反斜杠分号不像前面的命令那样是元命令;相反,它只是在查询缓冲区中添加一个分号,而不进行任何进一步的处理。

    通常,当遇到以分号结尾的命令时,uxsql会立即将SQL命令发送到服务器,即使当前行还有更多输入。因此,例如输入

    select 1; select 2; select 3;
    

    将导致三个SQL命令被单独发送到服务器,每个命令的结果在继续下一个命令之前显示。然而,输入为\;的分号不会触发命令处理,因此在其前面和后面的命令实际上被组合并作为一个请求发送到服务器。因此,例如

    select 1\; select 2\; select 3;
    

    在到达非反斜杠分号时,将三个SQL命令发送到服务器的单个请求中执行。服务器将执行此类请求作为单个事务,除非字符串中包含显式的BEGIN/COMMIT命令将其分成多个事务。

    • 模式

      各种\d命令接受 pattern 参数以指定要显示的对象名称。在最简单的情况下,模式只是对象的确切名称。模式内的字符可以使用通配符*?来匹配多个名称。例如,\d foo*将显示以“foo”开头的所有对象的列表。模式通常被折叠为小写,就像 SQL 名称一样;例如,\dt FOO 将显示名为 foo 的表。与 SQL名称一样,将双引号放在模式周围可以停止折叠为小写。如果需要在模式中包含实际的双引号字符,请在双引号序列内写成一对双引号;这也符合SQL 引用标识符的规则。例如,\dt "FOO""BAR" 将显示名为 FOO"BAR 的表(而不是 foo"bar)。与 SQL名称的常规规则不同,您可以在模式的一部分周围放置双引号,例如 \dt FOO"FOO"BAR 将显示名为 fooFOObar 的表。

      每当完全省略 pattern 参数时,\d 命令会显示在当前模式搜索路径中可见的所有对象,这相当于使用 *作为模式。(如果包含模式的对象的包含模式在搜索路径中,并且没有相同类型和名称的对象出现在搜索路径中,则称该对象为可见对象。这相当于该对象可以通过名称引用而不需要显式模式限定。)要查看数据库中所有对象,而不考虑可见性,请使用*.* 作为模式。

      在模式中,* 匹配任何字符序列(包括没有字符),而 ? 匹配任何单个字符。(此符号类似于 Unix shell文件名模式。)例如,\dt int* 显示名称以 int 开头的表。但在双引号内,*?失去这些特殊含义,只是按字面意义匹配。

      包含点号(.)的关系模式被解释为模式开始的模式名称模式,后跟对象名称模式。例如,\dt foo*.*bar* 显示表名包括 bar 的所有表,这些表位于以 foo开头的模式中。当没有点出现时,模式仅匹配在当前模式搜索路径中可见的对象。同样,双引号中的点号失去其特殊含义,只是按字面意义匹配。包含两个点号(.)的关系模式被解释为数据库名称,后跟模式名称模式,后跟对象名称模式。数据库名称部分不会被视为模式,必须与当前连接的数据库的名称匹配,否则将引发错误。

      包含点号(.)的模式模式被解释为数据库名称,后跟模式名称模式。例如,\dn mydb.*foo* 显示包括 foo的所有模式。数据库名称部分不会被视为模式,必须与当前连接的数据库的名称匹配,否则将引发错误。

      高级用户可以使用正则表达式符号,例如字符类,例如 [0-9] 匹配任何数字。所有正则表达式特殊字符都按照指定的方式工作,除了.,它被视为上述分隔符,* 被转换为正则表达式符号 .*? 被转换为.,以及$是一个字面匹配的字符。如果需要,您可以通过写?代替.,写(R+|)代替R *,或写(R|)代替R?来模拟这些模式字符。由于模式必须匹配整个名称,因此不需要将$作为正则表达式字符(换句话说,$会自动附加到您的模式中)。如果不希望模式被锚定,请在开头或结尾处写*。请注意,在双引号内,所有正则表达式特殊字符都失去了其特殊含义,而是按字面匹配。此外,在操作符名称模式(即\do的参数)中,正则表达式特殊字符也按字面匹配。

  • 高级特性

    • 变量

      uxsql提供了类似于常见Unix命令shell的变量替换功能。变量只是名称/值对,其中值可以是任何长度的任何字符串。名称必须由字母(包括非拉丁字母)、数字和下划线组成。

      要设置变量,请使用uxsql元命令\set。例如:

      testdb=> \set foo bar
      

      将变量foo设置为值bar。要检索变量的内容,请在名称前加上冒号,例如:

      testdb=> \echo :foo
      

      这适用于常规SQL命令和元命令;有关详细信息,请参见下面的SQL插值

      如果调用\set而没有第二个参数,则将变量设置为空字符串值。要取消设置(即删除)变量,请使用命令\unset。要显示所有变量的值,请调用没有任何参数的\set

      注意

      \set的参数受到与其他命令相同的替换规则的影响。因此,您可以构造有趣的引用,例如\set :foo 'something',并获得Perl或PHP著名的“软链接”或“变量变量”。不幸的是(或幸运的是?),没有办法使用这些构造做任何有用的事情。另一方面,\set bar :foo是复制变量的完全有效的方法。

      uxsql特别处理一些变量。它们表示可以通过更改变量的值在运行时更改的某些选项设置,或者在某些情况下表示uxsql的可变状态。按照惯例,所有特别处理的变量名称都由所有大写ASCII字母(可能包括数字和下划线)组成。为确保最大的兼容性,请避免使用这样的变量名称用于您自己的目的。

      控制uxsql行为的变量通常情况下,变量不能被取消设置或设置为无效值。允许使用\unset命令,但会被解释为将变量设置为其默认值。如果控制变量接受on值,则没有第二个参数的\set命令将被解释为将变量设置为on,并且对于其他变量则会被拒绝。此外,接受onoff值的控制变量也将接受其他常见的布尔值拼写,例如truefalse

      特别处理的变量包括:

      AUTOCOMMIT
      当设置为on(默认值)时,每个SQL命令在成功完成后会自动提交。在此模式下延迟提交,必须输入BEGINSTART TRANSACTIONSQL命令。当设置为off或未设置时,SQL命令直到您明确发出COMMITEND才会提交。关闭自动提交模式是通过在任何不在事务块中且不是BEGIN或其他事务控制命令,也不是无法在事务块中执行的命令(例如VACUUM)之前,为您发出隐式的BEGIN来实现的。

      注意

      在关闭自动提交模式下,您必须明确放弃任何失败的事务,方法是输入ABORTROLLBACK。还要记住,如果您退出会话而没有提交,则您的工作将丢失。

      注意

      自动提交模式是UXDB的传统行为,但关闭自动提交更接近SQL规范。如果您喜欢关闭自动提交,您可能希望在系统范围的uxsqlrc文件或您的~/.uxsqlrc文件中设置它。

      COMP_KEYWORD_CASE
      确定在完成SQL关键字时要使用哪个字母大小写。如果设置为lowerupper,则完成的单词将分别为小写或大写。如果设置为preserve-lowerpreserve-upper(默认值),则完成的单词将与已输入的单词大小写相同,但没有输入的单词将分别为小写或大写。

      DBNAME
      您当前连接的数据库的名称。每次连接到数据库(包括程序启动)时都会设置它,但可以更改或取消设置。

      ECHO
      如果设置为all,则所有非空输入行都会作为它们被读取时打印到标准输出。(这不适用于交互式读取的行。)要在程序启动时选择此行为,请使用开关-a。如果设置为queries,则uxsql会将每个查询作为它被发送到服务器的标准输出打印。选择此行为的开关是-e。如果设置为errors,则仅在标准错误输出上显示失败的查询。此行为的开关为-b。如果设置为none(默认值),则不显示任何查询。

      ECHO_HIDDEN
      当这个变量被设置为on并且一个反斜杠命令查询数据库时,查询会首先显示出来。这个功能可以帮助你研究UXDB的内部机制,并在你自己的程序中提供类似的功能。(要在程序启动时选择这种行为,请使用开关-E。)如果你将这个变量设置为值noexec,查询将只显示出来,而不会实际发送到服务器并执行。默认值为off

      ENCODING
      当前客户端字符集编码。这是在每次连接到数据库时(包括程序启动时)设置的,并且当你使用\encoding更改编码时也会被更改或取消设置。

      ERROR
      如果最后一条SQL查询失败,则为true,如果成功,则为false。另请参见SQLSTATE

      FETCH_COUNT
      如果将此变量设置为大于零的整数值,则SELECT查询的结果将以该行数的分组方式获取和显示,而不是默认行为,即在显示之前收集整个结果集。因此,无论结果集的大小如何,只使用有限的内存。启用此功能时通常使用100到1000的设置。请记住,使用此功能时,查询可能会在已经显示了一些行后失败。

      提示

      虽然你可以使用任何输出格式来使用此功能,但默认的aligned格式往往看起来很糟糕,因为每组FETCH_COUNT行将被单独格式化,导致行组之间的列宽度不同。其他输出格式效果更好。

      HIDE_TABLEAM
      如果将此变量设置为true,则不会显示表的访问方法详细信息。这主要用于回归测试。

      HIDE_TOAST_COMPRESSION
      如果将此变量设置为true,则不会显示列的压缩方法详细信息。这主要用于回归测试。

      HISTCONTROL
      如果将此变量设置为ignorespace,则以空格开头的行不会进入历史记录列表。如果设置为ignoredups的值,则与前一个历史记录行匹配的行不会进入历史记录列表。值ignoreboth结合了这两个选项。如果设置为none(默认值),则在交互模式下读取的所有行都保存在历史记录列表中。

      HISTFILE
      将用于存储历史记录列表的文件名。如果未设置,则文件名将从UXSQL_HISTORY环境变量中获取。如果也没有设置,那么默认值为~/.uxsql_history,在Windows上为%APPDATA%\uxsinodb\uxsql_history。例如,在~/.uxsqlrc中放置:

      \set HISTFILE ~/.uxsql_history-:DBNAME
      

      将导致使用uxsql维护每个数据库的单独历史记录。

      HISTSIZE
      命令历史记录中存储的最大命令数(默认为500)。如果设置为负值,则不应用限制。

      HOST
      当前连接的数据库服务器主机。每次连接到数据库时(包括程序启动),都会设置该变量,但可以更改或取消设置。

      IGNOREEOF
      如果设置为1或更少,则将uxsql的交互会话中的EOF字符(通常为Control+D)发送到应用程序将终止。如果设置为较大的数字值,则必须键入那么多连续的EOF字符才能使交互会话终止。如果将变量设置为非数字值,则将其解释为10。默认值为0。

      LASTOID
      最后一个受影响的OID的值,从INSERT\lo_import命令返回。此变量仅保证在显示下一个SQL命令的结果之前有效。自版本12以来,UXDB服务器不再支持OID系统列,因此在针对这些服务器的INSERT之后,LASTOID将始终为0。

      LAST_ERROR_MESSAGE
      LAST_ERROR_SQLSTATE
      当前uxsql会话中最近失败的查询的主要错误消息和相关的SQLSTATE代码,如果当前会话中没有错误,则为空字符串和00000

      ON_ERROR_ROLLBACK
      当设置为on时,如果事务块中的语句生成错误,则忽略该错误并继续事务。当设置为interactive时,这些错误仅在交互会话中被忽略,而不是在读取脚本文件时。当设置为off(默认值)时,生成错误的事务块中的语句会中止整个事务。错误回滚模式通过为每个在事务块中的命令之前隐式发出SAVEPOINT来工作,然后在命令失败时回滚到保存点。

      ON_ERROR_STOP
      默认情况下,在发生错误后,命令处理会继续。当将此变量设置为on时,处理将立即停止。在交互模式下,uxsql将返回命令提示符;否则,uxsql将退出,并返回错误代码3以区分此情况和致命错误条件,后者使用错误代码1报告。在任一情况下,任何当前正在运行的脚本(如果有的话,则为顶级脚本和任何子脚本)都将被中止。其他可能被调用的脚本将立即终止。如果顶层命令字符串包含多个SQL命令,则处理将停止在当前命令处。

      PORT
      您当前连接的数据库服务器端口。这是每次连接到数据库(包括程序启动)时设置的,但可以更改或取消设置。

      PROMPT1
      PROMPT2
      PROMPT3
      这些指定了uxsql发出的提示应该是什么样子。请参见下面的提示

      QUIET
      将此变量设置为on等同于命令行选项-q。在交互模式下可能不太有用。

      ROW_COUNT
      上一次SQL查询返回或影响的行数,如果查询失败或未报告行数,则为0。

      SERVER_VERSION_NAME
      SERVER_VERSION_NUM
      服务器的版本号作为字符串,例如9.6.210.111beta1,以及以数字形式表示,例如90602100001。这些是每次连接到数据库时设置的(包括程序启动),但可以更改或取消设置。

      SHOW_ALL_RESULTS
      当此变量设置为off时,仅显示组合查询(\;)的最后一个结果,而不是所有结果。默认值为on。关闭行为是为了与旧版本的uxsql兼容。

      SHOW_CONTEXT
      此变量可以设置为nevererrorsalways的值,以控制是否在来自服务器的消息中显示CONTEXT字段。默认值为errors(意味着在错误消息中将显示上下文,但在通知或警告消息中不会显示)。当VERBOSITY设置为tersesqlstate时,此设置无效。(另请参见\errverbose,用于在您刚刚收到的错误的详细版本中使用。)

      SINGLELINE
      将此变量设置为on等同于命令行选项-S

      SINGLESTEP
      将此变量设置为on等同于命令行选项-s

      SQLSTATE
      与上一次SQL查询失败相关联的错误代码,如果成功,则为00000

      USER
      您当前连接的数据库用户。这是每次连接到数据库(包括程序启动)时设置的,但可以更改或取消设置。

      VERBOSITY
      此变量可设置为值 defaultverbosetersesqlstate,以控制错误报告的详细程度。 (另请参见\errverbose,用于在您需要获取刚刚收到的错误的详细信息时。)

      VERSION
      VERSION_NAME
      VERSION_NUM
      这些变量在程序启动时设置,以反映 uxsql 的版本,分别作为一个详细字符串、一个短字符串(例如 9.6.210.111beta1)和一个数字(例如 90602100001)。它们可以更改或取消设置。

    • SQL插值

      uxsql 变量的一个关键特性是,您可以将它们替换(“插值”)到常规的 SQL 语句中,以及元命令的参数中。此外,uxsql还提供了一些设施,以确保用作 SQL字面量和标识符的变量值被正确引用。插值一个没有任何引用的值的语法是在变量名前面加上冒号(:)。例如,

      testdb=> \set foo 'my_table'
      testdb=> SELECT * FROM :foo;
      

      将查询表my_table。请注意,这可能是不安全的:变量的值被逐字复制,因此它可能包含不平衡的引号,甚至是反斜杠命令。您必须确保它在您放置它的地方是有意义的。

      当一个值被用作 SQL 字面量或标识符时,最安全的方法是安排它被引用。要将变量的值引用为 SQL字面量,请在单引号中写入一个冒号,后跟变量名。要将值引用为SQL 标识符,请在双引号中写入一个冒号,后跟变量名。这些构造正确处理嵌入在变量值中的引号和其他特殊字符。上面的示例可以更安全地编写如下:

      testdb=> \set foo 'my_table'
      testdb=> SELECT * FROM :"foo";
      

      变量插值不会在引用的 SQL 字面量和标识符中执行。因此,构造如 ':foo'的语句无法从变量的值中产生引用的字面量(如果它确实起作用,那么它是不安全的,因为它无法正确处理嵌入在值中的引号)。

      这种机制的一个示例用途是将文件的内容复制到表列中。首先将文件加载到一个变量中,然后将变量的值作为引用字符串插值:

      testdb=> \set content `cat my_file.txt`
      testdb=> INSERT INTO my_table VALUES (:'content');
      

      (请注意,如果 my_file.txt 包含 NUL 字节,则仍然无法正常工作。 uxsql 不支持变量值中嵌入的 NUL 字节。)

      由于冒号可以合法地出现在 SQL 命令中,因此一个表面上的尝试插值(即:name:'name':"name")只有在命名变量当前被设置时才被替换。无论如何,您都可以使用反斜杠转义冒号以保护它免受替换。

      :{?name}特殊语法返回变量是否存在的TRUE或FALSE,并因此始终被替换,除非冒号被反斜杠转义。

      变量的冒号语法是嵌入式查询语言(例如ECUX)的标准SQL。数组切片和类型转换的冒号语法是UXDB扩展,有时可能会与标准用法冲突。用于将变量的值转义为SQL文字或标识符的冒号引号语法是uxsql扩展。

    • 提示符

      uxsql发出的提示可以根据您的喜好进行自定义。三个变量PROMPT1、PROMPT2和PROMPT3包含字符串和特殊转义序列,用于描述提示的外观。提示1是当uxsql请求新命令时发出的正常提示。当需要在命令输入期间输入更多输入时,例如因为未使用分号终止命令或未关闭引号时,会发出提示2。当您运行SQL COPY FROM STDIN命令并需要在终端上键入行值时,会发出提示3。

      所选提示变量的值会按字面打印,除非遇到百分号(%)。根据下一个字符,某些其他文本将被替换。定义的替换包括:

      %M
      数据库服务器的完整主机名(带域名),如果连接是通过Unix域套接字,则为[local],如果Unix域套接字不在编译的默认位置,则为[local:/dir/name]

      %m
      数据库服务器的主机名,在第一个点处截断,如果连接是通过Unix域套接字,则为[local]

      %>
      数据库服务器侦听的端口号。

      %n
      数据库会话用户名。(此值的扩展可能会在数据库会话期间更改,因为命令SET SESSION AUTHORIZATION的结果。)

      %/
      当前数据库的名称。

      %~
      %/相似,但如果数据库是您的默认数据库,则输出为~(波浪号)。

      %#
      如果会话用户是数据库超级用户,则为#,否则为>。(此值的扩展可能会在数据库会话期间更改,因为命令SET SESSION AUTHORIZATION的结果。)

      %p
      当前连接到的后端进程的进程 ID。

      %R
      在提示符 1 中通常为 =, 但如果会话处于条件块的非活动分支中,则为 @, 如果处于单行模式,则为 ^,如果会话与数据库断开连接(如果 \connect 失败,则可能发生), 则为 !。在提示符 2 中,%R 会被替换为一个字符, 该字符取决于为什么 uxsql 需要更多的输入: 如果命令尚未终止,则为 -,但如果存在未完成的 /* ... */ 注释,则为 *, 如果存在未完成的引号字符串,则为单引号,如果存在未完成的引号标识符,则为双引号, 如果存在未完成的美元引号字符串,则为美元符号,如果存在未匹配的左括号,则为 (。 在提示符 3 中,%R 不会产生任何内容。

      %x
      事务状态:当不在事务块中时为空字符串, 当在事务块中时为 *,当在失败的事务块中时为 !,当事务状态不确定时(例如,因为没有连接)为?

      %l
      当前语句内的行号,从 1 开始。

      %digits
      用指定的八进制代码替换字符。

      %:name:
      uxsql 变量 name 的值。 有关详细信息,请参见上面的变量

      %` command `
      command 的输出,类似于普通的 “反引号” 替换。

      %[ ... %]
      提示符可以包含终端控制字符,例如更改提示符文本的颜色、背景或样式, 或更改终端窗口的标题。为了使 Readline 的行编辑功能正常工作,这些不可打印的控制字符必须用 %[%] 包围起来, 表示它们是不可见的。在提示符中可以出现多对这样的字符。例如:

      testdb=> \set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%]%# '
      

      在支持 VT100 的彩色终端上,这将产生一个黑底黄字的粗体(1;)提示符。

      %w
      与最近的 PROMPT1 输出具有相同宽度的空格。 这可以用作 PROMPT2 设置,以便多行语句与第一行对齐,但没有可见的次要提示符。

      要在提示符中插入百分号,请写成%%。默认提示符为 '%/%R%x%# '(提示符1和2),以及 '>> '(提示符3)。

    • 命令行编辑

      uxsql使用 Readline或libedit库(如果可用)进行方便的行编辑和检索。当uxsql退出时,命令历史记录会自动保存,并在uxsql启动时重新加载。键入上箭头或控制-P以检索以前的行。

      您还可以在许多(远非全部)上下文中使用制表符完成部分键入的关键字和SQL对象名称。例如,在命令的开头,键入ins并按下TAB键将填充insertinto。然后,键入表或模式名称的几个字符并按下TAB键,将填充未完成的名称,或在有多个名称时提供可能的完成菜单。(根据使用的库,您可能需要按多次TAB键才能获得菜单。)

      SQL对象名称的制表符完成需要向服务器发送查询以查找可能的匹配项。在某些情况下,这可能会干扰其他操作。例如,在BEGIN之后,如果在之间发出制表符完成查询,则太晚发出SET TRANSACTION ISOLATION LEVEL。如果您根本不想使用制表符完成,则可以通过将以下内容放入名为.inputrc的文件中来永久关闭它:

      $if uxsql
      set disable-completion on
      $endif
      

      (这不是uxsql而是Readline功能。阅读其文档以获取更多详细信息。)

      -n--no-readline)命令行选项也可以用于禁用单个运行的uxsql中Readline的使用。这将防止制表符完成,使用或记录命令行历史记录以及编辑多行命令。当您需要复制和粘贴包含TAB字符的文本时,它特别有用。

环境变量

COLUMNS
如果\pset columns为零,则控制wrapped格式的宽度以及确定宽输出是否需要分页器或应在扩展自动模式下切换到垂直格式的宽度。

UXDATABASE
UXHOST
UXPORT
UXUSER
默认连接参数。

UX_COLOR
指定是否在诊断消息中使用颜色。可能的值为alwaysautonever

UXSQL_EDITOR
EDITOR
VISUAL
\e\ef\ev 命令使用的编辑器。 这些变量按照列出的顺序进行检查;使用设置的第一个变量。如果没有设置任何一个变量,则默认使用 Unix 系统上的 vi 或 Windows系统上的 notepad.exe

UXSQL_EDITOR_LINENUMBER_ARG
当使用带有行号参数的 \e\ef\ev 命令时,此变量指定用于将起始行号传递给用户编辑器的命令行参数。对于像Emacs 或 vi 这样的编辑器,这是一个加号。如果选项名称和行号之间需要空格,则在变量的值中包含一个尾随空格。例如:

UXSQL_EDITOR_LINENUMBER_ARG='+'
UXSQL_EDITOR_LINENUMBER_ARG='--line '

在 Unix 系统上,默认值为 +(对应于默认编辑器 vi,并且对于许多其他常见编辑器非常有用);但是在Windows系统上没有默认值。

UXSQL_HISTORY
命令历史文件的备用位置。执行波浪号(~)扩展。

UXSQL_PAGER
PAGER
如果查询结果无法适合屏幕,则通过此命令进行传输。典型的值为 moreless。 通过将 UXSQL_PAGERPAGER 设置为空字符串,或通过调整 \pset 命令的分页器相关选项,可以禁用分页器的使用。这些变量按照列出的顺序进行检查;使用设置的第一个变量。如果没有设置任何一个变量,则默认在大多数平台上使用 more,但在 Cygwin 上使用less

UXSQL_WATCH_PAGER
当使用 \watch 命令重复执行查询时,默认情况下不使用分页器。可以通过在 Unix 系统上将UXSQL_WATCH_PAGER 设置为分页器命令来更改此行为。 pspg 分页器(不是 UXDB的一部分,但在许多开源软件发行版中可用)可以在使用选项 --stream 启动时显示\watch 的输出。

UXSQLRC
用户的 .uxsqlrc 文件的备用位置。执行波浪号(~)扩展。

SHELL
\! 命令执行的命令。

TMPDIR
用于存储临时文件的目录。默认值为/tmp

与大多数其他 UXDB 实用程序一样,此实用程序还使用 libuxsql 支持的环境变量。

文件

uxsqlrc~/.uxsqlrc
除非传递了 -X 选项,否则 uxsql 会在连接到数据库之后但在接受正常命令之前,尝试从系统范围的启动文件 (uxsqlrc)和用户的个人启动文件 (~/.uxsqlrc) 中读取并执行命令。这些文件可用于设置客户端或服务器的偏好设置,通常使用\setSET 命令。

系统范围的启动文件名为 uxsqlrc。默认情况下,它在安装的“系统配置”目录中寻找,该目录最可靠的标识方法是运行ux_config --sysconfdir。通常,该目录将相对于包含 UXDB 可执行文件的目录为../etc/。可以通过 UXSYSCONFDIR 环境变量显式设置要查找的目录。

用户的个人启动文件名为 .uxsqlrc,并在调用用户的主目录中查找。在 Windows 上,个人启动文件的名称为%APPDATA%\UXDB\uxsqlrc.conf。在任一情况下,可以通过设置 UXSQLRC环境变量来覆盖此默认文件路径。

系统范围的启动文件和用户的个人启动文件都可以通过在文件名后附加破折号和 UXDB 主要或次要版本标识符来使其与 uxsql版本特定匹配,例如 ~/.uxsqlrc-15~/.uxsqlrc-15.1。最具体的版本匹配文件将优先读取非版本特定文件。这些版本后缀是在按上述方式确定文件路径后添加的。

.uxsql_history
命令行历史记录存储在文件 ~/.uxsql_history或Windows 上的%APPDATA%\uxsinodb\uxsql_history 中。

可以通过 HISTFILE uxsql 变量或 UXSQL_HISTORY 环境变量显式设置历史记录文件的位置。

注解

uxsql 与相同或旧版本的服务器配合使用效果最佳。如果服务器的版本比 uxsql 更高,则反斜杠命令特别容易失败。但是,\d系列的反斜杠命令应该可以与版本回溯到 9.2 的服务器一起使用,但不一定与比 uxsql更高版本的服务器一起使用。运行 SQL命令和显示查询结果的一般功能也应该可以与更高主要版本的服务器一起使用,但无法保证在所有情况下都能正常工作。

如果要使用 uxsql 连接到不同主要版本的多个服务器,则建议使用最新版本的 uxsql。或者,您可以保留每个主要版本的 uxsql副本,并确保使用与相应服务器匹配的版本。但实际上,这种额外的复杂性应该是不必要的。

uxsql 单字母反斜杠命令的第一个参数和命令之间需要空格间隔。

Windows用户注意事项

uxsql 是一个“控制台应用程序”。 由于 Windows 控制台窗口使用与系统其余部分不同的编码,因此在使用 8 位字符时必须特别小心。 如果uxsql 检测到问题的控制台代码页,它将在启动时警告您。 要更改控制台代码页,需要两个步骤:

  • 通过输入 cmd.exe /c chcp 1252 来设置代码页。(1252是适用于德语的代码页;将其替换为您的值。)如果您使用Cygwin, 您可以将此命令放在 /etc/profile 中。
  • 将控制台字体设置为 Lucida Console,因为点阵字体与 ANSI 代码页不兼容。

示例

第一个示例展示了如何将命令分散到多行输入中。注意提示符的变化:

testdb=> CREATE TABLE my_table (
testdb(>  first integer not null default 0,
testdb(>  second text)
testdb-> ;
CREATE TABLE

现在再次查看表定义:

testdb=> \d my_table
Table "public.my_table"
Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
first  | integer |           | not null | 0
second | text    |           |          |

现在我们将提示符更改为更有趣的内容:

testdb=> \set PROMPT1 '%n@%m %~%R%# '
peter@localhost testdb=>

假设您已经用数据填充了表并想要查看它:

peter@localhost testdb=> SELECT * FROM my_table;
first | second
-------+--------
1 | one
2 | two
3 | three
4 | four
(4 rows)

您可以使用 \pset 命令以不同的方式显示表:

peter@localhost testdb=> \pset border 2
Border style is 2.
peter@localhost testdb=> SELECT * FROM my_table;
+-------+--------+
| first | second |
+-------+--------+
|     1 | one    |
|     2 | two    |
|     3 | three  |
|     4 | four   |
+-------+--------+
(4 rows)

peter@localhost testdb=> \pset border 0
Border style is 0.
peter@localhost testdb=> SELECT * FROM my_table;
first second
----- ------
1 one
2 two
3 three
4 four
(4 rows)

peter@localhost testdb=> \pset border 1
Border style is 1.
peter@localhost testdb=> \pset format csv
Output format is csv.
peter@localhost testdb=> \pset tuples_only
Tuples only is on.
peter@localhost testdb=> SELECT second, first FROM my_table;
one,1
two,2
three,3
four,4
peter@localhost testdb=> \pset format unaligned
Output format is unaligned.
peter@localhost testdb=> \pset fieldsep '\t'
Field separator is "    ".
peter@localhost testdb=> SELECT second, first FROM my_table;
one     1
two     2
three   3
four    4

或者,使用短命令:

peter@localhost testdb=> \a \t \x
Output format is aligned.
Tuples only is off.
Expanded display is on.
peter@localhost testdb=> SELECT * FROM my_table;
-[ RECORD 1 ]-
first  | 1
second | one
-[ RECORD 2 ]-
first  | 2
second | two
-[ RECORD 3 ]-
first  | 3
second | three
-[ RECORD 4 ]-
first  | 4
second | four

此外,这些输出格式选项可以通过使用\g仅为一个查询设置:

peter@localhost testdb=> SELECT * FROM my_table
peter@localhost testdb-> \g (format=aligned tuples_only=off expanded=on)
-[ RECORD 1 ]-
first  | 1
second | one
-[ RECORD 2 ]-
first  | 2
second | two
-[ RECORD 3 ]-
first  | 3
second | three
-[ RECORD 4 ]-
first  | 4
second | four

以下是使用\df命令查找仅匹配int*pl名称且第二个参数为bigint类型的函数的示例:

testdb=> \df int*pl * bigint
List of functions
   Schema   |  Name   | Result data type | Argument data types | Type
------------+---------+------------------+---------------------+------
 ux_catalog | int28pl | bigint           | smallint, bigint    | func
 ux_catalog | int48pl | bigint           | integer, bigint     | func
 ux_catalog | int8pl  | bigint           | bigint, bigint      | func
(3 rows)

如果合适,可以使用\crosstabview命令以交叉表表示形式显示查询结果:

testdb=> SELECT first, second, first > 2 AS gt2 FROM my_table;
first | second | gt2
-------+--------+-----
1 | one    | f
2 | two    | f
3 | three  | t
4 | four   | t
(4 rows)

testdb=> \crosstabview first second
first | one | two | three | four

-------+-----+-----+-------+------
1 | f   |     |       |
2 |     | f   |       |
3 |     |     | t     |
4 |     |     |       | t
(4 rows)

此第二个示例显示一个乘法表,其中行按逆数值顺序排序,列具有独立的升序数值顺序。

testdb=> SELECT t1.first as "A", t2.first+100 AS "B", t1.first*(t2.first+100)as "AxB",
testdb(> row_number() over(order by t2.first) AS ord
testdb(> FROM my_table t1 CROSS JOIN my_table t2 ORDER BY 1 DESC
testdb(> \crosstabview "A" "B" "AxB" ord
A | 101 | 102 | 103 | 104
---+-----+-----+-----+-----
4 | 404 | 408 | 412 | 416
3 | 303 | 306 | 309 | 312
2 | 202 | 204 | 206 | 208
1 | 101 | 102 | 103 | 104
(4 rows)

22.reindexdb

reindexdb — 重建 UXDB 数据库索引

概要

reindexdb [connection-option...] [option...] [ -S | --schema schema ] ... [ -t | --table table ] ... [-i | --index index ] ... [ dbname ]

reindexdb [connection-option...] [option...] -a | --all

reindexdb [connection-option...] [option...] -s | --system [ dbname ]

描述

reindexdb 是一个用于重建 UXDB 数据库索引的实用程序。

reindexdb 是 SQL 命令 REINDEX的包装器。通过此实用程序和通过其他访问服务器的方法重建数据库索引没有实质性区别。

选项

reindexdb 接受以下命令行参数:

-a
--all
重建所有数据库的索引。

--concurrently
使用 CONCURRENTLY选项。

[-d] dbname
[--dbname=]dbname
指定要重新索引的数据库的名称,当未使用-a/--all时。如果未指定,则从环境变量UXDATABASE中读取数据库名称。如果未设置该变量,则使用连接所指定的用户名。 dbname 可以是连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。

-e
--echo
回显reindexdb生成并发送到服务器的命令。

-i index
--index=index
仅重新创建 index 。可以通过写入多个-i开关来重新创建多个索引。

-j njobs
--jobs=njobs
通过同时运行 njobs 个命令并行执行重新索引命令。此选项可能会减少处理时间,但也会增加数据库服务器的负载。

reindexdb将打开 njobs 个连接到数据库,因此请确保您的max_connections设置足够高,以容纳所有连接。

请注意,此选项与--index--system选项不兼容。

-q
--quiet
不显示进度消息。

-s
--system
仅重新索引数据库的系统目录。

-S schema
--schema=schema
仅重新索引 schema 。可以通过写入多个-S开关来重新索引多个模式。

-t table
--table=table
仅重新索引 table 。可以通过写入多个-t开关来重建多个表索引。

--tablespace=tablespace
指定重建索引的表空间。(此名称将被处理为双引号标识符。)

-v
--verbose
在处理过程中打印详细信息。

-V
--version
打印reindexdb的版本并退出。

-?
--help
显示关于reindexdb命令行参数的帮助信息,并退出。

reindexdb还接受以下用于连接参数的命令行参数:

-h host
--host=host
指定运行服务器的计算机的主机名。如果值以斜杠开头,则将其用作Unix域套接字的目录。

-p port
--port=port
指定服务器侦听连接的TCP端口或本地Unix域套接字文件扩展名。

-U username
--username=username
要连接的用户名。

-w
--no-password
永远不要发出密码提示。如果服务器需要密码身份验证并且没有其他方式(例如.uxpass文件)提供密码,则连接尝试将失败。此选项可用于批处理作业和脚本,其中没有用户输入密码。

-W
--password
强制reindexdb在连接到数据库之前提示输入密码。

此选项从不是必需的,因为如果服务器要求密码身份验证,reindexdb将自动提示输入密码。但是,reindexdb将浪费一个连接尝试来了解服务器需要密码。在某些情况下,输入-W值得避免额外的连接尝试。

--maintenance-db=dbname
指定要连接以发现应重新索引的数据库的名称,当使用-a/--all时。如果未指定,则使用uxdb数据库,如果不存在,则使用template1。这可以是连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。此外,除了数据库名称本身之外的连接字符串参数将在连接到其他数据库时重新使用。

环境变量

UXDATABASE
UXHOST
UXPORT
UXUSER
默认连接参数

UX_COLOR
指定是否在诊断消息中使用颜色。可能的值为alwaysautonever

像大多数其他UXDB实用程序一样,此实用程序还使用libuxsql支持的环境变量。

诊断

如果遇到困难,请参见uxsql,了解可能出现的问题和错误消息。数据库服务器必须在目标主机上运行。此外,libuxsql前端库使用的任何默认连接设置和环境变量都将适用。

注解

reindexdb可能需要多次连接到UXDB服务器,每次都要求输入密码。在这种情况下,有一个~/.uxpass文件很方便。

示例

重新索引数据库test

$ reindexdb test

在名为abcd的数据库中重新索引表foo和索引bar

$ reindexdb --table=foo --index=bar abcd

23.vacuumdb

vacuumdb — 垃圾回收和分析 UXDB 数据库

概要

vacuumdb [connection-option...] [option...] [ -t | --table table [( column [,...] )] ] ... [ dbname ]

vacuumdb [connection-option...] [option...] -a | --all

描述

vacuumdb 是清理UXDB 数据库的实用程序。vacuumdb还会生成内部统计信息,用于UXDB查询优化器。

vacuumdb 是SQL命令VACUUM的包装器。通过此实用程序和通过其他访问服务器的方法清理和分析数据库没有实质性区别。

选项

vacuumdb 接受以下命令行参数:

-a
--all
清理所有数据库。

[-d] dbname
[--dbname=]dbname
指定要清理或分析的数据库的名称,当未使用 -a/--all时。如果没有指定,数据库名称将从环境变量UXDATABASE中读取。如果未设置该变量,则使用连接指定的用户名。 dbname 可以是连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。

--disable-page-skipping
禁用基于可见性映射内容的页面跳过。

-e
--echo
回显vacuumdb生成并发送到服务器的命令。

-f
--full
执行“full”清理。

-F
--freeze
积极地“冻结”元组。

--force-index-cleanup
始终删除指向死元组的索引条目。

注意

此选项仅适用于运行UXDB 2113及更高版本的服务器。

-j njobs
--jobs=njobs
通过同时运行 njobs 个命令并行执行清理或分析命令。此选项可能会减少处理时间,但也会增加数据库服务器的负载。

vacuumdb将打开 njobs 个连接到数据库,因此请确保您的max_connections设置足够高以容纳所有连接。

请注意,与-f(FULL)选项一起使用此模式可能会导致死锁失败,如果某些系统目录以并行方式处理。

--min-mxid-age mxid_age
仅对多个事务ID年龄至少为 mxid_age 的表执行清理或分析命令。此设置对于优先处理表以防止多个事务ID环绕非常有用。

对于此选项,关系的多个事务ID年龄是主关系及其关联的TOAST表(如果存在)的年龄中最大的。由vacuumdb发出的命令也将在必要时处理关系的TOAST表,因此不需要单独考虑它。

--min-xid-age xid_age
只在事务 ID 年龄至少为 xid_age 的表上执行 vacuum 或 analyze 命令。此设置对于优先处理表以防止事务ID 环绕非常有用。

对于此选项,关系的事务 ID 年龄是主关系及其关联的 TOAST 表(如果存在)的年龄中最大的。由于 vacuumdb发出的命令也会在必要时处理关系的 TOAST 表,因此不需要单独考虑它。

--no-index-cleanup
不要删除指向死元组的索引条目。

注意

此选项仅适用于运行 UXDB 2113及更高版本的服务器。

--no-process-toast
跳过要清理的表关联的 TOAST 表(如果有)。

注意

此选项仅适用于运行 UXDB 2122及更高版本的服务器。

--no-truncate
不要截断表末尾的空页面。

注意

此选项仅适用于运行 UXDB 2113及更高版本的服务器。

-P parallel_workers
--parallel=parallel_workers
指定并行 vacuum 的并行工作进程数。这允许 vacuum 利用多个 CPU 处理索引。

注意

此选项仅适用于运行 UXDB 2122及更高版本的服务器。

-q
--quiet
不显示进度消息。

--skip-locked
跳过无法立即锁定以进行处理的关系。

注意

此选项仅适用于运行 UXDB 2113及更高版本的服务器。

-t table [ (column [,...]) ]
--table=table [ (column [,...]) ]
仅清理或分析 table 。只有在与 --analyze--analyze-only选项结合使用时才能指定列名。可以通过编写多个 -t开关来清理多个表。

提示

如果指定了列,则可能需要从 shell 转义括号。 (请参见下面的示例。)

-v
--verbose
在处理过程中打印详细信息。

-V
--version
打印 vacuumdb 版本并退出。

-z
--analyze
还计算用于优化器的统计信息。

-Z
--analyze-only
仅计算用于优化器的统计信息(不进行清理)。

--analyze-in-stages
仅计算用于优化器的统计信息(不进行清理),类似于--analyze-only。运行三个阶段的分析;第一个阶段使用最低可能的统计目标以更快地生成可用的统计信息,随后的阶段构建完整的统计信息。

此选项仅适用于分析当前没有统计信息或统计信息完全不正确的数据库,例如如果它是从恢复的转储或通过ux_upgrade新填充的。请注意,在具有现有统计信息的数据库中使用此选项可能会导致查询优化器选择由于早期阶段的低统计目标而变得短暂恶化。

-?
--help
显示关于 vacuumdb 命令行参数的帮助信息,并退出。

vacuumdb 还接受以下用于连接参数的命令行参数:

-h host
--host=host
指定运行服务器的机器的主机名。如果值以斜杠开头,则用作 Unix 域套接字的目录。

-p port
--port=port
指定服务器侦听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。

-U username
--username=username
连接的用户名。

-w
--no-password
永远不提示输入密码。如果服务器需要密码身份验证并且没有其他方式(例如 .uxpass文件)提供密码,则连接尝试将失败。此选项可用于批处理作业和脚本,其中没有用户存在以输入密码。

-W
--password
强制 vacuumdb 在连接到数据库之前提示输入密码。

此选项从不是必需的,因为 vacuumdb将自动提示输入密码,如果需要的话。如果服务器要求密码验证,则需要输入密码。但是,vacuumdb将浪费一个连接尝试来确定服务器需要密码。在某些情况下,建议输入 -W 以避免额外的连接尝试。

--maintenance-db=dbname
指定要连接以发现应该清理的数据库的名称,当使用 -a/--all 时。如果未指定,则将使用 uxdb数据库,或者如果不存在,则将使用 template1。这可以是一个连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。此外,除了数据库名称本身之外的连接字符串参数将在连接到其他数据库时被重用。

环境变量

UXDATABASE
UXHOST
UXPORT
UXUSER
默认连接参数

UX_COLOR
指定是否在诊断消息中使用颜色。可能的值为 alwaysautonever

像大多数其他 UXDB 实用程序一样,此实用程序还使用 libuxsql 支持的环境变量。

诊断

如果遇到困难,请参阅和uxsql,了解可能出现的问题和错误消息。数据库服务器必须在目标主机上运行。此外,任何默认连接设置和由libuxsql 前端库使用的环境变量都将应用。

注解

vacuumdb 可能需要多次连接到 UXDB 服务器,每次都要求密码。在这种情况下,拥有一个 ~/.uxpass文件很方便。

示例

要清理数据库 test

$ vacuumdb test

要清理并分析名为 bigdb 的数据库以供优化器使用:

$ vacuumdb --analyze bigdb

要在名为 xyzzy 的数据库中清理单个表 foo,并分析表的单个列 bar 以供优化器使用:

$ vacuumdb --analyze --verbose --table='foo(bar)' xyzzy

24.ux_fastload

ux_fastload — 并行地将数据导入指定的表

概要

ux_fastload[ OPTION ]...

描述

ux_fastload是通过将一个比较大的数据表,切分成多个较小的数据表,通过copy并发的将这些小的数据表写入到数据库表文件中,提高导入数据的速度。

选项

ux_fastload接受以下命令行参数:

-t
--table=TABLENAME
导入的目标表对象。

-i
--input=INPUT
导入的数据文件名,相对路径,默认数据文件在当前目录下。

-P
--paralTel=PARALLEl
加上-P参数,进行并发处理,默认只执行单个copy命令。

-n
--linenum=LINENUM
指定切分的数据文件的数据行数,默认为10000000。

-f
--format=FORMAT
指定数据文件的格式,默认是csv,支持csv|txt|binary。

-D
--delimiter=DELIMITER
数据文件中的分隔符,默认为逗号“,”。

-m
--maxconn=MAXCONN
指定最大并发数量,默认设置为90。

-s
--splitdir=SPLITDIR
分片的数据表存放的路径,建议放在空间比较大的路径下。

-?
--help
显示关于ux_fastload命令行参数的帮助信息,并退出。

连接选项

-h
--host=HOSTNAME
数据库服务器主机名或者套接字目录,默认为127.0.0.1。

-p
--port=PORT
数据库服务器的端口,默认为52025。

-U
--username=USERNAME
要连接的用户名,默认为uxdb。

-d
--dbname=DBNAME
要连接的数据库名称,默认为uxdb。

-S --schema=SCHEMA
指定模式名称,默认为public。

-w
--no-password
从不发出密码提示。获取~/.uxpass中的密码。建议并发连接使用-w,默认需要配置127.0.0.1的连接信息。

-W --password
强制输入密码。

-o
指定copy命令的其他参数(除 format 和 delimiter),如果包含quote参数需要加转义符。

建议

  1. 执行并发导入时,切分的文件个数大于设置的最大并发数时,会直接返回错误信息。

    [uxdb@tkbhost bin]$ ./ux_fastload -i /tmp/data/test1.csv -t test1 -P -n 100000 -s /tmp/data/
    parallel_num more than max parallel_num 90
    Suggest set bigger linenum (-n) or maxconn (-m).
    

    建议:将-n参数值设置的更大,重新执行ux_fastload命令;或者是将-m 参数设置的更大,如果-m的参数值超过数据库的最大连接数max_connection(默认为100),需要修改uxsino.conf文件中max_connection,重启数据库后,重新执行ux_fastload命令。

  2. 如果发生core时,需要检查一下-s指定的路径下,是否存在表名的目录,如果存在,则删除即可,否则有可能影响数据导入。

    ./ux_fastload -i /tmp/data/test1.csv -t test1 -P -n 100000 -s /tmp/data/
    

    检查:/tmp/data/test1/

    示例

    ./ux_fastload -t test1 -i /home/uxdb/uxdbinstall/dbsql/bin/test1.csv -P -n 500 -s /tmp -o " null '\N',quote '\"' "