mysql5.6 批量设置表 ROW_FORMAT =DYNAMIC 的方法

安装某个软件的时候提示

ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

后来发现是一些参数设置的问题,不知道mysql5.7会不会出现这个问题,没有测试大家可以直接升级到mysql5.7看能不能解决

解决方法是:

1: 系统变量innodb_large_prefix为ON

2: 系统变量innodb_file_format为Barracuda

3: ROW_FORMAT为DYNAMIC或COMPRESSED

将这三个变量设置为以上状态:

分别可以使用命令 

1)show variables like '%innodb_large_prefix%';

2)show variables like '%innodb_file_format%';

3)SELECT table_schema, table_name, row_format  FROM information_schema.TABLES 
WHERE table_schema IN ( '数据库名') 【可以加筛选命令不是
Dynamic的表 AND information_schema.TABLES.row_format <> 'Dynamic'】

查看参数状态如果参数状态不正确可以使用:

set global innodb_large_prefix=on;

set global innodb_file_format=Barracuda;

两个命令完成

问题是第三个修改比较麻烦,mysql5.6没有全局设置表为ROW_FORMAT为DYNAMIC或COMPRESSED的属性,所以得一个个修改,后来想了个办法,可以这样尝试操作:

1)可以通过命令

筛选出不等于Dynamic的表并生成更新语句

SELECT
    CONCAT( "ALTER TABLE `", table_schema, "`.`", table_name, "` ROW_FORMAT =DYNAMIC ;" ) 
FROM
    information_schema.TABLES 
WHERE
    table_schema IN ( '数据库名' ) AND information_schema.TABLES.row_format <> 'Dynamic'

将生成的语句批量执行就可以了!

