MYSQL的恢复

本文详细介绍MySQL的备份与恢复过程,包括完全备份与增量备份的方法。通过执行备份文件进行恢复,利用mysqlbinlog工具解析二进制日志,实现精确到特定时间点或事件位置的数据恢复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MYSQL备份

恢复就简单多了! 只要执行该备份文件就行了,该备份文件是SQL哦!

恢复完全备份
mysql -uroot -p < backup.sql

就这么简单!

恢复增量备份
mysqlbinlog MySQL-bin.000002 … | MySQL -u root -p

注意此次恢复过程亦会写入日志文件,如果数据量很大,建议先关闭日志功能

增量恢复也是怎么简单的哦!

mysqlbinlog 这个工具是解析BINLOG二进制 翻译成SQL语句,然后管道给MYSQL去执行。

有的时候你想精确恢复到,那么下面就可以完成。

mysqlbinlog常见的选项有以下几个
--start-datetime:从二进制日志中读取指定等于时间戳或者晚于本地计算机的时间
--stop-datetime:从二进制日志中读取指定小于时间戳或者等于本地计算机的时间 取值和上述一样
--start-position:从二进制日志中读取指定position 事件位置作为开始。
--stop-position:从二进制日志中读取指定position 事件位置作为事件截至

开始时间我们知道了,那结束怎么知道呢?

方法一:使用mysqlbinlog读取binlog日志:
[root@vm-002 ~]# cd /var/lib/mysql/
[root@vm-002 mysql]# mysqlbinlog mysql-bin.000003

方法二:登录服务器,并查看(推荐此种方法)
mysql> show binlog events in 'mysql-bin.000003';

