MySQL常见错误问答_第1页
免费预览已结束,剩余7页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、mysql常见错误问答18.2.10 table 'xxx' doesn't ist 假如你得到错误table 'xxx' doesn't exist 或can't : 'xxx' (errno: 2) ,这意味着在当前数据库中没出名为xxx 的表存在。 注重,由于mysql 用法名目和文件存储数据库和表,数据库和表名件是区别大小写的 !(在win32上,数据库和表名不是区别大小写的,但是在查询中对全部表的引用必需用法相同的大小写!) 你可以用show tables 检查你在当前数据库中有哪个表。见7.21 show 句法

2、(得到表、列的信息)。 18.3 mysql怎样处理一个溢出的磁盘 当浮现一个磁盘溢出的状况时,mysql 做下列事情: 它每分钟检查一次看是否有足够空间写入当前行。假如有足够的空间,它继续好似发生什么事情。 每6分钟它将有关磁盘溢出的警告写入日志文件。 为了缓和这个问题,你可以实行下列行动: 继续,你只需释放足够的空闲磁盘空间以便插入全部记录。 放弃线程,你必需发一个mysqladmin 到线程。在下一次检查磁盘时,线程将被放弃(在1分钟内)。 注重,其他线程可能正在等待引起“磁盘溢出”条件的表。假如你有几个“锁定的”的线程,杀死正在等待磁盘溢出条件的那个线程将允许其他线程继续。 18.4

3、如何从一个文本文件运行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在哪儿存储

