华为云用户手册

  • 环境类 客户端需配置JDK1.8。JDK是跨平台的,支持Windows、Linux等多种平台,下面以Windows为例,介绍JDK配置流程: DOS窗口(windows下的命令提示符)输入“java -version”,查看JDK版本,确认为JDK1.8版本。如果未安装JDK,请下载安装包并安装。 右键单击“我的电脑”,选择“属性”。 在“系统”页面左侧导航栏单击“高级系统设置”。 在“系统属性”页面,“高级”页签上单击“环境变量”。 在“环境变量”页面上,“系统变量”区域单击“新建”或“编辑”,设置如下变量名和变量值。变量说明如表1所示。 表1 变量说明 变量名 操作 变量值 JAVA_HOME 若存在,则单击“编辑”。 若不存在,则单击“新建”。 JAVA的安装目录。 例如:C:\Program Files\Java\jdk1.8.0_131。 Path 单击“编辑”。 若配置了JAVA_HOME,则在变量值的最前面加上: %JAVA_HOME%\bin。 若未配置JAVA_HOME,则在变量值的最前面加上 JAVA安装的全路径: C:\Program Files\Java\jdk1.8.0_131\bin。 CLASSPATH 单击“新建”。 %JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar。 单击“确定”,并依次关闭各窗口。
  • 开发规范 如果用户在APP的开发过程中,使用了连接池机制,那么需要遵循如下规范: 如果在连接中设置了GUC参数,那么在将连接归还连接池之前,必须使用“SET SESSION AUTHORIZATION DEFAULT;RESET ALL;”将连接的状态清空。 如果使用了临时表,那么在将连接归还连接池之前,必须将临时表删除。 否则,连接池里面的连接就是有状态的,会对用户后续使用连接池进行操作的正确性带来影响。 应用程序开发驱动兼容性说明如表1所示: 表1 兼容性说明 驱动 兼容性说明 JDBC、Go、ODBC、libpq、Psycopg、ecpg 驱动前向兼容数据库,若需使用驱动与数据库同步增加的新特性,须升级数据库。 原则上,兼容性参数应在创建数据库后就设置,不应在使用过程中来回切换。 涉及使用以下场景的特性需要配合将JDBC驱动升级到503.1.0及以上的配套版本: 开启s2兼容性参数,设置sessiontimezone的合法性校验。 在多线程环境下使用驱动: JDBC驱动程序线程不是安全的,无法保证连接上的方法同步。由调用者来同步对驱动程序的调用。 父主题: 应用程序开发教程
  • 连接参数 第三方工具通过JDBC连接 GaussDB 时,JDBC向GaussDB发起连接请求,会默认添加以下配置参数,详见JDBC代码ConnectionFactoryImpl类的实现。 params = { { "user", user }, { "database", database }, { "client_encoding", "UTF8" }, { "DateStyle", "ISO" }, { "extra_float_digits", "3" }, { "TimeZone", createPostgresTimeZone() }, }; 这些参数可能会导致JDBC客户端的行为与gsql客户端的行为不一致,例如,Date数据显示方式、浮点数精度表示、timezone显示。 如果实际期望和这些配置不符,建议在java连接设置代码中显式设定这些参数。 通过JDBC连接数据库时,会设置extra_float_digits=3,gsql中设置为extra_float_digits=0,可能会造成同一条数据在JDBC显示和gsql显示的精度不同。 对于精度敏感的场景,建议使用numeric类型。 通过JDBC连接数据库时,应该保证以下三个时区设置一致: JDBC客户端所在主机的时区。 GaussDB集群所在主机的时区。 GaussDB集群配置过程中时区。 时区设置相关的操作,请联系管理员。
  • 释放连接 推荐使用连接池限制应用程序的连接数。不建议每执行一条SQL就连接一次数据库。 在应用程序完成作业任务之后,应当及时断开和GaussDB的连接,释放资源。建议在任务中设置session超时时间参数。 使用JDBC连接池,在将连接释放给连接池前,需要执行以下操作,重置会话环境。否则,可能会因为历史会话信息导致对象冲突。 如果在连接中设置了GUC参数,那么在将连接归还连接池之前,必须使用“SET SESSION AUTHORIZATION DEFAULT;RESET ALL;”将连接的状态清空。 如果使用了临时表,那么在将连接归还连接池之前,必须将临时表删除。
  • 选择分区方案 当表中的数据量很大时,应当对表进行分区,一般需要遵循以下原则: 使用具有明显区间性的字段进行分区,比如日期、区域等字段上建立分区。 分区名称应当体现分区的数据特征。例如,关键字+区间特征。 将分区上边界的分区值定义为MAXVALUE,以防可能出现的数据溢出。 表2 表的分区方式及使用场景 分区方式 描述 Range 表数据通过范围进行分区。 List 表数据通过指定列按照具体值进行分区。 Hash 表数据通过Hash散列方式进行分区。 典型的分区表定义如下: 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 --创建Range分区表。 CREATE TABLE staffS_p1 ( staff_ID NUMBER(6) not null, FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(25), EMAIL VARCHAR2(25), PHONE_NUMBER VARCHAR2(20), HIRE_DATE DATE, employment_ID VARCHAR2(10), SALARY NUMBER(8,2), COMMISSION_PCT NUMBER(4,2), MANAGER_ID NUMBER(6), section_ID NUMBER(4) ) PARTITION BY RANGE (HIRE_DATE) ( PARTITION HIRE_19950501 VALUES LESS THAN ('1995-05-01 00:00:00'), PARTITION HIRE_19950502 VALUES LESS THAN ('1995-05-02 00:00:00'), PARTITION HIRE_maxvalue VALUES LESS THAN (MAXVALUE) ); --创建List分区表。 CREATE TABLE test_list (col1 int, col2 int) partition by list(col1) ( partition p1 values (2000), partition p2 values (3000), partition p3 values (4000), partition p4 values (5000) ); --创建Hash分区表。 CREATE TABLE test_hash (col1 int, col2 int) partition by hash(col1) ( partition p1, partition p2 ); 更多的表分区语法信息请参见CREATE TABLE PARTITION。
  • Database设计建议 在实际业务中,根据需要创建新的Database,不建议直接使用集群默认的postgres数据库。 一个集群内,用户自定义的Database数量推荐值为3个,不建议超过10个。用户自定义的Database数量过多会导致升级、备份等运维操作的效率降低。 为了适应全球化的需求,使数据库编码能够存储与表示绝大多数的字符,建议创建Database的时候使用UTF-8编码。 创建Database时,需要重点关注字符集编码(ENCODING)和兼容性(DBCOMPATIBILITY)两个配置项。GaussDB支持TD、ORA、MYSQL和PG四种兼容模式,分别表示兼容Teradata语法、Oracle语法、MySQL语法和PostgreSQL语法,不同兼容模式下的语法行为存在一定差异,默认为MYSQL兼容模式。 Database的owner默认拥有该Database下所有对象的所有权限,包括删除权限。删除权限影响较大,请谨慎使用。
  • Schema设计建议 实际用户环境中Schema数量不建议超过100个。当数据库中存在大量Schema时,会导致gs_dump等依赖Schema数量的操作性能变慢。 如果该用户不具有sysadmin权限或者不是该Schema的owner,要访问Schema下的对象,需要同时给用户授予Schema的usage权限和对象的相应权限。 如果要在Schema下创建对象,需要授予操作用户该Schema的CREATE权限。 Schema的owner默认拥有该Schema下对象的所有权限,包括删除权限。删除权限影响较大,请谨慎使用。
  • 开发设计建议概述 开发设计建议约定数据库建模和数据库应用程序开发过程中,应当遵守的设计规范。依据这些规范进行建模,能够更好地契合GaussDB的分布式处理架构,输出更高效的业务SQL代码。 开发设计建议中所陈述的“建议”和“关注”含义如下: 建议:用户应当遵守的设计规则。遵守这些规则,能够保证业务的高效运行;违反这些规则,将导致业务性能的大幅下降或某些业务逻辑错误。 关注:在业务开发过程中用户需要注意的细则。用于标识容易导致用户理解错误的知识点(实际上遵守SQL标准的SQL行为),或者程序中潜在的用户不易感知的默认行为。 父主题: 开发设计建议
  • 注意事项 新序列值的产生是靠GTM维护的,默认情况下,每申请一个序列值都要向GTM发送一次申请,GTM在当前值的基础上加步长值作为产生的新值返回给调用者。GTM作为全局唯一的节点,势必成为性能的瓶颈,所以对于需要大量频繁产生序列号的操作,如使用Bulkload工具进行数据导入场景,是不建议产生默认序列值的。比如,在下面所示的场景中, INSERT INTO SELECT FROM语句的性能会非常慢。 1 2 3 4 5 6 7 gaussdb=# CREATE SEQUENCE newSeq1; gaussdb=# CREATE TABLE newT1 ( id int not null default nextval('newSeq1'), name text ); gaussdb=# INSERT INTO newT1(name) SELECT name FROM T1; 可以提高性能的写法是(假设T1表导入newT1表中的数据为10000行)。 1 2 gaussdb=# INSERT INTO newT1(id, name) SELECT id,name FROM T1; gaussdb=# 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申请,所以对序列正确性没有影响。
  • 操作步骤 方法一: 声明字段类型为序列整型来定义标识符字段。例如: 1 2 3 4 5 gaussdb=# CREATE TABLE T1 ( id serial, name text ); 当结果显示为如下信息,则表示创建成功。 1 CREATE TABLE 方法二: 创建序列,并通过nextval('sequence_name')函数指定为某一字段的默认值。这种方式更灵活,可以为序列定义cache,一次预申请多个序列值,减少与GTM的交互次数,来提高性能。 创建序列。 1 gaussdb=# CREATE SEQUENCE seq1 cache 100; 当结果显示为如下信息,则表示创建成功。 1 CREATE SEQUENCE 指定为某一字段的默认值,使该字段具有唯一标识属性。 1 2 3 4 5 gaussdb=# CREATE TABLE T2 ( id int not null default nextval('seq1'), name text ); 当结果显示为如下信息,则表示默认值指定成功。 1 CREATE TABLE 指定序列与列的归属关系。 将序列和一个表的指定字段进行关联。这样,在删除该字段或其所在表的时候会自动删除已关联的序列。 1 gaussdb=# ALTER SEQUENCE seq1 OWNED BY T2.id; 当结果显示为如下信息,则表示指定成功。 1 ALTER SEQUENCE 除了为序列指定cache,方法二所实现的功能基本与方法一类似。但是一旦定义cache,序列将会产生空洞(序列值为不连贯的数值,如:1.4.5),并且不能保序。另外为某序列指定从属列后,该列删除,对应的sequence也会被删除。 虽然数据库并不限制序列只能为一列产生默认值,但建议不要多列共用同一个序列。 当前版本只支持在定义表的时候指定自增列,或者指定某列的默认值为nextval('seqname'), 不支持在已有表中增加自增列或者增加默认值为nextval('seqname')的列。
  • 注意事项 数据库集群包含一个或多个已命名数据库。用户和用户组在整个集群范围内是共享的,但是其数据并不共享。任何与服务器连接的用户都只能访问连接请求里声明的数据库。 一个数据库可以包含一个或多个已命名的schema,schema又包含表及其他数据库对象,包括数据类型、函数和操作符等。同一对象名可以在不同的schema中使用而不会引起冲突。例如,schema1和schema2都可以包含一个名为mytable的表。 和数据库不同,schema不是严格分离的。用户根据其对schema的权限,可以访问所连接数据库的schema中的对象。进行schema权限管理首先需要对数据库的权限控制进行了解。 不能创建以PG_为前缀的schema名,该类schema名为数据库系统预留的。 在每次创建新用户时,系统会在当前登录的数据库中为新用户创建一个同名Schema。对于其他数据库,若需要同名Schema,则需要用户手动创建。 通过未修饰的表名(名称中只含有表名,没有“schema名”)引用表时,系统会通过search_path(搜索路径)来判断该表是哪一个schema下的表。pg_temp和pg_catalog始终会作为搜索路径顺序中的前两位,无论二者是否出现在search_path中,或者出现在search_path中的任何位置。search_path(搜索路径)是一个schema名列表,在其中找到的第一个表就是目标表,如果没有找到则报错。(某个表即使存在,如果它的schema不在search_path中,依然会查找失败)在搜索路径中的第一个schema叫做"当前schema"。它是搜索时查询的第一个schema,同时在没有声明schema名时,新创建的数据库对象会默认存放在该schema下。 每个数据库都包含一个pg_catalog schema,它包含系统表和所有内置数据类型、函数和操作符。pg_catalog是搜索路径中的一部分,始终在临时表所属的模式后面,并在search_path中所有模式的前面,即具有第二搜索优先级,以确保可以搜索到数据库内置对象。如果用户需要使用和系统内置对象重名的自定义对象时,可以在操作自定义对象时带上自己的模式。
  • 操作步骤 创建schema 执行如下命令来创建一个schema。 1 gaussdb=# CREATE SCHEMA myschema; 当结果显示为如下信息,则表示成功创建一个名为myschema的schema。 1 CREATE SCHEMA 如果需要在模式中创建或者访问对象,其完整的对象名称由模式名称和具体的对象名称组成,中间由符号“.”隔开。例如:myschema.table。 执行如下命令在创建schema时指定owner。 1 gaussdb=# CREATE SCHEMA myschema AUTHORIZATION omm; 当结果显示为如下信息,则表示成功创建一个属于omm用户,名为myschema的schema。 1 CREATE SCHEMA 使用schema 在特定schema下创建对象或者访问特定schema下的对象,需要使用有schema修饰的对象名。该名称包含schema名以及对象名,schema名和对象名之间用“.”号分开。 执行如下命令在myschema下创建mytable表。 1 2 gaussdb=# CREATE TABLE myschema.mytable(id int, name varchar(20)); CREATE TABLE 如果在数据库中指定对象的位置,就需要使用有schema修饰的对象名称。 执行如下命令查询myschema下mytable表的所有数据。 1 2 3 4 gaussdb=# SELECT * FROM myschema.mytable; id | name ----+------ (0 rows) schema的搜索路径 可以设置search_path配置参数指定查询对象可用schema的顺序。在搜索路径列出的第一个schema会变成默认的schema。如果在创建对象时不指定schema,则会创建在默认的schema中。 执行如下命令查看搜索路径。 1 2 3 4 5 gaussdb=# SHOW SEARCH_PATH; search_path ---------------- "$user",public (1 row) 执行如下命令将搜索路径设置为myschema, public。首先搜索myschema,然后搜索public。 1 2 gaussdb=# SET SEARCH_PATH TO myschema, public; SET schema的权限控制 默认情况下,用户只能访问属于自己的schema中的数据库对象。如果需要访问其他schema的对象,则该schema的所有者应该授予他对该schema的usage权限。 通过将模式的CREATE权限授予某用户,被授权用户就可以在此模式中创建对象。默认情况下,所有角色都拥有在public模式上的usage权限,但是普通用户没有在public模式上的CREATE权限。普通用户能够连接到一个指定数据库并在它的public模式中创建对象是不安全的,如果普通用户具有在public模式上的CREATE权限则建议通过如下语句撤销该权限。 撤销PUBLIC在public模式下创建对象的权限,下面语句中第一个“public”是模式,第二个“PUBLIC”指的是所有角色。 1 2 gaussdb=# REVOKE CREATE ON SCHEMA public FROM PUBLIC; REVOKE 执行如下命令查看现有的schema。 1 2 3 4 5 gaussdb=# SELECT current_schema(); current_schema ---------------- myschema (1 row) 执行如下命令创建用户jack,并将myschema的usage权限授予用户jack。 1 2 3 4 gaussdb=# CREATE USER jack IDENTIFIED BY '********'; CREATE ROLE gaussdb=# GRANT USAGE ON schema myschema TO jack; GRANT 将用户jack对于myschema的usage权限收回。 1 2 gaussdb=# REVOKE USAGE ON schema myschema FROM jack; REVOKE 删除schema 当schema为空时,即该schema下没有数据库对象,使用DROP SCHEMA命令进行删除。例如删除名为nullschema的空schema。 1 2 gaussdb=# DROP SCHEMA IF EXISTS nullschema; DROP SCHEMA 当schema非空时,如果要删除一个schema及其包含的所有对象,需要使用CASCADE关键字。例如删除myschema及该schema下的所有对象。 1 2 gaussdb=# DROP SCHEMA myschema CASCADE; DROP SCHEMA 执行如下命令删除用户jack。 1 2 gaussdb=# DROP USER jack; DROP ROLE
  • 查看和停止正在运行的查询语句 通过视图PG_STAT_ACTIVITY可以查看正在运行的查询语句。方法如下: 设置参数track_activities为on。 1 SET track_activities = on; 当此参数为on时,数据库系统才会获取当前活动查询的运行信息。 查看正在运行的查询语句。以查看正在运行的查询语句所连接的数据库名、执行查询的用户、查询状态及查询对应的PID为例: 1 SELECT datname, usename, state,pid FROM pg_stat_activity; 1 2 3 4 5 6 7 8 datname | usename | state | pid ----------+---------+--------+----------------- testdb | Ruby | active | 140298793514752 testdb | Ruby | active | 140298718004992 testdb | Ruby | idle | 140298650908416 testdb | Ruby | idle | 140298625742592 testdb | omm | active | 140298575406848 (5 rows) 如果state字段显示为idle,则表明此连接处于空闲,等待用户输入命令。 如果仅需要查看非空闲的查询语句,则执行如下命令查看: 1 SELECT datname, usename, state, pid FROM pg_stat_activity WHERE state != 'idle'; 若需要取消运行时间过长的查询,通过PG_TERMINATE_BACKEND函数,根据线程ID(即2中查询结果的pid字段)结束会话。 1 SELECT PG_TERMINATE_BACKEND(140298793514752); 显示类似如下信息,表示结束会话成功。 1 2 3 4 PG_TERMINATE_BACKEND ---------------------- t (1 row) 显示类似如下信息,表示用户执行了结束当前会话的操作。 1 2 FATAL: terminating connection due to administrator command FATAL: terminating connection due to administrator command gsql客户端使用PG_TERMINATE_BACKEND函数结束当前正在执行会话的后台线程时,如果当前的用户是初始用户,客户端不会退出而是自动重连,即还会返回“The connection to the server was lost. Attempting reset: Succeeded.”;否则客户端会重连失败,即返回。“The connection to the server was lost. Attempting reset: Failed.”。这是因为只有初始用户可以免密登录,普通用户不能免密登录,从而重连失败。 对于使用PG_TERMINATE_BACKEND函数结束非活跃的后台线程时,如果打开了线程池,此时空闲的会话没有线程ID,无法结束会话。非线程池模式下,结束的会话不会自动重连。
  • 查看数据库用户 通过PG_USER可以查看数据库中所有用户的列表,还可以查看用户ID(USESYSID)和用户权限。 1 2 3 4 5 6 7 8 SELECT * FROM pg_user; usename | usesysid | usecreatedb | usesuper | usecatupd | userepl | passwd | valbegin | valuntil | respool | parent | spacelimit | useconfig | nodegroup | tempspacelimit | spillsp acelimit | usemonitoradmin | useoperatoradmin | usepolicyadmin ---------+----------+-------------+----------+-----------+---------+----------+----------+----------+--------------+--------+------------+-----------+-----------+----------------+-------- ---------+-----------------+------------------+---------------- omm | 10 | t | t | t | t | ******** | | | default_pool | 0 | | | | | | t | t | t (1 row)
  • 操作步骤 向表中插入数据前,意味着表已创建成功。创建表的步骤请参见创建和管理表。 向表customer_t1中插入一行数据。 数据值是按照这些字段在表中出现的顺序列出的,并且用逗号分隔。通常数据值是文本(常量),但也允许使用标量表达式。 1 gaussdb=# INSERT INTO customer_t1(c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', 'Grace'); 如果用户已经知道表中字段的顺序,也可无需列出表中的字段。例如以下命令与上面的命令效果相同。 1 gaussdb=# INSERT INTO customer_t1 VALUES (3769, 'hello', 'Grace'); 如果用户不知道所有字段的数值,可以忽略其中的一些。如果INSERT语句中,用户没有显示指定目标表的字段名字,那么VALUES子句中待插入的多个值,将按照列号和目标表的字段一一对应,即VALUES子句的第一个值对应目标表的第一列,VALUES子句的第二个值对应目标表的第二列,依次类推,没有VALUES数值对应的列自动填充缺省值或NULL。没有数值的字段将被填充为字段的缺省值。例如: 1 2 3 gaussdb=# INSERT INTO customer_t1 (c_customer_sk, c_first_name) VALUES (3769, 'Grace'); gaussdb=# INSERT INTO customer_t1 VALUES (3769, 'hello'); 用户也可以对独立的字段或者整个行明确缺省值: 1 2 3 gaussdb=# INSERT INTO customer_t1 (c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', DEFAULT); gaussdb=# INSERT INTO customer_t1 DEFAULT VALUES; 如果需要在表中插入多行,请执行如下命令: 1 2 3 4 gaussdb=# INSERT INTO customer_t1 (c_customer_sk, c_customer_id, c_first_name) VALUES (6885, 'maps', 'Joes'), (4321, 'tpcds', 'Lily'), (9527, 'world', 'James'); 如果需要向表中插入多条数据,除此命令外,也可以多次执行插入一行数据命令实现。但是建议使用此命令以提升效率。 如果从指定表插入数据到当前表,例如在数据库中创建了一个表customer_t1的备份表customer_t2,现在需要将表customer_t1中的数据插入到表customer_t2中,则可以执行如下命令: 1 2 3 4 5 6 7 8 9 gaussdb=# CREATE TABLE customer_t2 ( c_customer_sk integer, c_customer_id char(5), c_first_name char(6), c_last_name char(8) ); gaussdb=# INSERT INTO customer_t2 SELECT * FROM customer_t1; 从指定表插入数据到当前表时,若指定表与当前表对应的字段数据类型之间不存在隐式转换,则这两种数据类型必须相同。 使用不带AS的表别名向表中插入数据。 1 2 3 gaussdb=# CREATE TABLE table_name(a int,b text,c timestamp,d float); gaussdb=# INSERT INTO table_name alias_name VALUES(1,'ha','1997-01-01 10:00:00'::timestamp,1.234); gaussdb=# INSERT INTO table_name alias_name(b,c,d) VALUES('ha','1997-01-01 10:00:00'::timestamp,1.234); INSERT不带AS的表别名不能为关键字(如SELECT、VALUE)或者表达式,别名要求符合标识符命名规则。 INSERT不带AS的表别名不支持INSERT INTO table_name alias_name(alias_name.col1,...,alias_name.coln) VALUES(xxx)格式。 INSERT的分区表不带AS的表别名不支持指定分区插入操作。 删除备份表 1 gaussdb=# DROP TABLE customer_t2 CASCADE; 在删除表的时候,若当前需删除的表与其他表有依赖关系,需先删除关联的表,然后再删除当前表。
  • 创建表 执行如下命令创建表。 1 2 3 4 5 6 7 8 gaussdb=# CREATE TABLE customer_t1 ( c_customer_sk integer, c_customer_id char(5), c_first_name char(6), c_last_name char(8) ) distribute by hash (c_last_name); 当结果显示为如下信息,则表示创建成功。 1 CREATE TABLE 其中c_customer_sk 、c_customer_id、c_first_name和c_last_name是表的字段名,integer、char(5)、char(6)和char(8)分别是这四个字段名称的类型。 默认情况下,新的数据库对象是创建在“$user”模式下。关于模式的更多信息请参见创建和管理schema。 除了创建的表以外,数据库还包含很多系统表。这些系统表包含集群安装信息以及GaussDB上运行的各种查询和进程的信息。可以通过查询系统表来收集有关数据库的信息。请参见查看系统表。 关于创建表的更多信息请参见CREATE TABLE。
  • 背景信息 通过使用表空间,管理员可以控制一个数据库安装的磁盘布局。这样有以下优点: 如果初始化数据库所在的分区或者表空间已满,又不能逻辑上扩展更多空间,可以在不同的分区上创建和使用表空间,直到系统重新配置空间。 表空间允许管理员根据数据库对象的使用模式安排数据位置,从而提高性能。 一个频繁使用的索引可以存储在性能稳定且运算速度较快的磁盘上,比如一种固态设备。 一个存储归档的数据,很少使用的或者对性能要求不高的表可以存储在一个运算速度较慢的磁盘上。 管理员通过表空间可以设置占用的磁盘空间,用以在和其他数据共用分区的时候,防止表空间占用相同分区上的其他空间。 表空间可以控制数据库数据占用的磁盘空间。当表空间所在磁盘的使用率达到90%时,数据库将被设置为只读模式,当磁盘使用率降到90%以下时,数据库将恢复到读写模式。CM的磁盘自动检查功能默认是开启的,若未开启,请联系管理员开启。 表空间对应于一个文件系统目录,执行如下命令创建一个对应/pg_location/mount1/path1的表空间,并指定最大可使用空间为500GB。 1 2 --创建表空间。 gaussdb=# CREATE TABLESPACE ds_location1 LOCATION '/pg_location/mount1/path1' MAXSIZE '500G'; 通过MAXSIZE进行表空间配额管理对并发插入性能可能会有30%左右的影响,MAXSIZE指定每个DN的配额大小,每个DN实际的表空间容量和配额误差在500MB以内。请根据实际的情况确认是否需要设置表空间的最大值。 GaussDB自带了两个表空间:pg_default和pg_global。 默认表空间pg_default:用来存储非共享系统表、用户表、用户表index、临时表、临时表index、内部临时表的默认表空间。对应存储目录为实例数据目录下的base目录。 共享表空间pg_global:用来存放共享系统表的表空间。对应存储目录为实例数据目录下的global目录。
  • 操作步骤 创建表空间 执行如下命令创建用户为jack,密码为********。 1 gaussdb=# CREATE USER jack IDENTIFIED BY '********'; 当结果显示为如下信息,则表示创建成功。 1 CREATE ROLE 执行如下命令创建表空间。 1 gaussdb=# CREATE TABLESPACE fastspace RELATIVE LOCATION 'my_tablespace/tablespace1'; 当结果显示为如下信息,则表示创建成功。 1 CREATE TABLESPACE 其中“fastspace”为新创建的表空间,“CN和DN数据目录/pg_location/my_tablespace/tablespace1”是用户拥有读写权限的空目录。 数据库系统管理员执行如下命令将“fastspace”表空间的访问权限授予数据用户jack。 1 gaussdb=# GRANT CREATE ON TABLESPACE fastspace TO jack; 当结果显示为如下信息,则表示授予成功。 1 GRANT
  • 注意事项 如果数据库的编码为SQL_ASCII(可以通过“show server_encoding”命令查看当前数据库存储编码),则在创建数据库对象时,如果对象名中含有多字节字符(例如中文),超过数据库对象名长度限制(63字节)的时候,数据库会将最后一个字节(而不是字符)截断,可能造成出现半个字符的情况。 针对这种情况,请遵循以下条件: 保证数据对象的名称不超过限定长度。 使用utf-8编码集为数据库的默认存储编码集(server_encoding)。 不要使用多字节字符作为对象名。 因为误操作导致在多字节字符的中间截断,从而导致无法删除数据库对象,如果出现这种现象,请使用截断前的数据库对象名进行删除操作,或将该对象从各个数据库节点的相应系统表中依次删掉。
  • 创建数据库用户 默认只有集群安装时创建的管理员用户可以访问初始数据库,您还可以创建其他数据库用户账号。 1 gaussdb=# CREATE USER joe WITH PASSWORD "********"; 当结果显示为如下信息,则表示创建成功。 1 CREATE ROLE 如上创建了一个用户名为joe,密码为********的用户。执行如下命令设置joe用户为系统管理员。 gaussdb=# GRANT ALL PRIVILEGES TO joe; 使用GRANT命令进行相关权限设置,具体操作请参见GRANT。 关于数据库用户的更多信息请参见用户及权限。 父主题: 操作数据库
  • 永久用户 GaussDB提供永久用户方案:创建具有PERSISTENCE属性的永久用户,具有PERSISTENCE属性的用户能够使用service_reserved_connections通道连接数据库。 service_reserved_connections为带有persistence属性预留的最少连接数,不建议设置过大。 1 gaussdb=# CREATE USER user_persistence WITH PERSISTENCE IDENTIFIED BY "********"; 只允许初始用户创建、修改和删除具有PERSISTENCE属性的永久用户。
  • 监控管理员 监控管理员是指具有MONADMIN属性的账户,具有查看dbe_perf模式下视图和函数的权限,亦可以对dbe_perf模式的对象权限进行授予或收回。 要创建新的监控管理员,请以系统管理员身份连接数据库,并使用带MONADMIN选项的CREATE USER语句或 ALTER USER语句进行设置。 1 gaussdb=# CREATE USER monadmin WITH MONADMIN password "********"; 或者 1 gaussdb=# ALTER USER joe MONADMIN; ALTER USER时,要求用户已存在。
  • 审计管理员 审计管理员是指具有AUDITADMIN属性的账户,具有查看和删除审计日志的权限。 要创建新的审计管理员,三权分立关闭时,请以系统管理员或者安全管理员身份连接数据库。三权分立打开时,只能以初始用户身份连接数据库,并使用带AUDITADMIN选项的CREATE USER语句或 ALTER USER语句进行设置。 1 gaussdb=# CREATE USER auditadmin WITH AUDITADMIN password "********"; 或者 1 gaussdb=# ALTER USER joe AUDITADMIN; ALTER USER时,要求用户已存在。
  • 运维管理员 运维管理员是指具有OPRADMIN属性的账户,具有使用Roach工具执行备份恢复的权限。 要创建新的运维管理员,请以初始用户身份连接数据库,并使用带OPRADMIN选项的CREATE USER语句或 ALTER USER语句进行设置。 1 gaussdb=# CREATE USER opradmin WITH OPRADMIN password "********"; 或者 1 gaussdb=# ALTER USER joe OPRADMIN; ALTER USER时,要求用户已存在。
  • 安全策略管理员 安全策略管理员是指具有POLADMIN属性的账户,具有创建资源标签、脱敏策略和统一审计策略的权限。 要创建新的安全策略管理员,请以系统管理员用户身份连接数据库,并使用带POLADMIN选项的CREATE USER语句或 ALTER USER语句进行设置。 1 gaussdb=# CREATE USER poladmin WITH POLADMIN password "********"; 或者 1 gaussdb=# ALTER USER joe POLADMIN; ALTER USER时,要求用户已存在。
  • 安全管理员 安全管理员是指具有CREATEROLE属性的账户,具有创建、修改、删除用户或角色的权限,和授予或者撤销任何非系统管理员、内置角色、永久用户、运维管理员的权限。 要创建新的安全管理员,三权分立关闭时,请以系统管理员或者安全管理员身份连接数据库。三权分立打开时,请以安全管理员身份连接数据库,并使用带CREATEROLE选项的CREATE USER语句或 ALTER USER语句进行设置。 1 gaussdb=# CREATE USER createrole WITH CREATEROLE password "********"; 或者 1 gaussdb=# ALTER USER joe CREATEROLE; ALTER USER时,要求用户已存在。
  • 系统管理员 系统管理员是指具有SYSADMIN属性的账户,默认安装情况下具有与对象所有者相同的权限,但不包括dbe_perf模式的对象权限。 要创建新的系统管理员,请以初始用户或者系统管理员用户身份连接数据库,并使用带SYSADMIN选项的CREATE USER语句或ALTER USER语句进行设置。 1 gaussdb=# CREATE USER sysadmin WITH SYSADMIN password "********"; 或者 1 gaussdb=# ALTER USER joe SYSADMIN; ALTER USER时,要求用户已存在。
  • 默认权限机制 数据库对象创建后,进行对象创建的用户就是该对象的所有者。集群安装后默认情况下,未开启三权分立,数据库系统管理员具有与对象所有者相同的权限。也就是说对象创建后,默认只有对象所有者或者系统管理员可以查询、修改和销毁对象,以及通过GRANT将对象的权限授予其他用户。 为使其他用户能够使用对象,必须向用户或包含该用户的角色授予必要的权限。 GaussDB支持以下的权限:SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFEREN CES 、CREATE、CONNECT、EXECUTE、USAGE、ALTER、DROP、COMMENT、INDEX和VACUUM。不同的权限与不同的对象类型关联。有关各权限的详细信息,请参见GRANT。 要撤销已经授予的权限,请参见REVOKE。对象所有者的权限(例如ALTER、DROP、COMMENT、INDEX、VACUUM、GRANT和REVOKE)是隐式拥有的,即只要拥有对象就可以执行对象所有者的这些隐式权限。对象所有者可以撤销自己的普通权限(SELECT、INSERT、UPDATE、DELETE),例如,使表对自己以及其他人只读,系统管理员用户除外。 系统表和系统视图要么只对系统管理员可见,要么对所有用户可见。标识了需要系统管理员权限的系统表和视图只有系统管理员可以查询。有关信息,请参见系统表和系统视图。 数据库提供对象隔离的特性,对象隔离特性开启时,用户只能查看有权限访问的对象(表、视图、字段、函数),系统管理员不受影响。有关信息,请参见ALTER DATABASE。 不建议用户修改系统表和系统视图的权限。 父主题: 用户及权限
  • 事务管理 在事务管理上,GaussDB采取了MVCC(多版本并发控制)结合两阶段锁的方式,其特点是读写之间不阻塞。GaussDB的astore存储引擎将历史版本数据和当前元组的版本放在了一起。GaussDB的astore存储引擎没有回滚段的概念,但是为了定期清除历史版本数据,GaussDB的astore存储引擎引入了VACUUM线程。一般情况下,除非用户要做性能调优,否则不用特别关注VACUUM线程。GaussDB的ustore存储引擎是将历史版本数据统一存放到undo回滚段里,由undo回收线程统一清理历史版本数据。此外,GaussDB对于单语句查询(没有使用BEGIN等语句显示启动事务块)是自动提交事务的。
  • 控制文件 语法说明: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 LOAD [ DATA ] [CHARACTERSET char_set_name] [INFILE [directory_path] [filename ] ] [BADFILE [directory_path] [filename ] ] [OPTIONS(name=value)] [{ INSERT | APPEND | REPLACE | TRUNCATE }] INTO TABLE table_name [{ INSERT | APPEND | REPLACE | TRUNCATE }] [FIELDS CS V] [TERMINATED [BY] { 'string' }] [OPTIONALLY ENCLOSED BY { 'string' }] [TRAILING NULLCOLS] [ WHEN { (start:end) | column_name } {= | !=} ‘string’ ] [( col_name [ [ POSITION ({ start:end }) ] ["sql_string"] ] | [ FILLER [column_type [external] ] ] | [ CONSTANT "string" ] | [ SEQUENCE ( { COUNT | MAX | integer } [, incr] ) ]|[NULLIF (COL=BLANKS)] [, ...] )]
共100000条