华为云用户手册

  • 示例 举例中使用的是命令的方式做描述。 创建会话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)
  • mysqldump选项解析 表1 配置项说明 选项名称 说明 add-drop-table 每个数据表创建之前添加drop数据表语句。 events,E 导出事件。 routines,R 存储过程以及自定义函数。 flush-logs 开始导出之前刷新日志。 no-create-db,n 只导出数据,而不添加CREATE DATABASE语句。 add-drop-database 创建数据库之前添加drop数据库语句。 no-create-info,t 只导出数据,而不添加CREATE TABLE语句。 no-data,d 不导出任何数据,只导出数据库表结构。 set-gtid-purged=OFF 不导出gtid相关语句。 hex-blob 使用十六进制格式导出二进制字符串字段。
  • 解决方案 将存储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。
  • 场景描述 业务插入或更新带有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;
  • 原因分析 MySQL内部在执行复杂SQL时,会借助临时表进行分组(group by)、排序(order by)、去重(distinct)、Union等操作,当内存空间不够时,便会使用磁盘空间。 排查思路: 因为其他只读节点磁盘占用空间正常,且是偶尔出现,说明该实例磁盘占用高,与承载的业务相关。 获取该实例的慢日志,分析磁盘占用高期间,是否有对应的慢SQL。 如果有慢SQL,执行explain [慢SQL语句],分析相应慢SQL语句。 观察explain语句输出的extra列,是否有using temporary、using filesort,如果有,说明该语句用到了临时表或临时文件,数据量大的情况下,会导致磁盘占用高。
  • 原因分析 在“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),会超出联合索引最大长度限制,所以报错。
  • 原因分析 大部分情况下,distinct是可以转化成等价的group by语句。在MySQL中,distinct关键字的主要作用就是去重过滤。 distinct进行去重的原理是先进行分组操作,然后从每组数据中取一条返回给客户端,分组时有两种场景: distinct的字段全部包含于同一索引:该场景下MySQL直接使用索引对数据进行分组,然后从每组数据中取一条数据返回。 distinct字段未全部包含于索引:该场景下索引不能满足去重分组需要,会用到临时表(首先将满足条件的数据写入临时表中,然后在临时表中对数据进行分组,返回合适的数据)。因为使用临时表会带来额外的开销,所以一般情况下性能会较差。 综上,在使用distinct或group by的时候,尽量在合理的情况下设置可以包含所有依赖字段的索引,优化示例: 没有合适索引,导致需要用到临时表。 有合适的索引,不会使用临时表,直接走索引。
  • 开通数据库代理后,还是有大量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类
  • 原因分析 经过排查,是因为参数“sql_mode”设置了NO_FIELD_OPTIONS属性。 sql_mode相关属性介绍: NO_FIELD_OPTIONS:不要在SHOW CREATE TABLE的输出中打印MySQL专用列选项。 NO_KEY_OPTIONS:不要在SHOW CREATE TABLE的输出中打印MySQL专用索引选项。 NO_TABLE_OPTIONS:不要在SHOW CREATE TABLE的输出中打印MySQL专用表选项(例如ENGINE)。
  • 原因分析 表字段类型是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开始;
  • 原因分析 查看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后,导致无法登录。
  • 使用示例 KEY-RANGE类型的使用示例 CREATE TABLE tbl_key_range ( col1 INT, col2 INT, col3 varchar(20), col4 DATE ) PARTITION BY KEY(col1) SUBPARTITION BY RANGE COLUMNS(col4) ( PARTITION p0( SUBPARTITION p0_q1_2023 VALUES LESS THAN('2023-04-01'), SUBPARTITION p0_q2_2023 VALUES LESS THAN('2023-07-01'), SUBPARTITION p0_q3_2023 VALUES LESS THAN('2023-10-01'), SUBPARTITION p0_q4_2023 VALUES LESS THAN('2024-01-01') ), PARTITION p1( SUBPARTITION p1_q1_2023 VALUES LESS THAN('2023-04-01'), SUBPARTITION p1_q2_2023 VALUES LESS THAN('2023-07-01'), SUBPARTITION p1_q3_2023 VALUES LESS THAN('2023-10-01'), SUBPARTITION p1_q4_2023 VALUES LESS THAN('2024-01-01') ), PARTITION p2( SUBPARTITION p2_q1_2023 VALUES LESS THAN('2023-04-01'), SUBPARTITION p2_q2_2023 VALUES LESS THAN('2023-07-01'), SUBPARTITION p2_q3_2023 VALUES LESS THAN('2023-10-01'), SUBPARTITION p2_q4_2023 VALUES LESS THAN('2024-01-01') ) );
  • 语法 创建一个或多个KEY-RANGE分区表,其中每个分区可能有一个或一个以上的子分区。 CREATE TABLE [ schema. ]table_name table_definition PARTITION BY [LINEAR] KEY (column_list) SUBPARTITION BY RANGE {(expr) | COLUMNS(column_list)} (partition_definition [, partition_definition] ...); 其中,partition_definition为: PARTITION partition_name (subpartition_definition [, subpartition_definition] ...) subpartition_definition为: SUBPARTITION subpartition_name VALUES LESS THAN {value | value_list | MAXVALUE} 表1 参数说明 参数名称 描述 table_name 要创建的表名称。 expr 分区字段表达式,目前只支持INT类型,不支持字符类型。 column_list RANGE COLUMNS的情况下使用,分区字段列表,不支持表达式。 value 分区边界值。 value_list LIST COLUMNS的情况下使用,多个字段的边界值。 MAXVALUE 最大值。 partition_name subpartition_name 分区名称,同一个表中不可重复。 子分区名称,同一个表中不可重复。
  • 开启并行查询 支持通过设置系统参数和使用HINT语法两种方式,开启或关闭并行查询。 方法一:通过设置系统参数开启或关闭并行查询 在管理控制台的参数修改页面,通过设置系统参数,开启和关闭并行查询,并设置并行度。 通过全局参数“force_parallel_execute”来控制是否强制启用并行执行。 使用全局参数“parallel_default_dop”来控制使用多少线程并行执行。 使用全局参数“parallel_cost_threshold”来控制当执行代价为多大时,开启并行执行。 上述参数在使用过程中,随时可以修改,无需重启数据库。 例如,想要强制开启并行执行,并且并发度为4,最小执行代价为0,可参照如下进行设置: SET force_parallel_execute=ON SET parallel_default_dop=4 SET parallel_cost_threshold=0 方法二:使用HINT开启或关闭并行查询 使用HINT语法可以控制单个语句是否进行并行执行。在系统默认关闭并行执行的情况下, 可以使用hint对特定的SQL进行开启。反之,也可以禁止某条SQL进行并行执行。 开启并行执行:采用下面的HINT语法可以开启并行执行。 采用默认的参数配置:SELECT /*+ PQ() */ … FROM … 采用默认的参数配置,同时指定并发度为8:SELECT /*+ PQ(8) */ … FROM … 采用默认的参数配置,同时指定并行表为t1:SELECT /*+ PQ(t1) */ … FROM … 采用默认的参数配置,同时指定并行表为t1,并发度为8:SELECT /*+ PQ(t1 8) */ … FROM … PQ HINT紧跟着SELECT关键字才能生效。PQ HINT的并发度参数dop正常取值范围[1, min(parallel_max_threads, 1024)]。 dop超出正常取值范围时,PQ不生效。 关闭并行执行:当并行查询开启时,可使用"NO_PQ"的hint语法关闭单条SQL的并行执行。 SELECT /*+ NO_PQ */ … FROM … NO_PQ hint的优先级高于PQ hint,如果SQL语句出现NO_PQ hint,即使配置PQ hint,该单条SQL也不会并行执行。
  • 系统参数及状态变量说明 支持的系统参数如表1。 表1 系统参数 参数名称 级别 描述 force_parallel_execute Global, Session 是否开启并行查询,当设置为“ON”时,表示查询SQL尽可能地使用并行执行。 取值范围:ON, OFF 默认值OFF parallel_max_threads Global 并行执行的最大活跃线程个数。当并行执行的活跃线程超过该值时,新的查询将不允许启用并行执行。 取值范围:0-4294967295 默认值:64 parallel_default_dop Global, Session 并行执行的默认并行度。当查询语句没有指定并行度时,使用该值。 取值范围:0-1024 默认值:4 parallel_cost_threshold Global, Session 启用并行执行的代价阈值。只有当查询的执行代价超过该阈值时才有可能进行并行执行。 取值范围:0-4294967295 默认值:1000 parallel_queue_timeout Global, Session 当不满足并行查询的条件时,请求并行执行的SQL等待超时时间。当等待时间超过该值后,则不再等待,开始进行单线程执行。 取值范围:0-4294967295 默认值:0 parallel_memory_limit Global 并行执行可用的内存上限。当并行执行使用的内存量超过该值时,新的SQL查询将不会进行并行执行。 取值范围:0-4294967295 默认值:104857600 支持的状态变量如表2。 表2 状态变量 变量名 级别 描述 PQ_threads_running Global 当前正在运行的并行执行的总线程数。 PQ_memory_used Global 当前并行执行使用的总内存量。 PQ_threads_refused Global 由于总线程数限制,导致未能执行并行执行的查询总数。 PQ_memory_refused Global 由于总内存限制,导致未能执行并行执行的查询总数。
  • 使用示例 RANGE-RANGE类型的使用示例 CREATE TABLE tbl_range_range (col1 INT, col2 INT, col3 varchar(20)) PARTITION BY RANGE(col1) SUBPARTITION BY RANGE(col2) ( PARTITION p0 VALUES LESS THAN (1000) ( SUBPARTITION s0 VALUES LESS THAN(100), SUBPARTITION s1 VALUES LESS THAN(MAXVALUE) ), PARTITION p1 VALUES LESS THAN (2000) ( SUBPARTITION s2 VALUES LESS THAN(100), SUBPARTITION s3 VALUES LESS THAN(200) ), PARTITION p2 VALUES LESS THAN (MAXVALUE) ( SUBPARTITION s4 VALUES LESS THAN(200), SUBPARTITION s5 VALUES LESS THAN(400) ) ); RANGE COLUMNS-RANGE类型的使用示例 CREATE TABLE tbl_range_col_range (col1 INT, col2 INT, col3 INT) PARTITION BY RANGE COLUMNS(col1, col2) SUBPARTITION BY RANGE(col3) ( PARTITION p1 VALUES LESS THAN(1000, MAXVALUE)( SUBPARTITION s0 VALUES LESS THAN(100), SUBPARTITION s1 VALUES LESS THAN(MAXVALUE) ), PARTITION p2 VALUES LESS THAN(2000, MAXVALUE)( SUBPARTITION s2 VALUES LESS THAN(100), SUBPARTITION s3 VALUES LESS THAN(200) ), PARTITION p3 VALUES LESS THAN(MAXVALUE, MAXVALUE)( SUBPARTITION s4 VALUES LESS THAN(200), SUBPARTITION s5 VALUES LESS THAN(400) ) );
  • 语法 创建一个或多个RANGE-RANGE分区表,其中每个分区可能有一个或一个以上的RANGE类型的子分区。 CREATE TABLE ... PARTITION BY RANGE {(expr) | COLUMNS(column_list)} SUBPARTITION BY RANGE {(expr) | COLUMNS(column_list)} [(partition_definition [, partition_definition] ...)]; 其中,partition_definition为: PARTITION partition_name VALUES LESS THAN {(value | MAXVALUE | value_list) | MAXVALUE} [(subpartition_definition [, subpartition_definition] ...)] subpartition_definition为: SUBPARTITION subpartition_name VALUES LESS THAN {value | value_list | MAXVALUE} 表1 参数说明 参数名称 描述 expr 分区字段表达式。目前只支持INT类型,不支持字符类型。 column_list RANGE COLUMNS的情况下使用。分区字段列表,不支持表达式,可以支持多列。 value 分区边界值。 value_list RANGE COLUMNS的情况下使用,多个字段的边界值。 MAXVALUE 最大值。 partition_name 分区名称,同一个表中不可重复。 subpartition_name 子分区名称, 同一个表中不可重复。
  • 语法 创建一个或多个KEY-HASH分区表,其中每个分区可能有一个或一个以上的子分区。 CREATE TABLE [ schema. ]table_name table_definition PARTITION BY [LINEAR] KEY(expr) [PARTITIONS num] SUBPARTITION BY [LINEAR] HASH(expr) [SUBPARTITIONS sub_num] (partition_definition [, partition_definition] ...); 其中,partition_definition为: PARTITION partition_name (subpartition_definition [, subpartition_definition] ...) subpartition_definition为: SUBPARTITION subpartition_name 表1 参数说明 参数名称 描述 table_name 要创建的表名称。 expr 分区字段表达式,目前只支持INT类型,不支持字符类型。 partition_name 分区名称,同一个表中不可重复。 subpartition_name 子分区名称,同一个表中不可重复。
  • 语法 创建一个或多个LIST-RANGE分区表,其中每个分区可能有一个或一个以上的子分区。 CREATE TABLE [ schema. ]table_name table_definition PARTITION BY LIST {(expr) | COLUMNS(column_list)} SUBPARTITION BY RANGE {(expr) | COLUMNS(column_list)} (partition_definition [, partition_definition] ...); 其中,partition_definition为: PARTITION partition_name VALUES IN (value_list) (subpartition_definition [, subpartition_definition] ...) subpartition_definition为: SUBPARTITION subpartition_name VALUES LESS THAN {value | value_list | MAXVALUE} 表1 参数说明 参数名称 描述 expr 分区字段表达式。目前只支持INT类型,不支持字符类型。 column_list LIST COLUMNS的情况下使用,分区字段列表,不支持表达式。 value 分区边界值。 value_list LIST COLUMNS的情况下使用,多个字段的边界值。 MAXVALUE 最大值。 partition_name 分区名称,同一个表中不可重复。 subpartition_name 子分区名称, 同一个表中不可重复。
  • 使用示例 LIST-RANGE类型的使用示例 CREATE TABLE tbl_list_range ( col1 INT, col2 INT, col3 varchar(20), col4 DATE ) PARTITION BY LIST (col1) SUBPARTITION BY RANGE(col2) ( PARTITION p0 VALUES in (1, 2)( SUBPARTITION s0 VALUES LESS THAN(1000), SUBPARTITION s1 VALUES LESS THAN(2000) ), PARTITION p1 VALUES in (3, 4)( SUBPARTITION s2 VALUES LESS THAN(1000), SUBPARTITION s3 VALUES LESS THAN(MAXVALUE) ), PARTITION p2 VALUES in (5, 6)( SUBPARTITION s4 VALUES LESS THAN(3000), SUBPARTITION s5 VALUES LESS THAN(MAXVALUE) ) ); LIST COLUMNS-RANGE类型的使用示例 CREATE TABLE tbl_list_columns_range ( col1 INT, col2 INT, col3 varchar(20), col4 DATE ) PARTITION BY LIST COLUMNS(col3) SUBPARTITION BY RANGE(month(col4)) ( PARTITION europe VALUES in ('FRANCE', 'ITALY')( SUBPARTITION q1_2012 VALUES LESS THAN(4), SUBPARTITION q2_2012 VALUES LESS THAN(7) ), PARTITION asia VALUES in ('INDIA', 'PAKISTAN')( SUBPARTITION q1_2013 VALUES LESS THAN(4), SUBPARTITION q2_2013 VALUES LESS THAN(7) ), PARTITION americas VALUES in ('US', 'CANADA')( SUBPARTITION q1_2014 VALUES LESS THAN(4), SUBPARTITION q2_2014 VALUES LESS THAN(7) ) );
  • 语法 创建一个或多个HASH-LIST分区表,其中每个分区可能有一个或一个以上的子分区。 CREATE TABLE [ schema. ]table_name table_definition PARTITION BY [LINEAR] HASH(expr) SUBPARTITION BY LIST {(expr) | COLUMNS(column_list)} (partition_definition [, partition_definition] ...); 其中,partition_definition为: PARTITION partition_name (subpartition_definition [, subpartition_definition] ...) subpartition_definition为: SUBPARTITION subpartition_name VALUES IN (value_list) 表1 参数说明 参数名称 描述 table_name 要创建的表名称。 expr 分区字段表达式,目前只支持INT类型,不支持字符类型。 column_list LIST COLUMNS的情况下使用,分区字段列表,不支持表达式。 value_list LIST COLUMNS的情况下使用,多个字段的边界值。 partition_name 分区名称,同一个表中不可重复。 subpartition_name 子分区名称,同一个表中不可重复。
  • 使用示例 HASH-LIST类型的使用示例 CREATE TABLE tbl_hash_list ( col1 INT, col2 INT, col3 varchar(20), col4 DATE ) PARTITION BY HASH(col1) SUBPARTITION BY LIST(col2) ( PARTITION dp0 ( SUBPARTITION p0 VALUES in (1, 2), SUBPARTITION p1 VALUES in (3, 4), SUBPARTITION p2 VALUES in (5, 6) ), PARTITION dp1 ( SUBPARTITION p3 VALUES in (1, 2), SUBPARTITION p4 VALUES in (3, 4), SUBPARTITION p5 VALUES in (5, 6) ), PARTITION dp2 ( SUBPARTITION p6 VALUES in (1, 2), SUBPARTITION p7 VALUES in (3, 4), SUBPARTITION p8 VALUES in (5, 6) ) );
  • 性能测试 使用sysbench模型测试。 准备1000w数据。 sysbench /usr/share/sysbench/oltp_read_only.lua --tables=1 --report-interval=10 --table-size=10000000 --mysql-user=root --mysql-password=123456 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-db=sbtest --time=300 --max-requests=0 --threads=200 prepare 查询带1万个IN。 select count(*) from sbtest1 where id/k in (... ...); 性能对比如下表所示: 表1 性能数据 测试方法 开启转换 关闭转换(不适用range_opt) 性能对比 带索引 0.09 2.48 提升26.5倍 父主题: IN谓词转子查询
  • 开启DDL快速超时 表1 参数说明 参数名称 级别 描述 rds_ddl_lock_wait_timeout Global,Session 控制当前会话或者全局的DDL超时时间。 时间单位为秒,范围为1秒到31536000,默认值为31536000,相当于不开启。 对于DDL的等锁超时,其真实超时时间是lock_wait_timeout和rds_ddl_lock_wait_timeout的最小值。 对于DDL过程中InnoDB层的加表锁超时(行锁不在该考虑范围),其真实超时时间是innodb_lock_wait_timeout和rds_ddl_lock_wait_timeout)的最小值。
  • 使用示例 首先开启一个客户端,执行加锁操作,示例如下。 图1 加锁操作 通过如下命令,查看DDL快速超时功能的状态。 show variables like "%rds_ddl_lock_wait_timeout%"; 图2 查看状态 如上图所示,查询到“rds_ddl_lock_wait_timeout”的值是“31536000”,此时是默认值,相当于不开启DDL快速超时功能。如果此时等锁,就会卡在这里。 如果需要开启DDL快速超时功能,可以将这个值设置为预期值,操作请参考3。 设置参数。 执行如下命令,设置“rds_ddl_lock_wait_timeout”参数值。 set rds_ddl_lock_wait_timeout=1; 图3 设置参数 然后执行如下创建索引命令,发现DDL操作会快速超时失败,符合预期。 alter table lzk.t_lzk drop index indexa; 图4 执行创建索引命令
  • 语法 创建一个或多个HASH-RANGE分区表,其中每个分区可能有一个或一个以上的子分区。 CREATE TABLE [ schema. ]table_name table_definition PARTITION BY [LINEAR] HASH(expr) SUBPARTITION BY RANGE {(expr) | COLUMNS(column_list)} (partition_definition [, partition_definition] ...); 其中,partition_definition为: PARTITION partition_name (subpartition_definition [, subpartition_definition] ...) 其中,subpartition_definition为: SUBPARTITION subpartition_name VALUES LESS THAN {value | valuse_list | MAXVALUE} 表1 参数说明 参数名称 描述 table_name 要创建的表名称。 expr 分区字段表达式,目前只支持INT类型,不支持字符类型。 column_list LIST COLUMNS的情况下使用,分区字段列表,不支持表达式。 value 分区边界值。 value_list LIST COLUMNS的情况下使用,多个字段的边界值。 MAXVALUE 最大值。 partition_name subpartition_name 分区名称,同一个表中不可重复。 子分区名称,同一个表中不可重复。
  • 使用示例 HASH-RANGE类型的使用示例 CREATE TABLE tbl_hash_range ( col1 INT, col2 INT, col3 varchar(20), col4 DATE ) PARTITION BY HASH(col1) SUBPARTITION BY RANGE(col2) ( PARTITION p0 ( SUBPARTITION s0 VALUES LESS THAN(4), SUBPARTITION s1 VALUES LESS THAN(7), SUBPARTITION s2 VALUES LESS THAN(10), SUBPARTITION s3 VALUES LESS THAN(13) ), PARTITION p1 ( SUBPARTITION s4 VALUES LESS THAN(4), SUBPARTITION s5 VALUES LESS THAN(7), SUBPARTITION s6 VALUES LESS THAN(10), SUBPARTITION s7 VALUES LESS THAN(13) ), PARTITION p2 ( SUBPARTITION s8 VALUES LESS THAN(4), SUBPARTITION s9 VALUES LESS THAN(7), SUBPARTITION s10 VALUES LESS THAN(10), SUBPARTITION s11 VALUES LESS THAN(13) ) );
  • 语法 创建一个或多个KEY-KEY分区表,其中每个分区可能有一个或一个以上的子分区。 CREATE TABLE [ schema. ]table_name table_definition PARTITION BY [LINEAR] KEY(expr) [PARTITIONS num] SUBPARTITION BY [LINEAR] KEY(expr) [SUBPARTITIONS sub_num] (partition_definition [, partition_definition] ...); 其中,partition_definition为: PARTITION partition_name (subpartition_definition [, subpartition_definition] ...) subpartition_definition为: SUBPARTITION subpartition_name 表1 参数说明 参数名称 描述 table_name 要创建的表名称。 expr 分区字段表达式,目前只支持INT类型,不支持字符类型。 partition_name 分区名称,同一个表中不可重复。 subpartition_name 子分区名称,同一个表中不可重复。
  • 语法 创建一个或多个LIST-LIST分区表,其中每个分区可能有一个或一个以上的子分区。 CREATE TABLE [ schema. ]table_name table_definition PARTITION BY LIST {(expr) | COLUMNS(column_list)} SUBPARTITION BY LIST {(expr) | COLUMNS(column_list)} (partition_definition [, partition_definition] ...); 其中,partition_definition为: PARTITION partition_name VALUES IN (value_list) (subpartition_definition [, subpartition_definition] ...) subpartition_definition为: SUBPARTITION subpartition_name VALUES IN (value_list) 表1 参数说明 参数名称 描述 table_name 要创建的表名称。 expr 分区字段表达式,目前只支持INT类型,不支持字符类型。 column_list LIST COLUMNS的情况下使用,分区字段列表,不支持表达式。 value_list LIST COLUMNS的情况下使用,多个字段的边界值。 partition_name 分区名称,同一个表中不可重复。 subpartition_name 子分区名称, 同一个表中不可重复。
  • 使用示例 LIST-LIST类型的使用示例 CREATE TABLE tbl_list_list ( col1 INT, col2 INT, col3 varchar(20), col4 DATE ) PARTITION BY LIST (col1) SUBPARTITION BY LIST (col2) ( PARTITION p0 VALUES in (1, 2)( SUBPARTITION partno0 VALUES in (1, 2), SUBPARTITION partno1 VALUES in (3, 4), SUBPARTITION partno2 VALUES in (5, 6) ), PARTITION p1 VALUES in (3, 4)( SUBPARTITION partno3 VALUES in (1, 2), SUBPARTITION partno4 VALUES in (3, 4), SUBPARTITION partno5 VALUES in (5, 6) ), PARTITION p2 VALUES in (5, 6)( SUBPARTITION partno6 VALUES in (1, 2), SUBPARTITION partno7 VALUES in (3, 4), SUBPARTITION partno8 VALUES in (5, 6) ) ); LIST COLUMNS-LIST类型的使用示例 CREATE TABLE tbl_list_columns_list ( col1 INT, col2 INT, col3 varchar(20), col4 DATE ) PARTITION BY LIST COLUMNS(col3) SUBPARTITION BY LIST (col1) ( PARTITION europe VALUES in ('FRANCE', 'ITALY')( SUBPARTITION p0 VALUES in (1, 2), SUBPARTITION p1 VALUES in (3, 4), SUBPARTITION p2 VALUES in (5, 6) ), PARTITION asia VALUES in ('INDIA', 'PAKISTAN')( SUBPARTITION p3 VALUES in (1, 2), SUBPARTITION p4 VALUES in (3, 4), SUBPARTITION p5 VALUES in (5, 6) ), PARTITION americas VALUES in ('US', 'CANADA')( SUBPARTITION p6 VALUES in (1, 2), SUBPARTITION p7 VALUES in (3, 4), SUBPARTITION p8 VALUES in (5, 6) ) );
共100000条