42000 (ER_DUP_KEYNAME)
消息:重复键名称'%s'。
我认为是主键重复了。
希望对你有帮助。
本章列出了当你用任何主机语言调用MySQL时可能出现的错误。首先列出了服务器错误消息。其次列出了客户端程序消息服务器错误信息来自下述源文件:
· 错误消息信息列在share/errmsg.txt文件中。逗%d地和逗%s地分别代表编号和字符串,显示时,它们将被消息值取代。
错误值列在share/errmsg.txt文件中,用于生成include/mysqld_error.h和include/mysqld_ername.h
MySQL源文件中的定义。
· SQLSTATE值列在share/errmsg.txt文件中,用于生成include/sql_state.h
MySQL源文件中的定义。
由于更新很频繁,这些文件中可能包含这里未列出的额外错误消息。
· 错误:1000 SQLSTATE:
HY000 (ER_HASHCHK)
消息:hashchk
· 错误:1001 SQLSTATE: HY000
(ER_NISAMCHK)
消息:isamchk
· 错误:1002 SQLSTATE: HY000 (ER_NO)
消息:NO
· 错误:1003 SQLSTATE: HY000 (ER_YES)
消息:YES
· 错误:1004 SQLSTATE: HY000 (ER_CANT_CREATE_FILE)
消息:无法创建文件'%s'
(errno: %d)
· 错误:1005 SQLSTATE: HY000 (ER_CANT_CREATE_TABLE)
消息:无法创建表'%s' (errno: %d)
· 错误:1006 SQLSTATE: HY000
(ER_CANT_CREATE_DB)
消息:无法创建数据库'%s' (errno: %d)
· 错误:1007
SQLSTATE: HY000 (ER_DB_CREATE_EXISTS)
消息:无法创建数据库'%s',数据库已存在。
·
错误:1008 SQLSTATE: HY000 (ER_DB_DROP_EXISTS)
消息:无法撤销数据库'%s',数据库不存在。
· 错误:1009 SQLSTATE: HY000 (ER_DB_DROP_DELETE)
消息:撤销数据库时出错(无法删除'%s',errno: %d)
· 错误:1010 SQLSTATE: HY000
(ER_DB_DROP_RMDIR)
消息:撤销数据库时出错(can't rmdir '%s', errno: %d)
·
错误:1011 SQLSTATE: HY000 (ER_CANT_DELETE_FILE)
消息:删除'%s'时出错 (errno: %d)
· 错误:1012 SQLSTATE: HY000 (ER_CANT_FIND_SYSTEM_REC)
消息:无法读取系统表中的记录。
· 错误:1013 SQLSTATE: HY000 (ER_CANT_GET_STAT)
消息:无法获取'%s'的状态(errno: %d)
· 错误:1014 SQLSTATE: HY000
(ER_CANT_GET_WD)
消息:无法获得工作目录(errno: %d)
· 错误:1015 SQLSTATE:
HY000 (ER_CANT_LOCK)
消息:无法锁定文件(errno: %d)
· 错误:1016 SQLSTATE:
HY000 (ER_CANT_OPEN_FILE)
消息:无法打开文件:'%s' (errno: %d)
· 错误:1017
SQLSTATE: HY000 (ER_FILE_NOT_FOUND)
消息:无法找到文件: '%s' (errno: %d)
· 错误:1018 SQLSTATE: HY000 (ER_CANT_READ_DIR)
消息:无法读取'%s'的目录
(errno: %d)
· 错误:1019 SQLSTATE: HY000 (ER_CANT_SET_WD)
消息:无法为'%s'更改目录 (errno: %d)
· 错误:1020 SQLSTATE: HY000
(ER_CHECKREAD)
消息:自上次读取以来表'%s'中的记录已改变。
· 错误:1021 SQLSTATE: HY000
(ER_DISK_FULL)
消息:磁盘满(%s);等待某人释放一些空间...
· 错误:1022 SQLSTATE:
23000 (ER_DUP_KEY)
消息:无法写入;复制表'%s'的 键。
· 错误:1023 SQLSTATE: HY000
(ER_ERROR_ON_CLOSE)
消息:关闭'%s'时出错 (errno: %d)
· 错误:1024 SQLSTATE:
HY000 (ER_ERROR_ON_READ)
消息:读取文件'%s'时出错 (errno: %d)
· 错误:1025
SQLSTATE: HY000 (ER_ERROR_ON_RENAME)
消息:将'%s'重命名为'%s'时出错 (errno: %d)
· 错误:1026 SQLSTATE: HY000 (ER_ERROR_ON_WRITE)
消息:写入文件'%s'时出错
(errno: %d)
· 错误:1027 SQLSTATE: HY000 (ER_FILE_USED)
消息:'%s'已锁定,拒绝更改。
· 错误:1028 SQLSTATE: HY000 (ER_FILSORT_ABORT)
消息:分类失败
· 错误:1029 SQLSTATE: HY000 (ER_FORM_NOT_FOUND)
消息:对于'%s',视图'%s'不存在。
· 错误:1030 SQLSTATE: HY000 (ER_GET_ERRNO)
消息:从存储引擎中获得错误%d。
· 错误:1031 SQLSTATE: HY000 (ER_ILLEGAL_HA)
消息:关于'%s'的表存储引擎不含该选项。
· 错误:1032 SQLSTATE: HY000
(ER_KEY_NOT_FOUND)
消息:无法在'%s'中找到记录。
· 错误:1033 SQLSTATE: HY000
(ER_NOT_FORM_FILE)
消息:文件中的不正确信息:'%s'
· 错误:1034 SQLSTATE: HY000
(ER_NOT_KEYFILE)
消息:对于表'%s', 键文件不正确,请尝试修复。
· 错误:1035 SQLSTATE:
HY000 (ER_OLD_KEYFILE)
消息:旧的键文件,对于表'%s',请修复之!
· 错误:1036
SQLSTATE: HY000 (ER_OPEN_AS_READONLY)
消息:表'%s'是只读的。
· 错误:1037
SQLSTATE: HY001 (ER_OUTOFMEMORY)
消息:内存溢出,重启服务器并再次尝试(需要%d字节)。
·
错误:1038 SQLSTATE: HY001 (ER_OUT_OF_SORTMEMORY)
消息:分类内存溢出,增加服务器的分类缓冲区大小。
· 错误:1039 SQLSTATE: HY000 (ER_UNEXPECTED_EOF)
消息:读取文件'%s'时出现意外EOF (errno: %d)
· 错误:1040 SQLSTATE: 08004
(ER_CON_COUNT_ERROR)
消息:连接过多。
· 错误:1041 SQLSTATE: HY000
(ER_OUT_OF_RESOURCES)
消息:内存溢出,请检查是否mysqld或其他进程使用了所有可用内存,如不然,或许应使用'ulimit'允许mysqld使用更多内存,或增加交换空间的大小。
· 错误:1042 SQLSTATE: 08S01 (ER_BAD_HOST_ERROR)
消息:无法获得该地址给出的主机名。
· 错误:1043 SQLSTATE: 08S01 (ER_HANDSHAKE_ERROR)
消息:不良握手
·
错误:1044 SQLSTATE: 42000 (ER_DBACCESS_DENIED_ERROR)
消息:拒绝用户'%s'@'%s'访问数据库'%s'。
· 错误:1045 SQLSTATE: 28000
(ER_ACCESS_DENIED_ERROR)
消息:拒绝用户'%s'@'%s'的访问(使用密码:%s)
· 错误:1046
SQLSTATE: 3D000 (ER_NO_DB_ERROR)
消息:未选择数据库。
· 错误:1047 SQLSTATE:
08S01 (ER_UNKNOWN_COM_ERROR)
消息:未知命令。
· 错误:1048 SQLSTATE: 23000
(ER_BAD_NULL_ERROR)
消息:列'%s'不能为空。
· 错误:1049 SQLSTATE: 42000
(ER_BAD_DB_ERROR)
消息:未知数据库'%s'。
· 错误:1050 SQLSTATE: 42S01
(ER_TABLE_EXISTS_ERROR)
消息:表'%s'已存在。
· 错误:1051 SQLSTATE: 42S02
(ER_BAD_TABLE_ERROR)
消息:未知表'%s'。
· 错误:1052 SQLSTATE: 23000
(ER_NON_UNIQ_ERROR)
消息:%s中的列'%s'不明确。
· 错误:1053 SQLSTATE: 08S01
(ER_SERVER_SHUTDOWN)
消息:在 *** 作过程中服务器关闭。
· 错误:1054 SQLSTATE: 42S22
(ER_BAD_FIELD_ERROR)
消息:'%s'中的未知列'%s'。
· 错误:1055 SQLSTATE: 42000
(ER_WRONG_FIELD_WITH_GROUP)
消息:'%s'不在GROUP BY中。
· 错误:1056
SQLSTATE: 42000 (ER_WRONG_GROUP_FIELD)
消息:无法在'%s'上创建组。
· 错误:1057
SQLSTATE: 42000 (ER_WRONG_SUM_SELECT)
消息:语句中有sum函数和相同语句中的列。
·
错误:1058 SQLSTATE: 21S01 (ER_WRONG_VALUE_COUNT)
消息:列计数不匹配值计数。
·
错误:1059 SQLSTATE: 42000 (ER_TOO_LONG_IDENT)
消息:ID名称'%s'过长。
·
错误:1060 SQLSTATE: 42S21 (ER_DUP_FIELDNAME)
消息:重复列名'%s'。
·
错误:1061 SQLSTATE: 42000 (ER_DUP_KEYNAME)
消息:重复键名称'%s'。
· 错误:1062
SQLSTATE: 23000 (ER_DUP_ENTRY)
消息:键%d的重复条目'%s'。
· 错误:1063
SQLSTATE: 42000 (ER_WRONG_FIELD_SPEC)
消息:对于列'%s',列分类符不正确。
·
错误:1064 SQLSTATE: 42000 (ER_PARSE_ERROR)
消息:在行%d上,%s靠近'%s'。
·
错误:1065 SQLSTATE: 42000 (ER_EMPTY_QUERY)
消息:查询为空。
· 错误:1066
SQLSTATE: 42000 (ER_NONUNIQ_TABLE)
消息:非唯一的表/别名:'%s'
· 错误:1067
SQLSTATE: 42000 (ER_INVALID_DEFAULT)
消息:关于'%s'的无效默认值。
· 错误:1068
SQLSTATE: 42000 (ER_MULTIPLE_PRI_KEY)
消息:定义了多个主键。
· 错误:1069
SQLSTATE: 42000 (ER_TOO_MANY_KEYS)
消息:指定了过多键:允许的最大键数是%d。
·
错误:1070 SQLSTATE: 42000 (ER_TOO_MANY_KEY_PARTS)
消息:指定了过多键部分:允许的最大键部分是%d。
· 错误:1071 SQLSTATE: 42000 (ER_TOO_LONG_KEY)
消息:指定的键过长,最大键长度是%d字节。
· 错误:1072 SQLSTATE: 42000
(ER_KEY_COLUMN_DOES_NOT_EXITS)
消息:键列'%s'在表中不存在。
· 错误:1073
SQLSTATE: 42000 (ER_BLOB_USED_AS_KEY)
消息:BLOB列'%s'不能与已使用的表类型用在 键说明中。
· 错误:1074 SQLSTATE: 42000 (ER_TOO_BIG_FIELDLENGTH)
消息:对于列'%s',列长度过大 (max = %d),请使用BLOB或TEXT取而代之。
这是我见的一个文档,虽然我看不懂,你看看有没有帮助MySQL死锁问题的相关知识是本文我们主要要介绍的内容,接下来我们就来一一介绍这部分内容,希望能够对您有所帮助。
1、MySQL常用存储引擎的锁机制
MyISAM和MEMORY采用表级锁(table-level locking)
BDB采用页面锁(page-level locking)或表级锁,默认为页面锁
InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁
2、各种锁特点
表级锁:开销小,加锁快不会出现死锁锁定粒度大,发生锁冲突的概率最高,并发度最低
行级锁:开销大,加锁慢会出现死锁锁定粒度最小,发生锁冲突的概率最低,并发度也最高
页面锁:开销和加锁时间界于表锁和行锁之间会出现死锁锁定粒度界于表锁和行锁之间,并发度一般
3、各种锁的适用场景
表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用
行级锁则更适合于有大量按索引条件并发更新数据,同时又有并发查询的应用,如一些在线事务处理系统
4、死锁
是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
表级锁不会产生死锁。所以解决死锁主要还是针对于最常用的InnoDB。
5、死锁举例分析
在MySQL中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql语句 *** 作了主键索引,MySQL就会锁定这条主键索引如果一条语句 *** 作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。
在UPDATE、DELETE *** 作时,MySQL不仅锁定WHERE条件扫描过的所有索引记录,而且会锁定相邻的键值,即所谓的next-key locking。
例如,一个表db。tab_test,结构如下:
id:主键
state:状态
time:时间
索引:idx_1(state,time)
出现死锁日志如下:
?***(1) TRANSACTION:
?TRANSACTION 0 677833455, ACTIVE 0 sec, process no 11393, OSthread id 278546 starting index read
?mysql tables in use 1, locked 1
?LOCK WAIT 3 lock struct(s), heap size 320
?MySQL thread id 83, query id 162348740 dcnet03 dcnet Searching rows for update
?update tab_test set state=1064,time=now() where state=1061 and time <date_sub(now(), INTERVAL 30 minute) (任务1的sql语句)
?***(1) WAITING FOR THIS LOCK TO BE GRANTED: (任务1等待的索引记录)
?RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `db/tab_test` trx id 0 677833455 _mode X locks rec but not gap waiting
?Record lock, heap no 92 PHYSICAL RECORD: n_fields 11compact formatinfo bits 0
?0: len 8hex 800000000097629casc b 1: len 6hex 00002866eaeeasc (f 2: len 7hex 00000d40040110asc @ 3: len 8hex 80000000000050b2asc P 4: len 8hex 800000000000502aasc P*5: len 8hex 8000000000005426asc T&6: len 8hex 800012412c66d29casc A,f 7: len 23hex 75706c6f6164666972652e636f6d2f6 8616e642e706870asc xxx.com/8: len 8hex 800000000000042basc +9: len 4hex 474bfa2basc GK +10: len 8hex 8000000000004e24asc N$
?*** (2) TRANSACTION:
?TRANSACTION 0 677833454, ACTIVE 0 sec, process no 11397, OS thread id 344086 updating or deleting, thread declared inside InnoDB 499
?mysql tables in use 1, locked 1
?3 lock struct(s), heap size 320, undo log entries 1
?MySQL thread id 84, query id 162348739 dcnet03 dcnet Updating update tab_test set state=1067,time=now () where id in (9921180) (任务2的sql语句)
?*** (2) HOLDS THE LOCK(S): (任务2已获得的锁)
?RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `db/tab_test` trx id 0 677833454 lock_mode X locks rec but not gap
?Record lock, heap no 92 PHYSICAL RECORD: n_fields 11compact formatinfo bits 0
?0: len 8hex 800000000097629casc b 1: len 6hex 00002866eaeeasc (f 2: len 7hex 00000d40040110asc @ 3: len 8hex 80000000000050b2asc P 4: len 8hex 800000000000502aasc P*5: len 8hex 8000000000005426asc T&6: len 8hex 800012412c66d29casc A,f 7: len 23hex 75706c6f6164666972652e636f6d2f6 8616e642e706870asc uploadfire.com/hand.php8: len 8hex 800000000000042basc +9: len 4hex 474bfa2basc GK +10: len 8hex 8000000000004e24asc N$
?*** (2) WAITING FOR THIS LOCK TO BE GRANTED: (任务2等待的锁)
?RECORD LOCKS space id 0 page no 843102 n bits 600 index `idx_1` of table `db/tab_test` trx id 0 677833454 lock_mode X locks rec but not gap waiting
?Record lock, heap no 395 PHYSICAL RECORD: n_fields 3compact formatinfo bits 0
?0: len 8hex 8000000000000425asc %1: len 8hex 800012412c66d29casc A,f 2: len 8hex 800000000097629casc b
?*** WE ROLL BACK TRANSACTION (1)
?(回滚了任务1,以解除死锁)
原因分析:
当“update tab_test set state=1064,time=now() where state=1061 and time <date_sub(now(), INTERVAL 30 minute)”执行时,MySQL会使用idx_1索引,因此首先锁定相关的索引记录,因为idx_1是非主键索引,为执行该语句,MySQL还会锁定主键索引。
假设“update tab_test set state=1067,time=now () where id in (9921180)”几乎同时执行时,本语句首先锁定主键索引,由于需要更新state的值,所以还需要锁定idx_1的某些索引记录。
这样第一条语句锁定了idx_1的记录,等待主键索引,而第二条语句则锁定了主键索引记录,而等待idx_1的记录,这样死锁就产生了。
6、解决办法
拆分第一条sql,先查出符合条件的主键值,再按照主键更新记录:
?select id from tab_test where state=1061 and time <date_sub(now(), INTERVAL 30 minute)
?update tab_test state=1064,time=now() where id in(......)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)