精华内容
下载资源
问答
  • 精讲 MYSQL数据恢复

    千次阅读 2012-07-12 15:19:09
    MYSQL数据库毁坏发生的原因有许多,...在其他情况下也需要MYSQL数据恢复操作,例如,当用户错误地删除数据库或表时,或者错误地删除表的内容时。不论这些不幸的事件发生是由于什么原因,都需要MYSQL恢复它们。  如

    MYSQL数据库毁坏发生的原因有许多,且程度各不相同。如果幸运的话,可能是一两个表的小毁坏(例如,如果您的机器由于断电而暂时停机)。如果不是这样,可能需要置换整个的数据目录(例如,如果某个磁盘瘫痪而且数据目录在它上)。在其他情况下也需要MYSQL数据恢复操作,例如,当用户错误地删除数据库或表时,或者错误地删除表的内容时。不论这些不幸的事件发生是由于什么原因,都需要MYSQL恢复它们。

      如果表被毁坏但没有丢失,可试着用myisamchk或isamchk来修复它们。如果修复实用程序能修复它们,就根本挥斜匾褂帽阜菸募1淼男薷垂探诘?3章讨论。如果表被丢失或不能修复,则需要恢复它们。

      MYSQL数据恢复过程包括两个信息源:备份文件和更新日志。备份文件将表恢复到进行该备份时的状态。但是,在备份和故障发生这段时间中,表通常已经被修改。更新日志包含了用来完成这些修改的查询。可以通过将更新日志作为对mysql的输入来重复这些查询(这就是为什么

      应该允许更新日志的原因。如果您还没有使更新日志有效,现在赶快做,并在进一步读取之前生成一个新的备份)。

      MYSQL数据恢复过程根据必须恢复的信息的多少而变化。事实上,恢复整个数据库比恢复单个的表要容易,因为对数据库应用更新日志比对表要容易。

      MYSQL数据恢复整个数据库

      首先,如果要恢复的数据库是含有授权表的mysql数据库,将需要使用--skip-grant-tables选项运行服务器。否则,服务器将抱怨无法找到授权表。在MYSQL数据恢复表之后,执行mysqladminflush-privileges来告诉服务器加载授权表,并用它们启动。

      将原数据库目录的内容拷贝到其他的地方。例如,您可能会在稍后用它们进行崩溃表的事后分析检查(post-mortemexamination)。

      用最新的备份文件重新加载数据库。如果您打算使用由mysqldump加载的文件,则需要将它们作为mysql的输入。如果打算使用从数据库中直接拷贝的文件(如,用tar或cp),则将它们直接拷贝回到该数据库目录中。但是,在这种情况下,应该在拷贝这些文件之前关闭服务器,然后再重新启动它。

      用更新日志重做在进行备份后又修改了数据库表的查询。对于所有可用的更新日志,可使用它作为mysql的输入。指定--one-database选项,使mysql只对想要MYSQL数据恢复的数据库执行查询。如果您知道需要使用所有的更新日志文件,可在包含日志的目录中使用

      下列命令:

      %ls-t-r-lupdate.(0-9)*|xargscat|mysql--one-databasedb_name

      ls命令产生更新日志文件的单列列表,更新日志文件根据服务器生成的顺序进行排序(要知道,如果您修改了其中的任何文件,排序的顺序都将改变,这将导致更新日志按错误的顺序使用)。

      您很可能必须使用某些更新日志。例如,如果自备份以来所产生的日志命名为update.392、update.393等等,可以重新运行它们中的命令:

      %mysql--one-databasedb_name<updata.392< p="">

      %mysql--one-databasedb_name<updata.393< p="">

      如果正在运行恢复并打算使用更新日志恢复由于失策的DROPDATABASE、DROPTABLE或DELETE语句而丢失的信息,应确保先从更新日志中删除这些语句。

      MYSQL数据恢复单个的表

      恢复单个表是很困难的。如果有通过mysqldump生成的备份文件并且它恰好不包含您想要的表数据,则需要抽取相关的行并用它们作为mysql的输入,这部分较容易。困难的是抽取应用于该表的更新日志的片段。您会发现:mysql_find_rows实用程序对这方面有帮助,它可以从更新日志中抽取多行查询。

      另一种可能性是用另一个服务器MYSQL数据恢复整个数据库,然后将所要的该表的文件拷贝到原始数据库中。这实际很容易!在将文件拷贝回数据库目录时,应确保原始数据库的服务器关闭。

    展开全文
  • MySQL数据恢复--binlog

    万次阅读 2014-03-07 23:16:14
    * 数据恢复 * 主从数据库。用于slave端执行增删改,保持与master同步。 1.开启binary log功能  需要修改mysql的配置文件,本篇的实验环境是win7,配置文件为mysql安装目录\MySQL Server 5.1下的

    MySQL Binary Log也就是常说的bin-log,,是mysql执行改动产生的二进制日志文件,其主要作用有两个:
    * 数据恢复
    * 主从数据库。用于slave端执行增删改,保持与master同步。

    1.开启binary log功能

         需要修改mysql的配置文件,本篇的实验环境是win7,配置文件为mysql安装目录\MySQL Server 5.1下的my.ini,添加一句log_bin = mysql_bin即可
         eg:
         [mysqld]
                 ......
                 log_bin = mysql_bin
                 ......
           log_bin是生成的bin-log的文件名,后缀则是6位数字的编码,从000001开始,按照上面的配置,生成的文件则为:
                 mysql_bin.000001
                 mysql_bin.000002
                 ......
     
        配置保存以后重启mysql的服务器,用show variables like  '%bin%'查看bin-log是否开启,如图: 


    2.查看产生的binary log

       bin-log因为是二进制文件,不能通过记事本等编辑器直接打开查看,mysql提供两种方式查看方式,在介绍之前,我们先对数据库进行一下增删改的操作,否则log里边数据有点空。
       create table bin( id int(10) primary key auto_increment,name varchar(255));(测试前我已经建表)
       insert into bin(name) values ('orange');

         1.在客户端中使用  show binlog events in 'mysql_bin.000001'  语句进行查看,为了排序美观,可以在结尾加\G使结果横变纵,此时结尾无需加;语句结束符。
          eg:
    mysql> show binlog events in 'mysql_bin.000001'\G
    ...............省略...............
    *************************** 3. row ***************************
       Log_name: mysql_bin.000001
            Pos: 174
    Event_type: Intvar
      Server_id: 1
    End_log_pos: 202
          Info: INSERT_ID=2
    *************************** 4. row ***************************
       Log_name: mysql_bin.000001
            Pos: 202
    Event_type: Query
      Server_id: 1
    End_log_pos: 304
           Info: use `test`; insert into bin(name) values ('orange')
    *************************** 5. row ***************************
    ...............省略...............
    Log_name:此条log存在那个文件中,从上面可以看出这2条log皆存在与mysql_bin.000001文件中。
    Pos:log在bin-log中的开始位置
    Event_type:log的类型信息
    Server_id:可以查看配置中的server_id,表示log是那个服务器产生
    End_log_pos:log在bin-log中的结束位置
    Info:log的一些备注信息,可以直观的看出进行了什么操作

    2.用mysql自带的工具mysqlbinlog,这是我们就需要知道bin-log存在硬盘的什么位置,win7默认存在C:\ProgramData\MySQL\MySQL Server 5.1\data文件夹下面,如果没有此文件夹,那我们可以通过配置文件中的  datadir="C:/ProgramData/MySQL/MySQL Server 5.1/Data/" 定位,如果还没有,那我就会说“各个系统的搜索功能都做的不错!”。这种查看方式就没那个美观了,如下

    C:\ProgramData\MySQL\MySQL Server 5.1\data>mysqlbinlog mysql_bin.000001
    /*!40019 SET @@session.max_insert_delayed_threads=0*/;
    /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
    DELIMITER /*!*/;
    # at 4
    #140215 16:35:56 server id 1  end_log_pos 106   Start: binlog v 4, server v 5.1.51-community-log created 140215 16:35:56 at startup
    ROLLBACK/*!*/;
    BINLOG '
    7Mp7UA8BAAAAZgAAAGoAAAAAAAQANS4xLjUxLWNvbW11bml0eS1sb2cAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAADsyntQEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC
    '/*!*/;
    # at 106
    #140215 16:36:51 server id 1  end_log_pos 174   Query   thread_id=2     exec_time=0     error_code=0
    SET TIMESTAMP=1350290211/*!*/;
    SET @@session.pseudo_thread_id=2/*!*/;
    SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
    SET @@session.sql_mode=1344274432/*!*/;
    SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
    /*!\C utf8 *//*!*/;
    SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
    SET @@session.lc_time_names=0/*!*/;
    SET @@session.collation_database=DEFAULT/*!*/;
    BEGIN
    /*!*/;
    # at 174
    #140215 16:36:51 server id 1  end_log_pos 202   Intvar
    SET INSERT_ID=3/*!*/;
    # at 202
    #140215 16:36:51 server id 1  end_log_pos 309   Query   thread_id=2     exec_time=0     error_code=0
    use test/*!*/;
    SET TIMESTAMP=1350290211/*!*/;
    insert into bin(name) values('xishizhaohua')
    /*!*/;
    # at 309
    #140215 16:36:51 server id 1  end_log_pos 336   Xid = 28
    COMMIT/*!*/;
    # at 336
    #140215 16:37:25 server id 1  end_log_pos 379   Rotate to mysql_bin.000002  pos: 4
    DELIMITER ;
    # End of log file
    ROLLBACK /* added by mysqlbinlog */;
    /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

    虽然排版有点乱,但从图中我们可以得到更多信息,如时间戳,自增的偏移,是否自动提交事务等信息。如下图为从中提取的一部分。


    3.利用bin_log恢复数据(date与position)

        1.最长用的就是恢复指定数据端的数据了,可以直接恢复到数据库中:
        mysqlbinlog  --start-date="2014-02-18 16:30:00" --stop-date="2014-02-18 17:00:00" mysql_bin.000001 |mysql -uroot -p123456
          亦可导出为sql文件,再导入至数据库中:
          mysqlbinlog  --start-date="2014-02-18 16:30:00" --stop-date="2014-02-18 17:00:00" mysql_bin.000001 >d:\1.sql
          source d:\1.sql
          2.指定开始\结束位置,从上面的查看产生的binary log我们可以知道某个log的开始到结束的位置,我们可以在恢复的过程中指定回复从A位置到B位置的log.需要用下面两个参数来指定:
        --start-positon="50" //指定从50位置开始
        --stop-postion="100"//指定到100位置结束

       最后介绍几个bin_log的操作:
       1.查看最后一个bin日志文件是那个,现在位置。

    show master status;

      2.启用新的日志文件,一般备份完数据库后执行。

    flush logs;

    3.清空现有的所用bin-log 

    reset master;
     

    展开全文
  • python3.6对MySQL数据恢复

    千次阅读 2017-04-25 19:54:00
    上一篇博客讲了关于python3.6对数据库的备份,这一篇讲一下对数据库的简单数据恢复,备份请看上一篇。 数据库的备份和数据恢复是一对相反的操作,如果你会了一种那么另一种自然就融会贯通了。   import os ...

    上一篇博客讲了关于python3.6对数据库的备份,这一篇讲一下对数据库的简单数据恢复,备份请看上一篇。

    数据库的备份和数据恢复是一对相反的操作,如果你会了一种那么另一种自然就融会贯通了。

     

    import os
    
    path = "选择你的sql文件位置"
    #简单的恢复关键代码其实就下面这一行mysqldump换为mysql 用户名 密码 你要恢复到的数据库名 < sql文件
    os.system("mysql -uname -ppassword database_name < %s.sql" % path)


    由于许之前初学编程及数据库,代码出现了冗余问题,现在有朋友指出,已改正,恢复当然还有其他的方法,这里只讲这一种简单的执行代码,已经很久没有看数据库了,如果后面再学习会对这些内容进行充实。

     

    展开全文
  • mysql数据恢复或数据找回方法

    千次阅读 2018-04-11 15:16:23
    注意:在恢复全备数据之前必须刷新该库binlog,否则恢复过程中,可能会继续写入语句到binlog,最终导致增量恢复数据部分变得比较混乱1、关闭应用,取出全量备份和binlog(腾讯cdb全备的position无法自行定位,需要提...

    注意:在恢复全备数据之前必须刷新该库binlog,否则恢复过程中,可能会继续写入语句到binlog,最终导致增量恢复数据部分变得比较混乱

    1、关闭应用,取出全量备份和binlog(腾讯cdb全备的position无法自行定位,需要提工单腾讯技术支持)
    2、flush logs ; 刷新binlog
    3、解析binlog,根据时间或其他方法(如:全备时使用--master-data或--dump-slave参数)确定全量备份时的position;
    4、收集binlog中从全量备份点到最后的sql(删除误操作相关部分);
    5、恢复全量备份;(可考虑新建一个库,待数据恢复后确认无误,再恢复到生产库,做好备份!)
    6、执行从binlog中获取的sql,恢复增量数据;
    参考命令:mysql -uroot -p test_db <002bin.sql
    7、flush logs ; 再次刷新binlog
    8、恢复应用。(如果有从库,需要考虑从库同步问题)


    如果使用的是腾讯云数据库,目前其cdb的全量备份未记录备份时刻的position,需要提交工单给腾讯技术后台确认......蛋疼。为掌握主动,于是采取了如下处理方式,避免耽误时间。

    1、为腾讯云数据库搭建一个从库,不是直接在其cdb上买一个从库,是自己在本地或云服务器上搭建一个slave;(如果是在本地搭建slave,需要cdb开放公网访问,存在安全隐患,建议在云主机上搭建)

    2、在从库定时执行全备作业,在备份文件内记录备份时刻主库的binlog文件及position;

    3、利用定时作业备份生成的全备恢复基准数据;

    4、利用云数据库上下载的binlog,结合第二点记录的position,增量恢复业务数据。

    5、如果是数据找回,在binlog里面找到误操作或需要找回的sql,第四点时执行从position到误删除之前的sql,找回数据。


    脚本参考:

    在云主机上为腾讯云数据库搭建从库参考:

    http://bbs.qcloud.com/forum.php?mod=viewthread&tid=4108&highlight=cdb


    解析binlog
    mysqlbinlog --no-defaults --skip-gtids=true mysql-bin.000002 -r 002bin.sql
    mysqlbinlog --no-defaults --skip-gtids=true mysql-bin.000002 > 002bin.sql
    ##实际应用时,解析后的binlog文件中每个事物开始前,都执行了SET @@SESSION.GTID_NEXT=操作来执行下一个要执行的GTID。但是这些GTID都已经存在数据库的Executed_Gtid_Set中(因为这些GTID都之前已经在实例上执行过),所以在执行解析后的binlog文件时,所有的事物都被忽略(已经存在于Executed_Gtid_Set集合中的GTID会跳过)。
      所以,在使用GTID时,如果我们想通过解析binlog来恢复数据的话,在使用mysqlbinlog解析binlog日志时需要指定--skip-gtids=true,这样的话解析出来的文件中就不会包含SET @@SESSION.GTID_NEXT=

    全量备份参考
    [root@vm ~]# mysqldump -u root -p -B -F -R -x --master-data=2 test_db|gzip >/opt/backup/test_db_$(date +%F).sql.gz
    Enter password: 
    [root@vm ~]# ls /opt/backup/
    test_db_2018-01-17.sql.gz
    -----------------
    参数说明:
    -B:指定数据库
    -F:刷新日志
    -R:备份存储过程等
    -x:锁表
    --master-data=2表示在dump过程中记录主库的binlog和pos点,并在dump文件中注释掉这一行;
    --master-data=1表示在dump过程中记录主库的binlog和pos点,并在dump文件中不注释掉这一行,即恢复时会执行;
    --dump-slave=2表示在dump过程中,在从库dump,mysqldump进程也要在从库执行,记录当时主库的binlog和pos点,并在dump文件中注释掉这一行;
    --dump-slave=1表示在dump过程中,在从库dump,mysqldump进程也要在从库执行,记录当时主库的binlog和pos点,并在dump文件中不注释掉这一行;
    注意:在从库上执行备份时,即--dump-slave=2,这时整个dump过程都是stop io_thread的状态

    mysqldump导出数据时,当这个参数(master-data)的值为1的时候,mysqldump出来的文件就会包括CHANGE MASTER TO这个语句,CHANGE MASTER TO后面紧接着就是file和position的记录,在slave上导入数据时就会执行这个语句,salve就会根据指定这个文件位置从master端复制binlog。默认情况下这个值是1
    当这个值是2的时候,chang master to也是会写到dump文件里面去的,但是这个语句是被注释的状态。

    --single-transaction:从5.1.13开始mysqldump指定--single-transaction备份时使用START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */ 来代替begin 开启一个事物,这样就能在备份的时候产生一个一致的快照



    在主库上导出,记录主库binlog及position
    mysqldump -uroot -p -B XX_db --master-data=2 --single-transaction --quick --skip-add-drop-table --force>/home/slavedbbak/XX_db_$(date +%F).sql

    在从库上导出,记录主库binlog及position
    mysqldump -uroot -p123456 -B xx_db oo_db --dump-slave=2 --single-transaction --quick --set-gtid-purged=OFF --skip-add-drop-table --force>/home/slavedbbak/all_$(date +%F).sql

    最后,总结几点:
    1)本案例适用于人为SQL语句造成的误操作或者没有主从复制等的热备情况宕机时的修复
    2)恢复条件为mysql要开启binlog日志功能,并且要全备和增量的所有数据
    3)恢复时建议对外停止更新,即禁止更新数据库
    4)先恢复全量,然后把全备时刻点以后的增量日志,按顺序恢复成SQL文件,然后把文件中有问题的SQL语句删除(也可通过时间和位置点),再恢复到数据库。

    展开全文
  • Linux 记录JAVA 与MYSQL 数据恢复与备份

    千次阅读 2018-05-17 16:21:25
    服务启动后一直提示表不存在,数据恢复后JAVA连接超时; java连接mysql 乱码;linux mysql 定时数据备份;一,mysql 无法启动 由于服务器异常,导致系统卡死,然后强制关机,在开机后无法启动mysql服务;可以通过...
  • 指定日期 mysqlbinlog mysql_bin.000001 --start-datetime='2019/08/02 00:00:00' --stop-datetime='2019/08/03 00:00:00' 指定数据库 mysqlbinlog -d test mysql_bin.000001
  • 记一次揪心的MySQL数据恢复过程

    千次阅读 2017-10-21 16:44:34
    其中一个MySQL实例(单机,无主从,windows server 2008,MySQL5.6.19)存放大量的日志数据,每天几十G的数据,定期清除(保存大概四个月的数据),由于硬盘空间不够,所以没有定期的备份。机房突然断电,启动MySQL ...
  • 重装系统后mysql数据恢复

    千次阅读 2014-10-19 12:11:36
    我怎么既能继续使用mysql又能将原来的数据转移到新安装的mysql上? 1、把原来mysql安装目录下的data文件夹拷出来; 2、卸载掉原来的mysql; 3、重新安装mysql; 4、拷出来的data文件夹里,除了mysql、test子...
  • Mysql数据恢复---闪回恢复

    千次阅读 2017-03-16 00:17:16
    使用过商业数据库oracle都知道,oracle有一个闪回功能非常好用,可以非常迅速的找回删除的数据或者删除的表,这个功能在线上要谨慎使用,除非是万般无奈之下才去使用,在转向使用mysql时发现,官方根本没有提供闪回...
  • 情况1: 如果阿里云RDS备份时间在你删除数据之后,那么根据日志备份里的binlog文件里来查找记录,那个是全的. 1.1 下载日志文件中的bin文件 1.2 在linux下 用下面的代码解码出来 xxxx 是日志的数字,不要在windows下!!...
  • MySQL数据恢复(通过.frm和.idb文件)

    万次阅读 2018-05-04 17:31:49
    转载自:https://www.2cto.com/database/201709/683413.html今天吐血向大家分享下mysql通过.frm和.ibd文件恢复数据的方法,因为之前电脑换系统的原因,忘记备份数据库,最后只能通过恢复工具找到数据库的.frm和.ibd...
  • 数据类型 Mysql 5.7 innodb表 数据大小 user表 5MB 故障检测 误删除了表记录。 客户要求 恢复全部的删除记录。 修复结果 frm ibd文件发来后,使用极佳innodb反删除记录恢复工具,成功恢复466条删除记录。 客户...
  • mysql如何数据恢复

    万次阅读 2020-06-04 20:06:39
    3.截取到误操作前面的二进制度日志,进行数据恢复 4.恢复业务 ==================== 基于mysqldump =================== 3.实现备份恢复 截取日志,查看上一次备份的日志信息,做日志截取的起点 mysql -uroot -p12
  • mysql删除表数据恢复

    万次阅读 2019-04-28 11:37:07
    实验模拟 该实验必须是mysql开启了binlog的情况。 binlog日志,即binary log,是二进制日志文件。...我们可以通过binlog日志恢复数据 查看mysql是否开启binlog语句 mysql> show variables like '...
  • 针对mysql 5.7.20 数据恢复

    千次阅读 2018-01-20 17:59:53
    恢复分为两部分:数据结构和数据 我们可以拿到的文件只有数据库中的.idb 和.frm 文件,并没有ibdata 以及ib_logfile文件 第一、首先恢复数据结构 搭建相同的数据库环境,新建test数据库,新建一张表,表名和...
  • mysql误操作删除数据后数据恢复

    千次阅读 2018-09-17 09:06:17
    关于误操作删除数据和数据恢复,一定要有安全意识,MySQL数据的找回,一定要在配置bin-log,否则数据丢失将无法恢复:  在MySQL的my.ini(或my.cnf,视操作系统不同而不同)添加:  [mysqld]  log-bin=binlog...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 187,057
精华内容 74,822
关键字:

mysql数据恢复

mysql 订阅