华为云用户手册

  • 示例:常用操作 import psycopg2 import os # 从环境变量中获取用户名和密码 user = os.getenv('user') password = os.getenv('password') # 创建连接对象 conn=psycopg2.connect(database="database", user=user, password=password, host="localhost", port=port) cur=conn.cursor() #创建指针对象 # 创建连接对象(SSl连接) conn = psycopg2.connect(dbname="database", user=user, password=password, host="localhost", port=port, sslmode="verify-ca", sslcert="client.crt",sslkey="client.key",sslrootcert="cacert.pem") 注意: 如果sslcert、sslkey、sslrootcert没有填写,默认取当前用户.postgresql目录下对应的client.crt、client.key、root.crt # 创建表 cur.execute("CREATE TABLE student(id integer,name varchar,sex varchar);") # 插入数据 cur.execute("INSERT INTO student(id,name,sex) VALUES(%s,%s,%s)",(1,'Aspirin','M')) cur.execute("INSERT INTO student(id,name,sex) VALUES(%s,%s,%s)",(2,'Taxol','F')) cur.execute("INSERT INTO student(id,name,sex) VALUES(%s,%s,%s)",(3,'Dixheral','M')) # 批量插入数据 stus = ((4,'John','M'),(5,'Alice','F'),(6,'Peter','M')) cur.executemany("INSERT INTO student(id,name,sex) VALUES(%s,%s,%s)",stus) # 获取结果 cur.execute('SELECT * FROM student') results=cur.fetchall() print (results) # 提交操作 conn.commit() # 插入一条数据 cur.execute("INSERT INTO student(id,name,sex) VALUES(%s,%s,%s)",(7,'Lucy','F')) # 回退操作 conn.rollback() # 关闭连接 cur.close() conn.close() psycopg2常用连接方式 1. conn = psycopg2.connect(dbname="dbname", user=user, password=password, host="localhost", port=port) 2. conn = psycopg2.connect(f"dbname=dbname user={user} password={password} host=localhost port=port") 3. 使用日志 import logging import psycopg2 from psycopg2.extras import LoggingConnection import os # 从环境变量中获取用户名和密码 user = os.getenv('user') password = os.getenv('password') logging.basicConfig(level=logging.DEBUG) # 日志级别 logger = logging.getLogger(__name__) db_settings = { "user": user, "password": password, "host": "localhost", "database": "dbname", "port": port } # LoggingConnection默认记录所有SQL,可自行实现filter过滤不需要的或敏感的SQL,下面给出了简单的过滤password相关SQL的示例 class SelfLoggingConnection(LoggingConnection): def filter(self, msg, curs): if db_settings['password'] in msg.decode(): return b'queries containing the password will not be recorded' return msg conn = psycopg2.connect(connection_factory=SelfLoggingConnection, **db_settings) conn.initialize(logger) 父主题: 基于Psycopg开发
  • PATTERN 很多\d命令都可以用一个PATTERN参数来指定要被显示的对象名称。在最简单的情况下,PATTERN正好就是该对象的准确名称。在PATTERN中的字符通常会被变成小写形式(就像在SQL名称中那样),例如\dt FOO将会显示名为foo的表。就像在SQL名称中那样,把PATTERN放在双引号中可以阻止它被转换成小写形式。如果需要在一个PATTERN中包括一个真正的双引号字符,则需要把它写成两个相邻的双引号,这同样是符合SQL引用标识符的规则。例如,\dt "FOO""BAR"将显示名为FOO"BAR(不是foo"bar)的表。和普通的SQL名称规则不同,不能只在PATTERN的一部分周围放上双引号,例如\dt FOO"FOO"BAR将会显示名为fooFOObar的表。 不使用PATTERN参数时,\d命令会显示当前schema搜索路径中可见的全部对象——这等价于用*作为PATTERN。所谓对象可见是指可以直接用名称引用该对象,而不需要用schema来进行限定。要查看数据库中所有的对象而不管它们的可见性,可以把*.*用作PATTERN。 如果放在一个PATTERN中,*将匹配任意字符序列(包括空序列),而?会匹配任意的单个字符(这种记号方法就像 Unix shell 的文件名PATTERN一样)。例如,\dt int*会显示名称以int开始的表。但是如果被放在双引号内,*和?就会失去这些特殊含义而变成普通的字符。 包含一个点号(.)的PATTERN被解释为一个schema名称模式后面跟上一个对象名称模式。例如,\dt foo*.*bar*会显示名称以foo开始的schema中所有名称包括bar的表。如果没有出现点号,那么模式将只匹配当前schema搜索路径中可见的对象。同样,双引号内的点号会失去其特殊含义并且变成普通的字符。 高级用户可以使用字符类等正则表达式记法,如[0-9]可以匹配任意数字。所有的正则表达式特殊字符都按照POSIX正则表达式所说的工作。以下字符除外: .会按照上面所说的作为一种分隔符。 *会被翻译成正则表达式记号.*。 ?会被翻译成.。 $则按字面意思匹配。 根据需要,可以通过书写?、(R+|)、(R|)和R?来分别模拟PATTERN字符.、R*和R?。$不需要作为一个正则表达式字符,因为PATTERN必须匹配整个名称,而不是像正则表达式的常规用法那样解释(换句话说,$会被自动地追加到PATTERN上)。如果不希望该PATTERN的匹配位置被固定,可以在开头或者结尾写上*。注意在双引号内,所有的正则表达式特殊字符会失去其特殊含义并且按照其字面意思进行匹配。另外,在操作符名称PATTERN中(即\do的PATTERN参数),正则表达式特殊字符也按照字面意思进行匹配。
  • 元命令 元命令的详细说明请参见表1、表2、表3、表4、表6、表8、表9、表10和表12。 以下命令中所提到的FILE代表文件路径。此路径可以是绝对路径(如/home/gauss/file.txt),也可以是相对路径(file.txt,file.txt会默认在用户执行gsql命令所在的路径下创建)。 表1 一般的元命令 参数 参数说明 取值范围 \copyright 显示GaussDB的版本和版权信息。 - \g [FILE] or ; 执行查询(并将结果发送到文件或管道)。 - \h(\help) [NAME] 给出指定SQL语句的语法帮助。 如果没有给出NAME,gsql将列出可获得帮助的所有命令。如果NAME是一个星号(*),则显示所有SQL语句的语法帮助。 \parallel [on [num]|off] 控制并发执行开关。 on:打开控制并发执行开关,且最大并发数为num。 off:关闭控制并发执行开关。 说明: 不支持事务中开启并发执行以及并发中开启事务。 不支持\d这类元命令的并发。 并发select返回结果混乱问题,此为客户可接受,core、进程停止响应不可接受。 不推荐在并发中使用set语句,否则导致结果与预期不一致。 不支持创建临时表!如需使用临时表,需要在开启parallel之前创建好,并在parallel内部使用。parallel内部不允许创建临时表。 \parallel执行时最多会启动num个独立的gsql进程连接服务器。 \parallel中所有作业的持续时间不能超过session_timeout,否则可能会导致并发执行过程中断连。 num的默认值:1024。 须知: 服务器能接受的最大连接数受max_connection及当前已有连接数限制。 设置num时请考虑服务器当前可接受的实际连接数合理指定。 \q 退出gsql程序。在一个脚本文件里,只在脚本终止的时候执行。 - 表2 查询缓存区元命令 参数 参数说明 \e [FILE] [LINE] 使用外部编辑器编辑查询缓冲区(或者文件)。 \ef [FUNCNAME [LINE]] 使用外部编辑器编辑函数定义。如果指定了LINE(即行号),则光标会指到函数体的指定行。 \p 打印当前查询缓冲区到标准输出。 \r 重置(或清空)查询缓冲区。 \w FILE 将当前查询缓冲区输出到文件。 表3 输入/输出元命令 参数 参数说明 \copy { table [ ( column_list ) ] | ( query ) } { from | to } { filename | stdin | stdout | pstdin | pstdout } [ with ] [ binary ] [ oids ] [ delimiter [ as ] 'character' ] [ null [ as ] 'string' ] [ csv [ header ] [ quote [ as ] 'character' ] [ escape [ as ] 'character' ] [ force quote column_list | * ] [ force not null column_list ] ] 在任何gsql客户端登录数据库成功后可以执行导入导出数据,这是一个运行SQL COPY命令的操作,但不是读取或写入指定文件的服务器,而是读取或写入文件,并在服务器和本地文件系统之间路由数据。这意味着文件的可访问性和权限是本地用户的权限,而不是服务器的权限,并且不需要数据库初始化用户权限。 说明: \COPY只适合小批量,格式良好的数据导入,不会对非法字符进行预处理,也无容错能力。导入数据应优先选择GDS或COPY。 \echo [STRING] 把字符串写到标准输出。 \i FILE 从文件FILE中读取内容,并将其当作输入,执行查询。 \i+ FILE KEY 执行加密文件中的命令。 \ir FILE 和\i类似,只是相对于存放当前脚本的路径。 \ir+ FILE KEY 和\i+类似,只是相对于存放当前脚本的路径。 \o [FILE] 把所有的查询结果发送到文件里。 \qecho [STRING] 把字符串写到查询结果输出流里。 表4中的选项S表示显示系统对象,+表示显示对象附加的描述信息。PATTERN用来指定要被显示的对象名称。 表4 显示信息元命令 参数 参数说明 取值范围 示例 \d[S+] 列出当前search_path中模式下所有的表、视图和序列。当search_path中不同模式存在同名对象时,只显示search_path中位置靠前模式下的同名对象。 - 列出当前search_path中模式下所有的表、视图和序列。 1 postgres=# \d \d[S+] NAME 列出指定表、视图和索引的结构。 - 假设存在表a,列出指定表a的结构。 1 postgres=# \dtable+ a \d+ [PATTERN] 列出所有表、视图和索引。 如果声明了PATTERN,只显示名称匹配PATTERN的表、视图和索引。 列出所有名称以f开头的表、视图和索引。 1 postgres=# \d+ f* \da[S] [PATTERN] 列出所有可用的聚集函数,以及它们操作的数据类型和返回值类型。 如果声明了PATTERN,只显示名称匹配PATTERN的聚集函数。 列出所有名称以f开头可用的聚集函数,以及它们操作的数据类型和返回值类型。 1 postgres=# \da f* \db[+] [PATTERN] 列出所有可用的表空间。 如果声明了PATTERN,只显示名称匹配PATTERN的表空间。 列出所有名称以p开头的可用表空间。 1 postgres=# \db p* \dc[S+] [PATTERN] 列出所有字符集之间的可用转换。 如果声明了PATTERN,只显示名称匹配PATTERN的转换。 列出所有字符集之间的可用转换。 1 postgres=# \dc * \dC[+] [PATTERN] 列出所有类型转换。 如果声明了PATTERN,只显示名称匹配PATTERN的转换。 列出所有名称以c开头的类型转换。 1 postgres=# \dC c* \dd[S] [PATTERN] 显示所有匹配PATTERN的描述。 如果没有给出参数,则显示所有可视对象。“对象”包括:聚集、函数、操作符、类型、关系(表、视图、索引、序列、大对象)、规则。 列出所有可视对象。 1 postgres=# \dd \ddp [PATTERN] 显示所有默认的使用权限。 如果指定了PATTERN,只显示名称匹配PATTERN的使用权限。 列出所有默认的使用权限。 1 postgres=# \ddp \dD[S+] [PATTERN] 列出所有可用域。 如果声明了PATTERN,只显示名称匹配PATTERN的域。 列出所有可用域。 1 postgres=# \dD \ded[+] [PATTERN] 列出所有的Data Source对象。 如果声明了PATTERN,只显示名称匹配PATTERN的对象。 列出所有的Data Source对象。 1 postgres=# \ded \det[+] [PATTERN] 列出所有的外部表。 如果声明了PATTERN,只显示名称匹配PATTERN的表。 列出所有的外部表。 1 postgres=# \det \des[+] [PATTERN] 列出所有的外部服务器。 如果声明了PATTERN,只显示名称匹配PATTERN的服务器。 列出所有的外部服务器。 1 postgres=# \des \deu[+] [PATTERN] 列出用户映射信息。 如果声明了PATTERN,只显示名称匹配PATTERN的信息。 列出用户映射信息。 1 postgres=# \deu \dew[+] [PATTERN] 列出封装的外部数据。 如果声明了PATTERN,只显示名称匹配PATTERN的数据。 列出封装的外部数据。 1 postgres=# \dew \df[antw][S+] [PATTERN] 列出所有可用函数,以及它们的参数和返回的数据类型。a代表聚集函数,n代表普通函数,t代表触发器,w代表窗口函数。 如果声明了PATTERN,只显示名称匹配PATTERN的函数。 列出所有可用函数,以及它们的参数和返回的数据类型。 1 postgres=# \df \dF[+] [PATTERN] 列出所有的文本搜索配置信息。 如果声明了PATTERN,只显示名称匹配PATTERN的配置信息。 列出所有的文本搜索配置信息。 1 postgres=# \dF+ \dFd[+] [PATTERN] 列出所有的文本搜索字典。 如果声明了PATTERN,只显示名称匹配PATTERN的字典。 列出所有的文本搜索字典。 1 postgres=# \dFd \dFp[+] [PATTERN] 列出所有的文本搜索分析器。 如果声明了PATTERN,只显示名称匹配PATTERN的分析器。 列出所有的文本搜索分析器。 1 postgres=# \dFp \dFt[+] [PATTERN] 列出所有的文本搜索模板。 如果声明了PATTERN,只显示名称匹配PATTERN的模板。 列出所有的文本搜索模板。 1 postgres=# \dFt \dg[+] [PATTERN] 列出所有数据库角色。 说明: 因为用户和群组的概念被统一为角色,所以这个命令等价于\du。为了和以前兼容,所以保留两个命令。 如果指定了PATTERN,只显示名称匹配PATTERN的角色。 列出名称为‘j_e’所有数据库角色。 1 postgres=# \dg j?e \dl \lo_list的别名,显示一个大对象的列表。 - 列出所有的大对象。 1 postgres=# \dl \dL[S+] [PATTERN] 列出可用的程序语言。 如果指定了PATTERN,只列出名称匹配PATTERN的语言。 列出可用的程序语言。 1 postgres=# \dL \dn[S+] [PATTERN] 列出所有模式(名称空间)。如果向命令追加+,则会列出每个模式相关的权限及描述。 如果声明了PATTERN,只列出名称匹配PATTERN的模式名。缺省时,只列出用户创建的模式。 列出所有名称以d开头的模式以及相关信息。 1 postgres=# \dn+ d* \do[S] [PATTERN] 列出所有可用的操作符,以及它们的操作数和返回的数据类型。 如果声明了PATTERN,只列出名称匹配PATTERN的操作符。缺省时,只列出用户创建的操作符。 列出所有可用的操作符,以及它们的操作数和返回的数据类型。 1 postgres=# \do \dO[S+] [PATTERN] 列出排序规则。 如果声明了PATTERN,只列出名称匹配PATTERN的规则。缺省时,只列出用户创建的规则。 列出排序规则。 1 postgres=# \dO \dp [PATTERN] 列出一列可用的表、视图以及相关的权限信息。 \dp显示结果如下: rolename=xxxx/yyyy --赋予一个角色的权限 =xxxx/yyyy --赋予public的权限 xxxx表示赋予的权限,yyyy表示授予这个权限的角色。权限的参数说明请参见表5。 如果指定了PATTERN,只列出名称匹配PATTERN的表、视图。 列出一列可用的表、视图以及相关的权限信息。 1 postgres=# \dp \drds [PATTERN1 [PATTERN2]] 列出所有修改过的配置参数。这些设置可以是针对角色的、针对数据库的或者同时针对两者的。PATTERN1和PATTERN2表示要列出的角色PATTERN和数据库PATTERN。 如果声明了PATTERN,只列出名称匹配PATTERN的规则。缺省或指定*时,则会列出所有设置。 列出postgres数据库所有修改过的配置参数。 1 postgres=# \drds * postgres \dT[S+] [PATTERN] 列出所有的数据类型。 如果指定了PATTERN,只列出名称匹配PATTERN的类型。 列出所有的数据类型。 1 postgres=# \dT \du[+] [PATTERN] 列出所有数据库角色。 说明: 因为用户和群组的概念被统一为角色,所以这个命令等价于\dg。为了和以前兼容,所以保留两个命令。 如果指定了PATTERN,则只列出名称匹配PATTERN的角色。 列出所有数据库角色。 1 postgres=# \du \dE[S+] [PATTERN] \di[S+] [PATTERN] \ds[S+] [PATTERN] \dt[S+] [PATTERN] \dv[S+] [PATTERN] 这一组命令,字母E,i,s,t和v分别代表着外部表,索引,序列,表和视图。可以以任意顺序指定其中一个或者它们的组合来列出这些对象。例如:\dit列出所有的索引和表。在命令名称后面追加+,则每一个对象的物理尺寸以及相关的描述也会被列出。 如果指定了PATTERN,只列出名称匹配该PATTERN的对象。默认情况下只会显示用户创建的对象。通过PATTERN或者S修饰符可以把系统对象包括在内。 列出所有的索引和视图。 1 postgres=# \div \dx[+] [PATTERN] 列出安装数据库的扩展信息。 如果指定了PATTERN,则只列出名称匹配PATTERN的扩展信息。 列出安装数据库的扩展信息。 1 postgres=# \dx \l[+] 列出服务器上所有数据库的名称、所有者、字符集编码以及使用权限。 - 列出服务器上所有数据库的名称、所有者、字符集编码以及使用权限。 1 postgres=# \l \sf[+] FUNCNAME 显示函数的定义。 说明: 对于带圆括号的函数名,需要在函数名两端添加双引号,并且在双引号后面加上参数类型列表。参数类型列表两端添加圆括号。 - 假设存在函数function_a和函数名带圆括号的函数func()name,列出函数的定义。 1 2 3 postgres=# \sf function_a postgres=# \sf "func()name"(argtype1, argtype2) \z [PATTERN] 列出数据库中所有表、视图和序列,以及它们相关的访问特权。 如果给出任何pattern ,则被当成一个正则表达式,只显示匹配的表、视图、序列。 列出数据库中所有表、视图和序列,以及它们相关的访问特权。 1 postgres=# \z 表5 权限的参数说明 参数 参数说明 r SELECT:允许对指定的表、视图读取数据。 w UPDATE:允许对指定表更新字段。 a INSERT:允许对指定表插入数据。 d DELETE:允许删除指定表中的数据。 D TRUNCATE:允许清理指定表中的数据。 x REFERENCES:允许创建外键约束。 t TRIGGER:允许在指定表上创建触发器。 X EXECUTE:允许使用指定的函数,以及利用这些函数实现的操作符。 U USAGE: 对于过程语言,允许用户在创建函数时,指定过程语言。 对于模式,允许访问包含在指定模式中的对象。 对于序列,允许使用nextval函数。 C CREATE: 对于数据库,允许在该数据库里创建新的模式。 对于模式,允许在该模式中创建新的对象。 对于表空间,允许在其中创建表,以及允许创建数据库和模式的时候把该表空间指定为其缺省表空间。 c CONNECT:允许用户连接到指定的数据库。 T TEMPORARY:允许创建临时表。 A ALTER:允许用户修改指定对象的属性。 P DROP:允许用户删除指定的对象。 m COMMENT:允许用户定义或修改指定对象的注释。 i INDEX:允许用户在指定表上创建索引。 v VACUUM:允许用户对指定的表执行ANALYZE和VACUUM操作。 * 给前面权限的授权选项。 表6 格式化元命令 参数 参数说明 \a 对齐模式和非对齐模式之间的切换。 \C [STRING] 把正在打印的表的标题设置为一个查询的结果或者取消这样的设置。 \f [STRING] 对于不对齐的查询输出,显示或者设置域分隔符。 \H 若当前模式为文本格式,则切换为HTML输出格式。 若当前模式为HTML格式,则切换回文本格式。 \pset NAME [VALUE] 设置影响查询结果表输出的选项。NAME的取值见表7。 \t [on|off] 切换输出的字段名的信息和行计数脚注。 \T [STRING] 指定在使用HTML输出格式时放在table标签里的属性。如果参数为空,不设置。 \x [on|off|auto] 切换扩展行格式。 表7 可调节的打印选项 选项 选项说明 取值范围 border value必须是一个数字。通常这个数字越大,表的边界就越宽线就越多,但是这个取决于特定的格式。 在HTML格式下,取值范围为大于0的整数。 在其他格式下,取值范围: 0:无边框 1:内部分隔线 2:台架 expanded (或x) 在正常和扩展格式之间切换。 当打开扩展格式时,查询结果用两列显示,字段名称在左、数据在右。这个模式在数据无法放进通常的"水平"模式的屏幕时很有用。 在正常格式下,当查询输出的格式比屏幕宽时,用扩展格式。正常格式只对aligned和wrapped格式有用。 fieldsep 声明域分隔符来实现非对齐输出。这样就可以创建其他程序希望的制表符或逗号分隔的输出。要设置制表符域分隔符,键入\pset fieldsep '\t'。缺省域分隔符是'|'(竖条符)。 - fieldsep_zero 声明域分隔符来实现非对齐输出到零字节。 - footer 用来切换脚注。 - format 设置输出格式。允许使用唯一缩写(这意味着一个字母就够了)。 取值范围: unaligned:写一行的所有列在一条直线上中,当前活动字段分隔符分隔。 aligned:此格式是标准的,可读性好的文本输出。 wrapped:类似aligned,但是包装跨行的宽数据值,使其适应目标字段的宽度输出。 html:把表输出为可用于文档里的对应标记语言。输出不是完整的文档。 latex:把表输出为可用于文档里的对应标记语言。输出不是完整的文档。 troff-ms:把表输出为可用于文档里的对应标记语言。输出不是完整的文档。 null 打印一个字符串,用来代替一个null值。 缺省是什么都不打印,这样很容易和空字符串混淆。 numericlocale 切换分隔小数点左边的数值的区域相关的分组符号。 on:显示指定的分隔符。 off:不显示分隔符。 忽略此参数,显示默认的分隔符。 pager 控制查询和gsql帮助输出的分页器。如果设置了环境变量PAGER,输出将被指向到指定程序,否则使用系统缺省。 on:当输出到终端且不适合屏幕显示时,使用分页器。 off:不使用分页器。 always:当输出到终端无论是否符合屏幕显示时,都使用分页器。 recordsep 声明在非对齐输出格式时的记录分隔符。 - recordsep_zero 声明在非对齐输出到零字节时的记录分隔符。 - tableattr(或T) 声明放在html输出格式中HTML table标签的属性(例如:cellpadding或bgcolor)。注意:这里可能不需要声明border,因为已经在\pset border里用过了。如果没有给出value,则不设置表的属性。 - title 为随后打印的表设置标题。这个可以用于给输出一个描述性标签。如果没有给出value,不设置标题。 - tuples_only(或者t) 在完全显示和只显示实际的表数据之间切换。完全显示将输出像列头、标题、各种脚注等信息。在tuples_only模式下,只显示实际的表数据。 - 表8 连接元命令 参数 参数说明 取值范围 \c[onnect] [DBNAME|- USER|- HOST|- PORT|-] 连接到一个新的数据库(当前数据库为postgres)。当数据库名称长度超过63个字节时,默认前63个字节有效,连接到前63个字节对应的数据库,但是gsql的命令提示符中显示的数据库对象名仍为截断前的名称。 说明: 重新建立连接时,如果切换数据库登录用户,将可能会出现交互式输入,要求输入新用户的连接密码。该密码最长长度为999字节,受限于GUC参数password_max_length的最大值。 - \encoding [ENCODING] 设置客户端字符编码格式。 不带参数时,显示当前的编码格式。 \conninfo 输出当前连接的数据库的信息。 - 表9 操作系统元命令 参数 参数说明 取值范围 \cd [DIR] 切换当前的工作目录。 绝对路径或相对路径,且满足操作系统路径命名规则。 \setenv NAME [VALUE] 设置环境变量NAME为VALUE,如果没有给出VALUE值,则不设置环境变量。 - \timing [on|off] 以毫秒为单位显示每条SQL语句的执行时间。 on表示打开显示。 off表示关闭显示。 \! [COMMAND] 返回到一个单独的Unix shell或者执行Unix命令COMMAND。 - 表10 变量元命令 参数 参数说明 \prompt [TEXT] NAME 提示用户用文本格式来指定变量名称。 \set [NAME [VALUE]] 设置内部变量NAME为VALUE或者如果给出了多于一个值,设置为所有这些值的连接结果。如果没有给出第二个参数,只设变量不设值。 有一些常用变量被gsql特殊对待,它们是一些选项设置,通常所有特殊对待的变量都是由大写字母组成(可能还有数字和下划线)。 表11是一个所有特殊对待的变量列表。 \unset NAME 不设置(或删除)gsql变量名。 表11 \set常用命令 名称 命令说明 取值范围 \set VERBOSITY value 这个选项可以设置为值default,verbose,terse之一以控制错误报告的冗余行。 value取值范围:default,verbose,terse \set ON_ERROR_STOP value 如果设置了这个变量,脚本处理将马上停止。如果该脚本是从另外一个脚本调用的,那个脚本也会按同样的方式停止。如果最外层的脚本不是从一次交互的gsql会话中调用的而是用-f选项调用的,gsql将返回错误代码3,以示这个情况与致命错误条件的区别(错误代码为1)。 value取值范围为:on/off,true/false,yes/no,1/0 \set RETRY [retry_times] 用于控制是否开启语句出错场景下的重试功能,参数retry_times用来指定最大重试次数,缺省值为5,取值范围为5-10。当重试功能已经开启时,再次执行\set RETRY可以关闭该功能。 使用配置文件retry_errcodes.conf列举需要重试的错误码列表,该文件和gsql可执行程序位于同一级目录下。该配置文件为系统配置,非用户定义,不允许用户直接修改。 当前支持以下13类出错场景的重试: YY001:TCP通信错误,Connection reset by peer(CN和DN间通信) YY002:TCP通信错误,Connection reset by peer(DN和DN间通信) YY003:锁超时,Lock wait timeout.../wait transaction xxx sync time exceed xxx YY004:TCP通信错误,Connection timed out YY005:SET命令发送失败,ERROR SET query YY006:内存申请失败,memory is temporarily unavailable YY007:通信库错误,Memory allocate error YY008:通信库错误,No data in buffer YY009:通信库错误,Close because release memory YY010:通信库错误,TCP disconnect YY011:通信库错误,SCTP disconnect YY012:通信库错误,Stream closed by remote YY013:通信库错误,Wait poll unknown error 同时,出错时gsql会查询所有CN/DN的连接状态,当状态异常时会sleep 1分钟再进行重试,能够覆盖大部分主备切换场景下的出错重试。 说明: 不支持事务块中的语句错误重试; 不支持通过ODBC、JDBC接口查询的出错重试; 含有unlogged表的sql语句,不支持节点故障后的出错重试; 当前不支持CN和GTM节点故障时,gsql客户端的出错重试; gsql客户端本身出现的错误,不在重跑考虑范围之内; retry_times取值范围为:5-10 表12 大对象元命令 参数 参数说明 \lo_list 显示一个目前存储在该数据库里的所有GaussDB大对象和提供给他们的注释。
  • 注意事项 一个gsql元命令的格式是反斜杠后面紧跟一个动词,然后是任意参数。参数命令动词和其他参数以任意个空白字符间隔。 要在参数里面包含空白,必须用单引号把它引起来。要在这样的参数里包含单引号,可以在前面加一个反斜杠。任何包含在单引号里的内容都会被进一步进行类似C语言的替换:\n(新行)、\t(制表符)、\b(退格)、\r(回车)、\f(换页)、\digits(八进制表示的字符)、\xdigits(十六进制表示的字符)。 用""包围的内容被当做一个命令行传入shell。该命令的输出(删除了结尾的新行)被当做参数值。 如果不带引号的参数以冒号(:)开头,它会被当做一个gsql变量,并且该变量的值最终会成为真正的参数值。 有些命令以一个SQL标识的名称(比如一个表)为参数。这些参数遵循SQL语法关于双引号的规则:不带双引号的标识强制转换成小写,而双引号保护字母不进行大小写转换,并且允许在标识符中使用空白。在双引号中,成对的双引号在结果名称中分析成一个双引号。比如,FOO"BAR"BAZ解析成fooBARbaz;而"Aweird""name"解析成A weird"name。 对参数的分析在遇到另一个不带引号的反斜杠时停止。这里会认为是一个新的元命令的开始。特殊的双反斜杠序列(\\)标识参数的结尾并将继续分析后面的SQL语句(如果存在)。这样SQL和gsql命令可以自由的在一行里面混合。但是在任何情况下,一条元命令的参数不能延续超过行尾。
  • 处理数据导入错误 根据获取的错误信息,请对照下表,处理数据导入错误。 表2 处理数据导入错误 错误信息 原因 解决办法 missing data for column "r_reason_desc" 数据源文件中的列数比外表定义的列数少。 对于TEXT格式的数据源文件,由于转义字符(\)导致delimiter(分隔符)错位或者quote(引号字符)错位造成的错误。 示例:目标表存在3列字段,导入的数据如下所示。由于存在转义字符“\”,分隔符“|”被转义为第二个字段的字段值,导致第三个字段值缺失。 BE|Belgium\|1 由于列数少导致的报错,选择下列办法解决: 在数据源文件中,增加列“r_reason_desc”的字段值。 在创建外表时,将参数“fill_missing_fields”设置为“on”。即当导入过程中,若数据源文件中一行数据的最后一个字段缺失,则把最后一个字段的值设置为NULL,不报错。 对由于转义字符导致的错误,需检查报错的行中是否含有转义字符(\)。若存在,建议在创建外表时,将参数“noescaping”(是否不对'\'和后面的字符进行转义)设置为true。 extra data after last expected column 数据源文件中的列数比外表定义的列数多。 在数据源文件中,删除多余的字段值。 在创建外表时,将参数“ignore_extra_data”设置为“on”。即在导入过程中,若数据源文件比外表定义的列数多,则忽略行尾多出来的列。 invalid input syntax for type numeric: "a" 数据类型错误。 在数据源文件中,修改输入字段的数据类型。根据此错误信息,请将输入的数据类型修改为numeric。 null value in column "staff_id" violates not-null constraint 非空约束。 在数据源文件中,增加非空字段信息。根据此错误信息,请增加“staff_id”列的值。 duplicate key value violates unique constraint "reg_id_pk" 唯一约束。 删除数据源文件中重复的行。 通过设置关键字“DISTINCT”,从SELECT结果集中删除重复的行,保证导入的每一行都是唯一的。 1 postgres=# INSERT INTO reasons SELECT DISTINCT * FROM foreign_tpcds_reasons; value too long for type character varying(16) 字段值长度超过限制。 在数据源文件中,修改字段值长度。根据此错误信息,字段值长度限制为VARCHAR2(16)。
  • 示例 1 2 3 4 5 6 7 8 --创建数据表all_data postgres=# CREATE TABLE all_data(id int, role varchar(100), data varchar(100)); --创建行访问控制策略 postgres=# CREATE ROW LEVEL SECURITY POLICY all_data_rls ON all_data USING(role = CURRENT_USER); --删除行访问控制策略 postgres=# DROP ROW LEVEL SECURITY POLICY all_data_rls ON all_data;
  • 参数说明 nodename 节点名称。 取值范围:字符串,要符合标识符的命名规范。 TYPE = nodetype 指定节点的类型。 取值范围: 'coordinator' 'datanode' HOST = hostname 指定节点对应的主机名称或者IP地址。 PORT = portnum 指定节点绑定的主机端口号。 HOST1 = hostname 指定节点对应的备机名称或者IP地址。 PORT1 = portnum 指定节点绑定的备机端口号。 HOSTPRIMARY PRIMARY = boolean 声明该节点是否为主节点。主节点允许做读写操作,否则只允许读操作。 取值范围: true false(默认值) PREFERRED = boolean 声明该节点是否为读操作的首选节点。 取值范围: true false(默认值) SCTP_PORT = portnum 主机TCP代理通信库或SCTP通信库使用的数据传输通道侦听端口,使用TCP或SCTP协议侦听连接。
  • 语法格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CREATE NODE nodename WITH ( [ TYPE = nodetype,] [ HOST = hostname,] [ PORT = portnum,] [ HOST1 = 'hostname',] [ PORT1 = portnum,] [ HOSTPRIMARY [ = boolean ],] [ PRIMARY [ = boolean ],] [ PREFERRED [ = boolean ],] [ SCTP_PORT = portnum,] [ CONTROL_PORT = portnum,] [ SCTP_PORT1 = portnum,] [ CONTROL_PORT1 = portnum ] );
  • 条件表达式 在执行SQL语句时,可通过条件表达式筛选出符合条件的数据。 条件表达式主要有以下几种: CASE CASE表达式是条件表达式,类似于其他编程语言中的CASE语句。 CASE表达式的语法图请参考图1。 图1 case::= CASE子句可以用于合法的表达式中。condition是一个返回BOOLEAN数据类型的表达式: 如果结果为真,CASE表达式的结果就是符合该条件所对应的result。 如果结果为假,则以相同方式处理随后的WHEN或ELSE子句。 如果各WHEN condition都不为真,表达式的结果就是在ELSE子句执行的result。如果省略了ELSE子句且没有匹配的条件,结果为NULL。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 postgres=# CREATE TABLE tpcds.case_when_t1(CW_COL1 INT) DISTRIBUTE BY HASH (CW_COL1); postgres=# INSERT INTO tpcds.case_when_t1 VALUES (1), (2), (3); postgres=# SELECT * FROM tpcds.case_when_t1; a --- 1 2 3 (3 rows) postgres=# SELECT CW_COL1, CASE WHEN CW_COL1=1 THEN 'one' WHEN CW_COL1=2 THEN 'two' ELSE 'other' END FROM tpcds.case_when_t1 ORDER BY 1; cw_col1 | case ---------+------- 1 | one 2 | two 3 | other (3 rows) postgres=# DROP TABLE tpcds.case_when_t1; DECODE DECODE的语法图请参见图2。 图2 decode::= 将表达式base_expr与后面的每个compare(n) 进行比较,如果匹配返回相应的value(n)。如果没有发生匹配,则返回default。 示例请参见条件表达式函数。 1 2 3 4 5 postgres=# SELECT DECODE('A','A',1,'B',2,0); case ------ 1 (1 row) COALESCE COALESCE的语法图请参见图3。 图3 coalesce::= COALESCE返回它的第一个非NULL的参数值。如果参数都为NULL,则返回NULL。它常用于在显示数据时用缺省值替换NULL。和CASE表达式一样,COALESCE只计算用来判断结果的参数,即在第一个非空参数右边的参数不会被计算。 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 postgres=# CREATE TABLE tpcds.c_tabl(description varchar(10), short_description varchar(10), last_value varchar(10)) DISTRIBUTE BY HASH (last_value); postgres=# INSERT INTO tpcds.c_tabl VALUES('abc', 'efg', '123'); postgres=# INSERT INTO tpcds.c_tabl VALUES(NULL, 'efg', '123'); postgres=# INSERT INTO tpcds.c_tabl VALUES(NULL, NULL, '123'); postgres=# SELECT description, short_description, last_value, COALESCE(description, short_description, last_value) FROM tpcds.c_tabl ORDER BY 1, 2, 3, 4; description | short_description | last_value | coalesce -------------+-------------------+------------+---------- abc | efg | 123 | abc | efg | 123 | efg | | 123 | 123 (3 rows) postgres=# DROP TABLE tpcds.c_tabl; 如果description不为NULL,则返回description的值,否则计算下一个参数short_description;如果short_description不为NULL,则返回short_description的值,否则计算下一个参数last_value;如果last_value不为NULL,则返回last_value的值,否则返回(none)。 1 2 3 4 5 postgres=# SELECT COALESCE(NULL,'Hello World'); coalesce --------------- Hello World (1 row) NULLIF NULLIF的语法图请参见图4。 图4 nullif::= 只有当value1和value2相等时,NULLIF才返回NULL。否则它返回value1。 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 postgres=# CREATE TABLE tpcds.null_if_t1 ( NI_VALUE1 VARCHAR(10), NI_VALUE2 VARCHAR(10) )DISTRIBUTE BY HASH (NI_VALUE1); postgres=# INSERT INTO tpcds.null_if_t1 VALUES('abc', 'abc'); postgres=# INSERT INTO tpcds.null_if_t1 VALUES('abc', 'efg'); postgres=# SELECT NI_VALUE1, NI_VALUE2, NULLIF(NI_VALUE1, NI_VALUE2) FROM tpcds.null_if_t1 ORDER BY 1, 2, 3; ni_value1 | ni_value2 | nullif -----------+-----------+-------- abc | abc | abc | efg | abc (2 rows) postgres=# DROP TABLE tpcds.null_if_t1; 如果value1等于value2则返回NULL,否则返回value1。 1 2 3 4 5 postgres=# SELECT NULLIF('Hello','Hello World'); nullif -------- Hello (1 row) GREATEST(最大值),LEAST(最小值) GREATEST的语法图请参见图5。 图5 greatest::= 从一个任意数字表达式的列表里选取最大的数值。 1 2 3 4 5 postgres=# SELECT greatest(9000,155555,2.01); greatest ---------- 155555 (1 row) LEAST的语法图请参见图6。 图6 least::= 从一个任意数字表达式的列表里选取最小的数值。 以上的数字表达式必须都可以转换成一个普通的数据类型,该数据类型将是结果类型。 列表中的NULL值将被忽略。只有所有表达式的结果都是NULL的时候,结果才是NULL。 1 2 3 4 5 postgres=# SELECT least(9000,2); least ------- 2 (1 row) 示例请参见条件表达式函数。 NVL NVL的语法图请参见图7。 图7 nvl::= 如果value1为NULL则返回value2,如果value1非NULL,则返回value1。 示例: 1 2 3 4 5 postgres=# SELECT nvl(null,1); NVL ----- 1 (1 row) 1 2 3 4 5 postgres=# SELECT nvl ('Hello World' ,1); nvl --------------- Hello World (1 row) 父主题: 表达式
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 --创建源表及触发表 postgres=# CREATE TABLE test_trigger_src_tbl(id1 INT, id2 INT, id3 INT); postgres=# CREATE TABLE test_trigger_des_tbl(id1 INT, id2 INT, id3 INT); --创建触发器函数 postgres=# CREATE OR REPLACE FUNCTION tri_insert_func() RETURNS TRIGGER AS $$ DECLARE BEGIN INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3); RETURN NEW; END $$ LANGUAGE PLPGSQL; postgres=# CREATE OR REPLACE FUNCTION tri_update_func() RETURNS TRIGGER AS $$ DECLARE BEGIN UPDATE test_trigger_des_tbl SET id3 = NEW.id3 WHERE id1=OLD.id1; RETURN OLD; END $$ LANGUAGE PLPGSQL; postgres=# CREATE OR REPLACE FUNCTION TRI_DELETE_FUNC() RETURNS TRIGGER AS $$ DECLARE BEGIN DELETE FROM test_trigger_des_tbl WHERE id1=OLD.id1; RETURN OLD; END $$ LANGUAGE PLPGSQL; --创建INSERT触发器 postgres=# CREATE TRIGGER insert_trigger BEFORE INSERT ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_insert_func(); --创建UPDATE触发器 postgres=# CREATE TRIGGER update_trigger AFTER UPDATE ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_update_func(); --创建DELETE触发器 postgres=# CREATE TRIGGER delete_trigger BEFORE DELETE ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_delete_func(); --执行INSERT触发事件并检查触发结果 postgres=# INSERT INTO test_trigger_src_tbl VALUES(100,200,300); postgres=# SELECT * FROM test_trigger_src_tbl; postgres=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效。 --执行UPDATE触发事件并检查触发结果 postgres=# UPDATE test_trigger_src_tbl SET id3=400 WHERE id1=100; postgres=# SELECT * FROM test_trigger_src_tbl; postgres=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效 --执行DELETE触发事件并检查触发结果 postgres=# DELETE FROM test_trigger_src_tbl WHERE id1=100; postgres=# SELECT * FROM test_trigger_src_tbl; postgres=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效 --修改触发器 postgres=# ALTER TRIGGER delete_trigger ON test_trigger_src_tbl RENAME TO delete_trigger_renamed; --禁用insert_trigger触发器 postgres=# ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER insert_trigger; --禁用当前表上所有触发器 postgres=# ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER ALL; --删除触发器 postgres=# DROP TRIGGER insert_trigger ON test_trigger_src_tbl; postgres=# DROP TRIGGER update_trigger ON test_trigger_src_tbl; postgres=# DROP TRIGGER delete_trigger_renamed ON test_trigger_src_tbl;
  • 参数说明 CONSTRAINT 可选项,指定此参数将创建约束触发器,即触发器作为约束来使用。除了可以使用SET CONSTRAINTS调整触发器触发的时间之外,这与常规触发器相同。 约束触发器必须是AFTER ROW触发器。 trigger_name 触发器名称,该名称不能限定模式,因为触发器自动继承其所在表的模式,且同一个表的触发器不能重名。 对于约束触发器,使用SET CONSTRAINTS修改触发器行为时也使用此名称。 取值范围:符合标识符命名规范的字符串,且最大长度不超过63个字符。 BEFORE 触发器函数是在触发事件发生前执行。 AFTER 触发器函数是在触发事件发生后执行,约束触发器只能指定为AFTER。 INSTEAD OF 触发器函数直接替代触发事件。 event 启动触发器的事件,取值范围包括:INSERT、UPDATE、DELETE或TRUNCATE,也可以通过OR同时指定多个触发事件。 对于UPDATE事件类型,可以使用下面语法指定列: UPDATE OF column_name1 [, column_name2 ... ] 表示只有这些列作为UPDATE语句的目标列时,才会启动触发器,但是INSTEAD OF UPDATE类型不支持指定列信息。 table_name 需要创建触发器的表名称。 取值范围:数据库中已经存在的表名称。 referenced_table_name 约束引用的另一个表的名称。 只能为约束触发器指定,常见于外键约束。由于当前不支持外键,因此不建议使用。 取值范围:数据库中已经存在的表名称。 DEFERRABLE | NOT DEFERRABLE 约束触发器的启动时机,仅作用于约束触发器。这两个关键字设置该约束是否可推迟。 详细介绍请参见CREATE TABLE。 INITIALLY IMMEDIATE | INITIALLY DEFERRED 如果约束是可推迟的,则这个子句声明检查约束的缺省时间,仅作用于约束触发器。 详细介绍请参见CREATE TABLE。 FOR EACH ROW | FOR EACH STATEMENT 触发器的触发频率。 FOR EACH ROW是指该触发器是受触发事件影响的每一行触发一次。 FOR EACH STATEMENT是指该触发器是每个SQL语句只触发一次。 未指定时默认值为FOR EACH STATEMENT。约束触发器只能指定为FOR EACH ROW。 condition 决定是否实际执行触发器函数的条件表达式。当指定WHEN时,只有在条件返回true时才会调用该函数。 在FOR EACH ROW触发器中,WHEN条件可以通过分别写入OLD.column_name或NEW.column_name来引用旧行或新行值的列。 当然,INSERT触发器不能引用OLD和DELETE触发器不能引用NEW。 INSTEAD OF触发器不支持WHEN条件。 WHEN表达式不能包含子查询。 对于约束触发器,WHEN条件的评估不会延迟,而是在执行更新操作后立即发生。 如果条件返回值不为true,则触发器不会排队等待延迟执行。 function_name 用户定义的函数,必须声明为不带参数并返回类型为触发器,在触发器触发时执行。 arguments 执行触发器时要提供给函数的可选的以逗号分隔的参数列表。参数是文字字符串常量,简单的名称和数字常量也可以写在这里,但它们都将被转换为字符串。 请检查触发器函数的实现语言的描述,以了解如何在函数内访问这些参数。 关于触发器种类: INSTEAD OF的触发器必须标记为FOR EACH ROW,并且只能在视图上定义。 BEFORE和AFTER触发器作用在视图上时,只能标记为FOR EACH STATEMENT。 TRUNCATE类型触发器仅限FOR EACH STATEMENT。 表1 表和视图上支持的触发器种类: 触发时机 触发事件 行级 语句级 BEFORE INSERT/UPDATE/DELETE 表 表和视图 TRUNCATE 不支持 表 AFTER INSERT/UPDATE/DELETE 表 表和视图 TRUNCATE 不支持 表 INSTEAD OF INSERT/UPDATE/DELETE 视图 不支持 TRUNCATE 不支持 不支持 表2 PLPGSQL类型触发器函数特殊变量: 变量名 变量含义 NEW INSERT及UPDATE操作涉及tuple信息中的新值,对DELETE为空。 OLD UPDATE及DELETE操作涉及tuple信息中的旧值,对INSERT为空。 TG_NAME 触发器名称。 TG_WHEN 触发器触发时机(BEFORE/AFTER/INSTEAD OF)。 TG_LEVEL 触发频率(ROW/STATEMENT)。 TG_OP 触发操作(INSERT/UPDATE/DELETE/TRUNCATE)。 TG_RELID 触发器所在表OID。 TG_RELNAME 触发器所在表名(已废弃,现用TG_TABLE_NAME替代)。 TG_TABLE_NAME 触发器所在表名。 TG_TABLE_SCHEMA 触发器所在表的SCHEMA信息。 TG_NARGS 触发器函数参数个数。 TG_ARGV[] 触发器函数参数列表。
  • 语法格式 1 2 3 4 5 6 7 CREATE [ CONSTRAINT ] TRIGGER trigger_name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] } ON table_name [ FROM referenced_table_name ] { NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } } [ FOR [ EACH ] { ROW | STATEMENT } ] [ WHEN ( condition ) ] EXECUTE PROCEDURE function_name ( arguments ); 其中event包含以下几种: 1 2 3 4 INSERT UPDATE [ OF column_name [, ... ] ] DELETE TRUNCATE
  • 注意事项 当前仅支持在普通行存表上创建触发器,不支持在列存表、临时表、unlogged表等类型表上创建触发器。 如果为同一事件定义了多个相同类型的触发器,则按触发器的名称字母顺序触发它们。 触发器常用于多表间数据关联同步场景,对SQL执行性能影响较大,不建议在大数据量同步及对性能要求高的场景中使用。 当触发器满足如下条件时,触发语句能和触发器一起下推到DN执行并提升触发器执行性能: 开关enable_trigger_shipping和enable_fast_query_shipping开启。 源表触发器使用的触发器函数为plpgsql类型(推荐类型)。 源表与触发表分布键的类型、数量完全相同,均为行存表,且所属相同的nodegroup。 原INSERT/UPDATE/DELETE语句条件中包含所有分布键与NEW/OLD等值比较表达式。 原INSERT/UPDATE/DELETE语句在没有触发器的情况下原本就能query shipping。 源表上只有INSERT BEFORE FOR EACH ROW/INSERT AFTER FOR EACH ROW/UPDATE BEFORE FOR EACH ROW/UPDATE AFTER FOR EACH ROW/DELETE BEFORE FOR EACH ROW/DELETE AFTER FOR EACH ROW六类触发器,且所有触发器都可下推。 INSERT ON DUPLICATE KEY UPDATE语句无法触发触发器。 执行触发器语句时是用触发器创建者的身份进行权限判断的。 执行创建触发器操作的用户需要拥有指定表的TRIGGER权限。
  • 示例 以把一个查询分成多行输入为例。注意提示符的变化: 1 2 3 4 5 postgres=# CREATE TABLE HR.areaS( postgres(# area_ID NUMBER, postgres(# area_NAME VARCHAR2(25) postgres-# )tablespace EXAMPLE; CREATE TABLE 查看表的定义: 1 2 3 4 5 6 postgres=# \d HR.areaS Table "hr.areas" Column | Type | Modifiers -----------+-----------------------+----------- area_id | numeric | not null area_name | character varying(25) | 向HR.areaS表插入四行数据: 1 2 3 4 5 6 7 8 postgres=# INSERT INTO HR.areaS (area_ID, area_NAME) VALUES (1, 'Europe'); INSERT 0 1 postgres=# INSERT INTO HR.areaS (area_ID, area_NAME) VALUES (2, 'Americas'); INSERT 0 1 postgres=# INSERT INTO HR.areaS (area_ID, area_NAME) VALUES (3, 'Asia'); INSERT 0 1 postgres=# INSERT INTO HR.areaS (area_ID, area_NAME) VALUES (4, 'Middle East and Africa'); INSERT 0 1 切换提示符: 1 2 postgres=# \set PROMPT1 '%n@%m %~%R%#' root@[local] postgres=# 查看表: 1 2 3 4 5 6 7 8 root@[local] postgres=#SELECT * FROM HR.areaS; area_id | area_name ---------+------------------------ 1 | Europe 4 | Middle East and Africa 2 | Americas 3 | Asia (4 rows) 可以用\pset命令以不同的方法显示表: 1 2 3 4 5 6 7 8 9 10 11 12 root@[local] postgres=#\pset border 2 Border style is 2. root@[local] postgres=#SELECT * FROM HR.areaS; +---------+------------------------+ | area_id | area_name | +---------+------------------------+ | 1 | Europe | | 2 | Americas | | 3 | Asia | | 4 | Middle East and Africa | +---------+------------------------+ (4 rows) 1 2 3 4 5 6 7 8 9 10 root@[local] postgres=#\pset border 0 Border style is 0. root@[local] postgres=#SELECT * FROM HR.areaS; area_id area_name ------- ---------------------- 1 Europe 2 Americas 3 Asia 4 Middle East and Africa (4 rows) 使用元命令: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 root@[local] postgres=#\a \t \x Output format is unaligned. Showing only tuples. Expanded display is on. root@[local] postgres=#SELECT * FROM HR.areaS; area_id|2 area_name|Americas area_id|1 area_name|Europe area_id|4 area_name|Middle East and Africa area_id|3 area_name|Asia root@[local] postgres=#
  • 操作步骤 使用gsql连接到GaussDB实例。 gsql工具使用-d参数指定目标数据库名、-U参数指定数据库用户名、-h参数指定主机名、-p参数指定端口号信息。 若未指定数据库名称,则使用初始化时默认生成的数据库名称;若未指定数据库用户名,则默认使用当前操作系统用户作为数据库用户名;当某个值没有前面的参数(-d、-U等)时,若连接的命令中没有指定数据库名(-d)则该参数会被解释成数据库名;如果已经指定数据库名(-d)而没有指定数据库用户名(-U)时,该参数则会被解释成数据库用户名。 示例,使用jack用户连接到远程主机postgres数据库的8000端口。 gsql -h 10.180.123.163 -d postgres -U jack -p 8000 详细的gsql参数请参见命令参考。 执行SQL语句。 以创建数据库human_staff为例。 1 2 CREATE DATABASE human_staff; CREATE DATABASE 通常,输入的命令行在遇到分号的时候结束。如果输入的命令行没有错误,结果就会输出到屏幕上。 执行gsql元命令。 以列出GaussDB中所有的数据库和描述信息为例。 1 2 3 4 5 6 7 8 9 10 11 12 postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges ----------------+----------+-----------+---------+-------+----------------------- human_resource | root | SQL_ASCII | C | C | postgres | root | SQL_ASCII | C | C | template0 | root | SQL_ASCII | C | C | =c/root + | | | | | root=CTc/root template1 | root | SQL_ASCII | C | C | =c/root + | | | | | root=CTc/root human_staff | root | SQL_ASCII | C | C | (5 rows) 更多gsql元命令请参见元命令参考。
  • 注意事项 当前会话的用户必须是指定的rolename角色的成员,但三权分立关闭时,系统管理员可以选择任何角色。 使用这条命令,它可能会增加一个用户的权限,也可能会限制一个用户的权限。如果会话用户的角色有INHERITS属性,则它自动拥有它能SET ROLE变成的角色的所有权限;在这种情况下,SET ROLE实际上是删除了所有直接赋予会话用户的权限,以及它的所属角色的权限,只剩下指定角色的权限。另一方面,如果会话用户的角色有NOINHERITS属性,SET ROLE删除直接赋予会话用户的权限,而获取指定角色的权限。
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 --创建角色paul。 postgres=# CREATE ROLE paul IDENTIFIED BY 'xxxxxxxxxx'; --设置当前用户为paul。 postgres=# SET ROLE paul PASSWORD 'xxxxxxxxxx'; --查看当前会话用户,当前用户。 postgres=# SELECT SESSION_USER, CURRENT_USER; --重置当前用户。 postgres=# RESET role; --删除用户。 postgres=# DROP USER paul;
  • 接口介绍 高级功能包DBE_RANDOM支持的所有接口请参见表 DBE_RANDOM接口参数说明。 表1 DBE_RANDOM接口参数说明 接口名称 描述 DBE_RANDOM.SET_SEED 设置一个随机数的种子。 DBE_RANDOM.GET_VALUE 生成一个大小介于指定的low及high之间的随机数。 DBE_RANDOM.SET_SEED 存储过程SEED用于设置一个随机数的种子。DBE_RANDOM.SET_SEED函数原型为: 1 DBE_RANDOM.SET_SEED (seed IN INTEGER); 表2 DBE_RANDOM.SET_SEED接口参数说明 参数 描述 seed 用于产生一个随机数的种子。 DBE_RANDOM.GET_VALUE 存储过程VALUE生成一个大小介于指定的low及high之间的随机数。DBE_RANDOM.GET_VALUE函数原型为: 1 2 3 4 DBE_RANDOM.GET_VALUE( min IN NUMBER, max IN NUMBER) RETURN NUMBER; 表3 DBE_RANDOM.GET_VALUE接口参数说明 参数 描述 min 指定随机数大小的下边界,生成的随机数大于或等于min。 max 指定随机数大小的上边界,生成的随机数小于max。 实际上,只要求这里的参数类型是NUMERIC即可,对于左右边界的大小并没有要求。
  • 注意事项 新序列值的产生是靠GTM维护的,默认情况下,每申请一个序列值都要向GTM发送一次申请,GTM在当前值的基础上加上步长值作为产生的新值返回给调用者。GTM作为全局唯一的节点,势必成为性能的瓶颈,所以对于需要大量频繁产生序列号的操作,如使用Bulkload工具进行数据导入场景,是非常不推荐产生默认序列值的。比如,在下面所示的场景中, INSERT FROM SELECT语句的性能会非常慢。 1 2 3 4 5 6 7 postgres=# CREATE SEQUENCE newSeq1; postgres=# CREATE TABLE newT1 ( id int not null default nextval('newSeq1'), name text ); postgres=# INSERT INTO newT1(name) SELECT name from T1; 可以提高性能的写法是(假设T1表导入newT1表中的数据为10000行): 1 2 postgres=# INSERT INTO newT1(id, name) SELECT id,name from T1; postgres=# SELECT SETVAL('newSeq1',10000); 序列操作函数nextval(),setval() 等均不支持回滚。另外setval设置的新值,会对当前会话的nextval立即生效,但对其他会话,如果定义了cache,不会立即生效,在用尽所有缓存的值后,其变动才被其他会话感知。所以为了避免产生重复值,要谨慎使用setval,设置的新值不能是已经产生的值或者在缓存中的值。 如果必须要在bulkload场景下产生默认序列值,则一定要为newSeq1定义足够大的cache,并且不要定义Maxvalue或者Minvalue。数据库会试图将nextval('sequence_name')的调用下推到Data Node,以提高性能。 目前GTM对并发的连接请求是有限制的,当Data Node很多时,将产生大量并发连接, 这时一定要控制bulkload的并发数目,避免耗尽GTM的连接资源。如果目标表为复制表(DISTRIBUTE BY REPLICATION)时下推将不能进行。当数据量较大时,这对数据库将是个灾难。除了性能问题之外,空间也可能会剧烈膨胀,在导入结束后,需要用vacuum full来恢复。推荐采用如上建议,不要在bulkload的场景中产生默认序列值。 另外,序列创建后,在每个节点上都维护了一张单行表,存储序列的定义及当前值,但此当前值并非GTM上的当前值,只是保存本节点与GTM交互后的状态。如果其他节点也向GTM申请了新值,或者调用了Setval修改了序列的状态,不会刷新本节点的单行表,但因每次申请序列值是向GTM申请,所以对序列正确性没有影响。
  • 背景信息 序列Sequence是用来产生唯一整数的数据库对象。序列的值是按照一定规则自增的整数。因为自增所以不重复,因此说Sequence具有唯一标识性。这也是Sequence常被用作主键的原因。 通过序列使某字段成为唯一标识符的方法有两种: 一种是声明字段的类型为序列整型,由数据库在后台自动创建一个对应的Sequence。 另一种是使用CREATE SEQUENCE自定义一个新的Sequence,然后将nextval('sequence_name')函数读取的序列值,指定为某一字段的默认值,这样该字段就可以作为唯一标识符。
  • 操作步骤 方法一: 声明字段类型为序列整型来定义标识符字段。例如: 1 2 3 4 5 postgres=# CREATE TABLE T1 ( id serial, name text ); 当结果显示为如下信息,则表示创建成功。 1 CREATE TABLE 方法二: 创建序列,并通过nextval('sequence_name')函数指定为某一字段的默认值。这种方式更灵活,可以为序列定义cache,一次预申请多个序列值,减少与GTM的交互次数,来提高性能。 创建序列 1 postgres=# CREATE SEQUENCE seq1 cache 100; 当结果显示为如下信息,则表示创建成功。 1 CREATE SEQUENCE 指定为某一字段的默认值,使该字段具有唯一标识属性。 1 2 3 4 5 postgres=# CREATE TABLE T2 ( id int not null default nextval('seq1'), name text ); 当结果显示为如下信息,则表示默认值指定成功。 1 CREATE TABLE 指定序列与列的归属关系。 将序列和一个表的指定字段进行关联。这样,在删除那个字段或其所在表的时候会自动删除已关联的序列。 1 postgres=# ALTER SEQUENCE seq1 OWNED BY T2.id; 当结果显示为如下信息,则表示指定成功。 1 ALTER SEQUENCE 除了为序列指定了cache,方法二所实现的功能基本与方法一类似。但是一旦定义cache,序列将会产生空洞(序列值为不连贯的数值,如:1.4.5),并且不能保序。另外为某序列指定从属列后,该列删除,对应的sequence也会被删除。 虽然数据库并不限制序列只能为一列产生默认值,但建议不要多列共用同一个序列。 当前版本只支持在定义表的时候指定自增列,或者指定某列的默认值为nextval('seqname'), 不支持在已有表中增加自增列或者增加默认值为nextval('seqname')的列。
  • 数据导入和查询的并发 事务T1: 1 2 3 START TRANSACTION; COPY test FROM '...'; COMMIT; 事务T2: 1 2 3 START TRANSACTION; SELECT * FROM test; COMMIT; 场景1: 开启事务T1,不提交的同时开启事务T2,事务T1开始执行COPY,事务T2开始执行SELECT,事务T1和事务T2都执行成功。事务T2中查询看不到事务T1新COPY进来的数据。 场景2: READ COMMITTED级别 开启事务T1,不提交的同时开启事务T2,事务T1开始执行COPY,然后提交,事务T2查询,可以看到事务T1中COPY的数据。 REPEATABLE READ级别 开启事务T1,不提交的同时开启事务T2,事务T1开始执行COPY,然后提交,事务T2 查询,看不到事务T1中COPY的数据。 父主题: 并发写入示例
  • 操作步骤 收集数据源格式信息、GDS服务的访问信息。 需要收集的主要数据源格式信息如下: format:GDS外表导入支持CSV、TEXT和FIXED格式。请确认存放在数据服务器上待入库数据的格式。例如,假设待入库的数据为CSV格式。 header(仅支持CSV,FIXED格式):确认数据文件是否包含标题行。 delimiter:确认数据文件中,字段间的分隔符。例如,假设是以英文逗号分隔的。 encoding:数据源文件的数据编码格式。例如,假设为UTF-8。 eol:确认数据文件中,行间的换行符。例如,默认的换行符,如0x0D0A、0X0A,或者自定义的换行符,如字符串!@#。该参数仅支持TEXT格式导入。 外表可识别的其他更多格式信息请参见数据格式参数。 需要收集的GDS服务的访问信息如下: location:GDS服务的访问地址。例如以安装配置和启动GDS中的GDS信息为例。非SSL模式下的location为:gsfs://192.168.0.90:5000/input_data/ 。SSL模式下的location为:gsfss://192.168.0.90:5000/input_data/ 。其中,“192.168.0.90:5000”为GDS服务的IP及端口号;“input_data”为GDS服务管理的数据源文件所在的路径。请根据实际情况替换。 依据数据源文件中的数据情况,设计导入容错机制。 GaussDB支持如下的数据容错性处理,相当于数据入库前对数据做初步的简单清洗。 fill_missing_fields:数据入库时,数据源文件中某行的最后一个字段缺失时,请选择是直接将字段设为Null,还是在错误表中报错提示。 ignore_extra_data:数据源文件中的字段比外表定义列数多时,请选择是忽略多出的列,还是在错误表中报错提示。 per node reject_limit:本次数据导入过程中每个DN实例上允许出现的数据格式错误的数量。如果有一个DN实例上录入错误表中的错误数量超过设定值时,本次导入失败,报错退出。可以选择不做限制,也可以根据所能容忍的错误数量选择一个上限值。 compatible_illegal_chars:导入时遇到非法字符,选择如何处理。是将非法字符按照转换规则转换后入库,还是报错中止导入。 非法字符容错转换规则如下: 对于'\0',容错后转换为空格。 对于其他非法字符,容错后转换为问号。 对非法字符进行容错转换时,如遇NULL、DELIMITER、QUOTE、ESCAPE也设置成了空格或问号,GaussDB会通过如"illegal chars conversion may confuse COPY escape 0x20"等报错信息提示用户修改可能引起混淆的参数以避免导入错误。 error_table_name:用于记录数据格式错误信息的错误表表名。并行导入结束后查询此错误信息表,能够获取详细的错误信息。 remote log 'name':数据导入过程中的数据格式错误信息是否同时在GDS服务器上以文件方式保存。name为错误数据文件的文件名前缀。 关于容错性参数的更多信息请参考容错性参数。 使用gsql连接数据库后,根据前面步骤所收集和规划的信息参数,创建GDS外表。 示例如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 postgres=# CREATE FOREIGN TABLE foreign_tpcds_reasons ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ) SERVER gsmpp_server OPTIONS ( LOCATION 'gsfs://192.168.0.90:5000/input_data | gsfs://192.168.0.91:5000/input_data', FORMAT 'CSV' , DELIMITER ',', ENCODING 'utf8', HEADER 'false', FILL_MISSING_FIELDS 'true', IGNORE_EXTRA_DATA 'true' ) LOG INTO product_info_err PER NODE REJECT LIMIT 'unlimited'; 示例中的各项说明如下: 外表字段需与数据库中即将存储数据的目标表保持一致。 对于GDS导入,SERVER gsmpp_server请保持不变。 location参数请根据1中收集的GDS服务访问信息修改。注意GDS使用SSL加密传输时,需要将“gsfs”替换为“gsfss”。 FORMAT、DELIMITER、ENCODING、HEADER请根据1中收集的数据源格式信息填写。 FILL_MISSING_FIELDS、IGNORE_EXTRA_DATA、LOG INTO及PER NODE REJECT LIMIT请根据2中设计的导入容错机制填写。注意LOG INTO是指将数据格式错误录入哪个错误表,即其取值为错误表表名。 CREATE FOREIGN TABLE语法的更多信息,请参考CREATE FOREIGN TABLE (导入导出)。
  • 任务示例 除了以下示例,更多外表创建的示例请参考示例。 示例1:创建GDS外表foreign_tpcds_reasons,数据格式为CSV。 1 2 3 4 5 6 7 postgres=# CREATE FOREIGN TABLE foreign_tpcds_reasons ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*', FORMAT 'CSV',MODE 'Normal', ENCODING 'utf8', DELIMITER E'\x08', QUOTE E'\x1b', NULL ''); 示例2:创建GDS导入外表foreign_tpcds_reasons_SSL,使用SSL加密传输的模式传输,数据格式为CSV。 1 2 3 4 5 6 7 postgres=# CREATE FOREIGN TABLE foreign_tpcds_reasons_SSL ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ) SERVER gsmpp_server OPTIONS (location 'gsfss://192.168.0.90:5000/* | gsfss://192.168.0.91:5000/*', FORMAT 'CSV',MODE 'Normal', ENCODING 'utf8', DELIMITER E'\x08', QUOTE E'\x1b', NULL ''); 示例3:创建GDS外表foreign_tpcds_reasons,数据格式为TEXT。 1 2 3 4 5 6 postgres=# CREATE FOREIGN TABLE foreign_tpcds_reasons ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*', FORMAT 'TEXT', delimiter E'\x08', null '',reject_limit '2',EOL '0x0D') WITH err_foreign_tpcds_reasons; 示例4:创建GDS外表foreign_tpcds_reasons,数据格式为FIXED。 1 2 3 4 5 6 postgres=# CREATE FOREIGN TABLE foreign_tpcds_reasons ( r_reason_sk integer position(1,2), r_reason_id char(16) position(3,16), r_reason_desc char(100) position(19,100) ) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/*', FORMAT 'FIXED', ENCODING 'utf8',FIX '119');
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 //以下用例以gsjdbc4.jar为例。 //以下代码将获取数据库连接操作封装为一个接口,可通过给定用户名和密码来连接数据库。 public static Connection getConnect(String username, String passwd) { //驱动类。 String driver = "org.postgresql.Driver"; //数据库连接描述符。 String sourceURL = "jdbc:postgresql://$ip:$port/postgres"; Connection conn = null; try { //加载驱动。 Class.forName(driver); } catch( Exception e ) { e.printStackTrace(); return null; } try { //创建连接。 conn = DriverManager.getConnection(sourceURL, username, passwd); System.out.println("Connection succeed!"); } catch(Exception e) { e.printStackTrace(); return null; } return conn; }; // 以下代码将使用Properties对象作为参数建立连接 public static Connection getConnectUseProp(String username, String passwd) { //驱动类。 String driver = "org.postgresql.Driver"; //数据库连接描述符。 String sourceURL = "jdbc:postgresql://$ip:$port/postgres?autoBalance=true"; Connection conn = null; Properties info = new Properties(); try { //加载驱动。 Class.forName(driver); } catch( Exception e ) { e.printStackTrace(); return null; } try { info.setProperty("user", username); info.setProperty("password", passwd); //创建连接。 conn = DriverManager.getConnection(sourceURL, info); System.out.println("Connection succeed!"); } catch(Exception e) { e.printStackTrace(); return null; } return conn; };
  • 参数 表1 数据库连接参数 参数 描述 url gsjdbc4.jar数据库连接描述符。格式如下: jdbc:postgresql:(数据库名称缺省则与用户名一致) jdbc:postgresql:database jdbc:postgresql://host/database(端口值缺省会使用默认端口) jdbc:postgresql://host:port/database jdbc:postgresql://host:port/database?param1=value1¶m2=value2 jdbc:postgresql://host1:port1,host2:port2/database?param1=value1¶m2=value2 说明: 使用gsjdbc200.jar时,将“jdbc:postgresql”修改为“jdbc:gaussdb” database为要连接的数据库名称。 host为数据库服务器名称或IP地址。 由于安全原因,数据库CN禁止集群内部其他节点无认证接入。如果要在集群内部访问CN,请将JDBC程序部署在CN所在机器,host使用"127.0.0.1"。否则可能会出现“FATAL: Forbid remote connection with trust method!”错误。 建议业务系统单独部署在集群外部,否则可能会影响数据库运行性能。 缺省情况下,连接服务器为localhost。 port为数据库服务器端口。 缺省情况下,会尝试连接到5431端口的database。 param为参数名称,即数据库连接属性。 参数可以配置在URL中,以"?"开始配置,以"="给参数赋值,以"&"作为不同参数的间隔。也可以采用info对象的属性方式进行配置,详细示例会在本节给出。 value为参数值,即数据库连接属性值。 连接时需配置connectTimeout和socketTimeout,推荐配置为2(如果未配置,默认为0,即不会超时)。在DN与客户端出现网络故障时,客户端一直未收到DN侧ACK确认报文,会启动超时重传机制,不断的进行重传。当超时时间达到系统默认的600s后才会报超时错误,这也就会导致RTO时间很高。 info 数据库连接属性(所有属性大小写敏感)。常用的属性如下: PGDBNAME:String类型。表示数据库名称(URL中无需配置该参数,自动从URL中解析)。 PGHOST:String类型。主机IP地址。若配置多个CN,它们的IP和端口用“:”分隔,并作为整体以逗号分隔其他CN(URL中无需配置该参数,自动从URL中解析)。详细示例见下。 PGPORT:Integer类型。主机端口号。若配置多个CN,它们的端口号和IP用":"分割,并作为整体以逗号分隔其他CN(URL中无需配置该参数,自动从URL中解析)。详细示例见下。 user:String类型。表示创建连接的数据库用户。 password:String类型。表示数据库用户的密码。 loggerLevel:String类型。目前支持4种级别:OFF、INFO、DEBUG、TRACE。设置为OFF关闭日志。设置为INFO、DEBUG和TRACE记录的日志信息详细程度不同。 loggerFile:String类型。用于指定日志输出路径(目录和文件名)。若只指定文件名,未指定目录则日志生成在客户端运行程序目录;若不配置或配置的路径不存在,则日志会默认通过流输出。 logger:String类型。表示JDBC Driver要使用的日志输出框架。JDBC Driver支持对接用户应用程序使用的日志输出框架。目前仅支持第三方的基于Slf4j-API的日志框架。具体使用方式,见6.2.9日志管理。 如果不设置或设置为JDK LOGGER,则JDBC Driver使用使用JDK LOGGER。 否则必须设置采用基于slf4j-API 第三方日志框架。 allowEncodingChanges:Boolean类型。设置该参数值为“true”进行字符集类型更改,配合characterEncoding=CHARSET设置字符集,二者使用"&"分隔。 currentSchema:String类型。在search-path中指定要设置的schema。 loadBalanceHosts:Boolean类型。在默认模式下(禁用),顺序连接URL中指定的多个主机。如果启用,则使用洗牌算法从候选主机中随机选择一个主机建立连接。 autoBalance:String类型。 设置为true或balance或roundrobin表示开启JDBC负载均衡功能,将应用程序的多个连接均衡到数据库集群中的各个可用CN。 例如:jdbc:postgresql://host1:port1,host2:port2/database?autoBalance=true JDBC将定期获取(周期刷新可使用参数refreshCNIpListTime配置,默认为10s)整个集群可用CN列表,比如获取到的列表为:host1:port1,host2:port2,host3:port3,host4:port4。 host1和host2在autoBalance启用时,仅在首次连接做高可用用途,后续Driver将从host1,host2,host3,host4中依次选择可用的CN刷新可用CN列表,后续用户新建的connection将使用RoundRobin算法从host1,host2,host3,host4选取CN主机进行连接。 设置为priorityn表示开启JDBC优先级负载均衡功能,将应用程序的多个连接首先均衡到url上配置的前n个中可用的CN数据库主节点,当url上配置前n个主节点全部不可用时,连接会随机分配到数据库集群中其他可用CN数据库主节点。n为数字,不小于0,且小于url上配置的CN数量。 例如:jdbc:postgresql://host1:port1,host2:port2,host3:port3,host4:port4/database?autoBalance=priority2 JDBC将定期获取(周期按refreshCNIpListTime定义)整个集群可用CN列表,比如获取到的列表为:host1:port1,host2:port2,host3:port3,host4:port4,host5:port5,host6:port6,其中host1和host2处于AZ1,host3和host4处于AZ2。 Driver将从优先从host1,host2中做负载均衡,host1和host2全部不可用才从host3, host4, host5, host6中随机选择CN主机连接。 设置为shuffle表示开启JDBC随机负载均衡功能,将应用程序的多个连接随机均衡到数据库集群中的各个可用CN。 例如:jdbc:postgresql://host1:port1,host2:port2,host3:port3/database?autoBalance=shuffle JDBC将定期获取(周期刷新可使用参数refreshCNIpListTime配置,默认为10S)整个集群的可用CN列表,比如获取到的列表为:host1:port1,host2:port2,host3:port3,host4:port4。 host1:port1,host2:port2,host3:port3,仅在首次连接做高可用,后续连接将在刷新后的CN列表中,使用shuffle算法随机选用一个CN节点进行连接。 设置为false,不开启JDBC负载均衡功能和优先级负载均衡功能。默认为false。 注意: 负载均衡是基于连接级别,不是基于事务级别。如果连接是长连接,并且连接上的负载不均衡,无法保证CN主机上的负载是均衡的。 负载均衡仅能在分布式场景下使用,集中式环境中不可使用。 使用priorityn做负载均衡时,连接串中IP需要和pgxc_node表中CN的node_host保持一致,否则无法实现优先级负载均衡功能。 查询集群中可用CN的IP和PORT,可使用此语句:“select node_host,node_port from pgxc_node where node_type='C' and nodeis_active = true;” refreshCNIpListTime:Integer类型。JDBC定期检测数据库集群中CN状态,获取可用CN的IP列表的时间间隔,默认为10秒。 hostRecheckSeconds:Integer类型。JDBC尝试连接主机后会保存主机状态:连接成功或连接失败。在hostRecheckSeconds时间内保持可信,超过则状态失效。缺省值是10秒。 ssl:Boolean类型。以SSL方式连接。 ssl=true可支持NonValidatingFactory通道和使用证书的方式: 1、NonValidatingFactory通道需要配置用户名和密码,同时将SSL设置为true。 2、配置客户端证书、密钥、根证书,将SSL设置为true。 sslmode:String类型。SSL认证方式。取值范围为:require、verify-ca、verify-full。 require只尝试SSL连接,不会检查服务器证书是否由受信任的CA签发,且不会检查服务器主机名与证书中的主机名是否一致。 verify-ca只尝试SSL连接,并且验证服务器是否具有由可信任的证书机构签发的证书。 verify-full只尝试SSL连接,并且验证服务器是否具有由可信任的证书机构签发的证书,以及验证服务器主机名是否与证书中的一致。 sslcert:String类型。提供证书文件的完整路径。客户端和服务端证书的类型为End Entity。 sslkey:String类型。提供密钥文件的完整路径。 sslrootcert:String类型。SSL根证书的文件名。根证书的类型为CA。 sslpassword:String类型。提供给ConsoleCallbackHandler使用。 sslpasswordcallback:String类型。SSL密码提供者的类名。缺省值:org.postgresql.ssl.jdbc4.LibPQFactory.ConsoleCallbackHandler。 sslfactory:String类型。提供的值是SSLSocketFactory在建立SSL连接时用的类名。 sslprivatekeyfactory: String类型。提供的值是实现私钥解密方法的接口org.postgresql.ssl.PrivateKeyFactory的实现类的完整限定类名。如果不提供,首先尝试默认的jdk私钥解密算法,如果无法解密,则使用org.postgresql.ssl.BouncyCastlePrivateKeyFactory,用户需要自己提供bcpkix-jdk15on.jar包,版本建议:1.65以上。 sslfactoryarg:String类型。此值是上面提供的sslfactory类的构造函数的可选参数(不推荐使用本参数)。 sslhostnameverifier:String类型。主机名验证程序的类名。接口实现javax.net.ssl.HostnameVerifier,默认使用org.postgresql.ssl.PGjdbcHostnameVerifier。 loginTimeout:Integer类型。指建立数据库连接的等待时间。超时时间单位为秒。 connectTimeout:Integer类型。用于连接服务器操作的超时值。如果连接到服务器花费的时间超过此值,则连接断开。超时时间单位为秒,值为0时表示已禁用,timeout不发生。 socketTimeout:Integer类型。用于socket读取操作的超时值。如果从服务器读取所花费的时间超过此值,则连接关闭。超时时间单位为秒,值为0时表示已禁用,timeout不发生。 cancelSignalTimeout:Integer类型。发送取消消息本身可能会阻塞,此属性控制用于取消命令的“connect超时”和“socket超时”。超时时间单位为秒,默认值为10秒。 tcpKeepAlive:Boolean类型。启用或禁用TCP保活探测功能。默认为false。 logUnclosedConnections:Boolean类型。客户端可能由于未调用Connection对象的close()方法而泄漏Connection对象。最终这些对象将被垃圾回收,并且调用finalize()方法。如果调用者自己忽略了此操作,该方法将关闭Connection。 assumeMinServerVersion(废弃):String类型。该参数设置要连接的服务器版本。 ApplicationName:String类型。设置正在使用连接的应用程序名称。通过在CN上查询pgxc_stat_activity表可以看到正在连接的客户端信息,显示在application_name列。缺省值为PostgreSQL JDBC Driver。 connectionExtraInfo:Boolean类型。表示驱动是否上报当前驱动的部署路径、进程属主用户到数据库。 取值范围:true或false,默认值为false。设置connectionExtraInfo为true,JDBC驱动会将当前驱动的部署路径、进程属主用户上报到数据库中,记录在connection_info参数里;同时可以在PG_STAT_ACTIVITY和PGXC_STAT_ACTIVITY中查询到。 autosave:String类型。共有3种:"always", "never", "conservative"。如果查询失败,指定驱动程序应该执行的操作。在autosave=always模式下,JDBC驱动程序在每次查询之前设置一个保存点,并在失败时回滚到该保存点。在autosave=never模式(默认)下,无保存点。在autosave=conservative模式下,每次查询都会设置保存点,但是只会在“statement XXX无效”等情况下回滚并重试。 protocolVersion:Integer类型。连接协议版本号,目前仅支持3。注意:设置该参数时将采用md5加密方式,需要同步修改数据库的加密方式:修改password_encryption_type=1:即设置"password_encryption_type=1 ,重启集群生效后需要创建用md5方式加密口令的用户。同时修改pg_hba.conf,将客户端连接方式修改为md5。用新建用户进行登录(因为设置这个值后,只能使用低等级的加密方式(md5),降低安全性,所以此值不推荐设置)。 说明: MD5加密算法安全性低,存在安全风险,建议使用更安全的加密算法。 prepareThreshold:Integer类型。该值决定着PreparedStatement对象在执行多少次以后使用服务端已经准备好的statement。默认值是5,意味着在执行同一个PreparedStatement对象时,在第五次以及以上执行时不再向服务端发送parse消息对statement进行解析,而使用之前在服务端已经解析好的statement。 preparedStatementCacheQueries:Integer类型。该参数确定了每个连接的cache缓存Statement对象生成query的最大个数。默认值为256,若Statement对象生成query个大于256则会将最近最少使用的query从缓存中丢弃。0表示禁用缓存。 preparedStatementCacheSizeMiB:Integer类型,该参数确定了每个连接的cache缓存Statement对象所生成query的最大值(以兆字节为单位),默认情况下是5。若缓存了超过5MB的query,则最近最少使用的查询缓存将被丢弃。0表示禁用缓存。 databaseMetadataCacheFields:Integer类型。默认值是65536。指定每个连接可缓存的最大字段的个数。“0”表示禁用缓存。 databaseMetadataCacheFieldsMiB:Integer类型。默认值是5。指定每个连接可缓存的字段的最大值,单位是MB。“0”表示禁用缓存。 stringtype:String类型,可选字段为:"unspecified", "varchar"。设置通过setString()方法使用的PreparedStatement参数的类型,如果stringtype设置为VARCHAR(默认值),则这些参数将作为varchar参数发送给服务器。若stringtype设置为unspecified,则参数将作为untyped值发送到服务器,服务器将尝试推断适当的类型。 batchMode:Boolean类型。用于确定是否使用batch模式连接。默认值为on,表示开启batch模式。 fetchsize:Integer类型。用于设置数据库连接所创建statement的默认fetchsize。默认值为0,表示一次获取所有结果。 reWriteBatchedInserts:Boolean类型。批量导入时,该参数设置为on,可将N条插入语句合并为一条:insert into TABLE_NAME values(values1, ..., valuesN), ..., (values1, ..., valuesN);使用该参数时,需设置batchMode=off。 unknownLength:Integer类型,默认为Integer.MAX_VALUE。某些postgresql类型(例如TEXT)没有明确定义的长度,当通过ResultSetMetaData.getColumnDisplaySize和ResultSetMetaData.getPrecision等函数返回关于这些类型的数据时,此参数指定未知长度类型的长度。 defaultRowFetchSize:Integer类型。确定一次fetch在ResultSet中读取的行数。限制每次访问数据库时读取的行数可以避免不必要的内存消耗,从而避免OutOfMemoryException。缺省值是0,这意味着ResultSet中将一次获取所有行。本参数不允许设置为负值。 binaryTransfer:Boolean类型。使用二进制格式发送和接收数据,默认值为“false”。 binaryTransferEnable:String类型。启用二进制传输的类型列表,以逗号分隔。OID编号和名称二选一,例如binaryTransferEnable=INT4_ARRAY,INT8_ARRAY。 比如:OID名称为BLOB,编号为88,可以如下配置: binaryTransferEnable=BLOB 或 binaryTransferEnable=88 binaryTransferDisEnable:String类型。禁用二进制传输的类型列表,以逗号分隔。OID编号和名称二选一。覆盖binaryTransferEnable的设置。 blobMode:String类型。用于设置setBinaryStream(int, InputStream, int)方法为不同类型的数据赋值,设置为on时表示为blob类型数据赋值,设置为off时表示为bytea类型数据赋值,默认为on;setBinaryStream(int, InputStream, long)与setBinaryStream(int, InputStream)用于为bytea数据类型赋值。 socketFactory:String类型。用于创建与服务器socket连接的类的名称。该类必须实现了接口“javax.net.SocketFactory”,并定义无参或单String参数的构造函数。 socketFactoryArg:String类型。此值是上面提供的socketFactory类的构造函数的可选参数,不推荐使用。 receiveBufferSize:Integer类型。该值用于设置连接流上的SO_RCVBUF。 sendBufferSize:Integer类型。该值用于设置连接流上的SO_SNDBUF。 preferQueryMode:String类型。共有4种:"extended", "extendedForPrepared", "extendedCacheEverything", "simple"。用于指定执行查询的模式,默认值为extended。simple模式只发送Q消息,仅支持文本模式,不支持parse与bind;extended模式会使用parse、bind和execute消息;extendedForPrepared模式下只有Prepared Statement对象使用扩展查询,Statement对象只使用简单查询;extendedCacheEverything模式会缓存每个Statement对象所生成的query。 ApplicationType:String类型。共有2种:"not_perfect_sharding_type","perfect_sharding_type"。用于设置是否开启分布式写入和查询,默认值为"not_perfect_sharding_type"。not_perfect_sharding_type模式下开启分布式写入和查询;perfect_sharding_type模式下默认禁止分布式写入和查询,只有在sql文中加入/* multinode */ 才能执行分布式写入和查询。该项设置只有数据库处于gtm free场景的情况下才会有效。 user 数据库用户。 password 数据库用户的密码。
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 --创建表 postgres=# CREATE TABLE sections_t1 ( section NUMBER(4) , section_name VARCHAR2(30), manager_id NUMBER(6), place_id NUMBER(4) ) DISTRIBUTE BY hash(manager_id); --声明变量 postgres=# DECLARE section NUMBER(4) := 280; section_name VARCHAR2(30) := 'Info support'; manager_id NUMBER(6) := 103; place_id NUMBER(4) := 1400; new_colname VARCHAR2(10) := 'sec_name'; BEGIN --执行查询 EXECUTE IMMEDIATE 'insert into sections_t1 values(:1, :2, :3, :4)' USING section, section_name, manager_id,place_id; --执行查询(重复占位符) EXECUTE IMMEDIATE 'insert into sections_t1 values(:1, :2, :3, :1)' USING section, section_name, manager_id; --执行ALTER语句(建议采用“||”拼接数据库对象构造DDL语句) EXECUTE IMMEDIATE 'alter table sections_t1 rename section_name to ' || new_colname; END; / --查询数据 postgres=# SELECT * FROM sections_t1; --删除表 postgres=# DROP TABLE sections_t1;
  • 语法 语法请参见图1。 图1 noselect::= using_clause子句的语法参见图2。 图2 using_clause::= 对以上语法格式的解释如下: USING IN bind_argument用于指定存放传递给动态SQL值的变量,在dynamic_noselect_string中存在占位符时使用,即动态SQL语句执行时,bind_argument将替换相对应的占位符。要注意的是,bind_argument只能是值、变量或表达式,不能是表名、列名、数据类型等数据库对象。如果存储过程需要通过声明参数传递数据库对象来构造动态SQL语句(常见于执行DDL语句时),建议采用连接运算符“||”拼接dynamic_select_clause。另外,动态语句允许出现重复的占位符,相同占位符只能与唯一一个bind_argument按位置一一对应。
  • 操作步骤 执行如下步骤对表customer_t进行深层复制。 使用CREATE TABLE语句创建表customer_t的副本customer_t_copy。 1 2 3 4 5 6 postgres=# CREATE TABLE customer_t_copy ( c_customer_sk integer, c_customer_id char(5), c_first_name char(6), c_last_name char(8) ) ; 使用INSERT INTO…SELECT语句向副本填充原始表中的数据。 1 postgres=# INSERT INTO customer_t_copy (SELECT * FROM customer_t); 删除原始表。 1 postgres=# DROP TABLE customer_t; 使用ALTER TABLE语句将副本重命名为原始表名称。 1 postgres=# ALTER TABLE customer_t_copy RENAME TO customer_t;
  • tsvector tsvector类型表示一个检索单元,通常是一个数据库表中一行的文本字段或者这些字段的组合,tsvector类型的值是一个标准词位的有序列表,标准词位就是把同一个词的变型体都标准化相同的,在输入的同时会自动排序和消除重复,支持的最大长度为2046字节。to_tsvector函数通常用于解析和标准化文档字符串。 tsvector的值是唯一分词的分类列表,把一句话的词格式化为不同的词条,在进行分词处理的时候tsvector会自动去掉分词中重复的词条,按照一定的顺序录入。如: 1 2 3 4 5 postgres=# SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector; tsvector ---------------------------------------------------- 'a' 'and' 'ate' 'cat' 'fat' 'mat' 'on' 'rat' 'sat' (1 row) 从上面的例子可以看出,通过tsvector把一个字符串按照空格进行分词,分词的顺序是按照长短和字母排序的。但是如果词条中需要包含空格或标点符号,可以用引号标记: 1 2 3 4 5 postgres=# SELECT $$the lexeme ' ' contains spaces$$::tsvector; tsvector ------------------------------------------- ' ' 'contains' 'lexeme' 'spaces' 'the' (1 row) 如果在词条中使用引号,可以使用双$$符号作为标记: 1 2 3 4 5 postgres=# SELECT $$the lexeme 'Joe''s' contains a quote$$::tsvector; tsvector ------------------------------------------------ 'Joe''s' 'a' 'contains' 'lexeme' 'quote' 'the' (1 row) 词条位置常量也可以放到词汇中: 1 2 3 4 5 postgres=# SELECT 'a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12'::tsvector; tsvector ------------------------------------------------------------------------------- 'a':1,6,10 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'on':5 'rat':12 'sat':4 (1 row) 位置常量通常表示文档中源字的位置。位置信息可以用于进行排名。位置常量的范围是1到255,最大值默认是255。相同词的重复位会被忽略掉。 拥有位置的词汇甚至可以用一个权来标记,这个权可以是A,B,C或D。默认的是D,因此输出中不会出现: 1 2 3 4 5 postgres=# SELECT 'a:1A fat:2B,4C cat:5D'::tsvector; tsvector ---------------------------- 'a':1A 'cat':5 'fat':2B,4C (1 row) 权可以用来反映文档结构,如:标记标题与主体文字的区别。全文检索排序函数可以为不同的权标记分配不同的优先级。 下面的示例是tsvector类型标准用法。如: 1 2 3 4 5 postgres=# SELECT 'The Fat Rats'::tsvector; tsvector -------------------- 'Fat' 'Rats' 'The' (1 row) 但是对于英文全文检索应用来说,上面的单词会被认为非规范化的,所以需要通过to_tsvector函数对这些单词进行规范化处理: 1 2 3 4 5 postgres=# SELECT to_tsvector('english', 'The Fat Rats'); to_tsvector ----------------- 'fat':2 'rat':3 (1 row)
共100000条