华为云用户手册

  • 操作步骤 创建管理用户及权限schema 执行如下命令来创建一个schema。 1 openGauss=# CREATE SCHEMA myschema; 当结果显示为如下信息,则表示成功创建一个名为myschema的schema。 1 CREATE SCHEMA 如果需要在模式中创建或者访问对象,其完整的对象名称由模式名称和具体的对象名称组成。中间由符号“.”隔开。例如:myschema.table。 执行如下命令在创建schema时指定owner。 1 openGauss=# CREATE SCHEMA myschema AUTHORIZATION omm; 当结果显示为如下信息,则表示成功创建一个属于omm用户,名为myschema的schema。 1 CREATE SCHEMA 使用schema 在特定schema下创建对象或者访问特定schema下的对象,需要使用有schema修饰的对象名。该名称包含schema名以及对象名,他们之间用“.”号分开。 执行如下命令在myschema下创建mytable表。 12 openGauss=# CREATE TABLE myschema.mytable(id int, name varchar(20));CREATE TABLE 如果在数据库中指定对象的位置,就需要使用有schema修饰的对象名称。 执行如下命令查询myschema下mytable表的所有数据。 1234 openGauss=# SELECT * FROM myschema.mytable;id | name ----+------(0 rows) schema的搜索路径 可以设置search_path配置参数指定寻找对象可用schema的顺序。在搜索路径列出的第一个schema会变成默认的schema。如果在创建对象时不指定schema,则会创建在默认的schema中。 执行如下命令查看搜索路径。 12345 openGauss=# SHOW SEARCH_PATH; search_path---------------- "$user",public(1 row) 执行如下命令将搜索路径设置为myschema、public,首先搜索myschema。 12 openGauss=# 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”指的是所有角色。 12 openGauss=# REVOKE CREATE ON SCHEMA public FROM PUBLIC;REVOKE 使用以下命令查看现有的schema: 12345 openGauss=# SELECT current_schema(); current_schema ---------------- myschema(1 row) 执行如下命令创建用户jack,并将myschema的usage权限赋给用户jack。 1234 openGauss=# CREATE USER jack IDENTIFIED BY 'xxxxxxxxx';CREATE ROLEopenGauss=# GRANT USAGE ON schema myschema TO jack;GRANT 将用户jack对于myschema的usage权限收回。 12 openGauss=# REVOKE USAGE ON schema myschema FROM jack;REVOKE 删除schema 当schema为空时,即该schema下没有数据库对象,使用DROP SCHEMA命令进行删除。例如删除名为nullschema的空schema。 12 openGauss=# DROP SCHEMA IF EXISTS nullschema;DROP SCHEMA 当schema非空时,如果要删除一个schema及其包含的所有对象,需要使用CASCADE关键字。例如删除myschema及该schema下的所有对象。 12 openGauss=# DROP SCHEMA myschema CASCADE;DROP SCHEMA 执行如下命令删除用户jack。 12 openGauss=# DROP USER jack;DROP ROLE
  • 注意事项 GaussDB包含一个或多个已命名数据库。用户和用户组在数据库范围内是共享的,但是其数据并不共享。任何与服务器连接的用户都只能访问连接请求里声明的那个数据库。 一个数据库可以包含一个或多个已命名的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中所有模式的前面,即具有第二搜索优先级。这样确保可以搜索到数据库内置对象。如果用户需要使用和系统内置对象重名的自定义对象时,可以在操作自定义对象时带上自己的模式。
  • 背景信息 当用户对数据库中的一张或者多张表的某些字段的组合感兴趣,而又不想每次键入这些查询时,用户就可以定义一个视图,以便解决这个问题。 视图与基本表不同,不是物理上实际存在的,是一个虚表。数据库中仅存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。若基本表中的数据发生变化,从视图中查询出的数据也随之改变。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中用户感兴趣的数据及变化。视图每次被引用的时候都会运行一次。
  • 操作步骤 向表中插入数据前,意味着表已创建成功。创建表的步骤请参考创建和管理表。 向表customer_t1中插入一行: 数据值是按照这些字段在表中出现的顺序列出的,并且用逗号分隔。通常数据值是文本(常量),但也允许使用标量表达式。 1 openGauss=# INSERT INTO customer_t1(c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', 'Grace'); 如果用户已经知道表中字段的顺序,也可无需列出表中的字段。例如以下命令与上面的命令效果相同。 1 openGauss=# INSERT INTO customer_t1 VALUES (3769, 'hello', 'Grace'); 如果用户不知道所有字段的数值,可以忽略其中的一些。没有数值的字段将被填充为字段的缺省值。例如: 123 openGauss=# INSERT INTO customer_t1 (c_customer_sk, c_first_name) VALUES (3769, 'Grace');openGauss=# INSERT INTO customer_t1 VALUES (3769, 'hello'); 用户也可以对独立的字段或者整个行明确缺省值: 123 openGauss=# INSERT INTO customer_t1 (c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', DEFAULT);openGauss=# INSERT INTO customer_t1 DEFAULT VALUES; 如果需要在表中插入多行,请使用以下命令: 1234 openGauss=# 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中,则可以执行如下命令。 123456789 openGauss=# CREATE TABLE customer_t2( c_customer_sk integer, c_customer_id char(5), c_first_name char(6), c_last_name char(8));openGauss=# INSERT INTO customer_t2 SELECT * FROM customer_t1; 从指定表插入数据到当前表时,若指定表与当前表对应的字段数据类型之间不存在隐式转换,则这两种数据类型必须相同。 删除备份表。 1 openGauss=# DROP TABLE customer_t2 CASCADE; 在删除表的时候,若当前需删除的表与其他表有依赖关系,需先删除关联的表,然后再删除当前表。
  • 背景信息 服务端与客户端使用不同的字符集时,两者字符集中单个字符的长度也会不同,客户端输入的字符串会以服务端字符集的格式进行处理,所以产生的最终结果可能会与预期不一致。 表1 客户端和服务端设置字符集的输出结果对比 操作过程 服务端和客户端编码一致 服务端和客户端编码不一致 存入和取出过程中没有对字符串进行操作 输出预期结果 输出预期结果(输入与显示的客户端编码必须一致)。 存入取出过程对字符串有做一定的操作(如字符串函数操作) 输出预期结果 根据对字符串具体操作可能产生非预期结果。 存入过程中对超长字符串有截断处理 输出预期结果 字符集中字符编码长度是否一致,如果不一致可能会产生非预期的结果。 上述字符串函数操作和自动截断产生的效果会有叠加效果,例如:在客户端与服务端字符集不一致的场景下,如果既有字符串操作,又有字符串截断,在字符串被处理完以后的情况下继续截断,这样也会产生非预期的效果。详细的示例请参见表2。 数据库DBCOMPATIBILITY设为兼容TD模式,且td_compatible_truncation参数设置为on的情况下,才会对超长字符串进行截断。 执行如下命令建立示例中需要使用的表table1、table2。 12 openGauss=# CREATE TABLE table1(id int, a char(6), b varchar(6),c varchar(6));openGauss=# CREATE TABLE table2(id int, a char(20), b varchar(20),c varchar(20)); 表2 示例 编号 服务端字符集 客户端字符集 是否启用自动截断 示例 结果 说明 1 SQL_ASCII UTF8 是 1 openGauss=# INSERT INTO table1 VALUES(1,reverse('123AA78'),reverse('123AA78'),reverse('123AA78')); 123 id |a|b|c----+------+------+------1 | 87| 87| 87 字符串在服务端翻转后,并进行截断,由于服务端和客户端的字符集不一致,字符A在客户端由多个字节表示,结果产生异常。 2 SQL_ASCII UTF8 是 1 openGauss=# INSERT INTO table1 VALUES(2,reverse('123A78'),reverse('123A78'),reverse('123A78')); 123 id |a|b|c----+------+------+------2 | 873| 873| 873 字符串翻转后,又进行了自动截断,所以产生了非预期的效果。 3 SQL_ASCII UTF8 是 1 openGauss=# INSERT INTO table1 VALUES(3,'87A123','87A123','87A123'); 123 id | a | b | c----+-------+-------+------- 3 | 87A1 | 87A1 | 87A1 字符串类型的字段长度是客户端字符编码长度的整数倍,所以截断后产生结果正常。 4 SQL_ASCII UTF8 否 12 openGauss=# INSERT INTO table2 VALUES(1,reverse('123AA78'),reverse('123AA78'),reverse('123AA78'));openGauss=# INSERT INTO table2 VALUES(2,reverse('123A78'),reverse('123A78'),reverse('123A78')); 1234 id |a|b|c----+-------------------+--------+--------1 | 87 321| 87 321 | 87 3212 | 87321| 87321| 87321 与示例1类似,多字节字符翻转之后不再表示原来的字符。
  • 列存表 数据按列进行存储,即一列所有数据是连续存储的。单列查询IO小,比行存表占用更少的存储空间。适合数据批量插入、更新较少和以查询为主统计分析类的场景。列存表不适合点查询。 1 2 3 4 5 6 7 8 910 openGauss=# CREATE TABLE customer_t2( state_ID CHAR(2), state_NAME VARCHAR2(40), area_ID NUMBER)WITH (ORIENTATION = COLUMN);--删除表openGauss=# DROP TABLE customer_t2;
  • 行存表 默认创建表的类型。数据按行进行存储,即一行数据是连续存储。适用于对数据需要经常更新的场景。 123456789 openGauss=# CREATE TABLE customer_t1( state_ID CHAR(2), state_NAME VARCHAR2(40), area_ID NUMBER);--删除表openGauss=# DROP TABLE customer_t1;
  • 更新表中数据 修改已经存储在数据库中数据的行为叫做更新。用户可以更新单独一行、所有行或者指定的部分行。还可以独立更新每个字段,而其他字段则不受影响。 使用UPDATE命令更新现有行,需要提供以下三种信息: 表的名称和要更新的字段名 字段的新值 要更新哪些行 SQL通常不会为数据行提供唯一标识,因此无法直接声明需要更新哪一行。但是可以通过声明一个被更新的行必须满足的条件。只有在表里存在主键的时候,才可以通过主键指定一个独立的行。 建立表和插入数据的步骤请参考创建表和向表中插入数据。 需要将表customer_t1中c_customer_sk为9527的地域重新定义为9876: 1 openGauss=# UPDATE customer_t1 SET c_customer_sk = 9876 WHERE c_customer_sk = 9527; 这里的表名称也可以使用模式名修饰,否则会从默认的模式路径找到这个表。SET后面紧跟字段和新的字段值。新的字段值不仅可以是常量,也可以是变量表达式。 比如,把所有c_customer_sk的值增加100: 1 openGauss=# UPDATE customer_t1 SET c_customer_sk = c_customer_sk + 100; 在这里省略了WHERE子句,表示表中的所有行都要被更新。如果出现了WHERE子句,那么只有匹配其条件的行才会被更新。 在SET子句中的等号是一个赋值,而在WHERE子句中的等号是比较。WHERE条件不一定是相等测试,许多其他的操作符也可以使用。 用户可以在一个UPDATE命令中更新更多的字段,方法是在SET子句中列出更多赋值,比如: 1 openGauss=# UPDATE customer_t1 SET c_customer_id = 'Admin', c_first_name = 'Local' WHERE c_customer_sk = 4421; 批量更新或删除数据后,会在数据文件中产生大量的删除标记,查询过程中标记删除的数据也是需要扫描的。故多次批量更新/删除后,标记删除的数据量过大会严重影响查询的性能。建议在批量更新/删除业务会反复执行的场景下,定期执行VACUUM FULL以保持查询性能。 父主题: 创建和管理表
  • 查看和停止正在运行的查询语句 通过视图PG_STAT_ACTIVITY可以查看正在运行的查询语句。方法如下: 设置参数track_activities为on。 1 SET track_activities = on; 当此参数为on时,数据库系统才会收集当前活动查询的运行信息。 查看正在运行的查询语句。以查看正在运行的查询语句所连接的数据库名、执行查询的用户、查询状态及查询对应的PID为例: 1 SELECT datname, usename, state,pid FROM pg_stat_activity; 12345678 datname | usename | state | pid----------+---------+--------+----------------- postgres | Ruby | active | 140298793514752 postgres | Ruby | active | 140298718004992 postgres | Ruby | idle | 140298650908416 postgres | Ruby | idle | 140298625742592 postgres | omm | active | 140298575406848(5 rows) 如果state字段显示为idle,则表明此连接处于空闲,等待用户输入命令。 如果仅需要查看非空闲的查询语句,则使用如下命令查看: 1 SELECT datname, usename, state pid FROM pg_stat_activity WHERE state != 'idle'; 若需要取消运行时间过长的查询,通过PG_TERMINATE_BACKEND函数,根据线程ID结束会话。 1 SELECT PG_TERMINATE_BACKEND(139834759993104); 显示类似如下信息,表示结束会话成功。 1234 PG_TERMINATE_BACKEND---------------------- t(1 row) 显示类似如下信息,表示用户执行了结束当前会话的操作。 12 FATAL: terminating connection due to administrator commandFATAL: terminating connection due to administrator command gsql客户端使用PG_TERMINATE_BACKEND函数结束当前会话后台线程时,客户端不会退出而是自动重连。即还会返回“The connection to the server was lost. Attempting reset: Succeeded.” 123 FATAL: terminating connection due to administrator commandFATAL: terminating connection due to administrator commandThe connection to the server was lost. Attempting reset: Succeeded.
  • 查看数据库用户 通过PG_USER可以查看数据库中所有用户的列表,还可以查看用户ID(USESYSID)和用户权限。 1 SELECT * FROM pg_user; usename | usesysid | usecreatedb | usesuper | usecatupd | userepl | passwd | valbegin | valuntil | respool | parent | spacelimit | useconfig | nodegroup | tempspacelimit | spillspacelimit | usemonitoradmin | useoperatoradmin | usepolicyadmin---------+----------+-------------+----------+-----------+---------+----------+----------+----------+--------------+--------+------------+-----------+-----------+----------------+-----------------+-----------------+------------------+---------------- omm | 10 | t | t | t | t | ******** | | | default_pool | 0 | | | | | | t | t | t
  • 查看数据库中包含的表 例如,在PG_TABLES系统表中查看public schema中包含的所有表。 1 SELECT distinct(tablename) FROM pg_tables WHERE SCHEMANAME = 'public'; 结果类似如下这样: 123456789 tablename------------------- err_hr_staffs test err_hr_staffs_ft3 web_returns_p1 mig_seq_table films4(6 rows)
  • 查看数据 使用系统表pg_tables查询数据库所有表的信息。 1 openGauss=# SELECT * FROM pg_tables; 使用gsql的\d+命令查询表的属性。 1 openGauss=# \d+ customer_t1; 执行如下命令查询表customer_t1的数据量。 1 openGauss=# SELECT count(*) FROM customer_t1; 执行如下命令查询表customer_t1的所有数据。 1 openGauss=# SELECT * FROM customer_t1; 执行如下命令只查询字段c_customer_sk的数据。 1 openGauss=# SELECT c_customer_sk FROM customer_t1; 执行如下命令过滤字段c_customer_sk的重复数据。 1 openGauss=# SELECT DISTINCT( c_customer_sk ) FROM customer_t1; 执行如下命令查询字段c_customer_sk为3869的所有数据。 1 openGauss=# SELECT * FROM customer_t1 WHERE c_customer_sk = 3869; 执行如下命令按照字段c_customer_sk进行排序。 1 openGauss=# SELECT * FROM customer_t1 ORDER BY c_customer_sk; 父主题: 创建和管理表
  • 删除表中数据 在使用表的过程中,可能会需要删除已过期的数据,删除数据必须从表中整行的删除。 SQL不能直接访问独立的行,只能通过声明被删除行匹配的条件进行。如果表中有一个主键,用户可以指定准确的行。用户可以删除匹配条件的一组行或者一次删除表中的所有行。 使用DELETE命令删除行,如果删除表customer_t1中所有c_customer_sk为3869的记录: 1 openGauss=# DELETE FROM customer_t1 WHERE c_customer_sk = 3869; 如果执行如下命令之一,会删除表中所有的行。 1 openGauss=# DELETE FROM customer_t1; 或 1 openGauss=# TRUNCATE TABLE customer_t1; 全表删除的场景下,建议使用TRUNCATE,不建议使用DELETE。 删除创建的表: 1 openGauss=# DROP TABLE customer_t1; 父主题: 创建和管理表
  • 操作步骤 创建表空间 执行如下命令创建用户jack。 1 openGauss=# CREATE USER jack IDENTIFIED BY 'xxxxxxxxx'; 当结果显示为如下信息,则表示创建成功。 1 CREATE ROLE 执行如下命令创建表空间。 1 openGauss=# CREATE TABLESPACE fastspace RELATIVE LOCATION 'tablespace/tablespace_1'; 当结果显示为如下信息,则表示创建成功。 1 CREATE TABLESPACE 其中“fastspace”为新创建的表空间,“数据库节点数据目录/pg_location/tablespace/tablespace_1”是用户拥有读写权限的空目录。 数据库系统管理员执行如下命令将“fastspace”表空间的访问权限赋予数据用户jack。 1 openGauss=# GRANT CREATE ON TABLESPACE fastspace TO jack; 当结果显示为如下信息,则表示赋予成功。 1 GRANT
  • 背景信息 通过使用表空间,管理员可以控制一个数据库安装的磁盘布局。这样有以下优点: 如果初始化数据库所在的分区或者卷空间已满,又不能逻辑上扩展更多空间,可以在不同的分区上创建和使用表空间,直到系统重新配置空间。 表空间允许管理员根据数据库对象的使用模式安排数据位置,从而提高性能。 一个频繁使用的索引可以放在性能稳定且运算速度较快的磁盘上,比如一种固态设备。 一个存储归档的数据,很少使用的或者对性能要求不高的表可以存储在一个运算速度较慢的磁盘上。 管理员通过表空间可以设置占用的磁盘空间。用以在和其他数据共用分区的时候,防止表空间占用相同分区上的其他空间。 表空间可以控制数据库数据占用的磁盘空间,当表空间所在磁盘的使用率达到90%时,数据库将被设置为只读模式,当磁盘使用率降到90%以下时,数据库将恢复到读写模式。 建议用户使用数据库时,通过后台监控程序或者Database Manager进行磁盘空间使用率监控,以免出现数据库只读情况。 表空间对应于一个文件系统目录,假定数据库节点数据目录/pg_location/mount1/path1是用户拥有读写权限的空目录。 使用表空间配额管理会使性能有30%左右的影响,MAXSIZE指定每个数据库节点的配额大小,误差范围在500MB以内。请根据实际的情况确认是否需要设置表空间的最大值。 GaussDB自带了两个表空间:pg_default和pg_global。 默认表空间pg_default:用来存储非共享系统表、用户表、用户表index、临时表、临时表index、内部临时表的默认表空间。对应存储目录为实例数据目录下的base目录。 共享表空间pg_global:用来存放共享系统表的表空间。对应存储目录为实例数据目录下的global目录。
  • 背景信息 初始时,GaussDB包含两个模板数据库template0、template1,以及一个默认的用户数据库postgres。postgres默认的兼容数据库类型为O(即DBCOMPATIBILITY = A ),该兼容类型下将空字符串作为NULL处理。 CREATE DATABASE实际上通过拷贝模板数据库来创建新数据库。默认情况下,拷贝template0。请避免使用客户端或其他手段连接及操作两个模板数据库。 模板数据库中没有用户表,可通过系统表PG_DATABASE查看模板数据库属性。 模板template0不允许用户连接;模板template1只允许数据库初始用户和系统管理员连接,普通用户无法连接。 GaussDB允许创建的数据库总数目上限为128个。 数据库系统中会有多个数据库,但是客户端程序一次只能连接一个数据库。也不能在不同的数据库之间相互查询。一个GaussDB中存在多个数据库时,需要通过-d参数指定相应的数据库实例进行连接。
  • 注意事项 如果数据库的编码为SQL_ASCII(可以通过“show server_encoding;”命令查看当前数据库存储编码),则在创建数据库对象时,如果对象名中含有多字节字符(例如中文),超过数据库对象名长度限制(63字节)的时候,数据库将会将最后一个字节(而不是字符)截断,可能造成出现半个字符的情况。 针对这种情况,请遵循以下条件: 保证数据对象的名称不超过限定长度。 修改数据库的默认存储编码集(server_encoding)为utf-8编码集。 不要使用多字节字符做为对象名。 创建的数据库总数目建议不超过128个。 如果出现因为误操作导致在多字节字符的中间截断而无法删除数据库对象的现象,请使用截断前的数据库对象名进行删除操作,或将该对象从各个数据库节点的相应系统表中依次删掉。
  • 创建表 执行如下命令创建表。 1234567 openGauss=# CREATE TABLE customer_t1( c_customer_sk integer, c_customer_id char(5), c_first_name char(6), c_last_name char(8)); 当结果显示为如下信息,则表示创建成功。 1 CREATE TABLE 其中c_customer_sk 、c_customer_id、c_first_name和c_last_name是表的字段名,integer、char(5)、char(6)和char(8)分别是这四个字段名称的类型。
  • 操作步骤 使用如下命令创建一个新的数据库db_tpcc。 12 openGauss=# CREATE DATABASE db_tpcc;CREATE DATABASE 数据库名称遵循SQL标识符的一般规则。当前角色自动成为此新数据库的所有者。 如果一个数据库系统用于承载相互独立的用户和项目,建议把它们放在不同的数据库里。 如果项目或者用户是相互关联的,并且可以相互使用对方的资源,则应该把它们放在同一个数据库里,但可以规划在不同的模式中。模式只是一个纯粹的逻辑结构,某个模式的访问权限由权限系统模块控制。 创建数据库时,若数据库名称长度超过63字节,server端会对数据库名称进行截断,保留前63个字节,因此建议数据库名称长度不要超过63个字节。 查看数据库 使用\l元命令查看数据库系统的数据库列表。 1 openGauss=# \l 使用如下命令通过系统表pg_database查询数据库列表。 1 openGauss=# SELECT datname FROM pg_database; 修改数据库 用户可以使用如下命令修改数据库属性(比如:owner、名称和默认的配置属性)。 使用以下命令为数据库设置默认的模式搜索路径。 12 openGauss=# ALTER DATABASE db_tpcc SET search_path TO pa_catalog,public;ALTER DATABASE 使用如下命令为数据库重新命名。 12 openGauss=# ALTER DATABASE db_tpcc RENAME TO human_tpcds;ALTER DATABASE 删除数据库 用户可以使用DROP DATABASE命令删除数据库。这个命令删除了数据库中的系统目录,并且删除了磁盘上带有数据的数据库目录。用户必须是数据库的owner或者系统管理员才能删除数据库。当有人连接数据库时,删除操作会失败。删除数据库时请先连接到其他的数据库。 使用如下命令删除数据库: 12 openGauss=# DROP DATABASE human_tpcds;DROP DATABASE
  • 连接数据库 连接数据库的客户端工具包括DAS、gsql和应用程序接口(如ODBC和JDBC)。 通过华为云数据管理服务(Data Admin Service,简称DAS)这款可视化的专业数据库管理工具,可获得执行SQL、高级数据库管理、智能化运维等功能,做到易用、安全、智能的管理数据库。GaussDB默认开通DAS连接权限。推荐使用DAS连接实例。连接GaussDB的具体操作请参考《DAS用户指南》。 gsql是GaussDB自带的客户端工具。使用gsql连接数据库,可以交互式地输入、编辑、执行SQL语句。具体连接方式请参考实例连接方式介绍。 用户可以使用标准的数据库应用程序接口(如ODBC和JDBC),开发基于GaussDB的应用程序。 分布式场景下:客户端工具通过连接CN访问数据库。因此连接前,需获取CN所在服务器的IP地址及CN的端口号信息。客户端工具可以通过连接任何一个CN访问数据库。正常业务使用禁止直接连接DN访问数据库。 主备版场景下:客户端工具通过连接主DN访问数据库。因此连接前,需获取主DN所在服务器的IP地址及端口号信息。正常业务使用禁止直接连接其他DN访问数据库。 应用程序接口 父主题: 数据库使用
  • 数据库逻辑结构图 GaussDB的数据库节点负责存储数据,其存储介质也是磁盘,本节主要从逻辑视角介绍数据库节点都有哪些对象,以及这些对象之间的关系。数据库逻辑结构如图1。 图1 数据库逻辑结构图 Tablespace,即表空间,是一个目录,可以存在多个,里面存储的是它所包含的数据库的各种物理文件。每个表空间可以对应多个Database。 Database,即数据库,用于管理各类数据对象,各数据库间相互隔离。数据库管理的对象可分布在多个Tablespace上。 Datafile Segment,即数据文件,通常每张表只对应一个数据文件。如果某张表的数据大于1GB,则会分为多个数据文件存储。 Table,即表,每张表只能属于一个数据库,也只能对应到一个Tablespace。每张表对应的数据文件必须在同一个Tablespace中。 Block,即数据块,是数据库管理的基本单位,默认大小为8KB。 父主题: 概述
  • 异步命令处理 PQexec函数对普通的同步应用里提交命令已经足够使用。但是它却有几个缺陷,而这些缺陷可能对某些用户很重要: PQexec等待命令结束,而应用可能还有其它的工作要做(比如维护用户界面等),此时PQexec可不想阻塞在这里等待响应。 因为客户端应用在等待结果的时候是处于挂起状态的,所以应用很难判断它是否该尝试结束正在进行的命令。 PQexec只能返回一个PGresult结构。如果提交的命令字符串包含多个SQL命令,除了最后一个PGresult以外都会被PQexec丢弃。 PQexec总是收集命令的整个结果,将其缓存在一个PGresult中。虽然这为应用简化了错误处理逻辑,但是对于包含多行的结果是不切实际的。 不想受到这些限制的应用可以改用下面的函数,这些函数也是构造PQexec的函数:PQsendQuery和PQgetResult。PQsendQueryParams,PQsendPrepare,PQsendQueryPrepared也可以和PQgetResult一起使用。 PQsendQuery PQsendQueryParams PQsendPrepare PQsendQueryPrepared PQflush 父主题: libpq
  • 事务管理 在事务管理上,GaussDB采取了MVCC(多版本并发控制)结合两阶段锁的方式,其特点是读写之间不阻塞。GaussDBMVCC没有将历史版本数据统一存放,而是和当前元组的版本放在了一起。GaussDB没有回滚段的概念,但是为了定期清除历史版本数据GaussDB引入了一个VACUUM线程。一般情况下,除非用户要做性能调优,否则不用特别关注VACUUM线程。此外,GaussDB对于单语句查询(没有使用begin等语句显示启动事务块)是自动提交事务的。
  • 原型 int PQsendQueryParams(PGconn *conn, const char *command, int nParams, const Oid *paramTypes, const char * const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat);
  • 返回值 PQresultStatus:命令执行结果的枚举,包括: 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930 PQresultStatus可以返回下面数值之一:PGRES_EMPTY_QUERY发送给服务器的字串是空的。PGRES_COMMAND_OK成功完成一个不返回数据的命令。PGRES_TUPLES_OK成功执行一个返回数据的查询(比如SELECT或者SHOW)。PGRES_COPY_OUT(从服务器)Copy Out (拷贝出)数据传输开始。PGRES_COPY_INCopy In(拷贝入)(到服务器)数据传输开始。PGRES_BAD_RESPONSE服务器的响应无法理解。PGRES_NONFATAL_ERROR发生了一个非致命错误(通知或者警告)。PGRES_FATAL_ERROR发生了一个致命错误。PGRES_COPY_BOTH拷贝入/出(到和从服务器)数据传输开始。这个特性当前只用于流复制, 所以这个状态不会在普通应用中发生。PGRES_SINGLE_TUPLEPGresult包含一个来自当前命令的结果元组。 这个状态只在查询选择了单行模式时发生
  • 注意事项 在非阻塞连接上发送任何命令或数据之后,调用PQflush。如果返回1,则等待套接字变为读或写就绪。如果为写就绪状态,则再次调用PQflush。如果已经读到,调用PQconsumeInput,然后再次调用PQflush。重复,直到PQflush返回0。(必须检查读就绪,并用PQconsumeInput排出输入,因为服务器可以阻止试图向我们发送数据,例如。通知信息,直到我们读完它才会读我们的数据。)一旦PQflush返回0,就等待套接字准备好,然后按照上面描述读取响应。
  • 原型 int PQsendQueryPrepared(PGconn *conn, const char *stmtName, int nParams, const char * const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat);
  • Psycopg Psycopg接口是一套提供给用户的API方法,本节将对部分常用接口做具体描述。 psycopg2.connect() connection.cursor() cursor.execute(query,vars_list) curosr.executemany(query,vars_list) connection.commit() connection.rollback() cursor.fetchone() cursor.fetchall() cursor.close() connection.close() 父主题: 接口参考
  • PG_CAST PG_CAST系统表存储数据类型之间的转化关系。 表1 PG_CAST字段 名称 类型 描述 oid oid 行标识符(隐含属性,必须明确选择)。 castsource oid 源数据类型的OID。 casttarget oid 目标数据类型的OID。 castfunc oid 转化函数的OID。如果为零表明不需要转化函数。 castcontext "char" 源数据类型和目标数据类型间的转化方式: 'e':表示只能进行显式转化(使用CAST或::语法)。 'i':表示能进行隐式转化。 'a':表示类型间同时支持隐式和显式转化。 castmethod "char" 转化方法: 'f':使用castfunc字段中指定的函数进行转化。 'b':类型间是二进制强制转化,不使用castfunc。 父主题: 系统表
  • PG_ATTRDEF PG_ATTRDEF系统表存储列的默认值。 表1 PG_ATTRDEF字段 名称 类型 描述 oid oid 行标识符(隐含属性,必须明确选择)。 adrelid oid 该列的所属表。 adnum smallint 该列的数目。 adbin pg_node_tree 字段缺省值或生成表达式的内部表现形式。 adsrc text 可读缺省值或生成表达式的内部表现形式。 adgencol "char" 标识该列是否为生成列。取值为's'表示该列为生成列,取值为'\0'表示该列为普通列,默认值为'\0'。 父主题: 系统表
共100000条