mysql常见过错解决方法及过错提示对照表ITeye - 亚美娱乐

mysql常见过错解决方法及过错提示对照表ITeye

2019年02月21日09时23分01秒 | 作者: 若山 | 标签: 运用,文件,数据库 | 浏览: 1100

18.2.1 MySQL server has gone away过错
本末节也触及有关Lost connection to server during query的过错。
对MySQL server has gone away过错最常见的原因是效劳器超时了而且封闭了衔接。缺省地,假如没有作业发作,效劳器在 8个小时后封闭衔接。你可在发动mysqld时经过设置wait_timeout变量改动时刻束缚。
你能够经过履行mysqladmin version而且查验正常运转的时刻来查看MySQL还没死掉。
假如你有一个脚本,你只须再宣布查询让客护进行一次主动的从头衔接。
在这种请下,你一般能取得下列过错代码(你得到的是OS相关的):
CR_SERVER_GONE_ERROR 客户不能发送一个问题给效劳器。
CR_SERVER_LOST 当写效劳器时,客户没有犯错,可是它没有得到对问题的一个无缺的答案(或任何答案)。

假如你向效劳器发送不正确的或太大的查询,你也或许得到这些过错。假如mysqld得到一个太大或不正常的包,它以为客户犯错了并封闭衔接。假如你需求较 大的查询(例如,假如你正在处理较大的BLOB列),你能够运用-O max_allowed_packet=#选项(缺省1M)发动mysqld以添加查询束缚。剩下的内存按需分配,这样mysqld只要在你宣布较大差询 时或mysqld有必要回来较大的成果行时,才运用更多的内存!

18.2.2 Can’t connect to [local] MySQL server过错
一个MySQL客户能够两种不同的办法衔接mysqld效劳器:Unix套接字,它经过在文件体系中的一个文件(缺省 “/tmp/mysqld.sock”)进行衔接;或TCP/IP,它经过一个端口号衔接。Unix套接字比TCP/IP更快,可是只要用在衔接同一台计 算机上的效劳器。假如你不指定主机名或假如你指定特其他主机名localhost,运用Unix套接字。
过错(2002)Can’t connect to …一般意味着没有一个MySQL效劳器运转在体系上或当企图衔接mysqld效劳器时,你正在运用一个过错的套接字文件或TCP/IP端口。
由查看(运用ps)在你的效劳器上有一个名为mysqld的进程发动!假如没有任何mysqld进程,你应该发动一个。见4.15.2 发动MySQL效劳器的问题。
假如一个mysqld进程正在运转,你能够经过测验这些不同的衔接来查看效劳器(当然,端口号和套接字途径名或许在你的装置中是不同的):
shell mysqladmin version
shell mysqladmin variables
shell mysqladmin -h `hostname` version variables
shell mysqladmin -h `hostname` –port=3306 version
shell mysqladmin -h ’ip for your host’ version
shell mysqladmin –socket=/tmp/mysql.sock version

