我们在使用mysql数据库的时候,有时会因为各种误操作而导致各种问题。下面介绍的导致1146报错的原因及解决方法。
由报错Table ‘xxx.xxxxx’ doesn’t exist可知,其中的mysql.proc表不存在而发生错误。
如此语句正确,则看下一条方法
解决方法如下:
<1>不正确请改正
如此表存在,则是linux的mysql区分大小写导致;如此表不存在,则看下一条方法
解决方法如下:
<1>查找该mysql数据库的配置文件my.cnf的路径
<2>在my.cnf中的[mysqld]下,追加lower_case_table_names = 1
1表示不区分大小写,0区分大小写
<3>重启mysql,重新在此表插入数据,看是否可用
systemctl restart maraidb/mysqld(centos7)
/etc/init.d/mysqld restart(centos6)
解决方法如下:
方法一:创建此表。(不同表结构根据实际情况)
例如:mysql.servers表的创建。
CREATE TABLE `mysql.servers` (
`Server_name` char(64) NOT NULL,
`Host` char(64) NOT NULL,`Db` char(64) NOT NULL,
`Username` char(64) NOT NULL,
`Password` char(64) NOT NULL,
`Port` int(4) DEFAULT NULL,
`Socket` char(64) DEFAULT NULL,
`Wrapper` char(64) NOT NULL,
`Owner` char(64) NOT NULL,
PRIMARY KEY (`Server_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='MySQL Foreign Servers table';
flush privileges;
方法二:修复损坏表
(修复方式还有很多种,请查询,只列一种)
repair table 表名;
方法三:拷贝缺失文件(最常用方法)
原理:
当表类型是MyISAM时,数据文件则以”Table.frm””Table.MYD””Table.MYI””三个文件存储于”/data/$databasename/”目录中。
当表类型是InnoDB时,数据文件则存储在”$innodb_data_home_dir/″中的ibdata1文件中(一般情况),结构文件存在于table_name.frm中。
MySQL的数据库文件直接复制便可以使用,但是那是指“MyISAM”类型的表。 而使用MySQL-Front直接创建表,默认是“InnoDB”类型,这种类型的一个表在磁盘上只对应一个“*.frm”文件,不像MyISAM那样还“*.MYD,*.MYI”文件。
MyISAM类型的表直接拷到另一个数据库就可以直接使用,但是InnoDB类型的表却不行。 解决方法就是同时拷贝innodb数据库表“*.frm”文件和innodb数据“ibdata1”文件到合适的位置。
<1>从另外相同的mysql数据库或之前的数据库备份中导出该表的数据,然后通过命令行导入进去
<2>或直接拷贝原有数据库文件".frm"、".MYD"、"*.MYI"等文件,如果原数据库引擎是InnoDB,切记还需拷贝ibdata1文件
(暴力点的是直接拷贝之前备份了的data)
<3>重启数据库
<1>重新编译
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
24
make && make install