4、暂时文件 mysql 用法tmpdir 环境变量的值作为存储暂时文件的名目的路径名。假如你没有设置tmpdir ,mysql 用法系统缺省值,它通常是“/tmp” 或“/usr/tmp” 。假如包含你的暂时文件名目的文件系统太小,你应当编辑safe_mysqld 设定tmpdir 指向你有足够空间的一个文件系统!你也可以用法mysqld的-tmpdir 选项目设置暂时名目。 mysql 以“隐含文件”创建全部暂时文件。这保证了假如mysqld 被终止,暂时文件也将被删除。用法隐含文件的缺点是你将看不到一个大的暂时文件填满了暂时文件名目所在的文件系统。 当排序(order by 或group b

5、y )时,mysql 通常用法一个或两个暂时文件。最大磁盘空间需求是: (存储东西的长度 + sizeof (数据库指针) * 匹配的行数 sizeof(数据库指针) 通常是4,但是在将来对的确很大的表可能增强。 对一些select 查询,mysql 也创建暂时sql表。这些没被隐含且有“sql_*” 格式的名字。 alter table 和optimize table 在原数据库表的同一个名目中创建一张暂时表。 18.6 怎样庇护“/tmp/mysql.sock ” 假如你有这个问题,实际上任何人可以删除mysql 通讯套接字“/tmp/mysql.sock” ,在unix的大多数版本上,你

6、能通过为其设置sticky (t)位来庇护你的“/tmp” 文件系统。作为root 登录并且做下列事情: shell +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

7、用户user_name 来运行,你必需做下列事情: 假如它正在运行,停止服务器(用法mysqladmin shutdown 转变数据库名目和文件以便user_name 有权限读和写文件(你可能需要作为unix的root 用户才干做到): shell -r user_name /path/to/mysql/datadir 假如在mysql 数据名目中的名目或文件是符号链接,你也将需要顺着那些链接并转变他们指向的名目和文件。chown -r 不能尾随符号链接。 以user_name 用户启动服务器,或假如你正在用法mysql 3.22或以后版本,以unix root 用户启动mysqld 并用法-

8、user=user_name 选项,mysqld 将在接受任何衔接之前切换到以unix user_name 用户运行。 假如在系统被重新启动时,你用法mysql.server 脚本启动mysqld ,你应当编辑mysql.server 以用户user_name 运行mysqld ,或用法-user 选项调用mysqld 。(不转变safe_mysqld 是须要的。) 现在,你的mysqld 进程应当正在作为unix用户user_name 运行,并运行完好。尽管有一件事情没有变幻:权限表的内容。缺省 地(就在运行了脚本mysql_install_db 安装的权限表后),mysql 用户root

9、是唯一有存取mysql 数据库或创建或抛弃数据库权限的用户。除非你转变了那些权限,否则他们仍然保持。当你作为一个unix用户而不是root 登录时,这不应当阻挡你作为mysql root 用户来存取mysql ;只要为客户程序指定-u root 的选项。 注重通过在指令行上提供-u root ,作为root 存取mysql ,与作为unix root 用户或其他unix用户运行mysql 。mysql 的存取权限和用户名与unix用户名字是彻低分开的。唯一与unix用户名有关的是,假如当你调用一个客户程序时,你不提供一个-u 选项,客户将试图用法你的unix登录名作为你的mysql 用户名举行

10、衔接。 假如你的unix机器本身担心全,你可能应当起码在存取表中为mysql root 用户放上一个口令。否则,在那台机器上有一个帐号的任何用户能运行mysql -u root db_name 并且做他喜爱做的任何事情。 18.9 怎样重新设置一个遗忘的口令 假如你遗忘了mysql 的root 用户的口令,你可以用下列过程复原它。 通过发送一个kill (不是kill -9 )到mysqld 服务器来关闭mysqld服务器。p 被保存在一个.pid 文件中,通常在mysql 数据库名目中: kill /mysql-data-directory/hostname.pid 你必需是一个unix r

11、oot 用户或运行服务器的相同用户做这个。 用法-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 文件许可权限问题 假如你有与文件许可

12、有关的问题,例如,假如当你创建一张表时,mysql 发出下列错误消息: error: can't find file: 'path/with/filename.f' (errcode: 13) 那么可能是在mysqld 启动时,环境变量umask 可能设置不正确。缺省的值是0660 。你可以如下启动safe_mysqld 转变其行为: shell umask=384 = 600 in octal shell umask shell /path/to/safe_mysqld 18.11 文件没找到 假如你从mysql 得到error '.' not fou

13、nd (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 一次保

14、持打开更少的文件,你可以通过用法safe_mysqld 的-o table_cache=32 选项(缺省值是64)使表缓冲更小。减小max_connections 值也将削减打开文件的数量(缺省值是90)。 要想转变mysqld 可用的文件描述符数量,修改safe_mysqld 脚本。脚本中有一条注释了的行 -n 256 。你可以删除'' 字符来去掉该行的注释,并且转变数字256转变为mysqld 可用的文件描述符的数量。 ulimit 能增强文件描述符的数量,但是只能到操作系统强加的限制。假如你需要增强每个进程可用的文件描述符数量的os限制,参见你的操作系统文档。 注重,假如

15、你运行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 自动变换一个日期到一个数字(并且反过来也如此)。当更

16、新时和将一个日期与timestamp 、date 或datetime 列比较的一个where 子句中,也是足够灵便以允许一种“宽裕”的字符串格式。(宽裕格式意味着任何标点字符用作在部件之间的分割符。例如,'1998-08-15' 和'19980815' 是等价的。)mysql 也能变换不包含分割符的一个字符串(例如 '19980815' ),假如它作为一个日期说得通。 特别日期'0000-00-00' 可以作为'0000-00-00' 被存储和检索。 当通过myodbc 用法一个'0000-00-00

17、9; 日期时,在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

18、) 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 sele

19、ct 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 不

20、检查日期是否正确。假如你存储一个不正确的日期,例如'1998-2-31' ,错误的日期将被存储。假如日期不能被变换到任何合理的值,在date 字段中存储一个0 。这主要是一个速度问题并且我们认为检查日期是应用程序的责任,而不服务器。 18.13 时区问题 假如你有一个问题,select now() 以gmt时光返回值而不是你的本地时光,你必需设定tz 环境变量为你的当前时区。这应当在服务器运行的环境举行,例如在safe_mysqld 或mysql.server 中。 18.14 在搜寻中的大小写敏感性 缺省地,mysql 搜寻是大小写不敏感的(尽管有一些字符集从来不是忽视大小写

21、的,例如捷克语 )。这意味着,假如你用col_name like 'a%' 搜索,你将得到全部以a 开头的列值。假如你想要使这个搜寻大小写敏感,用法象index(col_name, "a")=0 检查一个前缀。或假如列值必需确切是"a" ,用法strcmp(col_name, "a") = 0 。 容易的比较操作( =、 、= 、 、 = 、排序和聚合)是基于每个字符的“排序值”。有同样排序值的字符(象e,e和'e)被视为相同的字符! like 比较在每个字符的大写值上举行(e=e 但是e 'e)。 假

22、如你想要一个列总是被当作大小写敏感的方式,声明它为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_tabl

23、e (phone) values (""); 两个语句把值插入到phone 列,但是第一个插入一个null 值而其次个插入一个空字符串。第一个的含义可以认为是“电话号码不知道”,而其次个则可意味着“她没有电话”。 在sql中,null 值在于任何其他值甚至null 值比较时总是假的(false)。包含null 的一个表达式总是产生一个null 值,除非在包含在表达式中的运算符和函数的文档中指出。在下列例子,全部的列返回null : mysql select null,1+null,concat('invisible',null); 假如你想要寻觅值是null

24、 的列,你不能用法=null 测试。下列语句不返回任何行,由于对任何表达式, = 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 句法。 当用法ord

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论