针对MYISAM存储引擎

基本方法:

1,repair

登录mysql客户端,使用内置命令repair修复

比如:

repair table t01;
+----------+--------+----------+----------+

| Table | Op   | Msg_type | Msg_text |
| ----- | ---- | -------- | -------- |
|       |      |          |          |

+----------+--------+----------+----------+

| test.t01 | repair | status | OK   |
| -------- | ------ | ------ | ---- |
|          |        |        |      |

+----------+--------+----------+----------+
1 row in set (0.00 sec)


如果表为INNODB引擎

repair table t01;
+----------+--------+----------+---------------------------------------------------------+
| Table    | Op     | Msg_type | Msg_text                                                |
+----------+--------+----------+---------------------------------------------------------+
| test.t01 | repair | note     | The storage engine for the table doesn't support repair |
+----------+--------+----------+---------------------------------------------------------+
1 row in set (0.00 sec)

支持选项:

QUIK:用在表没有被修改的情况下,速度最快

EXTENDED:尝试恢复每行数据,会产生垃圾数据行,非必要不使用

USE_FRM:在.myi文件受损或者丢失的情况下,利用.frm的定义重建索引

比如,如果t01.MYI文件丢失

check table t01;
+----------+-------+----------+---------------------------------------------------------------+
| Table    | Op    | Msg_type | Msg_text                                                      |
+----------+-------+----------+---------------------------------------------------------------+
| test.t01 | check | Error    | Can't find file: 't01' (errno: 2 - No such file or directory) |
| test.t01 | check | status   | Operation failed                                              |
+----------+-------+----------+---------------------------------------------------------------+
2 rows in set (0.00 sec)

尝试修复:

repair table t01;
+----------+--------+----------+---------------------------------------------------------------+
| Table    | Op     | Msg_type | Msg_text                                                      |
+----------+--------+----------+---------------------------------------------------------------+
| test.t01 | repair | Error    | Can't find file: 't01' (errno: 2 - No such file or directory) |
| test.t01 | repair | status   | Operation failed                                              |
+----------+--------+----------+---------------------------------------------------------------+
2 rows in set (0.00 sec)

使用USE_FRM选项再次尝试修复:

repair table t01 USE_FRM;
+----------+--------+----------+------------------------------------+
| Table    | Op     | Msg_type | Msg_text                           |
+----------+--------+----------+------------------------------------+
| test.t01 | repair | warning  | Number of rows changed from 0 to 4 |
| test.t01 | repair | status   | OK                                 |
+----------+--------+----------+------------------------------------+
2 rows in set (0.00 sec)

再次检查表:

mysql> check table t01;
+----------+-------+----------+----------+
| Table    | Op    | Msg_type | Msg_text |
+----------+-------+----------+----------+
| test.t01 | check | status   | OK       |
+----------+-------+----------+----------+
1 row in set (0.00 sec)

2,myqlcheck

在.MYI损坏或者丢失的情况下

mysqlcheck test -u root -p
Enter password: 
test.t01
Error    : Can't find file: 't01' (errno: 2 - No such file or directory)
status   : Operation failed

加上--use_frm参数

mysqlcheck -r test --use-frm -u root -p
Enter password: 
test.t01
warning  : Number of rows changed from 0 to 4
status   : OK

3,myisamchk

root@d9265735e7fd:/var/lib/mysql/test# myisamchk t01
Checking MyISAM file: t01
Data records:       4   Deleted blocks:       0
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1
- check record links
root@d9265735e7fd:/var/lib/mysql/test# myisamchk -r t01

- recovering (with sort) MyISAM-table 't01'
  Data records: 4
- Fixing index 1

选项:

-B/--backup:Make a backup of the .MYD file as 'filename-time.BAK'
--correct-checksum:Correct checksum information for table.
-e/--extend-check:尝试恢复每个数据行,会产生垃圾数据,非必要不用
-f/--force:覆盖掉同名.TMD文件
-k/--keys-used=#:加快速度
-o/--safe-recover:使用-r修复不了时,使用,会比较慢

针对innodb存储引擎

基本步骤:

1,修改配置文件,增加配置项

默认配置如下:

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
#log-error      = /var/log/mysql/error.log

# By default we only accept connections from localhost

#bind-address   = 127.0.0.1

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

增加一条

innodb_force_recovery = 1

2,转储表

重启mysql,转储表(如果不能转储,可尝试加大innodb_force_recovery,该值小于4被认为是安全的,否则会造成数据表的永久损坏)

mysql> select * into outfile '/var/lib/mysql-files/test.t01.sql'  from test.t01;
Query OK, 4 rows affected (0.00 sec)

转储文件需带上secure_file_priv变量所指定的路径,否则会无法转储

mysql> select * into outfile '/root/test.t01.sql'  from test.t01;
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
mysql> show variables like '%secure_file_priv%';
+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+
1 row in set (0.00 sec)

3,创建新表结构

create table t02 as select * from t01 where 1=2;

4,还原配置文件

将之前配置文件的添加项删除,或者注释,然后重启mysql

5,导入转储数据

mysql> load data infile '/var/lib/mysql-files/test.t01.sql' into table t02;
Query OK, 4 rows affected (0.00 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

6,删除旧表

drop table t01;

7,重命名新表名

rename table t02 to t01;