1、由于磁盘爆满导致数据库宕机,将数据库服务器 mysql/data 文件夹中部分表的.ibd删除释放空间,导致数据库服务器无法重启,用service mysql restart 启动,如果能启动最好,不能启动报错 提示“ not updating without mysqld.pid ” 类似的报错,找解决方法无用。
2、数据回滚的时候,部分表的ibd无法回滚数据
找到my.cnf 文件,先将innodb_force_recovery 值设为 3,设置为放弃事务回滚。
innodb_force_recovery 值 具体区别详见下表
1. (SRV_FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页。
2. (SRV_FORCE_NO_BACKGROUND):阻止主线程的运行,如主线程需要执行full purge操作,会导致crash。
3. (SRV_FORCE_NO_TRX_UNDO):不执行事务回滚操作。
4. (SRV_FORCE_NO_IBUF_MERGE):不执行插入缓冲的合并操作。
5. (SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交。
6. (SRV_FORCE_NO_LOG_REDO):不执行前滚的操作。
3、设置为3可以启动起来
此时数据库只有查询操作,不能执行增删改(insert,update,delete)的操作
4、使用mysqldump -d参数将建表语句备份出来
5、恢复
(1)mysql开启安全路径
vim /etc/my.cnf --->添加以下配置
[mysqld]
secure-file-priv=/tmp
(1)创建和原来一模一样的库和表
(2)新表表空间脱离sql
select concat('alter table ',table_schema,'.',table_name,' discard tablespace;') from information_schema.tables where table_schema='qingchen' into outfile '/tmp/discard.sql';
(3)新表表空间重新加入sql
select concat('alter table ',table_schema,'.',table_name,' import tablespace;') from information_schema.tables where table_schema='qingchen' into outfile '/tmp/import.sql';
source /tmp/import.sql
(4)脱离表空间
source /tmp/discard.sql
#会将新表的ibd全部删掉
(5)将旧的ibd复制到新库目录下
(6)重新加入表空间
source /tmp/import.sql
##一次不要执行太多,如果单个表的数据量上G,最好单独执行加入表空间