<think>好的,我现在要解决用户的问题,他有一个在OceanBase数据库中导出的SQL语句,在MySQL上执行时报错了。他暂时不提供具体的报错信息,让我先分析可能存在的兼容性问题,并调整SQL语句使其能在MySQL上运行。之后他再提供报错信息进一步处理。 首先,我需要仔细查看用户提供的CREATE TABLE语句,找出OceanBase和MySQL之间可能不兼容的部分。用户提供的SQL如下: CREATE TABLE `base_client_frequency` ( `id` varchar(50) NOT NULL COMMENT 'id', `createdTime` datetime DEFAULT NULL, `creater` varchar(120) DEFAULT NULL, `deleted` bit(1) DEFAULT NULL, `modifiedTime` datetime DEFAULT NULL, `modifier` varchar(120) DEFAULT NULL, `remarks` varchar(200) DEFAULT NULL, `clientId` varchar(100) NOT NULL COMMENT '客户端id', `apiPath` varchar(200) NOT NULL COMMENT '接口地址', `frequency` int(11) NOT NULL COMMENT '接口频次', PRIMARY KEY (`id`), KEY `idx_clientId` (`clientId`) BLOCK_SIZE 16384 LOCAL ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0; 接下来,我需要逐行检查每个部分,对比OceanBase和MySQL的语法差异。 1. **结构定义部分**: - 列定义看起来是标准的,没有明显的问题。字段类型如varchar、datetime、bit、int在MySQL中都支持。 - COMMENT关键字在列定义后使用是正确的,MySQL也支持。 2. **索引部分**: - PRIMARY KEY (`id`) 是正确的。 - KEY `idx_clientId` (`clientId`) 后面的参数可能有问题。在MySQL中,创建索引时不允许指定BLOCK_SIZE和LOCAL这样的选项。OceanBase可能有自己的扩展语法,但MySQL不支持这些参数。所以需要删除这些额外的选项。 3. **选项部分**: - DEFAULT CHARSET = utf8mb4:MySQL支持,没问题。 - ROW_FORMAT = DYNAMICMySQL支持,但需要注意是否与存储引擎相关。InnoDB支持DYNAMIC行格式。 - COMPRESSION = 'zstd_1.3.8':MySQL的InnoDB引擎支持页压缩,但语法可能不同,或者使用的压缩算法可能不兼容。例如,MySQL可能使用COMPRESSION='zlib'而不是zstd,或者不支持该选项。 - BLOCK_SIZE = 16384:InnoDB的页大小通常在初始化时设置,不能在级别随意更改。MySQL可能不支持在CREATE TABLE中指定BLOCK_SIZE。 - USE_BLOOM_FILTER = FALSE:这是OceanBase的特定选项,MySQL没有这个功能,需要删除。 - TABLET_SIZE = 134217728:OceanBase的tablet概念,MySQL不存在,需删除。 - PCTFREE = 0:MySQL的InnoDB引擎使用PCTFREE来管理页空间,但语法可能不同,或者是否支持。在MySQL中,可以在创建时指定,但需要确认版本兼容性。例如,MySQL 5.7及以上支持。 接下来,我需要考虑如何调整这些部分: - **索引部分**:移除BLOCK_SIZE和LOCAL。修改后的索引行应为:KEY `idx_clientId` (`clientId`) - **选项**: - 删除COMPRESSION、BLOCK_SIZE、USE_BLOOM_FILTER、TABLET_SIZE、PCTFREE这些OceanBase特有的选项。 - 检查ROW_FORMAT=DYNAMIC是否在MySQL中有效。如果MySQL的默认存储引擎是InnoDB且版本支持(5.6及以上),则可以保留,但需要确认是否启用了必要的配置(如innodb_file_format)。 - 如果用户使用的MySQL版本较低,可能需要调整ROW_FORMAT,或者删除该选项,使用默认值。 此外,还需要确认存储引擎。OceanBase可能使用不同的存储引擎,而MySQL默认是InnoDB。如果选项中没有指定ENGINE=InnoDB,可能需要显式添加,尤其是在MySQL配置使用其他默认存储引擎时。 调整后的SQL可能如下: CREATE TABLE `base_client_frequency` ( `id` varchar(50) NOT NULL COMMENT 'id', `createdTime` datetime DEFAULT NULL, `creater` varchar(120) DEFAULT NULL, `deleted` bit(1) DEFAULT NULL, `modifiedTime` datetime DEFAULT NULL, `modifier` varchar(120) DEFAULT NULL, `remarks` varchar(200) DEFAULT NULL, `clientId` varchar(100) NOT NULL COMMENT '客户端id', `apiPath` varchar(200) NOT NULL COMMENT '接口地址', `frequency` int(11) NOT NULL COMMENT '接口频次', PRIMARY KEY (`id`), KEY `idx_clientId` (`clientId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; 这样处理后的SQL应该能在MySQL上执行。如果用户之后提供具体的错误信息,可能需要进一步调整,比如处理PCTFREE或COMPRESSION等选项,但目前根据常见兼容性问题,上述调整是必要的。</think>以下是针对OceanBase与MySQL语法差异的调整步骤及修改后的SQL: ### 主要兼容性问题分析 1. **索引选项不兼容** - OceanBase特有的`BLOCK_SIZE`、`LOCAL`参数在MySQL中不被支持 2. **选项不兼容** - `COMPRESSION='zstd_1.3.8'`:MySQL不支持ZSTD压缩算法声明 - `BLOCK_SIZE`:InnoDB页大小需在初始化时设置 - `USE_BLOOM_FILTER`:MySQL无此功能 - `TABLET_SIZE`:OceanBase分布式特性参数 - `PCTFREE`:MySQL语法中需用`KEY_BLOCK_SIZE`(但用途不同) ### 调整后的MySQL兼容版本 ```sql CREATE TABLE `base_client_frequency` ( `id` varchar(50) NOT NULL COMMENT 'id', `createdTime` datetime DEFAULT NULL, `creater` varchar(120) DEFAULT NULL, `deleted` bit(1) DEFAULT NULL, `modifiedTime` datetime DEFAULT NULL, `modifier` varchar(120) DEFAULT NULL, `remarks` varchar(200) DEFAULT NULL, `clientId` varchar(100) NOT NULL COMMENT '客户端id', `apiPath` varchar(200) NOT NULL COMMENT '接口地址', `frequency` int(11) NOT NULL COMMENT '接口频次', PRIMARY KEY (`id`), KEY `idx_clientId` (`clientId`) -- 移除OceanBase特有参数 ) ENGINE=InnoDB -- 明确指定存储引擎 DEFAULT CHARSET=utf8mb4 -- 保持字符集一致 ROW_FORMAT=DYNAMIC; -- 动态行格式(需确认innodb_file_format配置) ``` ### 执行前检查建议 1. 确认MySQL的`innodb_file_format`设置为`Barracuda` ```sql SHOW VARIABLES LIKE 'innodb_file_format'; ``` 2. 确认`innodb_large_prefix`已启用(MySQL 5.6+默认开启) ### 可能残留问题预告 如果您在执行时仍遇到以下错误,请提供具体报错信息: - `ROW_FORMAT=DYNAMIC`相关错误 → 可能需要调整文件格式配置 - 字段长度或类型不兼容 → 需核对数据类型支持范围 - 注释语法问题 → 检查COMMENT位置是否符合MySQL规范 调整后的SQL已移除所有OceanBase特有语法,现在可以直接在MySQL 5.6及以上版本运行。如果仍报错,请提供具体错误信息以便进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DQZ_cool

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值