• [技术干货] OceanBase字段类型和字符集与GaussDB映射关系分析
    OceanBase字段类型和字符集与GaussDB映射关系分析JackCao1 字符集本文基于OceanBase 3.22版本分析。1.1 CHARSET | CHARACTER SET指定表中列的默认字符集,可使用字符集如下:utf8utf8mb4gbkutf16gb18030binary为支持无缝迁移,OceanBase在语法上将 UTF8 视为 UTF8MB4 的同义词。 数据库默认的字符集是 utf8mb4。2 数据类型https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000363773https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000365129数值类型OceanBase 数据库支持所有标准 SQL 数值类型,包括精确数值类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC )、近似数值类型(FLOAT 和 DOUBLE )、存储位值的 BIT 数据类型和扩展类型(TINYINT、MEDIUMINT 和 BIGINT)。说明关键字 BOOL/BOOLEAN 是 TINYINT 的同义词。 关键字 INT 是 INTEGER 的同义词。2.1 数值类型分类OceanBase 数据库当前版本支持的数值类型可以划分为如下四类:整数类型:BOOL/BOOLEAN/TINYINT、SMALLINT、MEDIUMINT、INT/INTEGER 和 BIGINT。定点类型:DECIMAL 和 NUMERIC。浮点类型:FLOAT 和 DOUBLE。Bit-Value 类型:BIT。数值类型在定义时可以指定 Precision(精度,即字段长度)和 Scale(范围,即小数位数),不同数值类型的 Precision 和 Scale 的含义可能有所不同,详情请参见各类型的说明。ZEROFILL 属性数值类型在定义时可以通过 ZEROFILL 关键字指定最小显示宽度,同时将该类型隐式定义为 UNSIGNED。在数据实际显示宽度不足最小显示宽度时,通过先将小数部分补零到 Scale 上限,然后将整数部分补零到 Precision 上限的方式,将显示宽度补足到最小显示宽度。例如:INT(5) ZEROFILL:当数据值为 123 时,将显示为 00123。DECIMAL(10, 5) ZEROFILL:当数据值为 123.456 时,将显示为 00123.45600。2.1.1 整数类型长度(字节)值域(有符号)值域(无符号)BOOL/BOOLEAN/ TINYINT1[-2^7^, 2^7^ - 1][0, 2^8^ - 1]SMALLINT2[-2^15^, 2^15^ - 1][0, 2^16^ - 1]MEDIUMINT3[-2^23^, 2^23^ - 1][0, 2^24^ - 1]INT/INTEGER4[-2^31^, 2^31^ - 1][0, 2^32^ - 1]BIGINT8[-2^63^, 2^63^ - 1][0, 2^64^ - 1]2.1.2 定点类型定点类型为变长、精确数值类型,值域和精度取决于 Precision 和 Scale,以及是否为无符号。DECIMAL 等价于 NUMERIC。语法如下:DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]M 是可以存储的总位数(Precision),D 是小数点后的位数(Scale)。小数点和负数符号"-"不计入 M。如果 D 为 0,则值没有小数点或小数部分。整数部分最大有效位数等于 M 减去 D 的值,即 Precision 减去 Scale 的值。所有带有 DECIMAL 列的基本计算(+、-、*、/)都使用 65 位的精度。DECIMAL 的 M 最大值为 65,D 最大值为 30。如果省略 D,则默认为 0。如果省略 M,则默认为 10。如果为数值列指定 ZEROFILL,OceanBase 数据库会自动向该列添加 UNSIGNED 属性。如果指定 UNSIGNED,则不允许为负值。例如 DECIMAL(5, 2),整数部分和小数部分最大有效位数分别为 3 和 2,所以值域为 [-999.99, 999.99]。如果同时定义为 UNSIGNED,则值域为 [0, 999.99]。如下类型也是 DECIMAL 的同义词。其中,FIXED 可用于与其他数据库系统兼容。DEC[(M[,D])] [UNSIGNED] [ZEROFILL], NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL], FIXED[(M[,D])] [UNSIGNED] [ZEROFILL]2.1.3 浮点类型类型长度(字节)值域精度FLOAT4[-3.402823466E+38, -1.175494351E-38]、0 和 [1.175494351E-38,3.402823466E+38]7 位DOUBLE8[-1.7976931348623157E+308, -2.2250738585072014E-308]、0 和 [2.2250738585072014E-308,1.7976931348623157E+308]15 位FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]M 是可以存储的总位数,D 是小数点后的位数。DOUBLEDOUBLE 用于表示正常大小(双精度)浮点数。语法如下:DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]M 是可以存储总位数,D 是小数点后的位数。如果省略 M 和 D,则将值存储到硬件允许的限制范围内。双精度浮点数精确到大约 15 位小数。2.1.4 BIT-Value 类型BIT 数据类型用于存储位值。位值通过 b'value' 的形式指定,value是用 0 和 1 来指定的,例如,b'111' 表示 7,b'10000000' 表示 128。语法如下:BIT[(M)]M 表示每个值的位数,范围为 [1,64]。如果省略 M,则默认为 1。当向 BIT(M) 列插入值时,如果插入值的长度小于 M,则会在左侧填充 0。例如:将 b'101' 插入到 BIT(6) 时,相当于插入了 b'000101'。2.2 日期时间类型OceanBase 数据库支持用于表示时间值的日期和时间数据类型,包括 DATE、TIME、DATETIME、TIMESTAMP 和 YEAR。每个类型都有一个有效值范围,以及一个"零"值,可以指定无法表示的无效值。OceanBase 数据库当前版本所支持的日期和时间类型及其相关信息如下表所示。类型格式下界上界含义DATETIMEYYYY-MM-DD HH:MM:SS[.fraction]0000-00-00 00:00:00.0000009999-12-31 23:59:59.999999日期时间(不考虑时区)TIMESTAMPYYYY-MM-DD HH:MM:SS[.fraction]0000-00-00 00:00:00.0000009999-12-31 23:59:59.999999日期时间(考虑时区)DATEYYYY-MM-DD0000-00-009999-12-31日期TIMEHH:MM:SS[.fraction]-838:59:59.000000838:59:59.000000时间YEARYYYY19012155年份DATETIME、TIMESTAMP 和 TIME 的值域和精度取决于 Scale。Scale 属性表示小数部分最大有效位数,最大值为 6,默认值为 0。2.2.1 DATE DATETIME和TIMESTAMP DATE 类型用于表示具有日期部分但没有时间部分的值。DATE 值的检索和显示格式为 'YYYY-MM-DD',范围是 '0000-00-00' 到 '9999-12-31'。OceanBase 数据库允许使用字符串或数字将值分配给 DATE 列。DATETIME 类型用于表示同时包含日期和时间部分的值。DATETIME 值的检索和显示格式为 'YYYY-MM-DD hh:mm:ss',范围是 '0000-00-00 00:00:00' 到 '9999-12-31 23:59:59'。语法如下:DATETIME[(fsp)]可选 fsp 值用来指定小数位秒的精度,范围为 [0,6]。0 值表示没有小数部分。如果省略,则默认精度为 0。DATETIME 列通过使用 DEFAULT 和 ON UPDATE 子句指定当前日期和时间的自动初始化和更新。DATETIME 值可以包含秒的小数位部分,精度最高可达微秒(6 位),格式为 'YYYY-MM-DD hh:mm:ss[.fraction]',范围为 '0000-00-00 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。小数部分应始终与其他时间位用小数点分隔,不识别其他分隔符。TIMESTAMP 数据类型用于表示同时包含日期和时间部分的值。语法如下:TIMESTAMP[(fsp)]可选 fsp 值来指定小数位秒的精度,范围为 [0,6]。0 值表示没有小数部分。如果省略,则默认精度为 0。示例如下:CREATE TABLE t(C1 TIMESTAMP(6));TIMESTAMP 列可以使用 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 子句指定当前日期和时间的自动初始化和更新。默认情况下,第一个 TIMESTAMP 列具有这些属性,也可以定义表中的其他 TIMESTAMP 列具有这些属性。TIMESTAMP 值可以包括秒的小数位部分,精度最高可达微秒(6 位),格式为 'YYYY-MM-DD hh:mm:ss[.fraction]',范围是 '0000-00-00 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。小数部分应始终与其他时间位用小数点分隔,不识别其他分隔符。2.2.2 TIME 类型OceanBase 数据库允许使用字符串或数字将值分配给 TIME 列。TIME 值的检索和显示格式为 'hh:mm:ss',范围是 '-838:59:59' 到 '838:59:59'。TIME 值的显示格式也可以包含秒的小数位部分,格式为 'hh:mm:ss[.fraction]' ,精度最高可达微秒(6 位),范围是 '-838:59:59.000000' 到 '838:59:59.000000'。小数部分应始终与其他时间位用小数点分隔,不识别其他分隔符。2.2.3 YEAR 类型YEAR 类型用于表示 4 位数字格式的年份。YEAR 值的检索和显示格式为 YYYY,范围为 1901 到 2155,以及 0000。2.3 字符类型OceanBase 数据库支持的字符数据类型为 CHAR、VARCHAR、BINARY 和 VARBINARY。OceanBase 数据库当前版本所支持的普通字符类型及其相关信息如下表所示。类型长度类型长度上限字符集CHAR定长256 字符UTF8MB4VARCHAR变长65535 字节UTF8MB4BINARY定长256 字节BINARYVARBINARY变长65535 字节BINARY对于CHAR 类型,以字符为长度单位;对于 VARCHAR 类型和二进制字符串 BINARY 和 VARBINARY 类型,以字节为长度单位。2.3.1 CHAR 和 VARCHARCHAR 类型声明的长度为可以存储的最大字符数。例如,CHAR(30) 表示最多可容纳 30 个字符VARCHAR 类型声明的长度为可以存储的最大字符数。例如,VARCHAR(50) 表示最多可容纳 50 个字符2.3.2 BINARY 和 VARBINARYBINARY 和 VARBINARY 类型与 CHAR 和 VARCHAR 相似,不同之处在于它们存储二进制数据而不是字符串。BINARY 类型与 CHAR 类型相似,但其存储二进制字节串。语法如下:BINARY[(M)]可选长度参数 M 表示以字节为单位的列长度。如果省略,则取 M 的默认值 1。VARBINARY 类型与 VARCHAR 类型相似,但其存储二进制字节串。语法如下:VARBINARY(M)M 表示以字节为单位的最大列长度。2.4 大对象和文本类型类型长度存储长度上限(字节)字符集TINYBLOB变长256BINARYBLOB变长65536 / 64KBINARYMEDIUMBLOB变长16777216 / 16MBINARYLONGBLOB变长50331648 / 48MBINARYTINYTEXT变长256UTF8MB4TEXT变长65536 / 64KUTF8MB4MEDIUMTEXT变长16777216 / 16MUTF8MB4LONGTEXT变长50331648 / 48MUTF8MB4在大多数情况下,可以将 BLOB 列视为一个 VARBINARY 列,可以将 TEXT 列视为 VARCHAR 列。BLOB 和 TEXT 在以下方面与 VARBINARY 和 VARCHAR 有所不同:必须指定 BLOB 和 TEXT 列上的索引前缀长度。对于 CHAR 和 VARCHAR,前缀长度是可选的。BLOB 和 TEXT 列不能有 DEFAULT 值。2.4.1 BLOBBLOB 是一个二进制大对象类型,可以存储可变数量的数据。BLOB 类型包括四种,分别是 TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们存储值的最大长度不同。BLOB 值被视为二进制字符串(字节字符串),具有二进制字符集和排序规则,比较和排序需要基于列值中字节的数值。TINYBLOB 是最大长度为 256 个字节的 BLOB 类型。每个 TINYBLOB 值都使用 1 字节长度的前缀进行存储,该前缀指示值中的字节数。BLOB 列的最大长度为 65,536 个字节。每个 BLOB 值都使用 2 字节长度的前缀进行存储,该前缀指示值中的字节数。可以为 BLOB 类型指定一个可选的长度 M。语法如下:BLOB[(M)]MEDIUMBLOB 是最大长度为 16,777,216 字节的 BLOB 类型。每个 MEDIUMBLOB 值都使用 3 字节长度的前缀进行存储,该前缀指示值中的字节数。LONGBLOBLONGBLOB 是最大长度为 50331648 或 48 M 字节的 BLOB 类型。LONGBLOB 列的最大有效长度取决于客户端/服务器协议中配置的最大数据包大小和可用内存。每个 LONGBLOB 值都使用 4 字节长度的前缀进行存储,该前缀指示值中的字节数。2.4.2 TEXT 类型TEXT 类型用于存储所有类型的文本数据。文本类型包括四种,分别是 TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。它们对应于四种 BLOB 类型,并且具有相同的最大长度和存储要求。TINYTEXT 是最大长度为 256 个字符的 TEXT 类型。如果值中包含多字节字符,则最大有效长度会变小。TEXT 列的最大长度为 65,536 个字符。如果值包含多字节字符,则最大有效长度会变小。每个 TEXT 值都使用 2 字节长度的前缀存储,该前缀指示值中的字节数。可以为 TEXT 类型指定一个可选的长度 MMEDIUMTEXT 是最大长度为 16,777,216 个字符的 TEXT 类型。如果值包含多字节字符,则最大有效长度会变小。每个 MEDIUMTEXT 值都使用 3 字节长度的前缀进行存储,该前缀指示值中的字节数。LONGTEXT 是最大长度为 50331648 或 48 M 个字符的 TEXT 类型。如果值包含多字节字符,则最大有效长度会变小。LONGTEXT 列的有效最大长度还取决于客户端/服务器协议中配置的最大数据包大小和可用内存。每个 LONGTEXT 值都使用 4 字节长度的前缀进行存储2.5 枚举类型枚举类型 ENUM 是一个只能有一个值的字符串对象,该值必须来自列表 'value1', 'value2', ...,枚举值必须是带引号的字符串文字。ENUM 值在内部表示为整数。一个 ENUM 列最多可以容纳 65,535 个不同的元素(实际限制小于 3000)。ENUM 为可变长度类型,支持 UTF8MB4 字符集。ENUM 语法如下:ENUM('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]2.6 集合类型SET 是一个字符串对象,它可以有零个或多个值,每个值都必须来自列表 'value1', 'value2', ...SET 为可变长度类型,支持 UTF8MB4 字符集。SET 的语法如下:SET('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]2.7 JSON 数据类型OceanBase 数据库支持符合 RFC 7159 标准的 JSON(JavaScript Object Notation)数据类型,用户可以保存半结构化的 JSON 数据并访问和修改 JSON 文档中的数据。JSON 数据类型具有以下优势:自动验证存储在 JSON 列中的 JSON 文档,无效的文档会报错。存储在 JSON 列中的 JSON 文档可以被转换为便于快速读取和访问的格式。当服务器必须读取以二进制格式存储的 JSON 值时,不需要从文本中解析该值。3 数据类型对应数据类型大类数据类型OceanBaseMySQLGaussDB备注数值类型整数TINYINTTINYINTintegerBOOL/BOOLEANTINYINTbooleanSMALLINTSMALLINTintegerMEDIUMINTMEDIUMINTbigintINT/INTEGERINTintegerBIGINTBIGINTbigint定点类型DECIMALDECIMALnumeric浮点类型FLOATFLOATdoubleDOUBLEDOUBLEdoubleBIT-ValueBIT-ValueBITinteger日期时间类型DATE DATETIME和TIMESTAMPDateDatedateDatetimeDatetimetimestamp without time zonetimestamptimestamptimestamp without time zonetimetimeTimetime without time zoneyearyearYEARinteger字符类型Char和varcharCharCHARcharvarcharVARCHARvarcharBinary和varbinarybinaryBINARY byteavarbinaryVARBINARY bytea大对象和文本BlobTINYBLOBTINYBLOBbyteaBLOBBLOBbyteaMEDIUMBLOBMEDIUMBLOBbyteaLONGBLOBLONGBLOBbyteaTextTINYTEXTTINYTEXTtextTEXTTEXTtextMEDIUMTEXTMEDIUMTEXTtextLONGTEXTLONGTEXTtext枚举ENUMENUMENUM enum集合SetSetSETtextJSONJSONJSONJSONjson4 字符集对应OceanBaseMySQLGaussDB备注utf8utf8mb4UTF8utf8mb4utf8mb4UTF8gbkgbkGBKutf16utf16UTF8gb18030gb18030GB18030binarybinary无明确对应取决于MySQL建表语句或环境变量。详细参见独立的文档《MySQL CHARACTER SET Binary分析》。5 参考网址:https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000354623https://open.oceanbase.com/blog/8600173https://dev.mysql.com/doc/refman/8.0/en/integer-types.htmlhttps://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.htmlhttps://dev.mysql.com/doc/refman/8.0/en/bit-type.htmlhttps://dev.mysql.com/doc/refman/8.0/en/date-and-time-types.htmlhttps://dev.mysql.com/doc/refman/8.0/en/string-type-syntax.htmlhttps://dev.mysql.com/doc/refman/8.0/en/char.htmlhttps://dev.mysql.com/doc/refman/8.0/en/blob.htmlhttps://dev.mysql.com/doc/refman/8.0/en/enum.htmlhttps://dev.mysql.com/doc/refman/8.0/en/set.htmlhttps://dev.mysql.com/doc/refman/8.0/en/json.htmlcid:link_0cid:link_1https://dev.mysql.com/doc/refman/8.0/en/charset.htmlhttps://dev.mysql.com/doc/refman/8.0/en/charset-mysql.htmlhttps://dev.mysql.com/doc/refman/8.0/en/charset-charsets.htmlhttps://dev.mysql.com/doc/workbench/en/wb-migration-database-postgresql-typemapping.htmlcid:link_2https://www.striim.com/docs/en/data-type-support---mapping-for-mysql-sources.htmlhttps://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000361877https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000367561
  • [运维管理] 【实例状态】GaussDB ETCD服务异常
    首先确认是否是虚拟机、网络故障虚拟机故障导致ETCD服务异常告警问题现象管控面上报etcd服务异常告警,虚拟机发生重启,热迁移、冷迁移,HA等动作。问题分析及界定在告警信息中找到实例ID、节点ID、虚拟机ID,在管控面查看虚拟机状态是否正常,能否正常登录,如果虚拟机异常无法登录,联系IaaS技术支持修复虚拟机。检查虚拟机是否发生过重启,热迁移、冷迁移、HA等动作,例如内存、网卡等问题引起热迁移。处理步骤联系IaaS技术支持修复虚拟机,确认虚拟机故障原因,例如内存、网卡等问题引起热迁移。网络故障导致ETCD服务异常告警问题现象管控面上报etcd服务异常告警,虚拟机无法登录或ping通其他节点IP, 或者监控显示网络有异常。问题分析及界定在该节点上ping其他节点IP,测试是否ping通。如果ping不通,执行步骤(1)(2),检查该节点网络、IP配置、防火墙配置等。如果ping通,执行步骤(3)确认告警时间点网络是否断开。(1)检查IP是否正常:ifconfig查看etcd使用的IP是否存在,如果不存在,排查IP配置丢失原因,常见原因是虚拟机重启后IP没有重新配置,导致丢失。(2)检查防火墙是否正常在Ruby用户下查看etcd的IP和端口: ps ux | grep etcd在root用户下iptables -L命令检查防火墙是否限制了IP和端口,如果有限制,去掉防火墙限制。(3) 查看etcd日志进入Ruby用户cd $GAUSSLOG/cm/etcd查看对应时间点的etcd_xxx.log日志,如果有如下日志,可能是etcd节点间网络断开, 或者对端的etcd进程down,导致本端etcd连接断开。排查网络原因或对端的etcd进程是否重启,网络原因可能是网络断开,网卡故障,也有可能是虚拟机故障。grpc: Server.processUnaryRPC failed to write status: connection error: desc = "transport is closing"rafthttp: lost the TCP streaming connection with peer c797ab3a61e2ea55 (stream MsgApp v2 reader)etcdserver: failed to reach the peerURL(https:// X.X.X.X:X) of member c797ab3a61e2ea55 (Get "https://X.X.X.X:X/version": dial tcp X.X.X.X:X: i/o timeout)rafthttp: health check for peer c797ab3a61e2ea55 could not connect: dial tcp X.X.X.X:X: i/o timeout (prober "ROUND_TRIPPER_RAFT_MESSAGE")处理步骤处理步骤同上,已说明。负载过重导致ETCD服务异常警告问题现象管控面上报etcd服务异常告警, 磁盘IO/CPU/内存 很高.问题分析及界定进入Ruby用户cd $GAUSSLOG/cm/etcd查看对应时间点的etcd_xxx.log日志,告警时间点有如下日志,说明etcd节点负载过重, 磁盘IO、CPU等压力大。2021-04-09 10:57:40.112936 W | wal: sync duration of 2.00201804s, expected less than 1s ===通常这个表示磁盘IO压力大。2021-04-09 10:57:40.112993 W | etcdserver: failed to send out heartbeat on time (exceeded the 1s timeout for 2.124414ms, to c8eccd97bed22939)2021-04-09 10:57:40.112999 W | etcdserver: server is likely overloaded2021-04-09 10:57:43.126444 W | etcdserver: read-only range request "key:\"/Ruby/ignoreNodeNumKey\" " with result "error:context canceled" took too long (1.999877971s) to executecd $GAUSSLOG/cm/cm_agent搜索对应时间点的cm_agent-xxx.log, 如果有如下日志,表示当时磁盘io比较高, io util 100 表示磁盘io 达到100%2021-04-09 11:06:24.047 tid=15822 LOG: device vdb1, tot_ticks 889640579, cputime 1798651342, io util 100处理步骤1、在管控面查看该节点当时磁盘IO、CPU、内存监控指标是否很高,示例1:数据盘写延时在16:00左右升高,影响etcd状态。示例2: etcd故障时刻,cpu、内存、磁盘写延时都有增长,尤其是磁盘写延时很明显,需要分析磁盘写延时升高的原因。2、如果故障现场还在: iostat -mx 1 查看磁盘IO状态,top和free命令查看cpu、内存使用情况, 分析磁盘IO高、CPU高,内存高的原因。3、root用户查看该节点的系统日志, cd /var/log, 查看该时间点message日志是否有异常记录。例如:节点内存耗尽了,分析占用内存的原因,是否内存泄漏等。如果仍无法确认原因,联系华为工程师。etcd进程故障导致ETCD服务异常告警问题现象etcd进程down、重启,管控面上报etcd服务异常告警问题分析及界定登陆故障etcd节点, 进入Ruby用户,执行命令ps ux | grep etcd, 查看etcd进程是否在运行。如果进程在,查看etcd进程启动时间,告警时是否重启过,联系华为工程师确认重启原因。如果进程不在,查看etcd无法启动原因:(1)cd $GAUSSLOG/bin, 查看目录下是否有cluster_manual_start 和 etcd_manual_start 两个文件,如果有表示集群被停止,确认停止集群的原因,之后启动集群,定位结束。(2)cd $GAUSSHOME/bin 查看目录下是否存在etcd这个文件,文件权限是否正确,确认文件不存在或权限不正确的原因。(3)检查etcd的数据目录所在磁盘是否满了或者故障,etcd目录如下:cm_ctl query -Cvipd查看检查etcd的数据目录所在磁盘是否满了或者目录权限不正确(正确是700)或者故障,如果磁盘满,检查占用磁盘的文件并清除或者转存到其他盘,如果是etcd本身的文件占满,联系华为工程师分析原因。如果目录权限不正确,修改为正确的目录权限。如果是磁盘故障,联系IaaS技术支持分析定位。处理步骤参照上述处理,如果不是以上原因,请联系华为工程师OM接口无法正确返回结果导致ETCD服务异常告警问题现象管控面上报etcd服务异常告警, 管控无法获取集群状态问题分析及界定查看管控面是否获取集群状态成功,是否获取空消息,联系华为工程师分析定位。cd $GAUSSLOG/om/查看gs_om-xxx.log,是否有如下异常日志例如: The status file does not exist. Path: /usr/local/temp/local_status_1611355718.58.dat.处理步骤参照上面描述步骤。
  • [运维管理] 【实例状态】GaussDB CN DN为只读状态
    只读原因当CN和DN的磁盘使用率达到阈值时,集群管理就会自动将相应的CN或DN分片设为只读(业务只能读不能写),执行cm_ctl query -Cv命令查询集群状态如下: 设置为只读后禁止业务继续写入,避免磁盘被撑爆,同时也避免后续无法扩容(扩容需要磁盘有一定的剩余空间)。只读guc参数datastorage_threshold_value_check磁盘使用率阈值,超过该阈值,就会被设置为只读,默认85%enable_transaction_read_only 检测磁盘只读的开关,如果关闭,不再检测磁盘,即使磁盘使用率超过阈值也不会设置只读,磁盘清空后也不会消除只读,默认值为on。datastorage_threshold_check_interval 检测磁盘使用率的时间间隔,多久检测一次磁盘使用率,默认为10秒。3个参数都在CMserver数据目录下的cm_server.conf配置文件中。处理措施当CN或DN被设置为只读时,根据上图中查到的CN或DN目录,检查所在磁盘使用率是否超过阈值。1、检查对应磁盘被什么文件占用,确认文件用途,是否可以清理或转移到其他磁盘。2、可以调高磁盘使用率阈值。可以通过如下命令修改CMserver的guc参数,支持reload修改参数,无需重启CMserver进程。确认集群是否有扩容计划,若有后续扩容计划,datastorage_threshold_value_check值建议不要超过50,扩容要求,数据磁盘使用率不超过50%。gs_guc reload -Z cmserver -N all -I all -c "datastorage_threshold_value_check = 85"gs_guc reload -Z cmserver -N all -I all -c "enable_transaction_read_only = on"当磁盘使用率超阈值时,集群管理会自动把CN、DN设置为只读,对应的guc参数default_transaction_read_only被设置为on。当磁盘使用率降到阈值以下或者调高阈值后,集群管理会自动把CN、DN解除只读,对应的guc参数default_transaction_read_only被设置为off。由于集群管理默认检测磁盘的周期是10s秒,所以磁盘超阈值或者降到阈值以下,或者通过gs_guc调整阈值,CN、DN的只读状态可能最长会延迟600秒才变化,请耐心等待。如果想马上去掉只读限制,除了清理磁盘或调整阈值外,手动设置对应的CN、DN的guc参数。DN、CN设置只读和取消只读参数:gs_guc reload -Z datanode -N nodename -D dataPath -c 'default_transaction_read_only = on' 设置DN只读gs_guc reload -Z datanode -N nodename -D dataPath -c 'default_transaction_read_only = off' 取消DN只读gs_guc reload -Z coordinator -N nodename -D dataPath -c 'default_transaction_read_only = on' 设置CN只读gs_guc reload -Z coordinator -N nodename -D dataPath -c 'default_transaction_read_only = off' 取消CN只读
  • [问题求助] 【GaussDB】GaussDB怎么查询分区表的索引信息?
    GaussDB怎么查询分区表的索引信息?
  • sql查询优化——转载
     很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解。比如:    select * from table1 where name='zhangsan' and tID > 10000    和执行:    select * from table1 where tID > 10000 and name='zhangsan'    一些人不知道以上两条语句的执行效率是否一样,因为如果简单的从语句先后上看,这两个语句的确是不一样,如果tID是一个聚合索引,那么后一句仅仅从表的10000条以后的记录中查找就行了;而前一句则要先从全表中查找看有几个name='zhangsan'的,而后再根据限制条件条件tID>10000来提出查询结果。    事实上,这样的担心是不必要的。SQL SERVER中有一个“查询分析优化器”,它可以计算出where子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自动优化。    虽然查询优化器可以根据where子句自动的进行查询优化,但大家仍然有必要了解一下“查询优化器”的工作原理,如非这样,有时查询优化器就会不按照您的本意进行快速查询。    在查询分析阶段,查询优化器查看查询的每个阶段并决定限制需要扫描的数据量是否有用。如果一个阶段可以被用作一个扫描参数(SARG),那么就称之为可优化的,并且可以利用索引快速获得所需数据。    SARG的定义:用于限制搜索的一个操作,因为它通常是指一个特定的匹配,一个值得范围内的匹配或者两个以上条件的AND连接。形式如下:    列名 操作符 <常数 或 变量>    或    <常数 或 变量> 操作符列名    列名可以出现在操作符的一边,而常数或变量出现在操作符的另一边。如:    Name=’张三’    价格>5000    5000<价格    Name=’张三’ and 价格>5000    如果一个表达式不能满足SARG的形式,那它就无法限制搜索的范围了,也就是SQL SERVER必须对每一行都判断它是否满足WHERE子句中的所有条件。所以一个索引对于不满足SARG形式的表达式来说是无用的。    介绍完SARG后,我们来总结一下使用SARG以及在实践中遇到的和某些资料上结论不同的经验:    1、Like语句是否属于SARG取决于所使用的通配符的类型   如:name like ‘张%’ ,这就属于SARG    而:name like ‘%张’ ,就不属于SARG。    原因是通配符%在字符串的开通使得索引无法使用。    2、or 会引起全表扫描   Name=’张三’ and 价格>5000 符号SARG,而:Name=’张三’ or 价格>5000 则不符合SARG。使用or会引起全表扫描。    3、非操作符、函数引起的不满足SARG形式的语句   不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等,另外还有函数。下面就是几个不满足SARG形式的例子:    ABS(价格)<5000    Name like ‘%三’    有些表达式,如:    WHERE 价格*2>5000    SQL SERVER也会认为是SARG,SQL SERVER会将此式转化为:    WHERE 价格>2500/2    但我们不推荐这样使用,因为有时SQL SERVER不能保证这种转化与原始表达式是完全等价的。    4、IN 的作用相当与OR   语句:    Select * from table1 where tid in (2,3)    和    Select * from table1 where tid=2 or tid=3    是一样的,都会引起全表扫描,如果tid上有索引,其索引也会失效。    5、尽量少用NOT   6、exists 和 in 的执行效率是一样的   很多资料上都显示说,exists要比in的执行效率要高,同时应尽可能的用not exists来代替not in。但事实上,我试验了一下,发现二者无论是前面带不带not,二者之间的执行效率都是一样的。因为涉及子查询,我们试验这次用SQL SERVER自带的pubs数据库。运行前我们可以把SQL SERVER的statistics I/O状态打开。    (1)select title,price from titles where title_id in (select title_id from sales where qty>30)    该句的执行结果为:    表 'sales'。扫描计数 18,逻辑读 56 次,物理读 0 次,预读 0 次。    表 'titles'。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。    (2)select title,price from titles where exists (select * from sales where sales.title_id=titles.title_id and qty>30)    第二句的执行结果为:    表 'sales'。扫描计数 18,逻辑读 56 次,物理读 0 次,预读 0 次。    表 'titles'。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。    我们从此可以看到用exists和用in的执行效率是一样的。    7、用函数charindex()和前面加通配符%的LIKE执行效率一样   前面,我们谈到,如果在LIKE前面加上通配符%,那么将会引起全表扫描,所以其执行效率是低下的。但有的资料介绍说,用函数charindex()来代替LIKE速度会有大的提升,经我试验,发现这种说明也是错误的:    select gid,title,fariqi,reader from tgongwen where charindex('刑侦支队',reader)>0 and fariqi>'2004-5-5'    用时:7秒,另外:扫描计数 4,逻辑读 7155 次,物理读 0 次,预读 0 次。    select gid,title,fariqi,reader from tgongwen where reader like '%' + '刑侦支队' + '%' and fariqi>'2004-5-5'    用时:7秒,另外:扫描计数 4,逻辑读 7155 次,物理读 0 次,预读 0 次。    8、union并不绝对比or的执行效率高   我们前面已经谈到了在where子句中使用or会引起全表扫描,一般的,我所见过的资料都是推荐这里用union来代替or。事实证明,这种说法对于大部分都是适用的。    select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16' or gid>9990000    用时:68秒。扫描计数 1,逻辑读 404008 次,物理读 283 次,预读 392163 次。    select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'    union    select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid>9990000    用时:9秒。扫描计数 8,逻辑读 67489 次,物理读 216 次,预读 7499 次。    看来,用union在通常情况下比用or的效率要高的多。    但经过试验,笔者发现如果or两边的查询列是一样的话,那么用union则反倒和用or的执行速度差很多,虽然这里union扫描的是索引,而or扫描的是全表。    select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16' or fariqi='2004-2-5'    用时:6423毫秒。扫描计数 2,逻辑读 14726 次,物理读 1 次,预读 7176 次。    select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'    union    select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-2-5'    用时:11640毫秒。扫描计数 8,逻辑读 14806 次,物理读 108 次,预读 1144 次。    9、字段提取要按照“需多少、提多少”的原则,避免“select *”   我们来做一个试验:    select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc    用时:4673毫秒    select top 10000 gid,fariqi,title from tgongwen order by gid desc    用时:1376毫秒    select top 10000 gid,fariqi from tgongwen order by gid desc    用时:80毫秒    由此看来,我们每少提取一个字段,数据的提取速度就会有相应的提升。提升的速度还要看您舍弃的字段的大小来判断。    10、count(*)不比count(字段)慢   某些资料上说:用*会统计所有列,显然要比一个世界的列名效率低。这种说法其实是没有根据的。我们来看:    select count(*) from Tgongwen    用时:1500毫秒    select count(gid) from Tgongwen    用时:1483毫秒    select count(fariqi) from Tgongwen    用时:3140毫秒    select count(title) from Tgongwen    用时:52050毫秒    从以上可以看出,如果用count(*)和用count(主键)的速度是相当的,而count(*)却比其他任何除主键以外的字段汇总速度要快,而且字段越长,汇总的速度就越慢。我想,如果用count(*), SQL SERVER可能会自动查找最小字段来汇总的。当然,如果您直接写count(主键)将会来的更直接些。    11、order by按聚集索引列排序效率最高   我们来看:(gid是主键,fariqi是聚合索引列)    select top 10000 gid,fariqi,reader,title from tgongwen    用时:196 毫秒。 扫描计数 1,逻辑读 289 次,物理读 1 次,预读 1527 次。    select top 10000 gid,fariqi,reader,title from tgongwen order by gid asc    用时:4720毫秒。 扫描计数 1,逻辑读 41956 次,物理读 0 次,预读 1287 次。    select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc    用时:4736毫秒。 扫描计数 1,逻辑读 55350 次,物理读 10 次,预读 775 次。    select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi asc    用时:173毫秒。 扫描计数 1,逻辑读 290 次,物理读 0 次,预读 0 次。    select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi desc    用时:156毫秒。 扫描计数 1,逻辑读 289 次,物理读 0 次,预读 0 次。    从以上我们可以看出,不排序的速度以及逻辑读次数都是和“order by 聚集索引列” 的速度是相当的,但这些都比“order by 非聚集索引列”的查询速度是快得多的。    同时,按照某个字段进行排序的时候,无论是正序还是倒序,速度是基本相当的。    12、高效的TOP   事实上,在查询和提取超大容量的数据集时,影响数据库响应时间的最大因素不是数据查找,而是物理的I/0操作。如:    select top 10 * from (    select top 10000 gid,fariqi,title from tgongwen    where neibuyonghu='办公室'    order by gid desc) as a    order by gid asc    这条语句,从理论上讲,整条语句的执行时间应该比子句的执行时间长,但事实相反。因为,子句执行后返回的是10000条记录,而整条语句仅返回10条语句,所以影响数据库响应时间最大的因素是物理I/O操作。而限制物理I/O操作此处的最有效方法之一就是使用TOP关键词了。TOP关键词是SQL SERVER中经过系统优化过的一个用来提取前几条或前几个百分比数据的词。经笔者在实践中的应用,发现TOP确实很好用,效率也很高。但这个词在另外一个大型数据库ORACLE中却没有,这不能说不是一个遗憾,虽然在ORACLE中可以用其他方法(如:rownumber)来解决。在以后的关于“实现千万级数据的分页显示存储过程”的讨论中,我们就将用到TOP这个关键词。   原文链接:https://blog.51cto.com/u_15127635/3901527 
  • [问题求助] 请问GaussDB的session_timeout参数可以设为0不?我们这边场景需要一个长连接
    请问GaussDB的session_timeout参数可以设为0不?我们这边场景需要一个长连接
  • [问题求助] GaussDB添加索引报这个错误,是怎么回事,ERROR: temporary file size exceeds temp_file_limit (104857600kB)
    GaussDB添加索引报这个错误,是怎么回事,ERROR: temporary file size exceeds temp_file_limit (104857600kB)
  • [问题求助] GaussDB执行报错,ERROR:timestampdiff syntas is not supported 有可替换的方法吗?
    GaussDB执行报错,ERROR:timestampdiff syntas is not supported 有可替换的方法吗?
  • [问题求助] 自定义的函数,存储过程存在后台哪个目录?误删的数据怎么找回?
    1、自定义的函数和存储过程在后台哪个目录里存在?我先后台修改存储过程,自定义函数怎么操作?2、我记忆中好像在开发手册中提到,数据delete以后是把数据的一个标识删除了,数据其实还在表里,有没有什么方法可以找回?3、数据库导出的数据会默认省略整数位的0。知会省略0,例如0.11导出以后就变成 .1了,导入导致各种报错。求助各位大佬
  • [问题求助] 异地双活的数据同步,GaussDB有哪些工具可以支撑?
    异地双活的数据同步,GaussDB有哪些工具可以支撑?
  • [问题求助] 【GaussDB】GaussDB不支持conflict语法吗?
    GaussDB不支持conflict语法吗?CREATE TABLE t1(dist_key int PRIMARY KEY, a int, b int); INSERT INTO t1 VALUES(1,2,3) ON CONFLICT(dist_key) DO UPDATE SET dist_key = EXCLUDED.dist_key, a = EXCLUDED.a + 1;
  • [问题求助] 【GaussDB】GaussDB整数位显示丢失,我想要的效果其实是 0.001 乘以100 后显示 0.1,但是,实际显示的结果却是 .100 整数位丢失了;怎么处理?
    GaussDB整数位显示丢失,我想要的效果其实是 0.001 乘以100 后显示 0.1,但是,实际显示的结果却是 .100 整数位丢失了;怎么处理?
  • [问题求助] GaussDB事务执行过程中报错
    事务执行过程中报错:; uncategorized SQLException; SQL state [25P02]; error code [14310]; [10.235.217.215:59972/7.213.119.234:8000] ERROR: current transaction is aborted, commands ignored until end of transaction block, firstChar[B]
  • 【资讯】openGauss 3.1.0版本正式发布 | 七个方面全面增强
    七个方面全面增强快速了解高可用1. 两地三中心跨Region容灾针对两地三中心跨Region容灾特性新增基于流式复制的异地容灾解决方案。支持灾备数据库failover,满足主备集群异地网络时延<=100ms时,数据库典型配置下灾备升主RTO 分钟级,RPO ≈ 0。支持容灾主备数据库实例计划内switchover,满足主备集群异地网络时延<=100ms时,数据库典型配置下主备倒换,RTO 分钟级,RPO=0。2. CM支持对外状态查询和推送能力通过http/https服务远程查询到集群的状态,便于管理人员、运维平台等监控集群状态。在数据库集群发生切主事件时,通过http/https服务及时地将集群最新的主备信息推送到应用端注册的接收地址,便于应用端及时的感知到集群的主备变化,从而能够快速的连接到新的主机和备机。3. DCF支持策略化多数派DCF(Distributed Consensus Framework,分布式共识框架,基于Paxos算法实现数据同步强一致。)支持策略化多数派能力,以多数派为前提,同时根据用户配置的AZ,保证AZ内至少有一个节点同步复制日志。高性能基础算子性能提升新选择率模型典型场景选择率估算准确率提升1X,性能提升1X。分区表页面估算优化典型场景性能提升20%。Partition Iterator算子优化典型场景性能提升5%。函数依赖特性支撑多列查询典型场景行数估算准确率提升1X 。SeqScan算子优化典型场景性能提升10%。高智能1. DBMind自治运维平台构建端到端自治运维平台:新增异常检测能力,完善自监控、自诊断、自调优能力。DBMind服务化:提供简易的部署能力、通过新增cmd exporter扩充采集指标;将原有的openGauss-exporter扩展为Agent, 便于获得即时信息;提供多种形式的功能API,便于与用户已有的运维平台对接和集成。异常检测:通过对监控到的指标进行分析,可以给出系统异常状态波动告警,包括基于规则的和基于算法的两种模式。其中,基于算法的包括对spike, mean shift等典型异常场景进行分析。2. 智能优化器实现库内Bayes网络算法并基于此实现智能统计信息以提高多列基数估计准确度,进而提升生成的执行计划质量。计划自适应选择解决因数据倾斜、索引不准、使用Offset查询等引起的计划跳变难题,性能提升1x以上。高安全细粒度Any权限增强Any权限管理,新增支持以下5种对象共12种ANY权限功能:ALTER ANY TYPE、DROP ANY TYPEALTER ANY SEQUENCE、DROP ANY SEQUENCE、SELECT ANY SEQUENCEALTER ANY INDEX、DROP ANY INDEXCREATE ANY TRIGGER、ALTER ANY TRIGGER、DROP ANY TRIGGERCREATE ANY SYNONYM、DROP ANY SYNONYM工具链1. MySQL全量迁移性能提升,提升全量迁移性能通过支持表级并行迁移,提升MySQL全量迁移性能,基于sysbench测试模型,在Kunpeng-920 2p服务器上,10张表(单表容量三百万以上)使用10并发迁移,可达到大于300M/s的迁移性能。2. MySQL增量迁移支持事务级并行消费,提升增量迁移性能基于开源三方件mysql-binlog-connector-java解析mysql的binlog,并根据mysql主备并行复制的原理,对可并行的事务在openGauss端采用多线程进行并行回放,以实现MySQL到openGauss的在线迁移。利用sysbench对MySQL压测,在10张表30个线程并发情况下,IUD混合场景下,在Kunpeng-920 2p服务器上测试整体增量迁移性能可达3w tps。3. 支持基于默克尔树的数据校验实现基于默克尔树的数据实时校验工具,支持MySQL数据迁移到openGauss时,源端与目的端数据全量和增量校验。4. 支持openGauss到MySQL迁移,满足MySQL反向迁移要求特性基于openGauss的逻辑复制实现,在openGauss端开启逻辑复制,使用JDBC获取逻辑解码,对逻辑解码进行SQL解析,通过多线程并发迁移到MySQL端,满足用户数据从MySQL迁移到openGauss后,两个数据库并行运行或迁移后逃生的诉求。sysbench对openGauss进行压测,在100张表100个线程并发情况下,针对insert场景,在Kunpeng-920 2p服务器上测试整体迁移性能可达3w tps。企业级特性1. 行存表压缩能力增强通过对行存数据进行压缩的操作,改变数据页面的存储状态。通过增加一个映射管理层将压缩页面分块落盘。整体过程发生在数据库脏页刷盘过程,对数据库的上层逻辑不影响,对用户不感知。满足TPCC测试模型中,压缩率2:1以上,且性能劣化小于5%。2. 发布订阅能力增强发布订阅功能增强,支持异地双活解决方案。轻量化版本支持发布订阅功能,满足边云协同场景需求。支持发布端主备切换后订阅关系不断开。支持同步订阅关系创建前的基础数据。支持备份恢复后复制槽不丢失,保证发布订阅的连接正常。支持以二进制格式发送数据。3. 细粒度滚动升级在灰度升级下,提供一种升级指定部分节点的功能。保证在不中断业务的情况下,先升级部分节点再升级剩余节点,减少升级场景业务中断时间。4. statement_history视图诊断能力增强备机支持statement_history视图,满足备机慢SQL诊断要求。statement_history增加对waitevents的统计,记录慢SQL执行时等待事件耗时和次数。可扩展性1. 集成openLookeng,提供分布式OLAP能力基于openLookeng实现分布式分析能力,openLookeng复用shardingsphere中间件的分库分表能力,使openLookeng可以获取openGauss数据进行分析运算。加上shardingSphere搭配openGauss形成的分布式OLTP能力一起组合成分布式的HTAP能力。注: openLooKeng: 面向大数据库的数据虚拟化引擎,详情 https://openlookeng.io/zh/ShardingSphere:将任何数据库转换为分布式数据库系统的生态系统,并通过分片、弹性扩展、加密功能等对其进行增强。详情:https://shardingsphere.apache.org/2. CM支持管理shardingSphere Proxy和注册中心CM支持自定义资源管理,支持管理shardingSphere Proxy和注册中心,支持异常情况自动拉起。感谢openGauss社区所有贡献者独行快,众行远。感谢来自社区1005名参与openGauss3.1.0版本贡献的开发者。同样感谢积极参与本次版本贡献的华为、海量数据、云和恩墨、中国联通、电子科技大学计算机科学与工程学院、宁夏大学信息工程学院、华南理工大学软件学院、兰州大学信息科学与工程学院、北京工业大学计算机学院软件与理论系、北京思斐软件技术有限公司等组织单位。转自华为计算公众号
  • [问题求助] JDBC操作过程中,查询可以,但是新增不行,求助!!!
    在操作数据库的过程中,查询没有问题,新增会出现以下问题,求助各位大佬org.postgresql.util.PSQLException: ERROR: dn_6035_6036: relation "t_stat_sjzcgl_zysqd_sqfw" does not exist on DN dn_6035_6036 。表t_stat_sjzcgl_zysqd_sqfw是有存在的,通过查询是没有问题的。
总条数:1518 到第
上滑加载中