请问MYSQL数据库中如何恢复 急 谢

解决方案 »

  1.   

    用备份恢复数据 如果表损坏但没丢失,尝试用myisamchk或isamchk修复它们,如果这样的损坏可有修复程序修复,你可能根本不需要使用备份文件。关于表修复的过程,见《数据库维护与修复》。 
    恢复过程涉及两种信息源:你的备份文件和个更新日志。备份文件将表恢复到实施备份时的状态,然而一般表在备份与发生问题之间的时间内已经被修改,更新日志包含了用于进行这些修改的查询。你可以使用日志文件作为mysql的输入来重复查询。这已正是为什么要启用更新日志的原因。 
    恢复过程视你必须恢复的信息多少而不同。实际上,恢复整个数据库比单个表跟容易,因为对于数据库运用更新日志比单个表容易。 
     恢复整个数据库 首先,如果你想恢复的数据库是包含授权表的mysql数据库,你需要用--skip-grant-table选项运行服务器。否则,它会抱怨不能找到授权表。在你已经恢复表后,执行mysqladmin flush-privileges告诉服务器装载授权标并使用它们。 
    将数据库目录内容拷贝到其它某个地方,如果你在以后需要它们。 
    用最新的备份文件重装数据库。如果你用mysqldump产生的文件,将它作为mysql的输入。如果你用直接从数据库拷贝来的文件,将它们直接拷回数据库目录,然而,此时你需要在拷贝文件之前关闭数据库,然后重启它。 
    使用更新日志重复做备份以后的修改数据库表的查询。对于任何可适用的更新日志,将它们作为mysql的输入。指定--one-database选项使得mysql只执行你有兴趣恢复的数据库的查询。如果你知道你需要运用所有更新日志文件,你可以在包含日志的目录下使用这条命令: % ls -t -r -1 update.[0-9]* | xargs cat | mysql --one-database db_name ls命令生成更新日志文件的一个单列列表,根据服务器产生它们的次序排序(主意:如果你修改任何一个文件,你将改变排序次序,这导致更新日志一错误的次序被运用。) 
    很可能你会是运用某几个更新日志。例如,自从你备份以来产生的更新日志被命名为update.392、update.393等等,你可以这样重新运行: 
    %mysql --one-database db_name < update.392 
    %mysql --one-database db_name < update.393 
    ..... 
    如果你正在实施恢复且使用更新日志恢复由于一个错误建议的DROP DATABASE、DROP TABLE或DELETE语句造成丢失的信息,在运用更新日志之前,要保证从其中删除这些语句。
      

  2.   

    如果你的表没有丢失可以用一下方法修复。这是数据表的修复方法:
    数据表的修复
    作者:bombshell
    日期:2002-01-01注意:在修复表之前要靠被他们,注意备份,切记!1.标准的表修复
     a.试着用 --recover选项修复表,可以加上 --quick选项试图只根据索引的内容进行修复,这样做不触及数据文件。
       % myisamchk --recover --quick table_name
       or 
       % isamchk --recover --quick table_name
     b.如果问题还存在,在试一下上一步命令,但是要忽略 --quick选项,这样允许修改数据文件。
       % myisamchk --recover table_name
       or 
       % isamchk --recover table_name
     c.如果还不工作,试一下 --safe-recover 修复方法。但这种方法比普通方法要慢,但能修复 --recover不能修复的问题。
       % myisamchk --safe-recover table_name
       or 
       % isamchk --safe-recover table_name
    如果在myisamchk or isamchk 由于一个"can't create new temp file:file_name"的错误消息在任何一步停止,应该重复该命令并
    加入 --force选项强迫清除临时文件。2.如果标准修复失败这样做
     a.定位到包含崩溃表的数据库目录中。
     b.将该表的数据文件移到安全的地方。
     c.调用mysql并通过执行下列语句重新创建新的空表,该语句使用表的描述文件
       tbl_name.frm重新开始生成新的数据和索引文件。
       mysql>delete from tbl_name;
     d.退出mysql,将原始的数据文件移回到数据目录中,替换刚建的新的空文件。
     e.在世这样用标准修复方法。为了修复表的描述文件,可先从备份文件中恢复,然后再用标准修复方法。
    如果由于某些原因没有备份,如果知道create table 语句,仍然可以恢复该文件:
    a.定位到包含崩溃表的数据库目录中。
    b.将该表的数据文件移到安全的地方。如果想使用用索引的话,还需要把索引文件移走。
    c.调用mysql 发布create table 语句重建表。
    d.退出mysql,将原始的数据文件移回到数据目录中,替换刚才新建的数据文件。如果在第2不中移动了索引文件,则也要讲起移回到
      数据库目录中。
    e.在尝试标准表修复方法。以上方法针对mysql有效,请大家注意。建索引的目的是为了更好的查询,但是不要盲目建索引,有时候适得其反。
    遵循这样的原则:
    1.搜索的索引列,不一定是索要选择的列
      例如:select col_a from tbl1 left join tbl2 on   tbl1.col_b=tbl2.col_c
      where col_d=expr
    在这查询重视合作索引列的是tbl1.col_b and tbl2.col_c and col_d
    2.使用唯一索引:对于唯一值的列,索引的效果最好,而具有多个重复值的列
      其索引效果最差。
    3.使用短索引:应该指定一个前缀的长度,只要有可能就应该这样做
      例如:varchar(100)列,对前10个或者20个字符内,多数值是唯一的那就不要对整个列索引。
    4.利用最左索引:在创建n列的索引时,实际是创建了mysql可利用的n个索引,多列索引可以起几个索引的作用,因为可以利用索引中最左边的列集来匹配。
     ps: mysql不能使用不涉及左前缀的搜索。
    5.不要过渡索引:
      每个额外的索引都是要占额外的磁盘空间,并降低写操作的性能。
    6.考虑在列上进行比较的类型:
      索引可用于"<"、"<="、"="、">="、">"和 between 运算。本人卓见,仅供参考!
      

  3.   

    我把两个东东放到一起了,一不小心把优化查询的也帖出来了!!sorry!