阳光网驿-企业信息化交流平台【DTC零售连锁全渠道解决方案】

 找回密码
 注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

手机号码,快捷登录

老司机
查看: 1082|回复: 0

[转帖] MySQL常见问题集锦解答及技巧

[复制链接]
  • TA的每日心情
    开心
    2012-3-7 10:15
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2012-1-14 11:36:30 | 显示全部楼层 |阅读模式
    一、认知篇
      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  mysql  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关键词使得老记录用一个新记录替代。
    楼主热帖
    启用邀请码注册,提高发帖质量,建设交流社区
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表