热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Mysql数据库的备份与恢复技术Mysql数据库的备份与恢复

Mysql数据库的备份与恢复目录一、数据备份的重要性二、数据库备份的分类三、常见的备份方法四、MySQL完全备份五、MySQL物理冷备份及恢复六、mysqldump

 

 

一、数据备份的重要性

1.1、在生产环境中,数据的安全性至关重要

1.2、任何数据的丢失都可能产生严重的后果

1.3、造成数据丢失的原因

1.3.1、程序错误

1.3.2、人为操作错误

1.3.3、运算错误

1.3.4、磁盘故障

1.3.5、灾难(如火灾、地震等)

举例:携程宕机的损失为每小时106.48万美元

二、数据库备份的分类

2.1、从物理与逻辑的角度,备份可分为

2.1.1、物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份

物理备份方法:

①冷备份(脱机备份):是在关闭数据库的时候进行的

②热备份(联机备份):数据库处于运行状态,依赖于数据库的日志文件

③温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作

2.1.2、逻辑备份:对数据库逻辑组件(如:表等数据库对象)的备份

2.2、从数据库的备份策略角度,备份可分为

2.2.1、完全备份:每次对数据库进行完整的备份

2.2.2、差异备份:备份自从上次完全备份之后被修改过的文件

2.2.3、增量备份:只有在上次完全备份或者增量备份后被修改的文件才会被备份

三、常见的备份方法

3.1、物理冷备

3.1.1、备份时将数据库处于关闭状态,直接打包数据库文件

3.1.2、备份速度快,恢复时也是最简单的

3.2、专用备份工具mydump或mysqlhotcopy

3.2.1、mydump常用的逻辑备份工具

3.2.2、mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表

3.3、启用二进制日志进行增量备份

3.3.1、进行增量备份,需要刷新二进制日志

3.4、第三方工具备份

3.4.1、免费的MySQL热备份软件Percona XtraBackup

四、MySQL完全备份

4.1、是对整个数据库、数据库结构和文件结构的备份

4.2、保存的是备份完成时刻的数据库

4.3、是差异备份与增量备份的基础

4.4、优点:

4.4.1、备份与恢复操作简单方便

4.5、缺点:

4.5.1、数据存在大量的重复

4.5.2、占用大量的备份空间

4.5.3、备份与恢复时间长

4.6、数据库完全备份分类

4.6.1、物理冷备份与恢复

①关闭MySQL数据库

②使用tar命令直接打包数据库文件夹

③直接替换现有MySQL目录即可

4.6.2、mysqldump备份与恢复

①MySQL自带的备份工具,可方便实现对MySQL的备份

②可以将指定的库、表导出为SQL脚本

③使用命令mysql导入备份的数据

