一、背景:
开发人员通过MySQL客户端工具,可以访问MySQL5.7.6,可以访问具体的DB,可以查看小写表的数据,但是无法查看大写表的数据,报错信息为“table does not exist”。
二、检查与分析:
ssh登录MySQL数据库Linux主机,使用命令行工具,本地访问MySQL,也出现“table does not exist”问题,检查数据库参数lower_case_table_names=1
检查MySQL官方文档,查看参数描述与默认值等信息。
Command-Line Format | --lower-case-table-names[=#] |
---|---|
System Variable | lower_case_table_names |
Scope | Global |
Dynamic | No |
Type | Integer |
Default Value (macOS) | 2 |
Default Value (Unix) | 0 |
Default Value (Windows) | 1 |
Minimum Value | 0 |
Maximum Value | 2 |
If set to 0, table names are stored as specified and comparisons are case-sensitive. If set to 1, table names are stored in lowercase on disk and comparisons are not case-sensitive.If set to 2, table names are stored as given but compared in lowercase. This option also applies to database names and table aliases. For additional details, see Section 9.2.3, “Identifier Case Sensitivity”.
发现lower_case_table_names参数被修改,数据库只能识别小写,所以开发人员的大写表does not exist,但是表结构依然存在于MySQL中。
三、解决办法:
解决方法1:表结构替换
1)在异机上新建库、新建表,创建相同名称的大表,字段数量没有限制,可以只有一个字段id
create table TTT1(id int primary key);
2)将问题库中的TTT1.frm文件替换异机上新建的TTT1.frm文件。
3)重启MySQL服务。
4)查看表结构show create table TTT1
5)如果提示表的字段数据不一致,则考虑创建相同字段数量的表TTT1
6)可能需要设置innodb_force_recovery=6并重启mysql
解决方法2:使用mysql utilities工具解析frm文件
1)下载并安装mysql utilities
2)可能还需要下载并安装mysql-connector-python
3)在Linux主机上安装以上两个rpm包
rpm -ivh mysql-utilities-1.6.5-1.el7.noarch.rpm mysql-connector-python-2.1.7-1.el7.x86_64.rpm
4)查看mysql-utilities工具包
rpm -qa|grep mysql-utilities
rpm -ql mysql-utilities-1.6.5-1.el7.noarch
which mysqlfrm
确认mysqlfrm工具已安装
5)mysqlfrm使用帮助
man mysqlfrm
mysqlfrm --help
四、具体操作:
frm文件解析,可以使用--diagnostic参数
mysqlfrm --diagnostic TTT1.frm
五、结论:
如果只需要表结构,则可以考虑使用mysql utilities工具提供的mysqlfrm解析frm文件。
如果需要数据,则考虑将数据库参数lower_case_table_names修改为默认值。原则上,MySQL创建完成后,不允许修改lower_case_table_names参数值。