+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------------------------+
| mysql-bin.000003 | 4 | Format_desc | 1 | 106 | Server ver: 5.1.73-log, Binlog ver: 4 |
| mysql-bin.000003 | 106 | Query | 1 | 173 | BEGIN |
| mysql-bin.000003 | 173 | Intvar | 1 | 201 | INSERT_ID=3 |
| mysql-bin.000003 | 201 | Query | 1 | 444 | use `ops`; insert into ops.member(`name`,`sex`,`age`,`gsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6') |
| mysql-bin.000003 | 444 | Xid | 1 | 471 | COMMIT /* xid=66 */ |
| mysql-bin.000003 | 471 | Query | 1 | 538 | BEGIN |
| mysql-bin.000003 | 538 | Query | 1 | 646 | use `ops`; update ops.member set name='李四' where id= |
| mysql-bin.000003 | 646 | Xid | 1 | 673 | COMMIT /* xid=68 */ |
| mysql-bin.000003 | 673 | Query | 1 | 740 | BEGIN |
| mysql-bin.000003 | 740 | Query | 1 | 848 | use `ops`; update ops.member set name='小二' where id= |
| mysql-bin.000003 | 848 | Xid | 1 | 875 | COMMIT /* xid=69 */ |
| mysql-bin.000003 | 875 | Query | 1 | 954 | drop database ops |
| mysql-bin.000003 | 954 | Rotate | 1 | 997 | mysql-bin.000004;pos=4 |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------------------------+

通过分析,造成数据库破坏的pos点区间是介于 875--954 之间(这是按照日志区间的pos节点算的),只要恢复到875前就可

mysqlbinlog --stop-position=875  --database=zyyshop  MySQL-bin.000002

| MySQL -u root -p

--database=zyyshop 指定只恢复zyyshop数据库(一台主机上往往有多个数据库,只限本地log日志)

方法一:使用mysqlbinlog读取binlog日志:

[root@vm-002 mysql]# mysqlbinlog mysql-bin.000003 

BEGIN
/*!*/;
# at 173
#160925 21:57:19 server id 1 end_log_pos 201 Intvar
SET INSERT_ID=3/*!*/;
# at 201
#160925 21:57:19 server id 1 end_log_pos 444 Query thread_id=3 exec_time=0 error_code=0
use `ops`/*!*/;
SET TIMESTAMP=1474811839/*!*/;
#insert into ops.member(`name`,`sex`,`age`,`classid`) values('yiyi','w',20,'cls1'),('xiaoer','m',22,'cls3'),('zhangsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6')                               #执行的sql语句
/*!*/;
# at 444
#160925 21:57:19 server id 1 end_log_pos 471 Xid = 66    #开始执行的时间
COMMIT/*!*/;
# at 471
#160925 21:58:41 server id 1 end_log_pos 538 Query thread_id=3 exec_time=0 error_code=0    #结束时间

恢复到更改“name='李四'”之前的数据
mysqlbinlog --start-datetime="2016-09-25 21:57:19" --stop-datetime="2016-09-25 21:58:41" --database=zyyshop  MySQL-bin.000002| MySQL -uroot -p

mysqlbinlog --no-defaults --base64-output=decode-rows -vv mysql-bin.000341 > 341.sql 然后可以看到具体的SQL语句,这些语句被注解掉了,在恢复的时候MYSQL会自动定位获取到。

其实这里的SQL语句不是原始SQL语句,那么能否看到原始SQL语句呢?答案是可以,但是必须设置系统变量binlog_rows_query_log_events=TRUE

--no-defaults 取消默认字符集影响 --base64-output=decode-rows 解码ROW格式的BINLOG, -vv 换行显示SQL --database=db_name 指定显示某个数据库的变化 –start-datetime=datetime 从二进制日志中第1个日期时间等于或晚于datetime参量的事件开始读取。datetime值相对于运行mysqlbinlog的机器上的本地时区。该值格式应符合DATETIME或TIMESTAMP数据类型。例如: shell> mysqlbinlog –start-datetime=”2004-12-25 11:25:56″ binlog.000003该选项可以帮助点对点恢复。 · –stop-datetime=datetime 从二进制日志中第1个日期时间等于或晚于datetime参量的事件起停止读。关于datetime值的描述参见–start-datetime选项。该选项可以帮助及时恢复。 · –start-position=N 从二进制日志中第1个位置等于N参量时的事件开始读。 · –stop-position=N 从二进制日志中第1个位置等于和大于N参量时的事件起停止读。

<think>好的,用户的问题是如何使用MySQL恢复.dmp文件的方法。首先,我需要理解用户的疑问点在哪里。.dmp文件通常与Oracle数据库相关联,是使用Oracle的导出工具exp或expdp生成的。而用户可能误以为MySQL也使用相同的文件格式进行备份和恢复或者他们可能有一个Oracle的.dmp文件想要导入到MySQL中,这就需要转换工具。 首先,我要明确MySQL本身并不直接支持.dmp文件。MySQL的备份恢复通常使用mysqldump生成的.sql文件,或者物理备份工具如Percona XtraBackup。所以用户可能需要了解正确的MySQL备份恢复方法,或者需要将现有的.dmp文件转换为MySQL兼容的格式。 接下来,我需要查看用户提供的引用内容。引用1到3提到了使用mysqldump进行备份和恢复,以及一些参数如-B、-F、-R等。引用4和5提到Oracle的exp/imp工具,以及尝试将Oracle的.dmp文件导入MySQL的情况。这说明用户可能混淆了两种数据库的备份文件格式,或者确实有跨数据库迁移的需求。 因此,正确的解决步骤应该是: 1. **确认文件来源**:如果.dmp文件来自Oracle,需要先转换为MySQL兼容的格式。可以使用工具如Oracle的SQL Developer,或者第三方工具如ora2pg,将Oracle的数据导出为MySQL可以识别的SQL脚本。 2. **使用正确的MySQL恢复方法**:如果用户实际上是想恢复MySQL的备份文件,应确认文件是否为.sql或.sql.gz格式,并使用mysql命令行工具或source命令进行导入。 3. **处理可能的错误操作**:引用3中提到“删库跑路”,可能用户误操作删除了数据,需要从备份恢复。这时候需要确保备份文件正确,并按照正确步骤恢复。 另外,用户提供的引用中有使用gzip压缩备份文件的例子,恢复时需要先解压。例如,引用1中的备份命令使用了gzip压缩,恢复时应该先用gunzip解压,再用mysql导入。 可能的误解点在于文件扩展名。用户可能有一个.sql.gz文件但误命名为.dmp,或者确实有Oracle的.dmp文件需要处理。需要明确文件的实际格式和来源。 总结回答步骤: - 解释.dmp文件通常属于Oracle,MySQL使用.sql。 - 提供MySQL标准恢复方法,使用mysql命令或source。 - 如果涉及Oracle的.dmp,建议使用转换工具。 - 引用相关示例,如引用1和2中的mysqldump命令,以及恢复时的正确步骤。</think>要解决MySQL恢复.dmp文件的问题,需先明确.dmp文件通常为Oracle数据库格式。MySQL的标准备份恢复方法如下: --- ### 一、MySQL标准恢复方法(针对.sql或.sql.gz文件) 1. **解压备份文件**(若为.gz格式) ```bash gunzip ops_2023-10-01.sql.gz ``` 2. **使用mysql命令行恢复** ```bash mysql -u root -p < ops_2023-10-01.sql ``` 或进入MySQL后执行: ```sql source /path/to/ops_2023-10-01.sql ``` 此方法适用于通过`mysqldump`生成的备份文件[^1][^2]。 --- ### 二、处理Oracle的.dmp文件 若文件确为Oracle导出,需**转换为MySQL格式**: 1. **使用Oracle工具导出为SQL** 通过Oracle SQL Developer将数据导出为CSV或INSERT语句。 2. **使用第三方转换工具** 工具如`ora2pg`可将Oracle表结构及数据转为MySQL兼容格式: ```bash ora2pg -t TABLE -o mysql_output.sql ``` 3. **导入转换后的SQL文件** 按上述MySQL标准方法导入生成的.sql文件。 --- ### 三、常见错误排查 - **文件格式不匹配**:确认文件是否为MySQL的.sql备份,而非Oracle的.dmp文件[^4][^5]。 - **权限问题**:确保MySQL用户有权限创建数据库和表。 - **字符集冲突**:检查导出和导入时字符集是否一致(如utf8mb4)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值