• 本网豪情赞助商

  • login failed for display 0 ubuntuallowed_u
  • css设定文本超出一行或多行就隐藏并显示省略
  • css设定文本超出一行或多行就隐藏并显示省略
  • 微信小程序如何把接口调用成功的回调函数返回
  • CodeIgniter - 数据库的增删改查
  • php生成excel的三种方式
  • 小程序UI库推荐
  • 多个句子竖向排列
  • 美团,大众点评,58城市行政区域和商圈数据实
  • java.security.InvalidKeyException: Illega
  • h3>

    MySQL损坏表修复(附录自动处理脚本)


    文章摘要: 个人分类: mysql Linux 公司的游戏所在机房意外断电,导致MySQL未正常关闭,使得很多MyISAM表损坏, 很多表如果全部修复(数据库很大需要很长的时间)那如果检查整个库在复制命令一个一个修复也浪费时间,最后写个脚本修复数据库。 Mysql 数据库 相信很多地


    文章TAG:

     

    mysqlcheck -uroot -ppassword bnbvistaspider -r;
    mysqlcheck -uroot -ppassword bnbvistautf8 -r

    公司的游戏所在机房意外断电,导致MySQL未正常关闭,使得很多MyISAM表损坏,很多表如果全部修复(数据库很大需要很长的时间)那如果检查整个库在复制命令一个一个修复也浪费时间,最后写个脚本修复数据库。

       Mysql 数据库 相信很多地方 都在用,在用的时候避免不了出现表的损坏,损坏之后我们就要修复。如果是单张表,我们使用命令轻易的修复。如果是其中 的一部分表那?最重要的是还不知道具体的那些表。如果 全库修复那花费很长很长的时间。下面就是我写的一个自动化修复脚本。

    mysql 进程在一个写入中被杀死、计算机意外关闭、硬件错误都能造成mysql表损坏 。

    mysql 修复表的各种方法

    1、mysqlcheck 进行表修复

    使用mysqlcheck 命令对表进行修复

     

    #mysqlcheck -uuser -ppassword database  table  -c  #检查单个表是否损坏
    #mysqlcheck -uuser -ppassword database  -c  #检查整个库那些表损坏
    首先检查数据库的那些表损坏,如果能定位到那张表损坏可以直接对表修复

     

     #mysqlcheck -uuser -ppassword database  table  -r # 修复数据表
    #mysqlcheck -uuser -ppassword database   -r # 修复整个数据库
    更多参数 查看 mysqlcheck –help
     

    2、myisamchk 修复mysql表

     
    Myisamchk是MyISAM表维护的一个非常实用的工具。可以使用myisamchk实用程序来获得有关数据库表的信息或检查、修复、优化他们。myisamchk适用MyISAM表(对应.MYI和.MYD文件的表)。
    Myisamchk 选项解释

    –debug=debug_options, -# debug_options
    输出调试记录文件。debug_options字符串经常是’d:t:o,filename’。

    –silent,-s
    沉默模式。仅当发生错误时写输出。

    –wait, -w
    如果表被锁定,不是提示错误终止,而是在继续前等待到表被解锁。
    如果不使用–skip-external-locking,可以随时使用myisamchk来检查表。当检查表时,所有尝试更新表的客户端将等待,直到myisamchk准备好可以继续。
    请注意如果用–skip-external-locking选项运行mysqld,只能用另一个myisamchk命令锁定表。

    –var_name=value
    可以通过–var_name=value选项设置下面的变量:

    –check, -c
    检查表的错误。如果你不明确指定操作类型选项,这就是默认操作。

    –check-only-changed, -C
    只检查上次检查后有变更的表。

    –extend-check, -e
    非常仔细地检查表。如果表有许多索引将会相当慢。

    –fast,-F
    只检查没有正确关闭的表。

    –force, -f
    如果myisamchk发现表内有任何错误,则自动进行修复。

    –information, -i
    打印所检查表的统计信息。

    –medium-check, -m
    比–extend-check更快速地进行检查。只能发现99.99%的错误

    –update-state, -U
    将信息保存在.MYI文件中,来表示表检查的时间以及是否表崩溃了。该选项用来充分利用–check-only-changed选项,
    但如果mysqld服务器正使用表并且正用–skip-external-locking选项运行时不应使用该选项。

    –read-only, -T
    不要将表标记为已经检查。如果你使用myisamchk来检查正被其它应用程序使用而没有锁定的表很有用

    –backup, -B
    将.MYD文件备份为file_name-time.BAK

    –character-sets-dir=path
    字符集安装目录。

    –correct-checksum
    纠正表的校验和信息。

    –data-file-length=len, -D len
    数据文件的最大长度

    –extend-check,-e
    进行修复,试图从数据文件恢复每一行。一般情况会发现大量的垃圾行。不要使用该选项,除非你不顾后果。

    –force, -f
    覆盖旧的中间文件(文件名类似tbl_name.TMD),而不是中断

    –keys-used=val, -k val
    对于myisamchk,该选项值为位值,说明要更新的索引。选项值的每一个二进制位对应表的一个索引,其中第一个索引对应位0。
    选项值0禁用对所有索引的更新,可以保证快速插入。通过myisamchk -r可以重新激活被禁用的索引。

    –parallel-recover, -p
    与-r和-n的用法相同,但使用不同的线程并行创建所有键。

    –quick,-q
    不修改数据文件,快速进行修复。

    –recover, -r
    可以修复几乎所有一切问题,除非唯一的键不唯一时(对于MyISAM表,这是非常不可能的情况)。如果你想要恢复表,
    这是首先要尝试的选项。如果myisamchk报告表不能用-r恢复,则只能尝试-o。
    在不太可能的情况下-r失败,数据文件保持完好)。

    –safe-recover, -o
    使用一个老的恢复方法读取,按顺序读取所有行,并根据找到的行更新所有索引树。这比-r慢些,
    但是能处理-r不能处理的情况。该恢复方法使用的硬盘空间比-r少。一般情况,你应首先用-r维修,如果-r失败则用-o。

    –sort-recover, -n
    强制myisamchk通过排序来解析键值,即使临时文件将可能很大。

    –analyze,-a
    分析键值的分布。这通过让联结优化器更好地选择表应该以什么次序联结和应该使用哪个键来改进联结性能。
    要想获取分布相关信息,使用myisamchk –description –verbose tbl_name命令或SHOW KEYS FROM tbl_name语句。

    –sort-index, -S
    以从高到低的顺序排序索引树块。这将优化搜寻并且将使按键值的表扫描更快。

    –set-auto-increment[=value], -A[value]
    强制从给定值开始的新记录使用AUTO_INCREMENT编号(或如果已经有AUTO_INCREMENT值大小的记录,应使用更高值)。
    如果未指定value,新记录的AUTO_INCREMENT编号应使用当前表的最大值加上1。

    –description, -d
    打印出关于表的描述性信息。

    检查表
      [root@nagios test]# myisamchk -e wpusers.MYI
    Checking MyISAM file: wpusers.MYI
    Data records:       1   Deleted blocks:       0
    - check file-size
    - check record delete-chain
    - check key delete-chain
    - check index reference
    - check data record references index: 1
    - check data record references index: 2
    - check data record references index: 3
    - check records and index references

     

     

    myisanchk修复表
      [root@nagios test]# myisamchk -r wpusers.MYI
    - recovering (with sort) MyISAM-table ‘wpusers.MYI’
    Data records: 1
    - Fixing index 1
    - Fixing index 2
    - Fixing index 3

     

    我只是加了一个参数,可以根据自己的需求添加参数。使用myisam --help参看详细的参数

    3、自动修复mysql 表脚本

    这个shell脚本,可以很方便的对多个数据库的表进行检查和修复,操作起来也非常方便,希望对大家有用
    
    					
    1.  
      #!/bin/sh
    2.  
      export LANG=zh_CN.UTF-8
    3.  
       
    4.  
      # 修改数据库配置
    5.  
      DB_SOCKET_PATH="/data/app/db"
    6.  
      DB_ROOT_USER="root"
    7.  
      DB_ROOT_PASS="123456"
    8.  
       
    9.  
      # 数据库数组 可以加多个数据库
    10.  
      databases=(${SERVER_MARK}_mobcc_user ${SERVER_MARK}_mobcc ${SERVER_MARK}_mobcc_activity)
    11.  
      for database in ${databases[@]}
    12.  
      do
    13.  
      tables=$(mysql --default-character-set=utf8 --socket=${DB_SOCKET_PATH}/mysql.sock -u${DB_ROOT_USER} -p${DB_ROOT_PASS} ${database} -A -Bse "show tables" )
    14.  
      for arg in $tables
    15.  
      do
    16.  
      check_status=$(mysql --default-character-set=utf8 --socket=${DB_SOCKET_PATH}/mysql.sock -u${DB_ROOT_USER} -p${DB_ROOT_PASS} ${database} -A -Bse "check table $arg" | awk '{ print $4 }' )
    17.  
      if [ "$check_status" = "OK" ]
    18.  
      then
    19.  
      echo "$arg is ok"
    20.  
      else
    21.  
      echo $(mysql --default-character-set=utf8 --socket=${DB_SOCKET_PATH}/mysql.sock -u${DB_ROOT_USER} -p${DB_ROOT_PASS} ${database} -A -Bse "repair table $arg")
    22.  
      fi
    23.  
      echo $(mysql --default-character-set=utf8 --socket=${DB_SOCKET_PATH}/mysql.sock -u${DB_ROOT_USER} -p${DB_ROOT_PASS} ${database} -A -Bse "optimize table $arg")
    24.  
      done
    25.  
      done
    26.  
       
    27.