留意hostname指令运用反引号“`”而非正引号“’”;这些导致hostname输出(即,当时主机名)被替代进mysqladmin指令中。
这是或许形成Can’t connect to local MySQL server过错的一些原因:
mysqld不在运转。
你正在运用MIT-pthreads的一个体系上运转。假如正在运转在一个没有原生线程的体系上,mysqld运用 MIT-pthreads 软件包。见 4.2 由MySQL支撑的操作体系。可是,MIT-pthreads不支撑Unix套接字,因而当与效劳器衔接时,在这样一个体系上,你总是有必要明确地指定主机 名。试试运用这个指令查看到效劳器的衔接:
shell mysqladmin -h `hostname` version

或人删去了mysqld运用的Unix套接字(缺省“/tmp/mysqld.sock”)。你或许有一个cron使命删去了MySQL套接字(例如,一 个把旧文件从“/tmp”目录中删去的使命)。你总是能够运转mysqladmin version而且查看mysqladmin正在企图运用的套接字的确存在。在这种情况下,批改办法是删去cron使命而不删去“mysqld.sock 或将套接字放在其他当地。你能用这个指令在MySQL装备时指定一个不同的套接字地址:
shell ./configure –with-unix-socket-path=/path/to/socket

你也能够运用–socket=/path/to/socket选项发动safe_mysqld和在发动你的MySQL客户前设置环境变量 MYSQL_UNIX_PORT为套接字途径名。你可用–socket=/path/to/socket选项发动mysqld效劳器。假如你改动了效劳 器的套接字途径名,你也有必要通知MySQL客户关于新途径的情况。你能够经过设置环境变量MYSQL_UNIX_PORT为套接字途径名或由供给套接字路 径名作为客户的参数做到。你可用这个指令测验套接字:
shell mysqladmin –socket=/path/to/socket version

你正在运用 Linux和线程现已死了(中心倾倒了)。在这种情况中,你有必要杀死其它mysqld线程(例如在发动一个新的MySQL效劳器之前,能够用mysql_zap脚本)。见18.1 假如MySQL总是溃散怎么办。
假如你得到过错Can’t connect to MySQL server on some_hostname,你能够测验下列进程找出问题是什么:
经过履行telnet your-host-name tcp-ip-port-number而且按几回回车来查看效劳器是否正常运转。假如有一个 MySQL运转在这个端口上,你应该得到一个包含正在运转的MySQL效劳器的版别号的应对。假如你得到类似于telnet:  Unable to connect to remote host: Connection refused的一个过错,那么没有效劳器在运用的端口上运转。
测验衔接本地机器上的mysqld看护进程,并用mysqladmin variables查看mysqld被装备运用的TCP/IP端口(变量port)。
查看你的mysqld效劳器没有用–skip-networking选项发动。

18.2.3 Host ’…’ is blocked过错
假如你得到象这样的一个过错:
Host ’hostname’ is blocked because of many connection errors.
Unblock with ’mysqladmin flush-hosts’

这意味着,mysqld现已得到了许多(max_connect_errors)的主机’hostname’的在半途被中断了的衔接恳求。在 max_connect_errors次失利恳求后,mysqld断定犯错了(象来字一个黑客的进犯),而且阻挠该站点进一步的衔接,直到或人履行指令 mysqladmin flush-hosts。
缺省地,mysqld在10个衔接过错后堵塞一台主机。你能够经过象这样发动效劳器很简单地调整它:
shell safe_mysqld -O max_connect_errors=10000

留意,对给定的主机,假如得到这条过错音讯,你应该首要查看该主机的TCP/IP衔接有没有问题。假如你的TCP/IP衔接不在运转,添加max_connect_errors变量的值对你也不会有协助!

18.2.4 Too many connections过错
假如在你试土衔接MySQL时,你得到过错Too many connections,这意味着现已有max_connections个客户衔接了mysqld效劳器。
假如你需求比缺省(100)更多的衔接,那么你应该重启mysqld,用更大的 max_connections 变量值。
留意,mysqld实际上答应(max_connections+1)个客户衔接。最终一个衔接是为一个用Process权限的用户保存的。经过不把这个 权限给一般用户(他们不应该需求它),有这个权限一个管理员能够登录而且运用SHOW PROCESSLIST找出什么或许犯错。见7.21 SHOW句法 (得到表,列的信息)。
18.2.5 Out of memory过错
假如你宣布查询而且得到类似于下面的过错:
mysql: Out of memory at line 42, ’malloc.c’
mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)
ERROR 2008: MySQL client ran out of memory

留意,过错指向了MySQL客户mysql。这个过错的原因很简略,客户没有满足的内存存储悉数成果。
为了批改这个问题,首要查看你的查询是否正确。它应该回来这么多的行,这合理吗?假如是这样,你能够运用mysql –quick,它运用mysql_use_result()检索成果调集。这将较少的担负放在了客户端(仅仅效劳器更多)。

18.2.6 Packet too large过错
当一个MySQL客户或mysqld效劳器得到一个比max_allowed_packet个字节长的包,它宣布一个Packet too large过错并中止衔接。
假如你正在运用mysql客户,你能够经过用mysql –set-variable=max_allowed_packet=8M指定一个更大的缓冲区来发动客户程序。
假如你正在运用不答应你指定最大包巨细的其他客户(例如 DBI),你需求在你发动效劳器时设置包巨细。你能够运用mysqld的指令行选项设置 max_allowed_packet为一个更大的尺度。例如,假如你正希望将一个全长的BLOB存入一张表中,你将需求用–set-variable =max_allowed_packet=24M选项来发动效劳器。

18.2.7 The table is full过错
这个过错发作在内存暂时表变得比tmp_table_size字节大时。为了防止这个问题,你能够运用mysqld的-O tmp_table_size= #选项来添加暂时表的巨细,或在你宣布有疑问的查询之前运用SQL选项SQL_BIG_TABLES。见7.25 SET OPTION句法。
你也能够运用–big-tables选项发动mysqld。这与为一切查询运用SQL_BIG_TABLES彻底相同。

18.2.8 Commands out of sync in client过错
假如你在你的客户代码中得到Commands out of sync; You can’t run this command now,你正在以过错的次第调用客户函数!
这或许发作,例如,假如你正在运用mysql_use_result()而且在你现已调用了mysql_free_result()之前企图履行新查询。 假如你在mysql_use_result()或mysql_store_result()之间企图履行回来数据的2个查询,它也或许发作。

18.2.9 Ignoring user过错
假如你得到下列过错:
Found wrong password for user: ’some_user@some_host’; Ignoring user
这意味着在mysqld发动时或在它再次装载权限表时,它在user表中找到了一个有一个无效口令的条目。成果,条目简略地被权限体系疏忽。
或许导致这个问题的原因和批改:
你或许正在运转一个有一个老的user表的新版别mysqld。你能够经过履行mysqlshow mysql user看看口令字段是否少于 16个字符来查看它。假如是这样,你能够经过运转scripts/add_long_password脚本改正这种情况。
用户有一个旧式的口令(8个字符长)而且你没运用–old-protocol选项发动mysqld。用一个新口令更新在user表中的用户或用–old-protocol重启mysqld。
你没有运用PASSWORD()函数在在user表中指定了一个口令。运用mysql以一个新口令更新在user表中的用户。保证运用PASSWORD()函数:
mysql update user set password=PASSWORD(’your password’)
where user=’XXX’;

18.2.10 Table ’xxx’ doesn’t exist过错
假如你得到过错Table ’xxx’ doesn’t exist或Can’t find file: ’xxx’ (errno: 2),这意味着在当时数据库中没有名为xxx的表存在。
留意,由于MySQL运用目录和文件存储数据库和表,数据库和表名件是区别巨细写的!(在Win32上,数据库和表名不是区别巨细写的,可是在查询中对一切表的引证有必要运用相同的巨细写!)
你能够用SHOW TABLES查看你在当时数据库中有哪个表。见7.21 SHOW句法(得到表、列的信息)。
18.3 MySQL怎样处理一个溢出的磁盘
当呈现一个磁盘溢出的情况时,MySQL做下列作业:
它每分钟查看一次看是否有满足空间写入当时行。假如有满足的空间,它持续如同发作什么作业。
每6分钟它将有关磁盘溢出的正告写入日志文件。
为了平缓这个问题,你能够采纳下列举动:
持续,你只需开释满足的闲暇磁盘空间以便刺进一切记载。
扔掉线程,你有必要发一个mysqladmin kill到线程。鄙人一次查看磁盘时,线程将被扔掉(在1分钟内)。
留意,其他线程或许正在等候引起“磁盘溢出”条件的表。假如你有几个“断定的”的线程,杀死正在等候磁盘溢出条件的那个线程将答应其他线程持续。

18.4 怎么从一个文本文件运转SQL指令
一般地,mysql客户被交互性地运用,象这样:
shell mysql database
可是,也能够把你的SQL指令放在一个文件中而且通知mysql从该文件读取其输入。要想这样做,发明一个文本文件“text_file”,它包含你想要履行的指令。然后如下那样调用mysql:
shell mysql database text_file

你也能发动有一个USE db_name句子的文本文件。在这种情况下,在指令行上指定数据库名是不必要的:
shell mysql text_file

见12.1 不同的MySQL程序概述。

18.5 MySQL在哪儿存储暂时文件
MySQL 运用TMPDIR环境变量的值作为存储暂时文件的目录的途径名。假如你没有设置TMPDIR,MySQL运用体系缺省值,它一般是“/tmp”或 “/usr/tmp”。假如包含你的暂时文件目录的文件体系太小,你应该批改safe_mysqld设定TMPDIR指向你有满足空间的一个文件体系!你 也能够运用mysqld的–tmpdir选项目设置暂时目录。
MySQL以“隐含文件”创立一切暂时文件。这保证了假如mysqld被中止,暂时文件也将被删去。运用隐含文件的缺陷是你将看不到一个大的暂时文件填满了暂时文件目录地点的文件体系。
当排序(ORDER BY或GROUP BY)时,MySQL一般运用一个或两个暂时文件。最大磁盘空间需求是:
(存储东西的长度 + sizeof (数据库指针))
* 匹配的行数
* 2

sizeof(数据库指针)一般是4,可是在未来对的确很大的表或许添加。
对一些SELECT查询,MySQL也创立暂时SQL表。这些没被隐含且有“SQL_*”格局的姓名。
ALTER TABLE和OPTIMIZE TABLE在原数据库表的同一个目录中创立一张暂时表。

18.6 怎样维护“/tmp/mysql.sock ”不被删去
假如你有这个问题,事实上任何人能够删去MySQL通讯套接字“/tmp/mysql.sock”,在Unix的大多数版别上,你能经过为其设置sticky(t)位来维护你的“/tmp”文件体系。作为root登录而且做下列作业:
shell chmod +t /tmp

这将维护你的“/tmp”文件体系使得文件仅能由他们的一切者或超级用户(root)删去。
你能履行ls -ld /tmp查看sticky位是否被设置,假如最终一位答应位是t,该位被设置了。

18.7 Access denied过错
见6.6 权限体系怎么作业。而且特别要看6.13 引起Access denied过错的原因。

18.8 怎样作为一个一般用户运转MySQL
MySQL效劳器mysqld能被任何用户发动并运转。为了将mysqld改由Unix用户user_name来运转,你有必要做下列作业:
假如它正在运转,中止效劳器(运用mysqladmin shutdown)。
改动数据库目录和文件以便user_name有权限读和写文件(你或许需求作为Unix的root用户才干做到):
shell chown -R user_name /path/to/mysql/datadir

假如在MySQL数据目录中的目录或文件是符号链接,你也将需求顺着那些链接并改动他们指向的目录和文件。chown -R不能跟从符号链接。
以user_name用户发动效劳器,或假如你正在运用MySQL 3.22或今后版别,以Unix root用户发动mysqld并运用–user=user_name选项,mysqld将在承受任何衔接之前切换到以Unix user_name用户运转。
假如在体系被从头发动时,你运用mysql.server脚本发动mysqld,你应该批改mysql.server用su以用户user_name运转mysqld,或运用–user选项调用mysqld。(不改动safe_mysqld是必要的。)
现在,你的mysqld进程应该正在作为Unix用户user_name运转,并运转无缺。虽然有一件作业没有改动:权限表的内容。缺省 地(就在运转了脚本mysql_install_db装置的权限表后),MySQL用户root是仅有有存取mysql数据库或创立或扔掉数据库权限的用 户。除非你改动了那些权限,不然他们依然坚持。当你作为一个Unix用户而不是root登录时,这不应该阻挠你作为MySQL root用户来存取MySQL;只要为客户程序指定-u root的选项。
留意经过在指令行上供给-u root,作为root存取MySQL,与作为Unix root用户或其他 Unix用户运转MySQL没有关系。MySQL的存取权限和用户名与Unix用户姓名是彻底分隔的。仅有与Unix用户名有关的是,假如当你调用一个客 户程序时,你不供给一个-u选项,客户将企图运用你的Unix登录名作为你的MySQL用户名进行衔接。
假如你的Unix机器自身不安全,你或许应该至少在存取表中为MySQL root用户放上一个口令。不然,在那台机器上有一个帐号的任何用户能运转mysql -u root db_name而且做他喜爱做的任何作业。

18.9 怎样从头设置一个忘掉的口令
假如你忘掉了MySQL的root用户的口令,你能够用下列进程康复它。
经过发送一个kill(不是kill -9)到mysqld效劳器来封闭mysqld效劳器。pid 被保存在一个.pid文件中,一般在MySQL数据库目录中:
kill `cat /mysql-data-directory/hostname.pid`

你有必要是一个UNIX root用户或运转效劳器的相同用户做这个。
运用–skip-grant-tables选项重启mysqld。
用mysql  -h hostname mysql衔接mysqld效劳器而且用一条GRANT指令改动口令。见7.26 GRANT和REVOKE句法。你也能够用 mysqladmin -h hostname -u user password ’new password’ 进行。
用mysqladmin -h hostname flush-privileges或用SQL指令FLUSH PRIVILEGES来装载权限表。

18.10 文件答应权限问题
假如你有与文件答应有关的问题,例如,假如当你创立一张表时,mysql宣布下列过错音讯:
ERROR: Can’t find file: ’path/with/filename.frm’ (Errcode: 13)

那么或许是在mysqld发动时,环境变量UMASK或许设置不正确。缺省的umask值是0660。你能够如下发动safe_mysqld改动其行为:
shell UMASK=384  # = 600 in octal
shell export UMASK
shell /path/to/safe_mysqld

18.11 文件没找到
假如你从MySQL得到ERROR ’…’ not found (errno: 23), Can’t open file: …  (errno: 24)或任何其他有errno 23或errno 24的过错,它意味着,你没有为MySQL分配满足的文件描绘符。你能运用 perror实用程序得到过错号意义是什么的描绘:
shell perror 23
File table overflow
shell perror 24
Too many open files

这儿的问题是mysqld正在企图一起坚持翻开太多的文件。你也能够通知mysqld一次不翻开那么多的文件,或添加mysqld可得到的文件描绘符数 量。为了通知mysqld一次坚持翻开更少的文件,你能够经过运用safe_mysqld的-O table_cache=32选项(缺省值是64)使表缓冲更小。减小max_connections值也将削减翻开文件的数量(缺省值是90)。
要想改动mysqld可用的文件描绘符数量,批改safe_mysqld脚本。脚本中有一条注释了的行ulimit -n 256。你能够删去’#’字符来去掉该行的注释,而且改动数字256改动为mysqld可用的文件描绘符的数量。
ulimit 能添加文件描绘符的数量,可是只能到操作体系强加的束缚。假如你需求添加每个进程可用的文件描绘符数量的OS束缚,拜见你的操作体系文档。留意,假如你运 行tcsh外壳,ulimit将不作业!当你恳求当时束缚时,tcsh也将陈述不正确的值!在这种情况下,你应该用sh发动safe_mysqld!

18.12 运用DATE列的问题
一个DATE值的格局是’YYYY-MM-DD’。依据ANSI SQL,不答应其他格局。你应该在UPDATE表达式和SELECT句子的WHERE子句中运用这个格局。例如:
mysql SELECT * FROM tbl_name WHERE date = ’1997-05-05’;

为了便利,假如日期用在数字上下文,MySQL主动改换一个日期到一个数字(而且反过来也如此)。当更新时和将一个日期与TIMESTAMP、DATE或 DATETIME列比较的一个WHERE子句中,也是满足灵敏以答应一种“宽松”的字符串格局。(宽松格局意味着任何标点字符用作在部件之间的切割符。例 如,’1998-08-15’和’1998#08#15’是等价的。)MySQL也能改换不包含切割符的一个字符串(例如 ’19980815’),假如它作为一个日期说得通。特别日期’0000-00-00’能够作为’0000-00-00’被存储和检索。当经过 MyODBC运用一个’0000-00- 00’日期时,在MyODBC 2.50.12和以上版别,它将主动被转换为NULL,由于ODBC不能处理这种日期。
由于MySQL实行了上述的改换,下列句子能够作业:
mysql INSERT INTO tbl_name (idate) VALUES (19970505);
mysql INSERT INTO tbl_name (idate) VALUES (’19970505’);
mysql INSERT INTO tbl_name (idate) VALUES (’97-05-05’);
mysql INSERT INTO tbl_name (idate) VALUES (’1997.05.05’);
mysql INSERT INTO tbl_name (idate) VALUES (’1997 05 05’);
mysql INSERT INTO tbl_name (idate) VALUES (’0000-00-00’);

mysql SELECT idate FROM tbl_name WHERE idate = ’1997-05-05’;
mysql SELECT idate FROM tbl_name WHERE idate = 19970505;
mysql SELECT mod(idate,100) FROM tbl_name WHERE idate = 19970505;
mysql SELECT idate FROM tbl_name WHERE idate = ’19970505’;

可是,下列将不作业:
mysql SELECT idate FROM tbl_name WHERE STRCMP(idate,’19970505’)=0;

STRCMP()是字符串函数,因而它将idate转换为一个字符串而且施行字符串比较。它不将’19970505’转换为一个日期并施行日期比较。
留意,MySQL不查看日期是否正确。假如你存储一个不正确的日期,例如’1998-2-31’,过错的日期将被存储。假如日期不能被改换到任何合理的值,在DATE字段中存储一个0。这主要是一个速度问题而且咱们以为查看日期是应用程序的职责,而不效劳器。

18.13 时区问题
假如你有一个问题,SELECT NOW()以GMT时刻回来值而不是你的本地时刻,你有必要设定TZ环境变量为你的当时时区。这应该在效劳器运转的环境进行,例如在safe_mysqld或mysql.server中。

18.14 在查找中的巨细写灵敏性
缺省地,MySQL查找是巨细写不灵敏的(虽然有一些字符集历来不是疏忽巨细写的,例如捷克语)。这意味着,假如你用col_name LIKE ’a%’ 查找,你将得到一切以A或a开端的列值。假如你想要使这个查找巨细写灵敏,运用象INDEX(col_name, “A”)=0查看一个前缀。或假如列值有必要切当是”A”,运用STRCMP(col_name, “A”) = 0。
简略的比较操作( =、 、= 、 、 =、排序和聚合)是根据每个字符的“排序值”。有相同排序值的字符(象E,e和’e)被视为相同的字符!
LIKE比较在每个字符的大写值上进行(Ee 可是E ’e)。
假如你想要一个列总是被当作巨细写灵敏的办法,声明它为BINARY。见7.7 CREATE TABLE句法。
假如你运用以所谓的big5编码的中文数据,你要使一切的字符列是BINARY,它可行,是由于big5编码字符的排序次序根据 ASCII代码的次序。

18.15 NULL值问题
NULL值的概念是形成SQL的新手的混杂的遍及原因,他们常常以为NULL是和一个空字符串’’的相同的东西。不是这样的!例如,下列句子是彻底不同的:
mysql INSERT INTO my_table (phone) VALUES (NULL);
mysql INSERT INTO my_table (phone) VALUES (“”);

两个句子把值刺进到phone列,可是第一个刺进一个NULL值而第二个刺进一个空字符串。第一个的意义能够以为是“电话号码不知道”,而第二个则可意味着“她没有电话”。
在SQL中,NULL值在于任何其他值乃至NULL值比较时总是假的(FALSE)。包含NULL的一个表达式总是发作一个NULL值,除非在包含在表达式中的运算符和函数的文档中指出。鄙人列比如,一切的列回来NULL:
mysql SELECT NULL,1+NULL,CONCAT(’Invisible’,NULL);

假如你想要寻觅值是NULL的列,你不能运用=NULL测验。下列句子不回来任何行,由于对任何表达式,expr = NULL是假的:
mysql SELECT * FROM my_table WHERE phone = NULL;

要想寻觅NULL值,你有必要运用IS NULL测验。下例显现怎么找出NULL电话号码和空的电话号码:
mysql SELECT * FROM my_table WHERE phone IS NULL;
mysql SELECT * FROM my_table WHERE phone = “”;

在MySQL 中,就像许多其他的SQL效劳器相同,你不能索引能够有NULL值的列。你有必要声明这样的列为NOT NULL,而且,你不能刺进NULL到索引的列中。当用LOAD DATA INFILE读取数据时,空列用’’更新。假如你想要在一个列中有NULL值,你应该在文本文件中运用\N。字面词’NULL’ 也能够在某些景象下运用。见7.16 LOAD DATA INFILE句法。当运用ORDER BY时,首要呈现NULL值。假如你用DESC以降序排序,NULL值最终显现。当运用GROUP BY时,一切的NULL值被以为是持平的。为了有助于NULL的处理,你能运用IS NULL和 IS NOT NULL运算符和IFNULL()函数。
对某些列类型,NULL值被特别地处理。假如你将NULL刺进表的第一个TIMESTAMP列,则刺进当时的日期和时刻。假如你将NULL刺进一个AUTO_INCREMENT列,则刺进次序中的下一个数字。

18.16 alias问题
你能够在GROUP BY、ORDER BY或在HAVING部分中运用别号引证列。别号也能够用来为列取一个更好点的姓名:
SELECT SQRT(a*b) as rt FROM table_name GROUP BY rt HAVING rt
SELECT id,COUNT(*) AS cnt FROM table_name GROUP BY id HAVING cnt
SELECT id AS “Customer identity” FROM table_name;

留意,你的 ANSI SQL 不答应你在一个WHERE子句中引证一个别号。这是由于在WHERE代码被履行时,列值还或许没有完结。例如下列查询是不合法:SELECT id,COUNT(*) AS cnt FROM table_name WHERE cnt   0 GROUP BY id;

WHERE句子被履行以断定哪些行应该包含GROUP BY部分中,而HAVING用来决议应该只用成果调集中的哪些行。

18.17 从相关的表中删去行
由于MySQL不支撑子挑选或在DELETE句子中运用多个表,你应该运用下列办法从2个相关的表中删去行:
在主表中根据某个WHERE条件SELECT行。
在主表中根据相同的条件DELETE行。
DELETE FROM related_table WHERE related_column IN (selected_rows)
假如在related_column查询中的字符的悉数数量超越1,048,576(缺省值max_allowed_packet),你应该分红更小的部 分而且履行多个DELETE句子。假如related_column是一个索引,你每次只删去100-1000个related_column id将或许使得DELETE最快。假如related_column不是一个索引,速度与IN子句中参数的数量无关。

18.18 处理没有匹配行的问题
假如你有一个杂乱的查询,触及多个表,但没有回来任何行,你应该运用下列进程查找你的问询有什么不对:
EXPLAIN测验查询而且查看你是否能找出显然是过错的一些东西。见7.22 EXPLAIN句法(得到关于一个SELECT的信息)。
仅挑选那些在WHERE子句中运用的字段。
一次从查询中删去一个表,直到它回来一些行。假如表很大,对查询运用LIMIT 10是一个好主意。
对应该现已匹配一行的列做一个SELECT,针对从问询中做后被删去的表。
假如你将FLOAT或DOUBLE列与有小数的数字进行比较,你不能运用=!。这个问题在大多数计算机语言是常见的,由于浮点值不是精确的值。
mysql SELECT * FROM table_name WHERE float_column=3.5;
-
mysql SELECT * FROM table_name WHERE float_column between 3.45 and 3.55;

在大多数情况下,将FLOAT改成一个DOUBLE将批改它!
假如你依然不能发现过错是什么,创立一个最小的可运转mysql test query.sql的测验来显现你的问题。你能够用 mysqldump –quick database tables query.sql创立一个测验文件,在一个批改器批改文件,删去一些刺进行(假如有太多这些句子)而且在文件结尾参加你的挑选句子。测验你依然有问题, 能够这样做:
shell mysqladmin create test2
shell mysql test2 query.sql

运用mysqlbug的邮递测验文件到mysql@lists.mysql.com。

18.19 与ALTER TABLE有关的问题
假如ALTER TABLE死于这样一个过错:
Error on rename of ’./database/name.frm’ to ’./database/B-a.frm’ (Errcode: 17)

问题或许是MySQL在前一个ALTER TABLE中现已溃散而且留下了一个名为“A-xxx”或“B-xxx”的老的数据库表。在这种情况下,到MySQL数据目录中并删去一切姓名以A-或B-开端的文件。(你能够把他们移到其他当地而不是删去他们)。
ALTER TABLE作业办法是:
以要求的改动创立一个名为“A-xxx”的新表。
从老表把一切行拷贝到“A-xxx”。
老表被改名为“B-xxx”。
“A-xxx”被改名为你的老表的姓名。
“B-xxx”被删去。
假如某些改名操作犯错,MySQL企图复原改动。假如犯错严峻(当然,这不应该发作。),MySQL或许留下了老表为“B-xxx”可是一个简略改名就应该康复你的数据。

18.20 怎样改动一张表中列的次序
SQL的关键是中笼统应用程序以防止数据存储格局。你应该总是以你想要检索数据的志愿指定次序。例如:
SELECT col_name1, col_name2, col_name3 FROM tbl_name;

将以col_name1、col_name2、col_name3的次序回来列,而:
SELECT col_name1, col_name3, col_name2 FROM tbl_name;

将以col_name1、col_name3、col_name2的次序回来列。
在一个应用程序中,你应该决不根据他们的方位运用SELECT * 检索列,由于被回来的列的次序永久不能保证;对你的数据库的一个简略改动或许导致你的应用程序适当有戏剧性地失利。
不管怎样,假如你想要改动列的次序,你能够这样做:
以正确的列次序创立一张新表。
履行INSERT INTO new_table SELECT fields-in-new_table-order FROM old_table.
删去或改名old_table。
ALTER TABLE new_table RENAME old_table。

mysql常见过错提示及处理办法

130 :文件格局不正确。(还不是很清楚过错的情况)

145 :文件无法翻开。

1005:创立表失利。

1006:创立数据库失利。

1007:数据库已存在,创立数据库失利。

1008:数据库不存在,删去数据库失利。

1009:不能删去数据库文件导致删去数据库失利。

1010:不能删去数据目录导致删去数据库失利。

1011:删去数据库文件失利。

1012:不能读取体系表中的记载。

1016:文件无法翻开,运用后台批改或许运用 phpmyadmin 进行批改。

Quote:
开端= 一切程序= 附件= 指令提示符
输入 mysql 地点硬盘盘符
cd mysql 地点目录
cd bin
输入 myisamchk -f D:usr/local/mysql/data/bbs/PW_members.MYI
ps : D:usr/local/mysql/data/bbs 是你论坛数据库的途径
-f 依据详细情况挑选,一般也能够挑选 -r
留意你的 体系C盘或放数据库的硬盘空间是否满足,一般小于 1G 很简单呈现过错。
或用mysqlcheck指令进行批改。详细的办法:运用指令行进入mysql/bin目录,履行
mysqlcheck -o -r phpwind -uroot -p
其间phpwind是你数据库的称号,root是你的数据库用户名,然后会提示你输入暗码。然后就会批改你的数据库。

1017:效劳器非法关机,导致该文件损坏。

1020:记载已被其他用户批改。

1021:硬盘剩下空间缺乏,请加大硬盘可用空间。

1022:关键字重复,更改记载失利。

1023:封闭时发作过错。

1024:读文件过错。

1025:更改姓名时发作过错。

1026:写文件过错。

1030:或许是效劳器不稳定。(详细原因不是很清楚)

1032:记载不存在。

1036:数据表是只读的,不能对它进行批改。

1037:体系内存缺乏,请重启数据库或重启效劳器。

1038:用于排序的内存缺乏,请增大排序缓冲区。

1040:已抵达数据库的最大衔接数,请加大数据库可用衔接数。

Quote:
在my.ini 批改max_connections=100为max_connections=1000或更大,重启mysql

1041:体系内存缺乏。

1042:无效的主机名。

1043:无效衔接。

1044:数据库用户权限缺乏,请联络空间商处理。

1045:数据库效劳器/数据库用户名/数据库名/数据库暗码过错,请联络空间商查看帐户。

Quote:
办法:保证论坛data目录下的sql_config.php用户名与暗码都正确.假如用户忘掉了数据库的暗码,能够按如下办法进行暗码的批改:
假如 MySQL 正在运转,首要中止。
发动 MySQL :bin/safe_mysqld –skip-grant-tables
就能够不需求暗码就进入 MySQL 了。
然后就是
use mysql
update user set passWord=password(“new_pass”) where user=”root”;
flush privileges;

1046:没有挑选数据库。

1048:字段不能为空。

1049:数据库不存在。

1050:数据表已存在。

1051:数据表不存在。

1054:字段不存在,自行树立字段。

1060:字段重复,导致无法刺进这个字段。

1062:字段值重复,入库失利

1064:MySQL 不支撑过错提示中的编码。

1065:无效的 SQL 句子,SQL 句子为空。

1067:MySQL 版别为 5,不支撑空的默许值。

1081:不能树立 Socket 衔接。

1114:数据表已满,不能包容任何记载。

1115:设置的字符集在 MySQL 并没有支撑。

1116:翻开的数据表太多。

1129:数据库呈现异常,请重启数据库。

1130:衔接数据库失利,没有衔接数据库的权限。

1133:数据库用户不存在。

1135:或许是内存不满足,请联络空间商处理。

1141:当时用户无权拜访数据库。

1142:当时用户无权拜访数据表。

1143:当时用户无权拜访数据表中的字段。

1146:数据表缺失,请康复备份数据

1147:未定义用户对数据表的拜访权限。

1149:SQL 句子语法过错。

1158:网络过错,呈现读过错,请查看网络衔接情况。

1159:网络过错,读超时,请查看网络衔接情况。

1160:网络过错,呈现写过错,请查看网络衔接情况。

1161:网络过错,写超时,请查看网络衔接情况。

1169:字段值重复,更新记载失利。

1177:翻开数据表失利。

1180:提交业务失利。

1181:回滚业务失利。

1193:不支撑字符集限制(SET NAMES)。

1203:当时用户和数据库树立的衔接已抵达数据库的最大衔接数,请增大可用的数据库衔接数或重启数据库。

1205:加锁超时。

1211:当时用户没有创立用户的权限。

1216:外键束缚查看失利,更新子表记载失利。

1217:外键束缚查看失利,删去或批改主表记载失利。

1226:当时用户运用的资源已超越所答应的资源,请重启数据库或重启效劳器。

1227:权限缺乏,您无权进行此操作。

1235:MySQL版别过低,不具有本功用。

1250:客户端不支撑效劳器要求的认证协议,请考虑晋级客户端。

1251:Client 不能支撑 authentication protocol 的要求
Client does not support authentication protocol requested by server; consider upgrading MySQL client

Quote:
办法1:mysql SET PASSWORD FOR
- ‘ some_user ‘@’ some_host ‘ = OLD_PASSWORD(‘ newpwd ‘);

结合咱们的实际情况,在 MySQL Command Line Client 下运转:

set password for root@localhost = old_password(’123456′);

办法2:

mysql UPDATE mysql.user SET Password = OLD_PASSWORD(‘newpwd’)
- WHERE Host = ‘some_host’ AND User = ‘some_user’;
mysql FLUSH PRIVILEGES;

上面赤色的部分请按自己实际情况批改。

1267:不合法的混合字符集。

2002:效劳器端口不对,请咨询空间商正确的端口。

2003:MySQL 效劳没有发动,请发动该效劳。

2008:MySQL client ran out of memory
过错指向了MySQL客户mysql。这个过错的原因很简略,客户没有满足的内存存储悉数成果。

2013:长途衔接数据库是有时会有这个问题,MySQL 效劳器在履行一条 SQL 句子的时分失去了衔接形成的。

10048:

Quote:
主张在my.ini文件中批改最大衔接数,
把 mysql_connect() 办法都改成了 mysql_pconnect() 办法.

要批改mysql_pconnect(),能够在论坛的data目录的sql_config.php中
$pconnect = 0; //是否耐久衔接
批改成$pconnect = 1;
敞开防改写,禁止改写太快.

10055:没有缓存空间可运用

Quote:
查看下你的C盘空间是否现已满,铲除一些没有用的文件.
能够在后台的”论坛中心设置”,”中心功用设置”里”进程优化”敞开,”GZIP 紧缩输出”封闭.
查找了一下10055(没有缓存空间可运用)犯错的原因,剖析了my.ini的制造文件,在my.ini中如下:
default-storage-engine=INNODB
innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=10M
innodb_log_file_size=10M
innodb_thread_concurrency=8
觉得能够把innodb_buffer_pool_size=10M 加大如100M或是1000M
以上是对mysql5的

假如是mysql4能够在my.ini中添加如下:
#innodb_data_file_path = ibdata1:2000M;ibdata2:2000M
#innodb_data_home_dir = c:ibdata
#innodb_log_group_home_dir = c:iblogs
#innodb_log_arch_dir = c:iblogs
#set-variable = innodb_mirrored_log_groups=1
#set-variable = innodb_log_files_in_group=3
#set-variable = innodb_log_file_size=5M
#set-variable = innodb_log_buffer_size=8M
#innodb_flush_log_at_trx_commit=1
#innodb_log_archive=0
#set-variable = innodb_buffer_pool_size=16M
#set-variable = innodb_additional_mem_pool_size=2M
#set-variable = innodb_file_io_threads=4
#set-variable = innodb_lock_wait_timeout=50
把前面的#去了

10061:

Quote:
发动这台机器上的MySQL效劳
如效劳发动失利
一定是你的my.ini文件出了过失,
MySQL效劳不能正常发动
你删去了它后,MySQL就会按其默许装备运转,
那就没有问题了

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表亚美娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章