mysql通过frm文件查找表结构定义

1:在新安装的mysql数据库上做实验
创建一个表名相同的表,字段可以随意。

mysql> use resdb;
Database changed
mysql> create table t_wlkj_user_inf(id int);
Query OK, 0 rows affected (0.03 sec)

2、关闭mysql

service mysql stop

3、由于我安装的mysql指定了data-dir为/usr/local/mysql/data/mysql,故在该目录会有一个数据库命名的resdb目录,在resdb目录存放 t_wlkj_user_inf.frm 和t_wlkj_user_inf.ibd两个文件。

[root@localhost resdb]# pwd
/usr/local/mysql/data/mysql/resdb
[root@localhost resdb]# ls
db.opt  t_wlkj_user_inf.frm  t_wlkj_user_inf.ibd

把我们的备份t_wlkj_user_inf.frm文件覆盖产生的t_wlkj_user_inf.frm

[root@localhost resdb]# cp /root/back_mysql/t_wlkj_user_inf.frm /usr/local/mysql/data/mysql/resdb/
cp:是否覆盖"/usr/local/mysql/data/mysql/resdb/t_wlkj_user_inf.frm"? y

开启mysql服务,使用use resdb的时候会报诸如

2018-01-09T08:19:46.170814Z 3 [Warning] InnoDB: Table resdb/t_wlkj_user_inf contains 1 user defined columns in InnoDB, but 16 columns in MySQL. Please check INFORMATION_SCHEMA.INNODB_SYS_COLUMNS 
的记录,发现原表拥有16个字段

找到表字段个数之后,删除掉原来随意一个字段的表,重新建立一个含16个字段的表

create table t_wlkj_user_inf(t1 int,t2 int,t3 int,t4 int,t5 int,t6 int,t7 int,t8 int,t9 intt,t11 int,t12 int,t13 int,t14 int,t15 int,t16 int);

4、在mysql所使用的my.cnf(可以在安装目录下的my.cnf修改,不需要修改/etc/my.cnf全局文件)
增加如下配置

innodb_force_recovery=6

然后重启mysql服务

service mysql restart

可以查看到表的结构信息。

mysql> desc t_wlkj_user_inf;
+-----------------+--------------+------+-----+---------+-------+
| Field           | Type         | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+-------+
| ID              | varchar(32)  | NO   | PRI | NULL    |       |
| USER_NAME       | varchar(60)  | YES  |     | NULL    |       |
| LOGIN_NAME      | varchar(30)  | YES  |     | NULL    |       |
| USER_NO         | varchar(30)  | YES  |     | NULL    |       |
| PWD             | varchar(50)  | YES  |     | NULL    |       |
| PASSWORD        | varchar(50)  | YES  |     | NULL    |       |
| DEPT_ID         | varchar(32)  | YES  | MUL | NULL    |       |
| ORDER_ID        | int(11)      | YES  |     | NULL    |       |
| REMARKS         | varchar(300) | YES  |     | NULL    |       |
| STATUS          | char(1)      | YES  |     | NULL    |       |
| DEL_FLAG        | char(1)      | YES  |     | NULL    |       |
| LAST_LOGIN_IP   | varchar(50)  | YES  |     | NULL    |       |
| LAST_LOGIN_TIME | varchar(19)  | YES  |     | NULL    |       |
| CREATE_TIME     | varchar(19)  | YES  |     | NULL    |       |
| MODIFY_TIME     | varchar(19)  | YES  |     | NULL    |       |
| TYPE            | char(1)      | NO   |     | 1       |       |
+-----------------+--------------+------+-----+---------+-------+
16 rows in set (0.00 sec)

弄完之后,记得删除innodb_force_recovery=6,或者注释,重启mysql服务。

你可能感兴趣的:(数据库,mysql)