mysql还原数据的方法_MySQL 数据还原

1.1还原使用mysqldump命令备份的数据库的语法如下:

mysql -u root -p [dbname] < backup.sq

示例:

mysql -u root -p < C:\backup.sql

1.2还原直接复制目录的备份

通过这种方式还原时,必须保证两个MySQL数据库的版本号是相同的。MyISAM类型的表有效,对于InnoDB类型的表不可用,InnoDB表的表空间不能直接复制

2.1 时间点的恢复建立在一下规则的基础上:

1 mysql服务器需要开启二进制日志--log-bin

查看所有binlog文件

mysql> SHOW BINARY LOGS;

e3c5dfca5a9c433c1f5777d9c807b43d.png

查看当前binlog文件信息(包含文件名,当前位置等)

mysql> SHOW MASTER STATUS;

d29529735df261e48a90e3471822f1fc.png

2 mysqlbinlog工具将binary log文件由二进制转换为可读的文本文件,可以选择基于时间或位置的事件。

3 从binary log文件中执行事件会导致数据的修改,表示要重做数据。命令为:

[root@localhost /]# mysqlbinlog binlog_files | mysql -u root -p

4 查看binlog的时间及位置信息我们可以讲binlog内容输出到终端或文本文件

[root@localhost /]# mysqlbinlog binlog_files | more

[root@localhost /]# mysqlbinlog binlog_files > tmpfile

5 将二进制日志输出到文件非常有用,比如我们想要删除某些我们不想执行的语句。

通过文本文件导入到数据库

[root@localhost /]# mysql -u root -p 

2.2 多个binlog log日志的还原最好将所有文件使用一个连接完成,如果使用不同连接的话有时会导致不安全

例如:

[root@localhost /]# mysqlbinlog binlog.000001 | mysql -u root -p # DANGER!!

[root@localhost /]# mysqlbinlog binlog.000002 | mysql -u root -p # DANGER!!

如果第一个日志包含创建临时表语句CREATE TEMPORARY TABLE,第二个日志要使用该临时表,第一个导入binlog日志的进程退出后临时表会被删除,执行第二个日志文件要使用临时表时会因找不到而报 “unknown table.”

建议的方法:

方法1:

所有二进制文件放在单个连接里

[root@localhost /]# mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p

方法2:

将所有二进制文件写在一个文件里执行

[root@localhost /]# mysqlbinlog binlog.000001 >  /tmp/statements.sql

[root@localhost /]# mysqlbinlog binlog.000002 >> /tmp/statements.sql

[root@localhost /]# mysql -u root -p -e "source /tmp/statements.sql"

使用方法二如果二进制文件里包含GTID信息需要过滤掉

[root@localhost /]# mysqlbinlog --skip-gtids binlog.000001 >  /tmp/dump.sql

[root@localhost /]# mysqlbinlog --skip-gtids binlog.000002 >> /tmp/dump.sql

[root@localhost /]# mysql -u root -p -e "source /tmp/dump.sql"

3 通过时间点或位置点的恢复

如果我们要跳过某个时间段或位置段,需要指定起止时间或位置信息

3.1 通过事件的时间来恢复

我们可以通过参数--start-datetime 和 --stop-datetime指定恢复binlog日志的起止时间点,时间使用DATETIME格式。

比如在时间点2005-04-20 10:00:00我们删除掉一个库,我们要恢复该时间点前的所有日志

[root@localhost /]# mysqlbinlog --stop-datetime="2005-04-20 9:59:59" /usr/local/mysql/data/binlog.123456 | mysql -u root -p

我们可能几个小时后才发现该错误,后面又有一系列的增删查改等操作,我们还需要恢复后续的binlog,我们可以指定起始时间

[root@localhost /]# mysqlbinlog --start-datetime="2005-04-20 10:01:00" /usr/local/mysql/data/binlog.123456 | mysql -u root -p

通过该种方法恢复我们需要通过查看binlog日志知道发生误操作的确切时间点,查看日志我们可以先将日志输出到文本里

[root@localhost /]# mysqlbinlog /usr/local/mysql/data/binlog.123456 > /tmp/mysql_restore.sql

3.2 通过事件的位置来恢复

我们可以通过参数--start-position 和 --stop-position指定恢复binlog日志的起止位置点,通过位置的恢复需要我们有更加精细的操作,例如在某个时间点我们执行了错误的语句,且这个时间点前后都有大并发操作,要确定破坏性sql的时间点,我们可以先导出大致的时间段的日志到文件以缩小查找范围,再去分析和确定

[root@localhost /]# mysqlbinlog --start-datetime="2005-04-20 9:55:00"  --stop-datetime="2005-04-20 10:05:00" /usr/local/mysql/data/binlog.123456 > /tmp/mysql_restore.sql

确定好需要跳过的位置之后,我们就可以进行恢复了

[root@localhost /]# mysqlbinlog --stop-position=368312 /usr/local/mysql/data/binlog.123456 | mysql -u root -p

[root@localhost /]# mysqlbinlog --start-position=368315 /usr/local/mysql/data/binlog.123456 | mysql -u root -p

注:mysqlbinlog工具的输出会在每条sql语句前增加 SET TIMESTAMP语句,恢复的数据及mysql日志反映当前时间。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值