华为云用户手册

  • 响应示例 1 2 3 4 5 6 7 8 9 10 11 12 { "keypairs": [ { "keypair": { "fingerprint": "15:b0:f8:b3:f9:48:63:71:cf:7b:5b:38:6d:44:2d:4a", "name": "keypair-test", "type": "ssh", "public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC+Eo/RZRngaGTkFs7I62ZjsIlO79KklKbMXi8F+KITD4bVQHHn+kV+4gRgkgCRbdoDqoGfpaDFs877DYX9n4z6FrAIZ4PES8TNKhatifpn9NdQYWA+IkU8CuvlEKGuFpKRi/k7JLos/gHi2hy7QUwgtRvcefvD/vgQZOVw/mGR9Q== Generated-by-Nova" } } ] }
  • URI DELETE /v1/{project_id}/baremetalservers/{server_id}/os-server-password 参数说明请参见表1。 表1 参数说明 参数 是否必选 描述 project_id 是 项目ID。 获取方式请参见获取项目ID。 server_id 是 裸金属服务器ID。 可以从裸金属服务器控制台查询,或者通过调用查询裸金属服务器列表(OpenStack原生)获取。
  • 响应参数 参数 参数类型 描述 keypair Object SSH密钥信息,详情请参见表3。 表3 keypair字段数据结构说明 参数 参数类型 描述 fingerprint String 密钥对应指纹信息。 name String 密钥名称。 public_key String 密钥对应的公钥信息。 private_key String 密钥对应的私钥信息。 创建SSH密钥时,响应中包括private_key的信息。 导入SSH密钥时,响应中不包括private_key的信息。 user_id String 密钥所属用户ID。
  • 响应示例 1 2 3 4 5 6 7 8 { "keypair": { "public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC9mC3WZN9UGLxgPBpP7H5jZMc6pKwOoSgre8yun6REFktn/Kz7DUt9jaR1UJyRzHxITfCfAIgSxPdGqB/oF1suMyWgu5i0625vavLB5z5kC8Hq3qZJ9zJO1poE1kyD+htiTtPWJ88e12xuH2XB/CZN9OpEiF98hAagiOE0EnOS5Q== Generated by Nova\n", "user_id": "f882feb345064e7d9392440a0f397c25", "name": "keypair-7d7c3650-dabe-4eb0-b904-5c464453c043", "fingerprint": "35:9d:d0:c3:4a:80:d3:d8:86:f1:ca:f7:df:c4:f9:d8" } }
  • 请求示例 创建和导入名称为keypair-7d7c3650-dabe-4eb0-b904-5c464453c043,公钥信息为ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC9mC3WZN9UGLxgPBpP7H5jZMc6pKwOoSgre8yun6REFktn/Kz7DUt9jaR1UJyRzHxITfCfAIgSxPdGqB/oF1suMyWgu5i0625vavLB5z5kC8Hq3qZJ9zJO1poE1kyD+htiTtPWJ88e12xuH2XB/CZN9OpEiF98hAagiOE0EnOS5Q== Generated by Nova\n的SSH密钥。 1 POST https://{ECS Endpoint}/v2.1/bbf1946d374b44a0a2a95533562ba954/os-keypairs 1 2 3 4 5 6 { "keypair": { "name": "keypair-7d7c3650-dabe-4eb0-b904-5c464453c043", "public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC9mC3WZN9UGLxgPBpP7H5jZMc6pKwOoSgre8yun6REFktn/Kz7DUt9jaR1UJyRzHxITfCfAIgSxPdGqB/oF1suMyWgu5i0625vavLB5z5kC8Hq3qZJ9zJO1poE1kyD+htiTtPWJ88e12xuH2XB/CZN9OpEiF98hAagiOE0EnOS5Q== Generated by Nova\n" } }
  • 请求参数 创建SSH密钥时,只需要提交SSH密钥的name属性。导入SSH密钥时,才需要提交public_key属性。 参数 是否必选 参数类型 描述 keypair 是 Object 创建或导入的SSH密钥信息,详情请参见表2。 表2 keypair字段数据结构说明 参数 是否必选 参数类型 描述 public_key 否 String 导入的公钥信息。导入公钥最大长度为1024字节。 注:长度超过1024字节会导致裸金属服务器注入该密钥失败。 name 是 String 密钥名称。 新创建的密钥名称不能和已有密钥名称相同。
  • URI PUT /v2.1/{project_id}/servers/{server_id}/tags/{tag} 参数说明请参见表1。 表1 参数说明 参数 是否必选 描述 project_id 是 项目ID。 获取方式请参见获取项目ID。 server_id 是 裸金属服务器ID。 可以从裸金属服务器控制台查询,或者通过调用查询裸金属服务器列表(OpenStack原生)获取。 tag 是 标签信息。 约束: 标签的长度不超过80个字符。 标签不能以点“.”开头。 不支持创建空标签(空串)。 中文或特殊字符需要进行URLEncode。
  • 响应参数 参数 参数类型 描述 keypair Object SSH密钥信息,详情请参见表2。 表2 keypair字段数据结构说明 参数 参数类型 描述 public_key String 密钥对应publicKey信息。 name String 密钥名称。 fingerprint String 密钥对应指纹信息。 created_at String 密钥创建时间。 时间戳格式为ISO 8601,例如:2019-05-07T12:06:13.681238 deleted Boolean 密钥删除标记。 true:表示密钥已被删除。 false:表示密钥未被删除。 deleted_at String 密钥删除时间。 时间戳格式为ISO 8601,例如:2019-05-07T12:06:13.681238 id String 密钥ID。 updated_at String 密钥更新时间。 时间戳格式为ISO 8601,例如:2019-05-07T12:06:13.681238 user_id String 密钥所属用户信息。
  • 响应示例 1 2 3 4 5 6 7 8 9 10 11 12 13 { "keypair": { "created_at": "2019-05-07T12:06:13.681238", "deleted": false, "deleted_at": null, "fingerprint": "9d:00:f4:d7:26:6e:52:06:4c:c1:d3:1d:fd:06:66:01", "id": 1, "name": "keypair-3582d8b7-e588-4aad-b7f7-f4e76f0e4314", "public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDYJrTVpcMwFqQy/oMvtUSRofZdSRHEwrsX8AYkRvn2ZnCXM+b6+GZ2NQuuWj+ocznlnwiGFQDsL/yeE+/kurqcPJFKKp60mToXIMyzioFxW88fJtwEWawHKAclbHWpR1t4fQ4DS+/sIbX/Yd9btlVQ2tpQjodGDbM9Tr9/+/3i6rcR+EoLqmbgCgAiGiVV6VbM2Zx79yUwd+GnQejHX8BlYZoOjCnt3NREsITcmWE9FVFy6TnLmahs3FkEO/QGgWGkaohAJlsgaVvSWGgDn2AujKYwyDokK3dXyeX3m2Vmc3ejiqPa/C4nRrCOlko5nSgV/9IXRx1ERImsqZnE9usB Generated-by-Nova", "updated_at": null, "user_id": "fake" } }
  • URI GET /v2.1/{project_id}/servers/{server_id}/tags/{tag} 参数说明请参见表1。 表1 参数说明 参数 是否必选 描述 project_id 是 项目ID。 获取方式请参见获取项目ID。 server_id 是 裸金属服务器ID。 可以从裸金属服务器控制台查询,或者通过调用查询裸金属服务器列表(OpenStack原生)获取。 tag 是 待查询标签的key。 约束: 中文或特殊字符需要进行URLEncode。 如果未指定标签的key,将返回该裸金属服务器所有的标签。
  • 响应参数 参数 参数类型 描述 absolute Object 租户配额信息,详情请参见表2。 以下参数值为“-1”时,表示无数量限制。 表2 absolute数据结构说明 参数 参数类型 描述 maxTotalInstances Integer 裸金属服务器最大申请数量。 maxTotalCores Integer CPU核数最大申请数量。 maxTotalRAMSize Integer 内存最大申请容量(单位:MB)。 maxTotalKeypairs Integer 可以申请的SSH密钥对最大数量。 maxServerMeta Integer 可输入元数据的最大长度。 maxPersonality Integer 可注入文件的最大个数。 maxPersonalitySize Integer 注入文件内容的最大长度(单位:Byte)。 maxServerGroups Integer 服务器组的最大个数。 maxServerGroupMembers Integer 服务器组中的最大裸金属服务器数。 totalServerGroupsUsed Integer 已使用的服务器组个数。 maxSecurityGroups Integer 安全组最大使用个数。 说明: 具体配额限制请以VPC配额限制为准。 maxSecurityGroupRules Integer 安全组中安全组规则最大的配置个数。 说明: 具体配额限制请以VPC配额限制为准。 maxTotalFloatingIps Integer 最大的弹性IP使用个数。 maxImageMeta Integer 镜像元数据最大的长度。 totalInstancesUsed Integer 当前裸金属服务器使用个数。 totalCoresUsed Integer 当前已使用CPU核数。 totalRAMUsed Integer 当前内存使用容量(单位:MB)。 totalSecurityGroupsUsed Integer 当前安全组使用个数。 totalFloatingIpsUsed Integer 当前弹性IP使用个数。
  • 响应示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 { "absolute": { "maxServerMeta": 128, "maxPersonality": 5, "maxImageMeta": 128, "maxPersonalitySize": 10240, "maxSecurityGroupRules": 20, "maxTotalKeypairs": 100, "totalRAMUsed": 799836, "totalInstancesUsed": 21, "maxSecurityGroups": 10, "totalFloatingIpsUsed": 0, "maxTotalCores": -1, "totalSecurityGroupsUsed": 1, "maxTotalFloatingIps": 10, "maxTotalInstances": 100, "totalCoresUsed": 148, "maxTotalRAMSize": -1, "maxServerGroups": -1, "maxServerGroupMembers": -1, "totalServerGroupsUsed": 1 } }
  • 前提条件 由于某些机型的服务器没有配备SDI卡,或者其他服务器本身的原因,有些规格的裸金属服务器不支持挂载云硬盘。因此,您需要先确认裸金属服务器是否支持挂载云硬盘。判断方式如下: 调用查询规格详情和规格扩展信息列表API,确定响应参数中某个规格对应的“baremetal:__support_evs”的取值,如果为“true”表示支持挂载云硬盘,为“false”表示不支持。有些裸金属服务器规格中无此参数,也表示不支持云硬盘。
  • 操作步骤 创建云硬盘。 接口相关信息 URI格式:POST /v2/{project_id}/volumes 详情请参考“创建云硬盘”。 请求示例 POST https://{EVS Endpoint}/v2/05041fffa40025702f6dc009cc6f8f33/volumes {EVS Endpoint}信息请从“地区和终端节点”获取。 Body: { "volume": { "name": "openapi_vol01", "availability_zone": "cn-north-4a", "description": "create for api test", "volume_type": "SSD", "metadata": { "hw:passthrough": "true" }, "size": 40 } } 裸金属服务器仅支持挂载SCSI类型的云硬盘,因此“hw:passthrough”参数必须取值“true”。 响应示例 { "volume": { "attachments": [], "links": [ { "href": "https://evs.cn-north-4.myhuaweicloud.com/v2/05041fffa40025702f6dc009cc6f8f33/volumes/8ae4ff5b-7e6e-492f-b83a-8a51fdfa3111", "rel": "self" }, { "href": "https://evs.cn-north-4.myhuaweicloud.com/05041fffa40025702f6dc009cc6f8f33/volumes/8ae4ff5b-7e6e-492f-b83a-8a51fdfa3111", "rel": "bookmark" } ], "availability_zone": "cn-north-4a", "encrypted": false, "updated_at": "2020-11-09T08:19:22.077967", "replication_status": "disabled", "storage_cluster_id": null, "snapshot_id": null, "id": "8ae4ff5b-7e6e-492f-b83a-8a51fdfa3111", "size": 40, "user_id": "0504186e6a8010e01f3ec009a7279baa", "metadata": { "hw:passthrough": "true" }, "status": "creating", "description": "create for api test", "multiattach": false, "source_volid": null, "consistencygroup_id": null, "name": "openapi_vol01", "bootable": "false", "created_at": "2020-11-09T08:19:22.061273", "volume_type": "SSD", "shareable": false } } 记录响应中volume的“ID”。 挂载云硬盘。 接口相关信息 URI格式:POST /v1/{project_id}/baremetalservers/{server_id}/attachvolume 详情请参考裸金属服务器挂载云硬盘。 请求示例 POST https://{BMS Endpoint}/v1/05041fffa40025702f6dc009cc6f8f33/baremetalservers/9ab74d89-61e7-4259-8546-465fdebe4944/attachvolume {BMS Endpoint}信息请从“地区和终端节点”获取。 Body: { "volumeAttachment": { "volumeId": "8ae4ff5b-7e6e-492f-b83a-8a51fdfa3111", "device": "/dev/sdb" } } 响应示例 { "volumeAttachment": { "id": "b53f23bd-ee8f-49ec-9420-d1acfeaf91d6", "volumeId": "8ae4ff5b-7e6e-492f-b83a-8a51fdfa3111", "serverId": "9ab74d89-61e7-4259-8546-465fdebe4944", "device": "/dev/sdb" } } 确认挂载云硬盘是否成功。 接口相关信息 URI格式:GET /v1/{project_id}/baremetalservers/{server_id}/os-volume_attachments 详情请参考查询裸金属服务器挂载的云硬盘信息。 请求示例 GET https://{BMS Endpoint}/v1/05041fffa40025702f6dc009cc6f8f33/baremetalservers/9ab74d89-61e7-4259-8546-465fdebe4944/os-volume_attachments {BMS Endpoint}信息请从“地区和终端节点”获取。 响应示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 { "volumeAttachments": [ { "device": "/dev/sdd", "id": "a26887c6-c47b-4654-abb5-dfadf7d3f803", "serverId": "9ab74d89-61e7-4259-8546-465fdebe4944", "volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803" }, { "device": "/dev/sdb", "id": "b53f23bd-ee8f-49ec-9420-d1acfeaf91d6", "serverId": "9ab74d89-61e7-4259-8546-465fdebe4944", "volumeId": "8ae4ff5b-7e6e-492f-b83a-8a51fdfa3111" } ] }
  • 云审计服务支持的FunctionGraph操作列表 云审计支持的FunctionGraph操作列表如表1所示。 表1 云审计服务支持的FunctionGraph操作列表 操作名称 资源类型 事件名称 创建函数 Functions createFunction 删除函数 Functions deleteFunction 修改函数信息 Functions updateFunctionConfig 发布函数版本 FunctionVersions publishFunctionVersion 删除函数版本别名 FunctionVersionsAlias deleteVersionAlias 删除函数触发器 Trigger deleteTrigger 创建函数触发器 Trigger createTrigger 停用函数触发器 Trigger disableTrigger 启用函数触发器 Trigger enableTrigger 父主题: 审计
  • 概述 函数是处理事件的自定义代码,您可以使用空白模板函数创建函数,根据实际业务场景进行函数配置。 由于FunctionGraph承担计算资源的管理工作,在函数完成编码以后,需要为函数设置运算资源等信息,目前主要是在FunctionGraph函数控制台完成。 创建函数时可以使用空模板,也可以使用示例模板创建函数、使用容器镜像部署函数。 使用空模板创建函数时,需要设置基础配置信息和代码信息,如表1所示,带*参数为必填项。 每个FunctionGraph函数都运行在其自己的环境中,有其自己的资源和文件系统。
  • 查看代码信息 查看代码属性 代码属性展示最新部署代码的大小及上次修改时间。 图3 查看代码属性 查看基本信息 函数创建完成后,各语言默认内存和执行超时时间如图4所示,请根据实际业务评估,若需修改“函数执行入口”、“内存(MB)”“执行超时时间(秒)”,可单击“编辑”,在常规设置中修改配置信息,具体请参见配置常规信息。 图4 编辑基本信息 函数一旦创建,便不能修改运行时语言。 表2 各语言默认基本信息 Runtime 默认基本信息 JAVA 内存(MB):512MB 函数执行入口:com.demo.TriggerTests.apigTest 执行超时时间(秒):15s Node.js 内存(MB):128 MB 函数执行入口:index.handler 执行超时时间(秒):3s Custom 内存(MB):128 MB 函数执行入口:bootstrap 执行超时时间(秒):3s PHP 内存(MB):128 MB 函数执行入口:index.handler 执行超时时间(秒):3s Python 内存(MB):128 MB 函数执行入口:index.handler 执行超时时间(秒):3s Go 1.x 内存(MB):128 MB 函数执行入口:handler 执行超时时间(秒):3s
  • 在代码中导入sklearn并使用 # 导入 sklearn 相关内容 from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier def handler (event, context): iris=datasets.load_iris() iris_X=iris.data iris_y=iris.target X_train,X_test,y_train,y_test=train_test_split(iris_X,iris_y,test_size=0.3) knn=KNeighborsClassifier() knn.fit(X_train,y_train) print(knn.predict(X_test)) return y_test
  • 在代码中导入gym并使用 # 导入 gym 依赖 import gym env = gym.make('CartPole-v0') env.reset() def handler(event,context): for _ in range(10): env.render() observation, reward, done, info, _ = env.step(env.action_space.sample()) # take a random action temp = env.step(env.action_space.sample()) # take a random action print('observation:{}, reward:{}, done:{}, info:{}'.format(observation, reward, done, info)) env.close()
  • 在代码中导入torch并使用 # -*- coding:utf-8 -*- import json # 导入torch依赖 import torch as t import numpy as np def handler (event, context): print("start training!") train() print("finished!") return { "statusCode": 200, "isBase64Encoded": False, "body": json.dumps(event), "headers": { "Content-Type": "application/json" } } def get_fake_data(batch_size=8): x = t.rand(batch_size, 1) * 20; y = x * 2 + (1 + t.randn(batch_size, 1)) * 3 return x, y def train(): t.manual_seed(1000) x, y = get_fake_data() w = t.rand(1, 1) b = t.zeros(1, 1) lr = 0.001 for ii in range(2000): x, y = get_fake_data() y_pred = x.mm(w) + b.expand_as(y) loss = 0.5 * (y_pred - y) ** 2 loss = loss.sum() dloss = 1 dy_pred = dloss * (y_pred - y) dw = x.t().mm(dy_pred) db = dy_pred.sum() w.sub_(lr * dw) b.sub_(lr * db) if ii % 10 == 0: x = t.arange(0, 20).view(-1, 1) y = x.float().mm(w)+ b.expand_as(x) x2, y2 = get_fake_data(batch_size=20) print("w=",w.item(), "b=",b.item())
  • 在代码中导入tensorflow并使用 import json import random # 导入 TensorFlow 依赖库 import tensorflow as tf def handler (event, context): TRUE_W = random.randint(0,9) TRUE_b = random.randint(0,9) NUM_SAMPLES = 100 X = tf.random.normal(shape=[NUM_SAMPLES, 1]).numpy() noise = tf.random.normal(shape=[NUM_SAMPLES, 1]).numpy() y = X * TRUE_W + TRUE_b + noise model = tf.keras.layers.Dense(units=1) EPOCHS = 20 LEARNING_RATE = 0.002 print("start training") for epoch in range(EPOCHS): with tf.GradientTape() as tape: y_ = model(X) loss = tf.reduce_sum(tf.keras.losses.mean_squared_error(y, y_)) grads = tape.gradient(loss, model.variables) optimizer = tf.keras.optimizers.SGD(LEARNING_RATE) optimizer.apply_gradients(zip(grads, model.variables)) print('Epoch [{}/{}], loss [{:.3f}]'.format(epoch, EPOCHS, loss)) print("finished") print(TRUE_W,TRUE_b) print(model.variables) return { "statusCode": 200, "isBase64Encoded": False, "body": json.dumps(event), "headers": { "Content-Type": "application/json" } } class Model(object): def __init__(self): self.W = tf.Variable(tf.random.uniform([1])) self.b = tf.Variable(tf.random.uniform([1])) def __call__(self, x): return self.W * x + self.b
  • 数据库对象命名 数据库对象命名需要满足约束:非时序表长度不超过63个字节,时序表长度不超过53个字符,以字母或下划线开头,中间字符可以是字母、数字、下划线、$、#。 【建议】避免使用保留或者非保留关键字命名数据库对象。 可以使用select * from pg_get_keywords()查询GaussDB的关键字,或者在关键字章节中查看。 【建议】避免使用双引号括起来的字符串来定义数据库对象名称,除非需要限制数据库对象名称的大小写。数据库对象名称大小写敏感会使定位问题难度增加。 【建议】数据库对象命名风格务必保持统一。 增量开发的业务系统或进行业务迁移的系统,建议遵守历史的命名风格。 建议使用多个单词组成,以下划线分割。 数据库对象名称建议能够望文知意,尽量避免使用自定义缩写(可以使用通用的术语缩写进行命名)。例如,在命名中可以使用具有实际业务含义的英文词汇或汉语拼音,但规则应该在数据库实例范围内保持一致。 变量名的关键是要具有描述性,即变量名称要有一定的意义,变量名要有前缀标明该变量的类型。 【建议】表对象的命名应该可以表征该表的重要特征。例如,在表对象命名时区分该表是普通表、临时表还是非日志表: 普通表名按照数据集的业务含义命名。 临时表以“tmp_+后缀”命名。 非日志表以“ul_+后缀”命名。 外表以“f_+后缀”命名。 不创建以redis_为前缀的数据库对象。 不创建以mlog_和以matviewmap_为前缀的数据库对象。 【建议】非时序表对象命名建议不要超过63字节。如果过该长度内核会对表名进行截断,从而造成和设置值不一致的现象。且在不同字符集下,可能造成字符被截断,出现预期外的字符。 父主题: 开发设计建议
  • 语法格式 修改二级分区表分区包括修改表分区主语法、修改表分区名称的语法和重置分区ID的语法。 修改表分区主语法。 ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} action [, ... ]; 其中action统指如下分区维护子语法。当存在多个分区维护子句时,保证了分区的连续性,无论这些子句的排序如何,GaussDB总会先执行DROP PARTITION再执行ADD PARTITION操作,最后顺序执行其它分区维护操作。 move_clause | exchange_clause | row_clause | merge_clause | modify_clause | add_clause | drop_clause | split_clause | truncate_clause move_clause子语法用于移动分区到新的表空间。 MOVE SUBPARTITION { subpartion_name | FOR ( subpartition_value [, ...] ) } TABLESPACE tablespacename exchange_clause子语法用于把普通表的数据迁移到指定的分区。 EXCHANGE SUBPARTITION { ( subpartition_name ) | FOR ( subpartition_value [, ...] ) } WITH TABLE {[ ONLY ] ordinary_table_name | ordinary_table_name * | ONLY ( ordinary_table_name )} [ { WITH | WITHOUT } VALIDATION ] [ VERBOSE ] [ UPDATE GLOBAL INDEX ] 进行交换的普通表和分区必须满足如下条件: 普通表和分区的列数目相同,对应列的信息严格一致,包括:列名、列的数据类型、列约束、列的Collation信息、列的存储参数、列的压缩信息等。 普通表和分区的表压缩信息严格一致。 普通表索引和分区Local索引个数相同,且对应索引的信息严格一致。 普通表和分区的表约束个数相同,且对应表约束的信息严格一致。 普通表不可以是临时表,分区表只能是二级分区表。 普通表和分区表上不可以有动态数据脱敏,行访问控制约束。 完成交换后,普通表和分区的数据被置换,同时普通表和分区的表空间信息被置换。此时,普通表和分区的统计信息变得不可靠,需要对普通表和分区重新执行analyze。 由于非分区键不能建立本地唯一索引,只能建立全局唯一索引,所以如果普通表含有唯一索引时,可能会导致不能交换数据。 如果需要进行数交换数据操作可以通过创建中间表的方式,先将分区数据插入到中间表,truncate分区,普通表数据插入分区表,drop普通表,重命名中间表的方式完成数据交换操作。 如果在普通表/分区表上进行了drop column操作,被删除的列依然物理存在,所以需要保证普通表和分区的被删除列也严格对齐才能交换成功。 row_clause子语法用于设置分区表的行迁移开关。 { ENABLE | DISABLE } ROW MOVEMENT merge_clause子语法用于把多个分区合并成一个分区。一个命令中合并的源分区上限为300。 MERGE SUBPARTITIONS { subpartition_name } [, ...] INTO SUBPARTITION partition_name [ TABLESPACE tablespacename ] [ UPDATE GLOBAL INDEX ] 对于范围分区,MERGE分区要求源分区的范围连续递增,且MERGE后的分区名可以与最后一个源分区名相同;对于列表分区,则源分区无顺序要求,且MERGE后的分区名可以与任一源分区名相同。如果MERGE后的分区名与源分区名相同,视为同一个分区。 USTORE存储引擎表不支持在事务块/存储过程中执行ALTER TABLE MERGE SUBPARTITIONS的操作。 modify_clause子语法用于设置分区索引是否可用。语法可以作用在一级分区上。 MODIFY PARTITION partition_name { UNUSABLE LOCAL INDEXES | REBUILD UNUSABLE LOCAL INDEXES } 也可以作用在二级分区上。 MODIFY SUBPARTITION partition_name { UNUSABLE LOCAL INDEXES | REBUILD UNUSABLE LOCAL INDEXES } add_clause子语法用于为指定的分区表添加一个或多个分区。语法可以作用在一级分区上。 ADD {partition_less_than_item | partition_list_item } [ ( subpartition_definition_list ) ] 也可以作用在二级分区上。 MODIFY PARTITION partition_name ADD subpartition_definition 其中,分区项partition_less_than_item为RANGE分区定义语法,具体语法如下。 PARTITION partition_name VALUES LESS THAN ( partition_value | MAXVALUE ) [ TABLESPACE tablespacename ] 分区项partition_list_item为LIST分区定义语法,具体语法如下。 PARTITION partition_name VALUES ( partition_value [, ...] | DEFAULT ) [ TABLESPACE tablespacename ] subpartition_definition_list为1到多个二级分区subpartition_definition对象,subpartition_definition具体语法如下。 SUBPARTITION subpartition_name [ VALUES LESS THAN ( partition_value | MAXVALUE ) | VALUES ( partition_value [, ...] | DEFAULT )] [ TABLESPACE tablespace ] 若一级分区为HASH分区,不支持以ADD形式新增一级分区;若二级分区为HASH分区,不支持以MODIFY形式新增二级分区。 drop_clause子语法用于删除分区表中的指定分区。语法可以作用在一级分区上。 DROP PARTITION { partition_name | FOR ( partition_value ) } [ UPDATE GLOBAL INDEX ] 也可以作用在二级分区上。 DROP SUBPARTITION { subpartition_name | FOR ( partition_value, subpartition_value ) } [ UPDATE GLOBAL INDEX ] 若一级分区为HASH分区,不支持删除一级分区;若二级分区为HASH分区,不支持删除二级分区。 不支持删除唯一子分区。 split_clause子语法用于把一个分区切割成多个分区。 SPLIT SUBPARTITION { subpartition_name| FOR ( subpartition_value [, ...] ) } { split_point_clause | no_split_point_clause } [ UPDATE GLOBAL INDEX ] SPLIT后的分区名可以与源分区名相同,但视为不同的分区。 列存分区表不支持切割分区。 范围分区指定切割点split_point_clause的语法为: AT ( subpartition_value ) INTO ( SUBPARTITION subpartition_name [ TABLESPACE tablespacename ] , SUBPARTITION subpartition_name [ TABLESPACE tablespacename ] ) 切割点的大小要位于正在被切割的分区的分区键范围内,指定切割点的方式只能把一个分区切割成两个新分区。 范围分区不指定切割点no_split_point_clause 的语法如下,其中最后一个分区不能写分区范围定义,即VALUES LESS THAN (subpartition_value)部分,默认继承源分区范围定义的上界值。 INTO ( SUBPARTITION subpartition_name VALUES LESS THAN (subpartition_value) [ TABLESPACE tablespacename ][, ...] ) 第一个新分区的分区范围定义要大于正在被切割的分区的前一个分区(如果存在的话)的分区范围定义。 最后一个新分区不能写分区范围定义,默认继承源分区范围定义的上界值。 新分区必须满足分区范围定义递增的约束。 列表范围分区指定切割点split_point_clause的语法如下: VALUES ( subpartition_value ) INTO ( SUBPARTITION subpartition_name [ TABLESPACE tablespacename ] , SUBPARTITION subpartition_name [ TABLESPACE tablespacename ] ) 切割点必须是源分区的一个非空真子集,指定切割点的方式只能把一个分区切割成两个新分区。 列表分区表不指定切割点no_split_point_clause的语法如下,其中最后一个分区不能写分区范围定义,即VALUES (subpartition_value_list)部分,其范围等于源分区去掉其他子分区后的剩余集合。 INTO ( SUBPARTITION subpartition_name VALUES (subpartition_value_list) [ TABLESPACE tablespacename ][, ...] ) 最后一个新分区不能写分区范围定义,其范围等于源分区去掉其他子分区后的剩余集合。 不指定切割点的方式,每一个新分区都必须是源分区的一个非空真子集,且互不交叉。 truncate_clause子语法用于清空分区表中的指定分区。语法可以作用在一级分区上。 TRUNCATE PARTITION { partition_name | FOR ( partition_value [, ...] ) } [ UPDATE GLOBAL INDEX ] 也可以作用在二级分区上。 TRUNCATE SUBPARTITION { subpartition_name | FOR ( subpartition_value [, ...] ) } [ UPDATE GLOBAL INDEX ]
  • 参数说明 table_name 分区表名。 取值范围:已存在的分区表名。 subpartition_name 二级分区名。 取值范围:已存在的二级分区名。 tablespacename 指定分区要移动到哪个表空间。 取值范围:已存在的表空间名。 partition_value 一级分区键值。 通过PARTITION FOR ( partition_value [, ...] )子句指定的这一组值,可以唯一确定一个一级分区。 取值范围:需要进行操作的一级分区的分区键的取值范围。 subpartition_value 一级分区键值和二级分区键值。 通过SUBPARTITION FOR ( subpartition_value [, ...] )子句指定的这一组值,可以唯一确定一个二级分区。 取值范围:对于需要进行操作的二级分区,需要同时有其一级分区分区键和二级分区分区键的取值范围。 UNUSABLE LOCAL INDEXES 设置该分区上的所有索引不可用。 REBUILD UNUSABLE LOCAL INDEXES 重建该分区上的所有索引。 ENABLE/DISABLE ROW MOVEMET 行迁移开关。 如果进行UPDATE操作时,更新了元组在分区键上的值,造成了该元组所在分区发生变化,就会根据该开关给出报错信息,或者进行元组在分区间的转移。 取值范围: ENABLE:打开行迁移开关。 DISABLE:关闭行迁移开关。 默认是打开状态。 ordinary_table_name 进行迁移的普通表的名称。 取值范围:已存在的普通表名。 { WITH | WITHOUT } VALIDATION 在进行数据迁移时,是否检查普通表中的数据满足指定分区的分区键范围。 取值范围: WITH:对于普通表中的数据要检查是否满足分区的分区键范围,如果有数据不满足,则报错。 WITHOUT:对于普通表中的数据不检查是否满足分区的分区键范围。 默认是WITH状态。 由于检查比较耗时,特别是当数据量很大的情况下更甚。所以在保证当前普通表中的数据满足分区的分区键范围时,可以加上WITHOUT来指明不进行检查。 VERBOSE 在VALIDATION是WITH状态时,如果检查出普通表有不满足要交换分区的分区键范围的数据,那么把这些数据插入到正确的分区,如果路由不到任何分区,再报错。 只有在VALIDATION是WITH状态时,才可以指定VERBOSE。 partition_new_name 分区的新名称。 取值范围:字符串,要符合标识符命名规范。 subpartition_new_name 二级分区的新名称。 取值范围:字符串,要符合标识符命名规范。 UPDATE GLOBAL INDEX 如果使用该参数,则会更新分区表上的所有全局索引,以确保使用全局索引可以查询出正确的数据;如果不使用该参数,则分区表上的所有全局索引将会失效。
  • 语法格式 CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [ column_name type_name [ OPTIONS ( option 'value' [, ... ] ) ] [ COLLATE collation ] [ column_constraint [ ... ] ] [, ... ] ] ) SERVER server_name [ OPTIONS ( option 'value' [, ... ] ) ] 其中列约束column_constraint为: [ CONSTRAINT constraint_name ] { NOT NULL | NULL | DEFAULT default_expr }
  • 示例 --创建server gaussdb=# CREATE SERVER my_server FOREIGN DATA WRAPPER log_fdw; --创建外表 gaussdb=# CREATE FOREIGN TABLE foreign_tbl (col1 text) SERVER my_server OPTIONS (logtype 'pg_log'); --删除外表 gaussdb=# DROP FOREIGN TABLE foreign_tbl; --删除server gaussdb=# DROP SERVER my_server;
  • 基于Psycopg开发 Psycopg是一种用于执行SQL语句的PythonAPI,可以为GaussDB数据库提供统一访问接口,应用程序可基于它进行数据操作。Psycopg2是对libpq的封装,主要使用C语言实现,既高效又安全。它具有客户端游标和服务器端游标、异步通信和通知、支持“COPY TO/COPY FROM”功能。支持多种类型Python开箱即用,适配GaussDB数据类型;通过灵活的对象适配系统,可以扩展和定制适配。Psycopg2兼容Unicode。 GaussDB数据库提供了对Psycopg2特性的支持,并且支持psycopg2通过SSL模式连接。 表1 Psycopg支持平台 操作系统 平台 Python版本 EulerOS 2.5 ARM64位 x86_64位 3.8.5 EulerOS 2.9 ARM64位 x86_64位 3.7.4 EulerOS 2.10、Kylin v10、UnionTech20 ARM64位 x86_64位 3.7.9 EulerOS 2.11、Suse 12.5 ARM64位 x86_64位 3.9.11 psycopg2在编译过程中,会链接(link)GaussDB的openssl,GaussDB的openssl与操作系统自带的openssl可能不兼容。如果遇到不兼容现象,例如提示"version 'OPENSSL_1_1_1f' not found",请使用环境变量LD_LIBRARY_PATH进行隔离,以避免混用操作系统自带的openssl与GaussDB依赖的openssl。 例如,在执行某个调用psycopg2的应用软件client.py时,将环境变量显性赋予该应用软件: export LD_LIBRARY_PATH=/path/to/gaussdb/libs:$LD_LIBRARY_PATH python client.py 其中,/path/to/pyscopg2/lib 表示GaussDB依赖的openssl库所在目录,需根据文件实际存储路径修改。 开发流程 开发步骤 示例:常用操作 Psycopg接口参考 父主题: 应用程序开发教程
  • 基于JDBC开发 JDBC(Java Database Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问接口,应用程序可基于它操作数据。GaussDB库提供了对JDBC 4.2特性的支持,需要使用JDK1.8版本编译程序代码,不支持JDBC桥接ODBC方式。 JDBC包、驱动类和环境类 开发流程 加载驱动 连接数据库 连接数据库(以SSL方式) 连接数据库(UDS方式) 执行SQL语句 处理结果集 关闭连接 日志管理 示例:常用操作 示例:重新执行应用SQL 示例:通过本地文件导入导出数据 示例:从MY迁移数据 示例:逻辑复制代码示例 示例:不同场景下连接数据库参数配置 JDBC接口参考 JDBC常用参数参考 常见问题处理 JDBC数据类型映射关系 父主题: 应用程序开发教程
  • 执行计划显示信息 除了设置不同的执行计划显示格式外,还可以通过不同的EXPLAIN用法,显示不同详细程度的执行计划信息。常见有如下几种,关于更多用法请参见EXPLAIN语法说明。 EXPLAIN statement: 只生成执行计划,不实际执行。其中statement代表SQL语句。 EXPLAIN ANALYZE statement:生成执行计划,进行执行,并显示执行的概要信息。显示中加入了实际的运行时间统计,包括在每个规划节点内部花掉的总时间(以毫秒计)和它实际返回的行数。 EXPLAIN PERFORMANCE statement:生成执行计划,进行执行,并显示执行期间的全部信息。 为了测量运行时在执行计划中每个节点的开销,EXPLAIN ANALYZE或EXPLAIN PERFORMANCE会在当前查询执行上增加性能分析的开销。在一个查询上运行EXPLAIN ANALYZE或EXPLAIN PERFORMANCE有时会比普通查询明显的花费更多的时间。超支的数量依赖于查询的本质和使用的平台。 因此,当定位SQL运行慢问题时,如果SQL长时间运行未结束,建议通过EXPLAIN命令查看执行计划,进行初步定位。如果SQL可以运行出来,则推荐使用EXPLAIN ANALYZE或EXPLAIN PERFORMANCE查看执行计划及其实际的运行信息,以便更精准地定位问题原因。
  • 示例 --创建my_server。 gaussdb=# CREATE SERVER my_server FOREIGN DATA WRAPPER log_fdw; --修改外部服务的名称。 gaussdb=# ALTER SERVER my_server RENAME TO my_server_1; --删除my_server_1。 gaussdb=# DROP SERVER my_server_1;
共100000条