网页功能: 加入收藏 设为首页 网站搜索  
MySQL常见问题集锦解答及技巧
发表日期:2005-03-15作者:[转贴] 出处:  

一、认知篇
  MYSQL初学者使用指南与介绍
  学习MySQL常用操作命令
  学习MySQL多表操作和备份处理
  Mysql数据库学习心得(1)
  Mysql数据库学习心得(2)


  二、常见问题集锦

  MySQL总是崩溃

  首先你应该试着找出问题mysqld守护进程是否死掉或你的问题是否与你的客户有关。你可以用mysqladmin version检查你的mysqld服务器正常执行了多长时间,如果mysqld死了,你可以在文件“mysql-data-directory/'hostname'.err”中找到其原因。

  使用MySQL时的一些常见错误

  MySQL server has gone away

  常见的原因是服务器超时了并且关闭了连接。缺省地,如果没有事情发生,服务器在 8个小时后关闭连接。你可在启动mysqld时通过设置wait_timeout变量改变时间限制。

  如果mysqld得到一个太大或不正常的包,它认为客户出错了并关闭连接。

  Can't connect to [local] MySQL server

  通常意味着没有一个MySQL服务器运行在系统上或当试图连接mysqld服务器时,你正在使用一个错误的套接字文件或TCP/IP端口。

  检查(使用ps)服务器上是否有一个名为mysqld的进程启动

  如果一个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命令中。
  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 &


  Too many connections错误

  意味着已经有max_connections个客户连接了mysqld服务器。

  如果你需要比缺省(100)更多的连接,那么你应该重启mysqld,用更大的 max_connections 变量值。


  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。这个错误的原因很简单,客户没有足够的内存存储全部结果。

  首先检查你的查询是否正确

  Packet too large错误


  一个MySQL客户或mysqld服务器得到一个比max_allowed_packet个字节长的包

  可以通过用mysql --set-variable=max_allowed_packet=8M指定一个更大的缓冲区来启动客户程序。


  The table is full错误

  这个错误发生在内存临时表变得比tmp_table_size字节大时。

  Commands out of sync in client错误

  正在以错误的次序调用客户函数!

  Ignoring user错误

Found wrong password for user: _user@some_host'">'some_user@some_host'; Ignoring user

  这意味着在mysqld启动时或在它再次装载权限表时,它在user表中找到了一个有一个无效口令的条目。结果,条目简单地被权限系统忽略。

  Table 'xxx' doesn't exist错误

  数据库和表名件是区分大小写的!可以用SHOW TABLES检查你在当前数据库中有哪个表。


  从一个文本文件运行SQL命令

  可以把SQL命令放在一个文件中并且告诉mysql从该文件读取其输入:创造一个文本文件“text_file”,它包含要执行的命令。然后如下调用mysql:

shell> mysql database < text_file

  或

shell> mysql < text_file

  启动有USE db_name语句的文本文件。


  怎样重新设置一个忘记的口令

  如果忘记了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来装载权限表。


  使用DATE列的问题

  DATE值的格式是'YYYY-MM-DD'。


  改变一张表中列的顺序

  在一个应用程序中,应该决不基于他们的位置使用SELECT * 检索列,因为被返回的列的顺序永远不能保证;对数据库的一个简单改变可能导致应用程序相当有戏剧性地失败。

  可以使用如下方法改变:

  以正确的列顺序创建一张新表。

  执行INSERT INTO new_table SELECT fields-in-new_table-order FROM old_table.

  删除或改名old_table。

  ALTER TABLE new_table RENAME old_table。

  数据库复制

  MySQL(至今)没有数据库复制,但是有一些如何实现的信息。

  复制一个数据库最一般的方法是使用更新日志。

  数据库备份

  为了得到一个一致的备份,在相关的表上做一个LOCK TABLES。你只需一个读锁定;当你在数据库目录中做文件的一个拷贝时,这允许其他线程继续查询该表。如果你想要做一个SQL级的备份,你可以SELECT INTO OUTFILE。

  备份一个数据库的另一个方法是使用mysqldump程序:

  为你的数据库做一个完整的备份:

shell> mysqldump --tab=/path/to/some/dir --opt --full

 
  你也可以简单地拷贝所有的表文件(“*.frm”、“*.MYD”和“*.MYI”文件),只要服务器不在更新任何东西。

  停止mysqld如果它正在运行,然后以--log-update选项启动它。你将得到一个名为“hostname.n”形式的日志文件, 这里n是随着你每次执行mysqladmin refresh或mysqladmin flush-logs、FLUSH LOGS语句、或重启服务器而递增的一个数字。这些日志文件向你提供了在你执行mysqldump处后面进行的复制数据库改变的所需信息。

  如果你必须恢复一些东西,尝试首先用myisamchk -r恢复你的表。这应该处理所有情况的99.9%。如果myisamchk失败,尝试下列过程:


  恢复原来的mysqldump备份。

  执行下列命令以再次运行更新日志中的更改:

shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql


  ls被用来以正确的顺序得到所有的日志文件。


  你也可以与SELECT * INTO OUTFILE 'file_name' FROM tbl_name做有选择的备份并且用LOAD DATA INFILE 'file_name' REPLACE ...恢复。为了避免重复记录,在表中你需要一个PRIMARY KEY或UNIQUE键。当在唯一键值上一个新记录与一个老记录重复时,REPLACE关键词使得老记录用一个新记录替代。

  三、MySQL惯用技巧

_blank>用delphi解决MySQL数据库中无图形界面的问题
_blank>MySQL索引分析和优化
_blank>去掉MySQL中的噪声
_blank>PHP页面时而工作,时而不工作
_blank>创建一个带有MUL列的表
_blank>MyISAM和外键支持
_blank>添加并不存在于公司图表里的公司雇员
_blank>MERGE图表的性能
_blank>在同一台服务器上的MySQL和Active Directory
_blank>更新和删除的层叠
_blank>触发器和MySQL
_blank>从处理日志中恢复记录
_blank>分析索引
_blank>带有子查寻的1064查寻错误
_blank>得到错误1006: 不能生成数据库
_blank>管理MySQL的GUI工具
_blank>MySQL是关联的吗?
_blank>将SQL Server的安装迁移到MySQL
_blank>MySQL的存储过程支持
_blank>MySQL中的SQL-- TEXT、DATE、和SET数据类型
_blank>使用MySql ODBC进行MYsql和MS sql7的数据转换

 

我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 MySQL常见问题集锦解答及技巧
本类热点文章
  MySQL Join详解
  Mysql 内部函数的使用
  MySQL Cluster(MySQL 集群) 初试
  MySQL常见问题集锦解答及技巧
  MySQL索引分析和优化
  学习MySQL常用操作命令
  MySQL中各种字段的取值范围
  MySQL数据库优化五步走
  破解本地的mysql用户名和密码
  MySQL 常用命令
  MySQL数据库安全配置
  一个Mysql自动备份脚本
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2022 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00382