华为云用户手册

  • 2.0.42.230600 表6 2.0.42.230600内核版本说明 日期 特性描述 2023-08-31 新增功能和性能优化: 优化全量与增量备份放到备库进行,减少主机内存/CPU占用。 优化UNDO损坏场景的快速定位:启动undo损坏时,明确打印出undo损坏和对应表名称。 优化备机查询性能劣后于主库问题。 优化in-list转临时表。 NDP特性规模商用。 用Statement Outline方法稳定执行计划。 PQ特性支持Round函数。 问题修复: 修复快速排序和优先级队列排序算法不稳定导致ORDER BY LIMIT与ORDER LIMIT结果集有重合的问题。 修复PQ语句极小概率情况返回错误结果的问题。 修复部分场景PREPARE语句执行报错的问题。 修复部分场景UNION查询上的PQ断言错误的问题。 修复实例主节点INSERT大数据量的时候只读升主,升主成功后用全文索引查询的结果不准确的问题。 修复备机使用general_log和slow_log表打印warning日志的问题。 修复部分场景设置锁等待时间参数innodb_lock_wait_timeout后,实际超时等待时间不一致的问题。 修复只读升主过程中,小概率出现Failed to find page in slice manager导致升主失败的问题。 修复salsql日志pwal扫描进度percentage值大于100%的问题。 修复执行sqlsmith工具, 查询语句在explain阶段偶现mysqld coredump。 修复SELECT DISTINCT + CAST函数转换datetime类型为float类型时,结果不正确的问题。
  • 2.0.28.15 表11 2.0.28.15版本说明 日期 特性描述 2023-01-11 新特性 支持SQL限流。 读流控优化。 主备执行计划一致优化。 slice异步预创建。 问题修复 修复系统变量INNODB_VALIDATE_TABLESPACE_PATHS关闭情况下undo space truncate的时候出现的crash问题。 修复查询information_schema.innodb_trx较慢问题。 修复查询结果不一致的问题:left joins没有转化为inner joins。 修复优化子查询的过程中导致的crash问题。 修复并发instantDDL和DML场景下未按实际获取instant字段值的问题。 修复当load有FTS索引的两个INNODB表时可能导致OOM的问题。 修复更新百万级别的表的数据字典可能导致OOM的问题。
  • 2.0.51.240300 表3 2.0.51.240300内核版本说明 日期 特性描述 2024-03-30 新增功能和性能优化: 支持高性能全局一致性,在较低的性能损耗下,提供集群维度的强一致性读能力。 新增show binary logs no block语法,优化在show binary logs过程中对事务提交的阻塞情况。 提供undo truncate能力,优化大量写入场景导致undo空间膨胀的问题。 提高全量恢复的并行度,优化备份恢复效率。 问题修复: 修复一批window function查询结果不准确或异常错误的问题。 修复在打开plan cache后反复执行一类prepare statement,数据库节点崩溃的问题。 修复在先后执行的存储过程中,由于字符集不一致导致的报错问题。 修复一类开启PQ后进行磁盘hash join,查询结果不符合预期的问题。 修复一类查询含有group by临时表字段时,报错主键重复的问题。
  • 2.0.39.230300 表7 2.0.39.230300版本说明 日期 特性描述 2023-05-11 新特性及优化: 支持小规格实例。 备机DDL失效方案优化。 SALSQL使用空间容量计算优化。 支持对单个SQL语句使用资源进行限制。 支持admin port和local socket使用per thread。 pwalScanner内存优化。 支持修改default_collation_for_utf8mb4参数。 支持大事务检测能力。 支持Kill idle transactions。 优化增量恢复速度。 新增数据库描述和账号描述。 支持buffer pool resize加速。 问题修复: 修复Ptrc可能会导致Nestedloop join的结果不一致问题。 修复使用windows函数进行排序的子查询可能会导致crash问题。 修复使用rewrites view时,如果评估可能会把left joins转化为inner joins问题。 修复指定过滤条件的decimal类型的数据不返回结果问题。 修复内存非对齐问题。 修复全量日志中记录scan_row不准确问题。
  • 推理SDK概述 盘古大模型推理SDK是对REST API进行的封装,通过该SDK可以处理用户的输入,生成模型的回复,从而实现自然流畅的对话体验。 表1 推理SDK清单 SDK分类 SDK功能 支持语言 使用场景 推理SDK 对话问答(/chat/completions) Java、Python、Go、.NET、NodeJs 基于对话问答功能,用户可以与模型进行自然而流畅的对话和交流。 - 通用文本(/text/completions) Java、Python、Go、.NET、NodeJs、PHP 给定一个提示和一些参数,模型会根据这些信息生成一个或多个预测的补全,还可以返回每个位置上不同词语的概率。它可以用来做文本生成、自动写作、代码补全等任务。
  • 场景描述 业务插入或更新带有emoji表情的数据时,报错Error 1366。 java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\xB0\xE5\xA4...' for column 'username' at row 1 ;uncategorized SQLException for SQL []; SQL state [HY000]; error code [1366]; Incorrect string value: '\xF0\x9F\x90\xB0\xE5\xA4...' for column 'username' at row 1;
  • 原因分析 排查步骤: 查看TaurusDB的错误日志,观察到如下报错: 2021-07-09T10:30:58.476586+08:00 212539 [Warning] SSL errno: 337678594, SSL errmsg: error:14209102:SSL routines:tls_early_post_process_client_hello:unsupported protocol2021-07-09T10:30:58.476647+08:00 212539 [Note] Bad handshake2021-07-09T10:32:43.535738+08:00 212631 [Warning] SSL errno: 337678594, SSL errmsg: error:14209102:SSL routines:tls_early_post_process_client_hello:unsupported protocol2021-07-09T10:32:43.535787+08:00 212631 [Note] Bad handshake2021-07-09T10:50:03.401100+08:00 213499 [Warning] SSL errno: 337678594, SSL errmsg: error:14209102:SSL routines:tls_early_post_process_client_hello:unsupported protocol2021-07-09T10:50:03.401161+08:00 213499 [Note] Bad handshake2021-07-09T10:53:44.458404+08:00 213688 [Warning] SSL errno: 337678594, SSL errmsg: error:14209102:SSL routines:tls_early_post_process_client_hello:unsupported protocol2021-07-09T10:53:44.458475+08:00 213688 [Note] Bad handshake 从报错信息unsupported protocol可以看出,很可能和TLS版本相关,使用如下命令,分别查看TaurusDB和自建MySQL的TLS版本。 show variables like '%tls_version%'; 发现TaurusDB为TLS v1.2版本,自建MySQL为TLS v1.1版本,存在差异。进一步确认客户端TLS版本,与自建MySQL一致,因此出现连接自建MySQL成功,连接云上TaurusDB失败。
  • 开通数据库代理后,还是有大量select请求分发到主节点 原因分析: 读权重参数 设置主节点和只读节点的读权重分配,可以控制读请求的分发配比,仅在存在只读节点时生效。 例如:一主两只读,设置的读权重为1(主):2(只读1):3(只读2),那么会按照1:2:3将读请求分发到主和只读实例上;如果将读权重设置为0:2:3,会按照2:3将请求分发的只读实例,不会将读请求分发的主实例。 更多信息,请参见设置读写分离权重。 事务 事务中的SQL会发往主,若在查询语句前设置set autocommit=0也会被当做事务处理路由到主实例。 连接绑定 执行了Multi-Statements(如“insert xxx;select xxx”)当前连接的后续请求会全部路由到主节点;创建临时表的SQL会将连接绑定到主,后续此连接的请求都会到主。需断开当前连接并重新连接才能恢复读写分离。 自定义变量 SQL中包含了自定义变量的语句会发到主节点。 带锁的读操作(如SELECT for UPDATE)会被路由到主节点。 通过Hint指定SQL发往主实例或只读实例 在读写分离权重分配体系之外,在SQL开头添加hint注释进行强制路由: /*FORCE_MASTER*/:强制路由到主节点 /*FORCE_SLAVE*/:强制路由到只读节点 Hint注释仅作为路由建议,非只读SQL、事务中的场景不能强制路由到只读节点。 会话一致性特性 同一个会话内,对于写入还没有同步到只读节点的数据,读请求也会发送到主节点。 更多信息,请参见一致性级别介绍。 父主题: SQL类
  • 解决方案 将存储emoji表情的字段的字符集修改为utf8mb4。 如果涉及的表和字段比较多,建议把对应表、数据库的编码也设置为utf8mb4。参考命令: ALTER DATABASE database_name CHARACTER SET= utf8mb4 COLLATE= utf8mb4_unicode_ci; ALTER TABLE table_name CONVERTTOCHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE table_name MODIFY 字段名 VARCHAR(128) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci; 若对应字段的字符集已经是utf8mb4,则为客户端或MySQL服务端字符集转换问题,将客户端和MySQL服务端的字符集都设置为utf8mb4。
  • 解决方案 如果数据变化较多,表中实际数据量远小于自增主键的容量,则可以考虑将该表的数据全量导入新表,删除原表,然后rename将新表名改回原表名。(使用数据导入导出的方法有多种实现方法,此处仅举其中一种例子) 创建表auto_test5_tmp。 create table auto_test5_tmp(id tinyint not null AUTO_INCREMENT, name varchar(8), PRIMARY KEY (`id`)); Query OK, 0 rows affected (0.07 sec) 插入数据。 insert into auto_test5_tmp select 0,name from auto_test5; Query OK, 6 rows affected (0.01 sec) Records: 6 Duplicates: 0 Warnings: 0 查询表数据。 select * from auto_test5_tmp; +----+------+ | id | name | +----+------+ | 1 | A | | 2 | B | | 3 | C | | 4 | X | | 5 | Y | | 6 | Z | +----+------+ 删除表。 drop table auto_test5; 重命名。 rename table auto_test5_tmp to auto_test5;Query OK, 0 rows affected (0.12 sec) 如果自增主键的取值范围不够,则修改自增主键的字段类型。 alter table auto_test6 modify column id int NOT NULL AUTO_INCREMENT; Query OK, 6 rows affected (0.15 sec) Records: 6 Duplicates: 0 Warnings: 0
  • 使用mysqlbinlog工具获取binlog 本文以从弹性 云服务器ECS 上拉取为例,其他环境下方法类似。 在E CS 上安装MySQL客户端,详情请参考安装MySQL客户端。 TaurusDB兼容社区MySQL 8.0及以上版本,请勿安装8.0以下版本的版本的客户端。 执行命令,下载binlog文件。 mysqlbinlog -hxxx -uxxx -Pxxx -pxxx binlog.xxxx --read-from-remote-server mysqlbinlog的常用参数: -h:数据库host。 -u:用户名。 -P:端口号。 -p:密码。 --start-position:表示从指定的起始位置开始解析。 --start-datetime:表示从指定的时间开始解析。 --stop-position:表示解析到指定的位置。 --stop-datetime:表示解析到指定的时间。 --skip-gtids:跳过打印gtid_log_event。 --short-form:表示只显示statements。 --result-file:将binlog解析生成sql文件。 --read-from-remote-server:远程下载binlog(用于mysqlbinlog与数据库服务端不在同一台机器的情况)。 父主题: 备份恢复
  • 原因分析 场景1:DRS全量迁移阶段并行迁移导致 原因:DRS在全量迁移阶段,为了保证迁移性能和传输的稳定性,采用了行级并行的迁移方式。当源端数据紧凑情况下,通过DRS迁移到云上TaurusDB后,可能会出现数据膨胀现象,使得磁盘空间使用远大于源端。 场景2:大量删除操作后在表空间留下碎片所致 原因:当删除数据时,MySQL并不会回收被删除数据占据的存储空间,而只做标记删除,尝试供后续复用,等新的数据来填补相应空间,如果一时半会,没有数据来填补这些空间,就造成了表空间膨胀,形成大量碎片。 可以通过如下SQL语句,查询某个表详细信息,DATA_FREE字段表示表空间碎片大小: 更新统计信息 analyze table db_name.table_name; 查看碎片大小 select * from information_schema.tables where table_schema='db_name' and table_name = 'table_name'\G;
  • 对各个IP地址的解释说明 购买TaurusDB实例后获得了多个IP地址,以1主1只读为例,在实例基础信息中最多共能找到5个IP,业务可以按自己的需要连接对应的IP。 对于节点读内网地址,如果出现节点故障,故障恢复前IP不可访问。 主节点读内网地址(不推荐使用) IP与节点绑定,可以从内网(同VPC网络内)直接连接IP做读写操作,如果发生故障倒换,节点变为只读节点,则该IP将只能做读操作,不能做写操作。对该IP的操作实际会落到对应的节点上。 只读节点读内网地址(不推荐使用) IP与节点绑定,可以从内网(同VPC网络内)直接连接IP做读操作,如果发生故障倒换,节点变为主节点,则该IP将能做读写操作。对该IP的操作实际会落到对应的节点上。 读写内网地址 浮动IP,IP永远与主节点绑定,可以内网(同VPC网络内)直接连接IP做读写操作。如果发生故障倒换,该IP会浮动到新的主节点,依然可以做读写操作。对该IP的操作永远会落到当时的主节点上。 读写公网地址(购买实例后需要单独绑定) 购买并绑定公网IP后,可以从公网连接IP做读写操作。与浮动IP相同,也是一直与主节点绑定,且一直可以做读写操作。对该IP的操作永远会落到当时的主节点上。 图1 读写公网地址和数据库端口 代理地址(购买实例后要 开通读写分离 才会有) 购买数据库代理后,可以从数据库代理中查看代理地址,连接该地址可以执行读写操作,数据库代理会自动将写请求发送到当时的主节点,将读请求发送到当时的只读节点,最大化利用实例1主多读的多节点读写能力,降低主节点的压力。读写分离IP当前暂时只支持内网访问,尚未开放绑定公网IP的功能。 故障倒换: TaurusDB默认最少为2个节点,1主(可读可写)1只读(只可读不可写),主节点仅允许有一个,只读节点可以有多个。 当主节点遇到故障时,高可用系统会迅速发现,并选择一个只读节点将其升级为主节点,并将原主节点修复为只读节点,这个过程叫故障倒换。 父主题: 连接类
  • 场景描述 canal解析Binlog出现错误,导致拉取Binlog中断,错误信息如下: com.alibaba.otter.canal.parse.exception.CanalParseException: java.lang.NumberFormatException:- Caused by: java.lang.NumberFormatException: - at com.alibaba.fastsql.sql.parser.Lexer.integerValue(Lexer.java:2454)
  • 原因分析 检查TaurusDB的参数“binlog_rows_query_log_events”的值是否设置为1或ON。 目前canal只能支持ROW格式的Binlog增量订阅。 当TaurusDB的参数“binlog_rows_query_log_events”的值设置为1或ON时,会在Binlog中产生Rows_query类型的event,此类event非ROW格式,一些场景下,会导致canal出现blank topic问题,引发Binlog解析失败。
  • 通过命令查看存储容量 连接TaurusDB数据库后,执行如下命令查看存储容量。 show spaceusage; 上述命令查询到的存储容量值等于表数据、表预分配空间、分区预分配空间、Binlog、Redolog和undo space之和,详情请参见表1。 information_schema信息不是实时刷新的,查询之前可以先执行如下命令进行刷新: set information_schema_stats_expiry = 0; 表1 存储容量说明 条目 查看方式 说明 表数据 select sum(data_length+index_length+data_free) from information_schema.tables; 传统MySQL的容量计算方式,该语句依赖统计数据的精准度,在统计数据未更新时可能会有偏差。 表预分配空间 select count(*) from information_schema.tables; 每张表会预分配4MB空间,该语句查询出表的数量乘以4MB就是总的表预分配空间。 分区预分配空间 select count(*) from INFORMATION_SCHEMA.PARTITIONS where PARTITION_NAME is not null; 每个分区会预分配4MB空间,该语句查询出分区的数量乘以4MB就是总的分区预分配空间。 Binlog show binary logs; 将所有binlog的文件大小相加。 Redolog show lsninfo; flushed_to_disk_lsn- truncate_lsn undo space select sum(INITIAL_SIZE) as undo_space from information_schema.files where file_type='UNDO LOG '; undo空间。
  • 原因分析 查看mysql.user表中的root账号信息,排查客户端IP范围是否正确、是否使用SSL。 SELECT * FROM mysql.user WHERE User='root'; 如果发现root账号的ssl_type被设置为ANY,表明root账号需要使用SSL连接。 查看SSL开启情况。 show variables like '%ssl%'; 发现该实例未开启SSL: 因此,问题原因是自行修改root账号的ssl_type为ANY后,导致无法登录。
  • 原因分析 查看TaurusDB的错误日志,观察是否有如下信息:connection xxx is established slowly。示例: 有上述日志,说明存在某些连接超过一定时间仍未被MySQL处理,客户端的超时时间大于该时间,就会报错。 进一步查看线程池配置(默认开启),可以在控制台查看。 可以看出,threadpool_size为1,threadpool_stall_limit为500ms,threadpool_oversubscribe为3,线程池处理连接等待的时间主要与上述3个参数相关: 当线程池所有线程在忙碌,线程池中的调度线程会每隔500ms(threadpool_stall_limit)创建一个新线程,所以此时,每个线程组平均每500ms才能处理一个新的连接。如果队列太长,很可能导致客户端超时; 所有线程都在忙碌是指,工作线程达到线程池总线程数,在大量建立连接时,总线程数计算方法:threadpool_size*(threadpool_oversubscribe+1))
  • 解决方案 对于存在大量新建连接,建议调大threadpool_oversubscribe增加线程总数。 减少线程重复创建与销毁部分的开销,提高性能,同时它也限制了MySQL的runing线程数,关键时刻可以保护系统,防止雪崩。 正常情况下,线程池适用于大量短连接的场景,如果客户是长连接,并且连接数量不多(客户端使用了连接池等情况),线程池的作用不大,此时调整threadpool_size和threadpool_oversubscribe两个参数扩大线程总数,或者直接关闭线程池。
  • 原因分析 在“innodb_large_prefix”设置为off的情况下,InnoDB表的单字段索引的最大字段长度不能超过767字节,联合索引的每个字段的长度不能超过767字节,且所有字段长度合计不能超过3072字节。 当“innodb_large_prefix”设置为on时,单字段索引最大长度可为3072字节,联合索引合计最大长度可为3072字节。 索引长度与字符集相关。使用utf8字符集时,一个字符占用三个字节,在“innodb_large_prefix”参数设置为on情况下,索引的所有字段的长度合计最大为1072个字符。 查看表结构如下: CREATE TABLE `xxxxx` (……`subscription_type` varchar(64) NOT NULL DEFAULT 'DEVICE_EXCEPTION' COMMENT '订阅类型',`auth_key` varchar(255) DEFAULT '' COMMENT '签名,接口请求头会根据这个值增加token',`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `enterprise_id` (`subscription_type`,`enterprise_id`,`callback_url`) USING BTREE)) ENGINE=InnoDB AUTO_INCREMENT=1039 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC 该表使用了utf8字符集,一个字符占用三个字节。联合索引“enterprise_id”包含了“callback_url”字段,如果执行DDL操作将“callback_url”修改为varchar(1024),会超出联合索引最大长度限制,所以报错。
  • 解决方案 ERROR 2013是MySQL常见错误,一般为配置错误导致。 “wait_timeout”:服务器关闭非交互连接之前等待活动的秒数。 “interactive_timeout”:服务器关闭交互连接之前等待活动的秒数。 查看实例状态是否处于正常状态。 经查看实例状态正常,继续排查其他问题。 查看错误日志。 使用MySQL命令行客户端连接数据库,执行status命令,确认数据库实例是否频繁重启。 Uptime代表实例的运行时间,从排查结果可知,数据库并没有频繁重启,因而,客户端连接被断开,不是因数据库重启引起的。 查看“wait_timeout”和“interactive_timeout”参数设置,MySQL会自动断开超时的空连接。 您可根据实际应用需求量,修改“wait_timeout”和“interactive_timeout”参数值,无需重启实例。 恢复结果确认,等到10分钟左右,再次执行show databases命令,确认连接是否正常。 如图所示,说明连接正常。
  • 场景描述 14点~15点之间数据库出现大量行锁冲突,内核中大量update/insert会话在等待行锁释放,导致CPU使用率达到70%左右,数据库操作变慢。 查看 CES 指标行锁等待个数、MDL锁数量,下图仅供参考: 发生死锁的表: ********* 1. row *********Table: table_test Create Table: CREATE TABLE table_test(...CONSTRAINT act_fk_exe_parent FOREIGN KEY (parent_id_) REFERENCES act_ru_execution (id_) ON DELETE CASCADE,CONSTRAINT act_fk_exe_procdef FOREIGN KEY (proc_def_id_) REFERENCES act_re_procdef (id_),CONSTRAINT act_fk_exe_procinst FOREIGN KEY (proc_inst_id_) REFERENCES act_ru_execution (id_) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT act_fk_exe_super FOREIGN KEY (super_exec_) REFERENCES act_ru_execution (id_) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
  • 解决方案 TaurusDB是兼容社区8.0以上版本的,需要使用8.0及以上版本的mysql client或数据库驱动。 SSL(Secure Socket Layer:安全套接字层)使用 数据加密 、身份校验和消息完整性校验,为连接提供安全性保证。 SSL提供的功能主要包含: 加密数据传输:利用对称密钥算法对传输的数据进行加密。 身份校验:基于证书使用数字签名的方法对客户端与服务器进行身份验证。 消息完整性校验:消息传输过程中使用MAC算法来检验消息的完整性。 注意 当服务端的SSL开启时,客户端的身份验证是可选的,即:即使服务端开启了SSL,客户端也可以不通过SSL的方式连接服务端,此时也可以正常通信,只是数据不会被加密。 如果不是通过SSL的方式,那么其在网络中的传输数据会以明文进行,存在安全隐患。 TaurusDB数据库服务端会默认开启服务端会默认开启SSL(如需关闭可参考:设置SSL数据加密),客户业务使用时可以在客户端自行选择是否使用SSL。 使用mysql client连接时使用SSL的方式可参考:通过客户端连接TaurusDB。 使用JDBC连接时使用SSL的方式可参考:通过JDBC连接MySQL数据库。
  • 解决方案 对于mariadb的连接串应该为: String url = "jdbc:mysql://xxx.xxx.xxx.xxx:xxxx/mysql?useSsl=true&serverSslCert=D:\\ca.pem&disableSslHostnameVerification=true"; 注意:TaurusDB实例不支持hostname校验,因此需要设置disableSslHostnameVerification=true,不同mariadb jar包版本设置方式不同,可查看对应版本的使用说明。
  • 示例 举例中使用的是命令的方式做描述。 创建会话1。 # 查看参数值。show variables like 'long_query_time'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ 1 row in set (0.08 sec) # 修改变量值 set global long_query_time=1; Query OK, 0 rows affected (0.02 sec) # 重新查看,发现未生效。 show variables like 'long_query_time'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ 1 row in set (0.01 sec) 创建会话2。 show variables like 'long_query_time'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ 1 row in set (0.01 sec) 在会话1中执行。 #会话1中执行set global后,再次查看,变量未生效。show variables like 'long_query_time'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ 1 row in set (0.01 sec) # 会话1断开,重新连接,发现修改生效。 show variables like 'long_query_time'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time | 1.000000 | +-----------------+----------+ 1 row in set (0.00 sec) 会话2断开,重新连接,发现修改生效。 show variables like 'long_query_time'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time | 1.000000 | +-----------------+----------+ 1 row in set (0.01 sec)
  • 原因分析 MySQL内部在执行复杂SQL时,会借助临时表进行分组(group by)、排序(order by)、去重(distinct)、Union等操作,当内存空间不够时,便会使用磁盘空间。 排查思路: 因为其他只读节点磁盘占用空间正常,且是偶尔出现,说明该实例磁盘占用高,与承载的业务相关。 获取该实例的慢日志,分析磁盘占用高期间,是否有对应的慢SQL。 如果有慢SQL,执行explain [慢SQL语句],分析相应慢SQL语句。 观察explain语句输出的extra列,是否有using temporary、using filesort,如果有,说明该语句用到了临时表或临时文件,数据量大的情况下,会导致磁盘占用高。
  • 原因分析 大部分情况下,distinct是可以转化成等价的group by语句。在MySQL中,distinct关键字的主要作用就是去重过滤。 distinct进行去重的原理是先进行分组操作,然后从每组数据中取一条返回给客户端,分组时有两种场景: distinct的字段全部包含于同一索引:该场景下MySQL直接使用索引对数据进行分组,然后从每组数据中取一条数据返回。 distinct字段未全部包含于索引:该场景下索引不能满足去重分组需要,会用到临时表(首先将满足条件的数据写入临时表中,然后在临时表中对数据进行分组,返回合适的数据)。因为使用临时表会带来额外的开销,所以一般情况下性能会较差。 综上,在使用distinct或group by的时候,尽量在合理的情况下设置可以包含所有依赖字段的索引,优化示例: 没有合适索引,导致需要用到临时表。 有合适的索引,不会使用临时表,直接走索引。
  • 原因分析 表字段类型是TIMESTAMP类型, 关于timestamp字段:MySQL会把该字段插入的值从当前时区转换成UTC时间(世界标准时间)存储,查询时,又将其从UTC时间转化为当前时区时间返回 timestamp类型字段的时间范围:'1970-01-01 00:00:01' UTC -- '2038-01-19 03:14:07' UTC,详见官方文档: 使用如下命令,查看当前的时区: show variables like "%zone%"; 故障场景中使用的是utc+8时区,如下图,所以timestamp字段默认值需要加8小时才是有效范围,有效支持的范围是从1970-01-01 08:00:01开始;
  • 原因分析 查看内存利用率监控指标,实例的内存使用率在16:30左右率突增,触发OOM后实例重启,内存使用率骤降。 图1 内存利用率 查看该时间段慢SQL数监控指标,确认该时间段慢SQL数量突增。 图2 慢SQL数 查看磁盘吞吐相关指标,发现磁盘此时有大量读写操作。 图3 磁盘吞吐 分析对应时间点的慢日志记录,该时间点有大量的多值批量插入语句,该插入方式会导致每个会话申请较多的SESSION级内存,并发高,很容易引起实例OOM。 图4 慢日志
  • 解决方案 针对多值插入方式引起的OOM,建议减少单次插入数据量,分多次插入,且及时断开重连会话以释放内存。可执行show full processlist查看是否有明显占用内存高的会话。 合理设置SESSION级内存参数大小,可大体根据全局内存+会话级内存*最大会话数来预估可能最大的内存。注意开启“performance_schema”也会带来内存开销。 升级实例规格,将内存利用率维持在合理范围,防止业务突增导致实例OOM。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全