昨天晚上做完把mysql从DB01复制到DB02之前做数据库迁移时出现一个问题,innodb某个数据库里的某个表损坏了,导致数据库每隔一段时间自动重启,估计是读到那个坏表所致。昨天的数据库复制也是使用把mysql所有文件拷贝过去这种方法,而不是用mysqldump所有数据库到sql文件,在新服务器上安装新mysql,再把sql文件导入的正常流程。拷贝mysql比正常流程要节省好多时间,但是这种方法不太安全,因此我需要对所有的表进行扫描一次。我没有新服务器的ssh帐号,因此只能用mysql帐号。我检查的过程如下1.获取所有表名select TABLE_SCHEMA,TABLE_NAME from information_schema.TABLES;导出到excel2.构建测试sql语句测试表是否损坏需要做到1.必须扫描全表,所以不能用索引。2.由于表名是动态,每个表的列不一样,所以必须用*查所有列3.由于表是动态,所以不能加where条件因此我写了一条通用的语句select SQL_CALC_FOUND_ROWS * from test_db.test_tb where 1=1 limit 1;如下图所示,这条语句没有用索引而且是全表查询(SQL_CALC_FOUND_ROWS)3.产生批量测试SQL用excel公式:=CONCATENATE("select SQL_CALC_FOUND_ROWS *"," from ",A70,".",B70," where 1=1 limit 1;")4.把这些SQL语句保存到sql文件中用mysql -uroot -ppassword test 执行在执行之前先登录mysql客户端若是中间出现失去连接情况,表示某个表有损坏5.我用这种方法发现了有个View有问题ERROR 1356 (HY000): View 'test.testabc' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them出现这种情况注意是数据库的ip变了,这个得重新创建viewend