问题描述:
登录mysql,show tables; 表都存在,但是select * from table时, 报表不存在错误:
mysql> select * from table;
ERROR 1146 (42S02): Table '*****' doesn't exist
原因:
有两种可能的原因:
-
对于使用innodb的数据库, 从别的地方复制一个数据库时,只拷贝了数据文件,没有拷贝以ib*开头的文件
-
mysql5.7 默认lower_case_table_names没有设置, 表示表名区分大小写。 在这种情况下创建的表, 如果之后将 lower_case_table_names 设置成 1, 重启mysql再去访问之前的表,就会报表不存在的错误。
解决方法:
-
对于第一种问题, 可以把mysql 数据文件root 目录下 以ib*开头的文件也拷贝过来,并且设置正确的文件属性和权限即可。
cp /source_mysql_root_path/ib* /var/lib/mysql/ib* chown mysql : mysql ib* chmod 640 ib*
-
对于第二种问题,可以把lower_case_table_names 值设置回去(删除 或 = 0), 重启数据库,即可恢复。如果还需要设置lower_case_table_names=1,并且保留原来表中数据,可以先将数据导出备份, 然后修改参数lower_case_table_names, 重启mysql后,删除原来数据库,新建数据库后将备份数据导入。