昨天晚上做完把mysql从DB01复制到DB02
之前做数据库迁移时出现一个问题,innodb某个数据库里的某个表损坏了,导致数据库每隔一段时间自动重启,估计是读到那个坏表所致。
昨天的数据库复制也是使用把mysql所有文件拷贝过去这种方法,而不是用mysqldump所有数据库到sql文件,在新服务器上安装新mysql,再把sql文件导入的正常流程。
拷贝mysql比正常流程要节省好多时间,但是这种方法不太安全,因此我需要对所有的表进行扫描一次。
我没有新服务器的ssh帐号,因此只能用mysql帐号。
我检查的过程如下
1.获取所有表名
- select TABLE_SCHEMA,TABLE_NAME from information_schema.TABLES;
导出到excel
2.构建测试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 < test.sql
执行
在执行之前先登录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变了,这个得重新创建view
end
阅读(1698) | 评论(0) | 转发(0) |