1.破坏数据库
一般数据库的损耗是系统使用过程中无意被破坏的,这里破坏只是为了模拟数据库的修复思路。
删除分区表数据文件第一行,进行破坏。让数据库无法启动。
[root@mysql1 test]# sed -i '1d' itpux_rh1#P#p2014#SP#p2014sp0.ibd
[root@mysql1 test]#
2.重启数据库
[root@mysql1 binlog]# systemctl restart mysql
Job for mysql.service failed because the control process exited with error code.
See "systemctl status mysql.service" and "journalctl -xe" for details.
发现重启失败。我们查看后台的日志。
tail mysql3306.log
2023-02-11T07:13:15.968426Z 0 [ERROR] InnoDB: Tried to read 16384 bytes at offset 0, but was only able to read 0
2023-02-11T07:13:15.968434Z 0 [ERROR] InnoDB: File (unknown): 'read' returned OS error 0. Cannot continue operation
2023-02-11T07:13:15.968435Z 0 [ERROR] InnoDB: Cannot continue operation.
2023-02-11T07:13:20.968340Z 0 [Note] InnoDB: FTS optimize thread exiting.
2023-02-11T07:14:56.310313Z 0 [Warning] InnoDB: 3 threads created by InnoDB had not exited at shutdown!
读取数据失败。
3.加入参数强制启动
[root@mysql1 test]# cat /etc/my.cnf
[mysqld]
datadir=/mysql/mysql3306
socket=/mysql/mysql3306.sock
default-time-zone= '+8:00'
symbolic-links=0
user=mysql
server_id=1311
expire_logs_days = 7
log_bin=/mysql/data/binlog/mysql-binlog
log_bin_index=/mysql/data/binlog/mysql-binlog.index
binlog_format=row
binlog_rows_query_log_events=on
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates = 1
binlog_gtid_simple_recovery=1
secure_file_priv=/mysql/backup
innodb_force_recovery = 1 --这个参数。
[mysqld_safe]
log-error=/mysql/mysql3306.log
pid-file=/mysql/mysql3306.pid
经过测试发现:
innodb_force_recovery = 1 /2/3 均未能启动数据库。
innodb_force_recovery=4 成功启动数据库。
systemctl start mysql
5.验证数据。
发现这个表不存在。
mysql> select * from itpux_rh1;
ERROR 1146 (42S02): Table 'test.itpux_rh1' doesn''t exist
[root@mysql1 test]# ll
total 1096
-rw-r-----. 1 mysql mysql 65 Aug 23 21:44 db.opt
-rw-r-----. 1 mysql mysql 8892 Feb 11 15:11 itpux_rh1.frm
-rw-r-----. 1 mysql mysql 0 Feb 11 15:13 itpux_rh1#P#p2014#SP#p2014sp0.ibd --发现这个文件变空。
-rw-r-----. 1 mysql mysql 98304 Feb 3 18:15 itpux_rh1#P#p2014#SP#p2014sp1.ibd
-rw-r-----. 1 mysql mysql 98304 Feb 3 18:15 itpux_rh1#P#p2015#SP#p2015sp0.ibd
-rw-r-----. 1 mysql mysql 98304 Feb 3 18:15 itpux_rh1#P#p2015#SP#p2015sp1.ibd
-rw-r-----. 1 mysql mysql 98304 Feb 3 18:15 itpux_rh1#P#p2016#SP#p2016sp0.ibd
-rw-r-----. 1 mysql mysql 98304 Feb 3 18:15 itpux_rh1#P#p2016#SP#p2016sp1.ibd
-rw-r-----. 1 mysql mysql 98304 Feb 3 18:15 itpux_rh1#P#p2017#SP#p2017sp0.ibd
-rw-r-----. 1 mysql mysql 98304 Feb 3 18:23 itpux_rh1#P#p2017#SP#p2017sp1.ibd
-rw-r-----. 1 mysql mysql 98304 Feb 3 18:19 itpux_rh1#P#p2018#SP#p2018sp0.ibd
-rw-r-----. 1 mysql mysql 98304 Feb 3 18:22 itpux_rh1#P#p2018#SP#p2018sp1.ibd
6.innodb_force_recovery=4
阻止插入缓冲区合并操作。如果它们会导致崩溃,则不会这样做。不计算表 统计信息。此值可
能会永久损坏数据文件。使用此值后,请准备删除并重新创建所有二级索引。设置 InnoDB为只读。
7.删除损耗的表。
drop table itpux_rh1;
如果有备份,则需要从备份中恢复。