1.1 常见问题
1.Slave I/O: error connecting to master ‘[email protected]:3306‘-retry-time: 60 retries: 86400,Error_code:1045
解决方法:
从服务器上删除掉所有的二进制日志文件,包括一个数据目录下的master.info文件和hostname-relay-bin开头的文件。
master.info::记录了Mysql主服务器上的日志文件和记录位置、连接的密码。
2. Errorreading packet from server: File ‘/home/mysql/mysqlLog/log.000001‘ not found(Errcode: 2) ( server_errno=29)
解决方法:
由于主服务器运行了一段时间,产生了二进制文件,而slave是从log.000001开始读取的,删除主机二进制文件,包括log.index文件。
3.Slave SQL: Error ‘Table ‘xxxx‘ doesn‘t exist‘ on query.Default database: ‘t591‘.Query: ‘INSERT INTO `xxxx`(type,post_id,browsenum)
SELECT type,post_id,browsenum FROM xxxx WHEREhitdate=‘20090209‘‘, Error_code: 1146
解决方法:
由于slave没有此table表,添加这个表,使用slave start 就可以继续同步。
4.Error ‘Duplicate entry ‘1‘ for key 1‘ on query. Default database: ‘movivi1‘. Query:‘INSERT INTO `v1vid0_user_samename`
VALUES(null,1,‘123‘,‘11‘,‘4545‘,‘123‘)‘
Error ‘You have an error in your SQL syntax; check themanual that corresponds to your MySQL server version for the right syntax
to use near ‘?‘ at line 1‘ on query. Default database:‘club‘. Query: ‘INSERT INTO club.point_process ( GIVEID, GETID, POINT,CREATETIME, DEMO )
VALUES(0,4971112, 5,‘2010-12-19 16:29:28‘,?‘
1 row in set (0.00 sec)
Mysql> Slave status\G;
显示:Slave_SQL_Running 为 NO
解决方法:
Mysql > stop slave;
Mysql > set global sql_slave_skip_counter =1 ;
Mysql > start slave;
5. show slavestatus\G;
Master_Log_File: mysql-bin.000029
Read_Master_Log_Pos: 3154083
Relay_Log_File: c7-relay-bin.000178
Relay_Log_Pos: 633
Relay_Master_Log_File: mysql-bin.000025
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB: club
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1594
Last_Error: Relay log read failure: Could not parse relaylog event entry. The possible reasons are:
the master‘s binary log is corrupted (you can check thisby running ‘mysqlbinlog‘ on the binary log),
the slave‘s relay log is corrupted (you can check this byrunning ‘mysqlbinlog‘ on the relay log),
a network problem, or a bug in the master‘s or slave‘sMySQL code. If you want to check the master‘s
binary log or slave‘s relay log, you will be ableto know their names by issuing ‘SHOW SLAVE STATUS‘ on this slave.
Skip_Counter: 0
Exec_Master_Log_Pos: 1010663436
这个问题原因是,主数据库突然停止或问题终止,更改了mysql-bin.xxx日志,slave服务器找不到这个文件,需要找到同步的点和日志文件,然后chage master即可。
解决方法:
change master to
master_host=‘IP‘,
master_user=‘同步帐号‘,
master_password=‘同步密码‘,
master_port=3306,
master_log_file=‘mysql-bin.000025‘,
master_log_pos=1010663436;
6.Error‘Unknown column ‘qdir‘ in ‘fieldlist‘‘on query. Default database: ‘club‘. Query: ‘insert into club.question_del(id, pid,
ques_name, givepoint, title, subject, subject_pid,createtime, approve, did, status, intime, order_d, endtime,banzhu_uid,
banzhu_uname,del_cause,qdir) select id, pid, ques_name,givepoint, title, subject, subject_pid, createtime, approve, did,
status, intime, order_d, endtime,‘1521859‘,‘admin0523‘,‘无意义回复‘,qdir from club.question where id=7330212‘
1 row in set (0.00 sec)
解决方案:
这个错误就说club.question_del 表里面没有qdir这个字段造成的加上就可以了~!
在主的mysql : 里面查询 Descclub.question_del;
在错误的从服务器上执行 : alter table question_del add qdirvarchar(30) not null;
7、Can‘t connect to MySQL server on ‘localhost‘ (10061)
翻译:不能连接到 localhost 上的mysql
分析:这说明“localhost”计算机是存在的,但在这台机器上却没提供MySQL服务。
需要启动这台机器上的MySQL服务,如果机子负载太高没空相应请求也会产生这个错误。
解决方案:既然没有启动那就去启动这台机子的mysql。如果启动不成功,多数是因为你的my.ini配置的有问题。重新配置其即可。
如果觉得mysql负载异常,可以到mysql/bin 的目录下执行mysqladmin -uroot -p123 processlist来查看mysql当前的进程。
8、Unknown MySQL Server Host ‘localhosadst‘ (11001)
翻译:未知的MySQL服务器 localhosadst
分析:服务器 localhosasdst 不存在。或者根本无法连接
解决方案:仔细检查自己论坛下面的 ./config.inc.php 找到$dbhost重新设置为正确的mysql 服务器地址。
9、Access denied for user: ‘[email protected]‘ (Usingpassword: YES)
翻译:用户 roota 访问 localhost 被拒绝(没有允许通过)
分析:造成这个错误一般数据库用户名和密码相对mysql服务器不正确
解决方案:仔细检查自己论坛下面的 ./config.inc.php 找到$dbuser、$dbpw核实后重新设置保存即可。
10、Access denied for user: ‘[email protected]‘ to database‘newbbs‘
翻译:用户 red 在localhost 服务器上没有权限操作数据库newbbs
分析:这个提示和问题三是不同的。那个是在连接数据库的时候就被阻止了,而这个错误是在对数据库进行操作时引起的。比如在select update等等。这个是因为该用户没有操作数据库相应的权力。比如select这个操作在mysql.user.Select_priv里记录Y 可以操作N 不可以操作。
解决方案:如果是自己的独立主机那么更新mysql.user 的相应用户记录,比如这里要更新的用户为red 。或者直接修改 ./config.inc.php 为其配置一个具有对数据库操作权限的用户
或者通过如下的命令来更新授权grant all privileges on dbname.* to‘user‘@‘localhost‘ identified by ‘password’
提示:更新了mysql库中的记录一定要重启mysql服务器才能使更新生效
FLUSH PRIVILEGES;
11、No Database Selected
翻译:没有数据库被选择上
分析:产生的原因有两种
config.inc.php 里面$dbname设置的不对。致使数据库根本不存在,所以在 $db->select_db($dbname); 时返回了false
和上面问题四是一样的,数据库用户没有select权限,同样会导致这样的错误。当你发现config.inc.php的设置没有任何问题,但还是提示这个错误,那一定就是这种情况了。
解决方案:对症下药
打开config.inc.php 找到$dbname核实重新配置并保存
同问题四的解决方法
12、Can‘t open file: ‘xxx_forums.MYI‘. (errno: 145)
翻译:不能打开xxx_forums.MYI
问题分析:
这种情况是不能打开 cdb_forums.MYI 造成的,引起这种情况可能的原因有:
1、服务器非正常关机,数据库所在空间已满,或一些其它未知的原因,对数据库表造成了损坏。
2、类 unix 操作系统下直接将数据库文件拷贝移动会因为文件的属组问题而产生这个错误。
解决方法:
1、修复数据表
可以使用下面的两种方式修复数据表:(第一种方法仅适合独立主机用户)
1)使用 myisamchk ,MySQL 自带了专门用户数据表检查和修复的工具 —— myisamchk 。更改当前目录到 MySQL/bin 下面,一般情况下只有在这个下面才能运行 myisamchk 命令。常用的修复命令为:myisamchk -r 数据文件目录/数据表名.MYI;
2)通过 phpMyAdmin 修复, phpMyAdmin 带有修复数据表的功能,进入到某一个表中后,点击“操作”,在下方的“表维护”中点击“修复表”即可。
注意:以上两种修复方式在执行前一定要备份数据库。
2、修改文件的属组(仅适合独立主机用户)
1)复制数据库文件的过程中没有将数据库文件设置为 MySQL 运行的帐号可读写(一般适用于 Linux 和 FreeBSD 用户)。
13、Table ‘test.xxx_sessions‘ doesn‘t exist
翻译:xxxxx表不存在
分析:在执行sql语句时没有找到表,比如:SELECT *FROM xxx_members WHERE uid=’XX’ 这里如果表xxx_members不存在于$dbname库里,那么就会提示这个错误。具体可分为以下三种情况来讨论:
安装插件或者hack时修改了程序文件,而忘记了对数据库作相应的升级。
后台使用了不完全备份,导入数据时没有导入到已经安装了相应版本的论坛的数据库中。
解决方案: 同样对症下药,不同的原因不同的处理方法。
仔细对照插件作者提供的安装说明,把遗漏的对数据库的操作补上,如果仍然不能解决问题,那么应该怀疑该插件的可用性了。去咨询一下插件作者,或者将其卸载。
不要张冠李戴,多大的脚就穿多大的鞋。总之使得程序文件和数据库配套即可.
14、Unknown column ‘column_name‘ in ‘field list‘
翻译:未知的字段名 column_name
分析:在执行sql语句是出现了指定表中没有的字段名称,就会出现这个错误。具体导致的原因可分为以下两种
安装插件或者hack时修改了程序文件,而忘记了对数据库作相应的升级。
程序文件和数据库不配套,比如d2.5的数据库配置给d4.1的程序来用肯定会出现这个错误。
解决方案:导致的原因和问题八的1和 3是相同的,所以解决方法也一样。
15、You have an error in your SQL syntax
翻译:有一个语法错误在你的sql中
分析:论坛标准的程序是没有sql语法错误的。所以造成这个错误的原因一般就两类
安装插件或擅自修改程序。
不同的数据库版本数据库导出导入,比如MySQL4.1的数据在导出的语句包含了MySQL4.0没有的功能,像字符集的设定,这时如果将这些sql导入到MySQL4.0的时候就会产生sql语法错误。
解决方案:仔细检查看到底是哪里的错误,将其修正,实在不行就用标准程序把出错的程序替换。
在数据库备份的时候要留意,如果不打算倒入到其他版本的mysql中则不用特殊考虑,反之要特殊的设定。使用DZ4.1的后台数据备份,可以按照提示去设定想要的格式。独立主机的也可以在到处的时候将其导出为mysql4.0的格式。
mysqldump -uroot -p --default-character-set=latin1 --set-charset=gbk --skip-optdatabse > test.sql
16、Duplicate entry ‘xxx‘ for key 1
翻译:插入 xxx 使索引1重复
分析:索引如果是primary unique这两两种,那么数据表的数据对应的这个字段就必须保证其每条记录的唯一性。否则就会产生这个错误。
一般发生在对数据库写操作的时候,例如Discuz!4.1论坛程序要求所有会员的用户名username必须唯一,即username的索引是 unique,这时如果强行往cdb_members表里插入一个已有的username的记录就会发上这个错误,或者将一条记录的username更新为已有的一个username。
改变表结构的时候也有可能导致这个错误。例如 Discuz!4.0论坛的数据库中cdb_members.username 的索引类型是index这个时候是允许有相同username的记录存在的,在升级到4.1的时候,因为要将username的索引由原来的index变 为unique。如果这时cdb_members里存在有相同的username的记录,那么就会引发这个错误。
导出数据据时有时会因为一些原因(作者目前还不清楚)导致同一条记录被重复导出,那么这个备份数据在导入的时候出现这个错误是在所难免的了。
修改了auto_increment的值,致使“下一个 Autoindex”为一条已经存在的记录
解决方案: 两种思路,一是破坏掉唯一性的索引。二是把重复的数据记录干掉,只保留一条。很显然第一种思路是不可取的。那么按照二的思路我们得出以下几种解决方法,对应上面的i ii iii
略
按照错误提示里的信息到数据库中将重复的记录删除,仅保留一条即可。之后继续执行升级操作。
这种情况发生的概率很小,可以用文本编辑器打开备份文档,查找重复的信息。将其多余的拿掉,仅保留一条即可。
查询出表中auto_increment最大的一条记录,设置auto_incerment比其大一即可。
PS:repaire table "表名“,可以暂时解决问题。
17、 Duplicate key name ‘xxx‘
翻译:索引名重复
分析:要创建的索引已经存在了,就会引发这个错误,这个错误多发生在升级的时候。可能是已经升级过的,重复升级引起的错误。也有可能是之前用户擅自加的索引,刚好与升级文件中的所以相同了。
解决方案: 看看已经存在的索引和要添加的索引是否一样,一样的话可以跳过这条sql语句,如果不一样那么现删除已存在的所以,之后再执行。
18、 Duplicate column name ‘xxx‘
翻译:字段名xxx重复
分析:添加的字段xxx已经存在,多发生在升级过程中,与问题十二的产生是一样的。
解决方案: 看一下已经存在的字段是否和将要添加的字段属性完全相同,如果相同则可以跳过不执行这句sql,如果不一样则删除掉这个字段。之后继续执行升级程序。
19、 Table ‘xxx‘ already exists
翻译:数据表xxx已经存在
分析:xxx表已经存在于库中,再次试图创建这个名字的表就会引发这个错误。同样多发生在论坛的升级中。类似于问题十二。
解决方案: 看看已经存在的表是否和将要创建的表完全一样,一样的话可以跳过不执行这个sql,否则请将存在的表先删除,之后继续执行升级文件。
20、 Can‘t create database ‘xxx‘. Database exists
翻译:不能创建数据库xxx,数据库已经存在
分析:一个mysql下面的数据库名称必须保证唯一性,否则就会有这个错误。
解决方案:把已经存在的数据库改名或者把将要创建的数据库改名,总之不让他们的名称冲突。
21、 小结(针对问题 11\12\13\14\15)
此类问题错误提示中都暗藏一个关键词duplicate(重复)
那么对于mysql数据库来说什么东西是不能重复的呢?
数据库 database
同一个数据库下数据表 table
同一个数据表下字段 column
同一个数据表下索引 key
同一个数据表在索引唯一(UNIQUE PRIMARY)的情况下记录中的这些字段不可以重复
22、Unknown system variable ‘NAMES‘
翻译:未知的系统变量NAMES
分析:Mysql版本不支持字符集设定,此时强行设定字符集就会出现这个错误。
解决方案: 将sql语句中的SET NAMES ‘xxx’ 语句去掉
23、 Lost connection to MySQL server during query
翻译:MySQL服务器失去连接在查询期间
分析:远程连接数据库是有时会有这个问题。MySQL服务器在执行一条sql语句的时候失去了连接造成的。
解决方案: 一般不需要怎么去处理,如果频繁的出现那么考虑改善硬件环境。
24、User ‘red‘ has exceeded the ‘max_updates‘ resource(current value: 500)
翻译:msql用户red已经超过了‘max_updates‘(最大更新次数),‘max_questions‘(最大查询次数),‘max_connections‘(最大连接数),当前设定为500
分析:在mysql数据库的下有一个库为mysql,它其中有一个表为user这里面的纪录每一条都对应为一个mysql用户的授权。其中字段 max_questions max_updates max_connections分别记录着最大查询次数 最大更新数 最大连接数,当目前的任何一个参数大于任何一个设定的值就会产生这个错误。
解决方案: 独立主机用户可以直接修改授权表。修改完之后重启mysql或者跟新授权表,进入mysql提示符下执行
FLUSH PRIVILEGES;
记得后面要有分号’;’
虚拟主机的用户如果总是出现这个问题可找空间商协商解决。
25、Too many connections (1040)链接过多
翻译:达到最大连接数
问题分析:
连接数超过了mysql设置的值,与max_connections和wait_timeout 都有关系。wait_timeout的值越大,连接的空闲等待就越长,这样就会造成当前连接数越大
解决方案:
1.虚拟主机用户请联系空间商优化 MySQL 服务器的配置;
2.独立主机用户请联系服务器管理员优化 MySQL 服务器的配置,可参考:
修改 MySQL 配置文件 my.ini 或者 my.cnf 中的参数:
max_connections= 1000
wait_timeout = 10
修改后重启 MySQL ,如果经常性的报此错误,请做一下服务器的整体优化。
26、There is no such grant defined for user ‘%s‘ on host‘%s‘
错误编号:1141
问题分析:
MySQL 当前用户无权访问数据库。
解决方案:
1、虚拟主机用户请联系空间商,确认给你提供的帐号是否有授权数据库的权限。
2、独立主机用户请联系服务器管理员,确认给您提供的数据库帐号是否有管理此数据库的权限。
27、Error on rename of ‘%s‘ to ‘%s‘ (errno: %d)
error.:1025
问题分析:
请检查一下您的程序是否有修改数据库表名的语句。
解决方案:
1.请检查您的程序中哪些地方需要修改数据库表名;
2.如果您的实际应用确实需要修改到数据库表名的话,请联系空间商或者服务器管理员给您开放修改库名的权限和服务器本身是否正常。
28、Error reading file ‘%s‘ (errno: %d)
error.:1023
问题分析:
数据库文件不能被读取。
解决方案:
1.虚拟主机用户请联系空间商查看数据库是否完好。
2.独立主机用户请联系服务器管理员检查一下 MySQL 本身是否正常, MySQL 是否可以读取文件,Linux 用户可以检查一下 MySQL 的数据库文件的属主是否正确以及本身的文件是否损坏。
29、Host ‘*****‘ is blocked because of many connectionerrors; unblock with ‘mysqladmin flush-hosts‘
error.:1129
问题分析:
数据库出现异常,请重启数据库。
解决方案:
1. 由于存在很多连接错误,主机‘****‘被屏蔽,虚拟主机用户请联系空间商处理,独立主机用户请联系服务器管理员,在 MySQL 的命令控制台下执行‘mysqladmin flush-hosts‘解除屏蔽即可,或者重启 MySQL 数据库
30、dropping database (can‘t delete ‘%s‘, errno: %d)
error.:1009
问题分析:
不能删除数据库文件,导致删除数据库失败。
解决方案:
1.检查您使用的数据库管理帐号是否有权限删除数据。
2.检查数据库是否存在。
31、Got error 28 from table handler
error.:1030
问题分析:
数据库所在磁盘空间已满。
解决方案:
1.虚拟主机用户请联系空间商增加 MySQL 所在的磁盘空间或者清理一些无用文件;
2.独立主机用户请联系服务器管理员增加 MySQL 所在的磁盘空间或者清理一些无用文件
32、Can‘t create a new thread; if you are not out ofavailable memory, you can consult the manual for a possible OS-dependent bug。
error.:11/35
问题分析:
数据库服务器问题,数据库操作无法创建新线程。一般是两个原因:
1.服务器系统内存溢出。
2.环境软件损坏或系统损坏。
解决方案:
1.虚拟主机用户请联系下空间商数据库服务器的内存和系统是否正常。
2.独立主机用户请联系服务器管理员检查服务器的内存和系统是否正常,如果服务器内存紧张,请检查一下哪些进程消耗了服务器的内存,同时考虑是否增加服务器的内存来提高整个的负载能力。
33、Error: Client does not support authentication protocolrequested by server; consider upgrading MySQL client
error.:1251
问题分析:
如果你升级 MySQL 到 4.1 以上版本后遇到以上问题,请先确定你的 MySQL Client 是 4.1 或者更高版本( Windows 下有问题你就直接跳到下面看解决方法了,因为 MySQL 在 Windows 是 client 和server 一起装上了的)。
解决方案:
1. Windows 平台
主要是改变连接 MySQL 的帐户的加密方式,MySQL4.1/5.0 是通过 PASSWORD 这种方式加密的。可以通过以下两种方法得到解决:
1) mysql->SET PASSWORD FOR‘some_user‘@‘some_host‘=OLD_PASSWORD(‘new_password‘);
2) mysql->UPDATE mysql.user SET Password=OLD_PASSWORD(‘new_password‘) WHEREHost=‘some_host‘ AND User=‘some_user‘;
2. Linux/Unix 平台
Linux 平台下首先确定是否安装过 MySQL 的客户端,这个用 rpm 安装很简单,Linux 代码为:
rpm -ivh MySQL-client-4.1.15-0.i386.rpm
然后在编译 php 的时候要加上:
--with-mysql=/your/path/to/mysql
一般情况下都可以解决。如果还出现这种错误,可以按照下面的方法来做:
mysql->SET PASSWORD FOR‘some_user‘@‘some_host‘=OLD_PASSWORD(‘new_password‘);
mysql->UPDATE mysql.user SET Password=OLD_PASSWORD(‘new_password‘) WHEREHost=‘some_host‘ AND User=‘some_user‘;
34、Error: Can‘t connect to local MySQL server throughsocket ‘/var/lib/mysql/mysql.sock‘
error.:2002
问题分析:
出现这个错误一般情况下是因为下面两个原因:
1.MySQL 服务器没有开启。
2.MySQL 服务器开启了,但不能找到 socket 文件。
解决方案:
1.虚拟主机用户,请联系空间商确认数据库是否正常启动。
2.独立主机用户,请检查一下 MySQL 服务是否已经开启,没有开启,请启动 MySQL 服务;如果已经开启,并且是 Linux 系统,请检查一下 MySQL 的 socket 的路径,然后打开 config.inc.php 找到
$dbhost = ‘localhost‘; 在 hostname 后面加冒号‘:’和 MySQL 的 socket 的路径。
比如 MySQL 服务器为 localhost
MySQL 的 socket 的路径为/tmp/mysql.sock
那么就改成如下:
$dbhost = ‘localhost:/temp/mysql.sock‘;
35、Can‘t connect to MySQL server on ‘localhost‘
error.:2003
问题分析:
MySQL 服务没有启动,一般是在异常的情况下 MySQL 无法启动导致的,比如无可用的磁盘空间,my.ini 里 MySQL 的basedir 路径设置错误等。
解决方案:
1.检查磁盘空间是否还有剩余可用空间,尽量保持有足够的磁盘空间可用。
2.检查 my.ini 里的 basedir 等参数设置是否正确,然后重新启动下 MySQL 服务。
36、Lost connection to MySQL server during query
error.:2013
问题分析:
数据库查询过程中丢失了与 MySQL 服务器的连接。
解决方案:
1.请确认您的程序中是否有效率很低的程序,比如某些插件,可以卸载掉插件,检查一下服务器是否正常;
2.服务器本身资源紧张,虚拟主机用户请联系空间商确认,独立主机用户请联系服务器管理员,检查一下服务器是否正常。
37、Got a packet bigger than \‘max_allowed_packet\‘ bytes
错误编号:1153
问题分析:调整了 Mantis 的上传附件的大小却没有调整MySQL 的配置文件。
解决方案:
1、独立主机用户请按照以下方法调整:
查找 MySQL 的配置文件(my.cnf 或者 my.ini)
在 [mysqld] 部分添加一句(如果存在,调整其值就可以):
max_allowed_packet=10M
重启 MySQL 服务就可以了。这里设置的是 10MB。
2、虚拟主机用户请联系空间商调整此参数。
1.2 MySQL Replication常见错误
1.Last_SQL_Errno: 1677
Last_SQL_Error: Column 1 of table ‘test.t‘ cannot be converted from type‘int‘ to type ‘bigint(20)‘
解决方法:这个案例是从网上找到的,自己动手实验了一把。从错误信息来看表面上是由于在slave上无法执行一条转换字段类型的SQL语句。实际上并不是有这种语句直接引起的,而是间接引起的(之前某些操作导致主从表字段类型不一致,接下来对这个表进行DML时就会报错)。它的意思是在对这个表t进行 DML操作时,发现主从上表结果不一致,比如这里是说在主上t的字段1是int类型,但是从上t的字段1是bigint类型,所以报错。那么为什么要报错呢?这是从安全角度考虑,因为如果字段类型不一致可能会导致数据截断之类的问题。那么解决方法呢?通过参数slave_type_conversions
进行控制,它有三种取值:
ALL_LOSSY:仅支持有损转换,什么叫有损?比如一个值本来是bigint存储为9999999999999,现在转换为int类型势必会要截断从而导致数据不一致。
ALL_NON_LOSSY:仅支持无损转换,只能在无损的情况下才能进行转换
ALL_LOSSY,ALL_NON_LOSSY:有损/无算转换都支持
空,即不设置这个参数:必须主从的字段类型一模一样。
注意: 前面说的这几中情况都只在binlog_format=ROW的情况下才有效。
2.Last_SQL_Errno: 1194
Last_SQL_Error: Error ‘Table ‘traincenter‘ is marked as crashedand should be repaired‘ on query.Default database: ‘basketballman‘. Query:‘update traincenter set points=‘4‘,pointstime=‘1361912066‘ where uid =‘1847482697‘ limit 1‘
解决方法:myisam表traincenter损坏,直接repair table即可。至于为什么myisam类型表比innodb更容易损坏,我觉得有两个原因:1,innodb有double write机制,损坏或者half write的页可以用它恢复,第二innodb是事务引擎,都有操作都是事务的,而myisam是非事务的,存在写一半但是操作终止情况。
3.Last_IO_Errno: 1236
Last_IO_Error: Got fatal error 1236 from master when reading datafrom binary log: ‘Could not find first log file name in binary log index file‘
解决方法:主库上的binlog文件已经不存在但是在index file中确有相应记录存在。我这里发生这个错误的原因在于由于复制中断时间很长,报警出来一直没人处理,这个中断时间超过master上binlog超期时间,等恢复复制时需要的binlog已经由于其超期而被删掉,没办法只好重建这个实例了。以大家都要引以为戒。
4.Last_IO_Errno: 1593
Last_IO_Error: Fatal error: The slave I/O thread stops becausemaster and slave have equal MySQL server ids; these ids must be different forreplication to work (or the --replicate-same-server-id option must be used onslave but this does not always make sense;
please check the manual before usingit).
解决方法:主从配置的server-id一样,而在主从复制环境中server-id一样的binlog events都会被过滤掉。具体server-id的含义可以了解一下复制原理。这个一般是因为拷贝配置文件时忘记修改server-id导致,遇到这类问题也比较容易,平时操作谨慎一点即可。
5.Last_Errno: 1053
Last_Error: Query partially completed on the master (error on master:1053) and was aborted. There is a chance that your master is inconsistent atthis point. If you are sure that your master is ok, run this query manually onthe slave and then restart the slave
with SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;START SLAVE; . Query: ‘insert into ...
解决方法:查询在master上部分完成,然后终止了。这马上又能想到是myisam表,结果也正是这样。由于myisam不支持事务所以可能存在一个查询完成一部分然后失败的情况。解决方法一般也就是提示信息给出的跳过一个binlog event。不过确认跳过之前最好还是查询一下master上是否真的存在相应的记录,因为错误信息同时还会给出它认为在master上执行一部分然后终止的查询语句。
6.Last_SQL_Errno: 1666
Last_SQL_Error: Error executing row event: ‘Cannot executestatement: impossible to write to binary log since statement is in row formatand BINLOG_FORMAT = STATEMENT.‘
解决方法:这个案例的背景是做一个ABC结构的复制,B、C中设定的binlog_format=statement,A中的是MIXED,所以当B尝试 重做A过来的relay log,然后记录binlog(传给C)时发现relay log的binlog_format与自己设定的binlog_format不一致。我当时就是直接先更改BC的binlog_format=MIXED 解决。
7.Last_Errno: 1032
Last_Error: Could not execute Update_rows event on table db.table; Can‘tfind record in ‘table‘, Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND;the event‘s master log mysql-bin.000064, end_log_pos 158847
解决方法:这个是在binlog_format=row复制下发生的。原因是因为row格式复制是最严格的,所以在mysql看来如果在从库上找不到要更新的这条记录,那么就代表主从数据不一致,因此报错。另外顺便说一句,对于row格式binlog,如果某个更新操作实际上并没有更新行,这个操作是不会记binlog的,因为row格式的binlog宗旨就是只记录发生了改变的行。所以这个解决办法根据你自己实际应用来定,最好的方法还是重做slave 吧,这样更放心。
8.Last_Errno: 28
Last_Error: Error in Append_block event: write to‘/tmp/SQL_LOAD-32343798-72213798-1.data‘ failed
解决方法:首先说错误原因:主库执行load data infile,同步到从库后load data infile存放的文件默认是放在/tmp(由参数slave_load_tmpdir控制),而/tmp空间不够因此报错。因此只要将从库上 slave_load_tmpdir设置到一个磁盘空间足够大的分区就行。
1.3 MySQL 操作失误常见错误
1.
执行mysql -u -root -p 报错如下:
解决方法如下:
2.
执行mysql -u root -p 报错如下:
解决方法如下:
(1)
修改内容:
socket = /tmp/mysql.sock
然后重启
(2)
检查/usr/local/mysql/my.cnf
发现socket = /temp/mysql.sock,设置的没有问题
在检查mysql Service是否启动,OMG居然没有启动服务,我脑子一定秀逗了
3.
从服务器数据库Slave_IO_Running:Connecting
解决办法:
service iptables stop