五、MySQL物理冷备份及恢复

 
 1 #数据库创建数据库和表
 2 mysql -uroot -p
 3 mysql> create datebase test;
 4 mysql> use test;
 5 mysql> create table aa(id char(24) not null,name varchar(36) not null,score int(3) not null,primary key(id));
 6 mysql> insert into aa(id,name,score) values(1,\'lisi\',88),(2,\'zhangsan\',60),(3,\'wangwu\',78);
 7 mysql> select * from aa;
 8 #物理冷备份
 9 systemctl stop mysqld           #冷备份一定要关闭数据库服务
10 mkdir /backup
11 tar zcf /backup/mysql_all-$(date +%F).tar.gz /usr/local/mysql/data
12 systemctl start mysqld
13 #误删除操作
14 mysql -uroot -p
15 mysql> delete from aa where name=\'zhangsan\';
16 mysql> select * from aa;
17 #恢复数据库
18 systemctl stop mysqld
19 mkdir /bak
20 mv /usr/local/mysql/data /bak
21 mkdir /restore
22 tar zxf /backup/mysql_all-$(date +%F).tar.gz -C /restore
23 mv /restore/usr/local/mysql/date /usr/local/mysql
24 systemctl start mysqld
25 #查看数据
26 mysql -uroot -p
27 mysql> use test;
28 mysql> select * from aa;
 

六、mysqldump备份和恢复

1 mysqldump -u root -p --all-databses > all-data-$(date +%F).sql ###备份所有数据库
2 mysqldump -u root -p -databases auth mysql > auth-mysql.sql ###备份auth和mysql库
3 mysqldump -u root -p auth > auth-$(data +%F).sql ###备份auth数据库
4 mysqldump -u root -p mysql user > mysql-user-$(date +%F).sql ###备份mysql的user表
5 mysqldump -u root -p -d mysql user > /tmp/desc-mysql-user.sql ###备份mysql库user表的结构

6.1、方法一

1 mysqldump -u root -p test > test-$(date +%F).sql
2 mysql> drop database test;
3 mysql> create database test2; ###建立空库
4 mysql -u root -p test2 

6.2、方法二

1 mysqldump -u root -p test > test-$(date +%F).sql
2 mysql> drop database test;
3 mysql> create database test2;
4 mysql> use test2;
5 mysql> source /root/test-2020-10-24.sql;

七、MySQL增量备份与恢复

7.1、MySQL增量备份

7.1.1、使用mysqldump进行完全备份存在的问题
①备份数据中有重复数据
②备份时间与恢复时间过长
7.1.2、MySQL增量备份是自上一次备份后增加/变化的文件或者内容
7.1.3、特点
没有重复数据,备份量不大,时间短
恢复需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复

7.2、MySQL数据库增量恢复

7.2.1、一般恢复
将所有备份的二进制日志内容全部恢复
7.2.2、断点恢复
基于位置恢复
数据库在某一时间点可能既有错误的操作也有正确的操作
可以基于精准的位置跳过错误的操作
基于时间点恢复
跳过某个发生错误的时间点实现数据恢复

7.3、增量恢复的方法

7.3.1、一般恢复
mysqlbinlog [–no-defaults] 增量备份文件 | mysql -u 用户名 -p
7.3.2、基于位置的恢复
恢复数据到指定位置(到错误操作前的最后一次正确操作)
mysqlbinlog --stop-position=‘操作id’ 二进制日志 | mysql -u 用户名 -p密码
从指定的位置开始恢复数据(跳过错误操作后的第一次正确操作)
mysqlbinlog --start-position=‘操作id’ 二进制日志 | mysql -u 用户名 -p密码
7.3.3、基于时间点恢复
跳过某个发生错误的时间点实现数据恢复
恢复数据到指定时间(停止错误操作的时间)
mysqlbinlog --stop-datetime=‘错误时间’ 二进制日志 | mysql -u 用户名 -p密码
从指定的位置开始恢复数据(跳过错误操作后的第一次正确操作)
mysqlbinlog --start-datetime=‘正确操作时间’ 二进制日志 | mysql -u 用户名 -p密码

时间点恢复:

 
 1 [root@server1 ~]# mkdir -p /opt/bak_sql
 2 [root@server1 ~]# mysqldump -uroot -p test2 > /opt/bak_sql/test2-$(date +%F).sql; ###完整备份
 3 
 4 [root@server1 ~]# vi /etc/my.cnf
 5 [mysqld]
 6 log_bin=/usr/local/mysql/data/mysql_bin ###开启增量备份
 7 
 8 [root@server1 ~]# systemctl restart mysqld
 9 
10 [root@server1 ~]# mysqladmin -uroot -p flush-logs ###将二进制日志更新,产生新的日志文件
11 [root@server1 ~]# cd /usr/local/mysql/data/
12 [root@server1 data]# ll ###查询增量备份结果
13 
14 [root@server1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000002 ###查询该二进制日志内容是否正确
15 
16 mysql> insert into aa values(4,\'sisi\',90); ###正确操作
17 mysql> delete from aa where name=\'zhangsan\'; ###错误操作
18 mysql> insert into aa values(5,\'haha\',89); ###正确操作
19 mysql> select * from aa;
20 +----+--------+-------+
21 | id | name   | score |
22 +----+--------+-------+
23 |  1 | lisi   | 88    |
24 |  3 | wangwu | 78    |
25 |  4 | sisi   | 90    |
26 |  5 | haha   | 89    |
27 +----+--------+-------+
28 4 rows in set (0.01 sec)
29 
30 [root@server1 ~]# mysqladmin -u root -p flush-logs; ###将二进制日志更新,产生新的日志文件
31 [root@server1 ~]# cd /usr/local/mysql/data/
32 [root@server1 data]# ll ###查询增量备份结果
33 [root@server1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000003 ###查询该二进制日志内容是否正确
34 
35 ###还原时间点的步骤
36 mysql> use test2;
37 mysql> drop table aa; ###先删掉坏的那张表
38 [root@server1 ~]# mysql -u root -p test2  select * from aa; ###查看是否复原
75 +----+----------+-------+
76 | id | name     | score |
77 +----+----------+-------+
78 |  1 | lisi     | 88    |
79 |  2 | zhangsan | 60    |
80 |  3 | wangwu   | 78    |
81 |  4 | sisi     | 90    |
82 |  5 | haha     | 89    |
83 +----+----------+-------+
84 5 rows in set (0.00 sec)
 

位置点恢复:

 
 1 mysql> use test2;
 2 mysql> delete from aa where name=\'lisi\'; ###误操作
 3 mysql> delete from aa where name=\'haha\'; ###误操作
 4 
 5 [root@server1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000003 ###查询该二进制日志内容
 6 ...省略内容
 7 # at 2168
 8 #201024  1:26:20 server id 1  end_log_pos 2220 CRC32 0x5a192cfd         Table_map: `test2`.`aa` mapped to number 221
 9 # at 2220
10 #201024  1:26:20 server id 1  end_log_pos 2268 CRC32 0x30f35bdf         Delete_rows: table id 221 flags: STMT_END_F
11 ### DELETE FROM `test2`.`aa`
12 ### WHERE
13 ###   @1=1
14 ###   @2=\'lisi\'
15 ###   @3=\'88\'
16 # at 2268
17 #201024  1:26:20 server id 1  end_log_pos 2299 CRC32 0xe8fa9bd8         Xid = 123
18 COMMIT/*!*/;
19 # at 2299
20 #201024  1:26:26 server id 1  end_log_pos 2364 CRC32 0xfa901848         Anonymous_GTID  last_committed=9        sequence_number=10  rbr_Only=yes
21 /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
22 SET @@SESSION.GTID_NEXT= \'ANONYMOUS\'/*!*/;
23 # at 2364
24 #201024  1:26:26 server id 1  end_log_pos 2437 CRC32 0x04379db1         Query   thread_id=12    exec_time=0     error_code=0
25 SET TIMESTAMP=1603527986/*!*/;
26 BEGIN
27 /*!*/;
28 # at 2437
29 #201024  1:26:26 server id 1  end_log_pos 2489 CRC32 0xa0c3b6c1         Table_map: `test2`.`aa` mapped to number 221
30 # at 2489
31 #201024  1:26:26 server id 1  end_log_pos 2537 CRC32 0xd7509926         Delete_rows: table id 221 flags: STMT_END_F
32 ### DELETE FROM `test2`.`aa`
33 ### WHERE
34 ###   @1=5
35 ###   @2=\'haha\'
36 ###   @3=\'89\'
37 # at 2537
38 #201024  1:26:26 server id 1  end_log_pos 2568 CRC32 0xb7b17eee         Xid = 124
39 ...省略内容
40 
41 [root@server1 ~]# mysqlbinlog --no-defaults --stop-position=\'2168\' /usr/local/mysql/data/mysql_bin.000003 | mysql -u root -p ###上一次操作正确的位置点停止
42 [root@server1 ~]# mysqlbinlog --no-defaults --start-position=\'2537\' /usr/local/mysql/data/mysql_bin.000003 | mysql -u root -p ###下一次操作正确的位置点开始
43 
44 mysql> select * from aa;
45 +----+----------+-------+
46 | id | name     | score |
47 +----+----------+-------+
48 |  1 | lisi     | 88    |
49 |  2 | zhangsan | 60    |
50 |  3 | wangwu   | 78    |
51 |  4 | sisi     | 90    |
52 |  5 | haha     | 89    |
53 +----+----------+-------+
54 5 rows in set (0.00 sec)

推荐阅读
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
author-avatar
木扎尔特2502918527
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有