导读 大家好,小体来为大家解答以上问题。mysql怎么备份数据库和恢复数据库,一文搞懂MySQL数据库怎么备份与恢复很多人还不知道,现在让我们一起...
大家好,小体来为大家解答以上问题。mysql怎么备份数据库和恢复数据库,一文搞懂MySQL数据库怎么备份与恢复很多人还不知道,现在让我们一起来看看吧!
推荐:mysql视频教程
在任何数据库环境中,总会出现不确定的突发情况,比如异常断电,计算机系统出现各种软硬件故障,破坏、管理员的误操作在所难免。这些情况可能会导致数据丢失、服务器瘫痪等严重后果。当有多台服务器时,主服务器和从服务器之间会出现数据同步问题。
为了有效防止数据丢失,将损失降到最低,MySQL数据库服务器要定期备份。如果数据库中的数据丢失或出现错误,可以使用备份的数据进行恢复。主服务器和从服务器之间的数据同步可以通过复制来实现。
物理备份和逻辑备份物理备份:备份数据文件并将数据库物理文件转储到一个目录中。物理备份的恢复速度更快,但占用空间更大。xtrabackup工具可以在MySQL中用于物理备份。
一、逻辑备份:使用工具导出数据库对象并将它们汇总到备份文件中。逻辑备份恢复速度较慢,但它占用的空间更少,也更灵活。MySQL中常用的逻辑备份工具是mysqldump。逻辑备份是sql语句的备份,恢复时通过执行backup sql语句可以重现数据库数据。
Myqldump实现逻辑备份。Myqldump是MySQL提供的一个非常有用的数据库备份工具。
2.3 备份部分数据库
使用--databases
或-B
参数了,该参数后面跟数据库名称,多个数据库间用空格隔开。如果指定databases参数,备份文件中会存在创建数据库的语句,如果不指定参数,则不存在。语法如下:
比如,在表变更前做个备份。语法如下:
可以看到, book文件和备份的库文件类似。不同的是,book文件只包含book表的DROP、CREATE和INSERT语句。
备份多张表使用下面的命令,比如备份book和account表:
2.5 备份单表的部分数据
有些时候一张表的数据量很大,我们只需要部分数据。这时就可以使用--where
选项了。where后面附带需要满足的条件。
举例:备份student表中id小于10的数据:
内容如下所示,insert语句只有id小于10的部分
2.6 排除某些表的备份
如果我们想备份某个库,但是某些表数据量很大或者与业务关联不大,这个时候可以考虑排除掉这些表,同样的,选项--ignore-table
可以完成这个功能。
通过如下指定判定文件中没有student表结构:
2.7 只备份结构或只备份数据
只备份结构的话可以使用--no-data
简写为--d
选项;只备份数据可以使用--no-create-info
简写为--t
选项。
2.8 备份中包含存储过程、函数、事件
mysqldump备份默认是不包含存储过程,自定义函数及事件的。可以使用--routines
或-R
选项来备份存储过程及函数,使用--events
或-E
参数来备份事件。
举例:备份整个atguigu库,包含存储过程及事件:
下面备份atguigu库的数据,函数以及存储过程。
查询备份文件中是否存在函数,如下所示,可以看到确实包含了函数。
mysql命令恢复数据
使用mysqldump命令将数据库中的数据备份成一个文本文件。需要恢复时,可以使用mysql命令
来恢复备份的数据。
mysql命令可以执行备份文件中的CREATE语句
和INSERT语句
。通过CREATE语句来创建数据库和表。通过INSERT语句来插入备份的数据。
其中,dbname参数表示数据库名称。该参数是可选参数,可以指定数据库名,也可以不指定。指定数据库名时,表示还原该数据库下的表。此时需要确保MySQL服务器中已经创建了该名的数据库。不指定数据库名时,表示还原文件中所有的数据库。此时sql文件中包含有CREATE DATABASE语句,不需要MysQL服务器中已存在这些数据库。
使用root用户,将之前练习中备份的atguigu.sql文件中的备份导入数据库中,命令如下:
如果备份文件中包含了创建数据库的语句,则恢复的时候不需要指定数据库名称,如下所示
否则需要指定数据库名称,如下所示
如果我们现在有昨天的全量备份,现在想整个恢复,则可以这样操作:
执行完后,MySQL数据库中就已经恢复了all.sql文件中的所有数据库。
补充: 如果使用--all-databases
参数备份了所有的数据库,那么恢复时不需要指定数据库。对应的sql文件包含有CREATE DATABASE语句,可通过该语句创建数据库。创建数据库后,可以执行sql文件中的USE语句选择数据库,再创建表并插入记录。
可能有这样的需求,比如说我们只想恢复某一个库,但是我们有的是整个实例的备份,这个时候我们可以从全量备份中分离出单个库的备份。
3.4 从单库备份中恢复单表
这个需求还是比较常见的。比如说我们知道哪个表误操作了,那么就可以用单表恢复的方式来恢复。
举例:我们有atguigu整库的备份,但是由于class表误操作,需要单独恢复出这张表。
物理备份:直接复制整个数据库
直接将MySQL中的数据库文件复制出来。这种方法最简单,速度也最快。MySQL的数据库目录位置不一定相同:
但为了保证备份的一致性。需要保证:
这种方式方便、快速,但不是最好的备份方法,因为实际情况可能不允许停止MySQL服务器
或者锁住表
,而且这种方法对InnoDB存储引擎
的表不适用。对于MyISAM存储引擎的表,这样备份和还原很方便,但是还原时最好是相同版本的MySQL数据库,否则可能会存在文件类型不同的情况。
注意,物理备份完毕后,执行UNLOCK TABLES
来结算其他客户对表的修改行为。
说明: 在MySQL版本号中,第一个数字表示主版本号,主版本号相同的MySQL数据库文件格式相同。
此外,还可以考虑使用相关工具实现备份。比如,MySQLhotcopy
工具。MySQLhotcopy是一个Perl脚本,它使用LOCK TABLES、FLUSH TABLES和cp或scp来快速备份数据库。它是备份数据库或单个表最快的途径,但它只能运行在数据库目录所在的机器上,并且只能备份MyISAM类型的表。多用于mysql5.5之前。
其中,两个mysql分别表示组和用户;“-R”参数可以改变文件夹下的所有子文件的用户和组;“dbname”参数表示数据库目录。
提示 Linux操作系统下的权限设置非常严格。通常情况下,MySQL数据库只有root用户和mysql用户组下的mysql用户才可以访问,因此将数据库目录复制到指定文件夹后,一定要使用chown命令将文件夹的用户组变为mysql,将用户变为mysql。
在MySQL中,可以使用SELECT…INTO OUTFILE语句将表的内容导出成一个文本文件。
(1)选择数据库atguigu,并查询account表,执行结果如下所示。
(2)mysql默认对导出的目录有权限限制,也就是说使用命令行进行导出的时候,需要指定目录进行操作。
举例1:使用mysqldump命令将将atguigu数据库中account表中的记录导出到文本文件:
举例2:使用mysqldump将atguigu数据库中的account表导出到文本文件,使用FIELDS选项,要求字段之间使用逗号“,”间隔,所有字符类型字段值用双引号括起来:
打开account.txt文件,其内容包含创建account表的数据。从文件中可以看出,字段之间用逗号隔开,字符类型的值被双引号括起来。
四、3. 使用mysql命令导出文本文件
举例1:使用mysql语句导出atguigu数据中account表中的记录到文本文件:
举例2:将atguigu数据库account表中的记录导出到文本文件,使用–veritcal参数将该条件记录分为多行显示:
举例3:将atguigu数据库account表中的记录导出到xml文件,使用–xml参数,具体语句如下。
说明:如果要将表数据导出到html文件中,可以使用--html
选项。然后可以使用浏览器打开。
删除account表中的数据:
查询account表中的数据:
举例2: 选择数据库atguigu,使用SELECT…INTO OUTFILE将atguigu数据库account表中的记录导出到文本文件,使用FIELDS选项和LINES选项,要求字段之间使用逗号","间隔,所有字段值用双引号括起来:
删除account表中的数据:
查询account表中的数据,具体SQL如下:
导出文件account.txt,字段之间使用逗号","间隔,字段值用双引号括起来:
删除account表中的数据:
查询account表中的数据:
数据库迁移7.1 概述
数据迁移(data migration)是指选择、准备、提取和转换数据,并 将数据从一个计算机存储系统永久地传输到另一个计算机存储系统的过程 。此外,验证迁移数据的完整性
和退役原来旧的数据存储
,也被认为是整个数据迁移过程的一部分。
数据库迁移的原因是多样的,包括服务器或存储设备更换、维护或升级,应用程序迁移,网站集成,灾难恢复和数据中心迁移。
根据不同的需求可能要采取不同的迁移方案,但总体来讲,MySQL 数据迁移方案大致可以分为物理迁移
和逻辑迁移
两类。通常以尽可能自动化
的方式执行,从而将人力资源从繁琐的任务中解放出来。
物理迁移适用于大数据量下的整体迁移。使用物理迁移方案的优点是比较快速,但需要停机迁移并且要求 MySQL 版本及配置必须和原服务器相同,也可能引起未知问题。
物理迁移包括拷贝数据文件和使用 XtraBackup 备份工具两种。
不同服务器之间可以采用物理迁移,我们可以在新的服务器上安装好同版本的数据库软件,创建好相同目录,建议配置文件也要和原数据库相同,然后从原数据库方拷贝来数据文件及日志文件,配置好文件组权限,之后在新服务器这边使用 mysqld 命令启动数据库。
逻辑迁移适用范围更广,无论是 部分迁移 还是 全量迁移 ,都可以使用逻辑迁移。逻辑迁移中使用最多的就是通过 mysqldump 等备份工具。
九、① 相同版本的数据库之间迁移注意点
指的是在主版本号相同的MySQL数据库之间进行数据库移动。
方式1
: 因为迁移前后MySQL数据库的主版本号相同
,所以可以通过复制数据库目录来实现数据库迁移,但是物理迁移方式只适用于MyISAM引擎的表。对于InnoDB表,不能用直接复制文件的方式备份数据库。
方式2
: 最常见和最安全的方式是使用mysqldump命令
导出数据,然后在目标数据库服务器中使用MySQL命令导入。
在上述语句中,|
符号表示管道,其作用是将mysqldump备份的文件给mysql命令;--all-databases
表示要迁移所有的数据库。通过这种方式可以直接实现迁移。
十、② 不同版本的数据库之间迁移注意点
例如,原来很多服务器使用5.7版本的MySQL数据库,在8.0版本推出来以后,改进了5.7版本的很多缺陷,因此需要把数据库升级到8.0版本
旧版本与新版本的MySQL可能使用不同的默认字符集,例如有的旧版本中使用latin1作为默认字符集,而最新版本的MySQL默认字符集为utf8mb4。如果数据库中有中文数据,那么迁移过程中需要对默认字符集
进行修改 ,不然可能无法正常显示数据。
高版本的MySQL数据库通常都会兼容低版本
,因此可以从低版本的MySQL数据库迁移到高版本的MySQL数据库。
十一、③ 不同数据库之间迁移注意点
不同数据库之间迁移是指从其他类型的数据库迁移到MySQL数据库,或者从MySQL数据库迁移到其他类型的数据库。这种迁移没有普适的解决方法。
迁移之前,需要了解不同数据库的架构,比较它们之间的差异
。不同数据库中定义相同类型的数据的关键字可能会不同
。例如,MySQL中日期字段分为DATE和TIME两种,而ORACLE日期字段只有DATE;SQL
另外,数据库厂商并没有完全按照SQL标准来设计数据库系统,导致不同的数据库系统的SQL语句
有差别。例如,微软的SQL Server软件使用的是T-SQL语句,T-SQL中包含了非标准的SQL语句,不能和MySQL的SQL语句兼容。
不同类型数据库之间的差异造成了互相迁移的困难
,这些差异其实是商业公司故意造成的技术壁垒。但是不同类型的数据库之间的迁移并不是完全不可能
。例如,可以使用MyODBC
实现MySQL和SQL Server之间的迁移。MySQL官方提供的工具MySQL Migration
Toolkit
也可以在不同数据之间进行数据迁移。MySQL迁移到Oracle时,需要使用mysqldump命令导出sql文件,然后,手动更改
sql文件中的CREATE语句。
传统的高可用架构是不能预防误删数据的,因为主库的一个drop table命令,会通过binlog传给所有从库和级联从库,进而导致整个集群的实例都会执行这个命令。
为了找到解决误删数据的更高效的方法,我们需要先对和MySQL相关的误删数据,做下分类:
十二、处理措施1:数据恢复
原理:修改binlog
内容,拿回原库重放。如果误删数据涉及到了多个事务的话,需要将事务的顺序调过来再执行。
十三、处理措施2:预防
代码上线前,必须SQL审查
、审计
。
建议可以打开安全模式
,把sql_safe_updates
参数设置为on
。强制要求加where条件且where后需要是索引字段,否则必须使用limit。否则就会报错。
十四、背景: delete全表是很慢的,需要生成回滚日志、写redo、写binlog。所以,从性能角度考虑,优先考虑使用truncatetable或者drop table命令。
database命令删除的数据,就没办法通过Flashback来恢复了。因为,即使我们配置了binlog_format=row,执行这三个命令时,记录的binlog还是statement格式。binlog里面就只有一个truncate/drop语句,这些信息是恢复不出数据的。
这种情况下恢复数据,需要使用全量备份与增量日志结合的方式。
方案的前提:有定期的全量备份,并且实时备份binlog。
举例:有人误删了一个库,时间为下午3点。步骤如下:
上面我们说了使用truncate /drop语句误删库/表的恢复方案,在生产环境中可以通过下面建议的方案来尽量的避免类似的误操作。
十五、② 制定操作规范
比如在删除数据表之前,必须先对表做改名操作(比如加_to_be_deleted
)。然后,观察一段时间,确保对业务无影响以后再删除这张表。
、③ 设置延迟复制备库
简单的说延迟复制就是设置一个固定的延迟时间,比如1个小时,让从库落后主库一个小时。出现误删除操作1小时内,到这个备库上执行stop slave
,再通过之前介绍的方法,跳过误操作命令,就可以恢复出需要的数据。这里通过CHANGE MASTER TO MASTER_DELAY =
N
命令,可以指定这个备库持续保持跟主库有N秒的延迟。比如把N设置为3600,即代表1个小时。
此外,延迟复制还可以用来解决以下问题:
用来做延迟测试
,比如做好的数据库读写分离,把从库作为读库,那么想知道当数据产生延迟的时候到底会发生什么,就可以使用这个特性模拟延迟。
用于老数据的查询等需求
,比如你经常需要查看某天前一个表或者字段的数值,你可能需要把备份恢复后进行查看,如果有延迟从库,比如延迟一周,那么就可以解决这样类似的需求。
对于一个有高可用机制的MySQL集群来说,不用担心rm删除数据
。因为只删掉其中某一个节点数据的话,HA系统就会选出一个新的主库,从而保证整个集群的正常工作。我们把这个节点上的数据恢复回来后,再接入整个集群就好了。
但如果是恶意地把整个集群删除,那就需要考虑跨机房备份,跨城市备份。
本文到此结束,希望对大家有所帮助。
以下图为例,B列,C列为原数据,D列为把B列和C列合并后,显示的结果或者说要求。 下面通过gif动画演示,来进行操作。 此公式支持,数字合并,文本合并,数字和文本的混合合并等。 只需要将公式中的$b$1,修改为您实际工作中,需要合并的第1列内容的第1个单元格的位置就可以了。 假设一个新的工作表,需要从D5单元格开始合并2列内容数据,那修改后的公式为: 即上面的公式中,B对应修改为D,1对应修改5,其他内容保持不变。 修改完成后,再通过单元格右下角的填充柄下拉就可以了。或者用更简单的办法,就是双击右下角的填充柄也可以实现向下填充的效果。 |
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。