zoukankan      html  css  js  c++  java
  • mysql数据恢复

    场景:意外操作导致mysql启动异常,数据库损坏,无法使用。
     解决:

    我们知道MySQL中如果用的是MYISAM数据引擎,那么数据很好恢复,只要将相应.frm, .MYD, .MYI文件拷贝过去即可。但是如果是innodb的话,如果开启innodb_file_per_table=1,则每一个数据表都是一个单独的文件,比如User表,则会建立User.frm和User.ibd.

    那么直接拷贝这两个文件到新的MySQL数据目录下可以吗,一般来说是不行的,那么什么时候可以呢?只有在你的ibd文件的tablespace id和ibdata1文件中的元信息的tablespace id一致才可以。

    那么怎么办呢?根据之前讲的,innodb恢复不了就是因为table space id不匹配导致的。所以我们可以这样做 (以zhc_db数据库为例):

    1 首先将当前mysql数据目录下的ibdata1文件和zhc_db下边的frm和ibd文件备份。

    2 将之前要恢复的ibdata1和frm和ibd文件拷贝到当前的mysql数据目录下,进行覆盖。注意因为当前数据库可能还有其它数据库和表,所以这一步可能导致其它数据库出现问题。不过没关系,因为我们已经备份了。

    3 保险起见,重启一下mysql吧,service mysql restart

    4 直接登录到zhc_db数据库,mysql -u root -p zhc_db; 这时候你就可以show tables和select了,激动了吧,看到你的数据了吧。

    5 将此数据库用mysqldump导出,mysqldump -u root -p[password] zhc_db > dump_zhc_db.sql

    好了,你已经有了以前的数据和表定义。

    6 最后一步,别忘了,将ibdata1文件和zhc_db下边的文件用之前的备份进行恢复。

    7 重启mysql,然后你就可以将你的数据进行导入了。注意目录的权限一定是MySQL可读写的。

    8 后来操作的时候,发现只能读取数据库的内容,不能更改写入任何信息,提示#1036 – Table ‘* ‘ is read only (*号为任意表),也就是说表只有只读属性。
    通过SSH,给数据库文件777权限,dedeadmin是我的数据库文件夹

    chmod -R 0777 /usr/local/mysql/var/dedeadmin/

    给数据库目录的所属用户和组改为MySQL

    chown -R mysql:mysql dedeadmin

    但是这样还不能更改数据库,首先,找到mysqladmin所在位置,一般都在mysql/bin下面,我的在/usr/local/mysql/bin 里面,还需要运行以下命令:

    ./mysqladmin -u root -p flush-tables

    之后输入root账号的密码,马上就好了,没有任何任何提示,然后测试一下,能正常读写,搬家也就顺利完

  • 相关阅读:
    Team Foundation Server 2010完整装机过程
    Horovod介绍
    学习笔记 【Min_25 筛】
    Educational Codeforces Round 117
    C#打造秒杀腾讯的仿QQ界面,从此独孤求败
    C# ListView控件的间隔色和自动适应宽度
    jQuery1.6.1源码分析系列
    优雅框架授权验证页面
    多个DataTable的合并成一个新表
    教你自定义绘制TreeView
  • 原文地址:https://www.cnblogs.com/xjh713/p/6377682.html
Copyright © 2011-2022 走看看