这篇文章包含了很多知识点,而这些知识点在之前的文章中都已经总结过,所以,如果阅读时遇到障碍请参考之前的文章。
mysql系列文章列表直达链接:mysql知识点总结
如果你只是想找一些mysqldump语句进行参考,那么,直接查看本文章下方的"mysqldump备份操作小结"部分即可。
如果你想学习怎样使用mysqldump,以及一些常用选项的含义,请按部就班的阅读这篇文章。
之前的文章已经描述了与数据库备份有关的常用术语并且简单介绍了mysql中常用的备份工具,如果你还不了解这些知识,请参考如下文章:
之前说过,最好用也最常用的备份工具就是mysqldump和xtrabackup,此处,我们就来总结一下mysqldump的用法。
mysqldump简介
mysqldump是mysql自带的逻辑备份工具。
它的备份原理是,通过协议连接到mysql数据库,将需要备份的数据查询出来,将查询出的数据转换成对应的insert语句,当我们需要还原这些数据时,只要执行这些insert语句,即可将对应的数据还原。
mysqldump的优点:
可以直接使用文本处理工具处理对应的备份数据,因为备份数据已经被mysqldump转换为了对应的insert语句,所以,我们可以借助文件系统中的文本处理工具对备份数据进行直接处理。
mysqldump的缺点:
当数据为浮点类型时,会出现精度丢失
mysqldump的备份过程属于逻辑备份,备份速度、恢复速度与物理备份工具相比较慢,而且mysqldump备份的过程是串行化的,不会并行的进行备份,如果想要并行备份,可以使用mydumper,但是此处我们不考虑这些,只考虑mysqldump,当数据量较大时,一般不会使用mysqldump进行备份,因为效率较低。
mysqldump对innodb存储引擎支持热备,innodb支持事务,我们可以基于事务通过mysqldump对数据库进行热备。
mysqldump对myisam存储引擎只支持温备,通过mysqldump对使用myisam存储引擎的表进行备份时,最多只能实现温备,因为在备份时会对备份的表请求锁,当备份完成后,锁会被释放。
初识mysqldump
mysqldump是一个客户端工具,所以当mysqldump连接到数据库时,也会读取mysql数据库的配置文件,加载跟客户端相关的配置。
我们先通过一些最简单的实验,来了解一下mysqldump,但是这些操作过于简陋,不足以满足我们的备份需求,备份的数据也有可能出现问题,所以不要使用简单示例中的语句进行备份,我们只是通过它们去了解mysqldump命令罢了,等我们掌握了它,再总结一些实用的备份命令,先来做个小示例。
假设,我们现在想要通过mysqldump备份zsythink数据库,那么,我们可以通过如下mysqldump命令
(注意,如下命令只会显示mysqldump的备份过程,并没有将数据备份,我们慢慢聊)
我们说过mysqldump是一个客户端命令,所以,就像使用mysql命令连接数据库一样,我们需要指定连接的用户名,需要连接的数据库服务IP,以及使用-p选项提示我们输入密码,这些用法都与我们的mysql命令一致,上图中,我们指定要备份zsythink数据库,此时,提示我们输入root用户的密码。
输入正确的密码以后,会看到类似如下模样的输出
首先,输出的信息中包含一些注释,这些注释信息中包括mysqldump的版本,mysql的版本,以及主机IP,数据库信息等信息。
除了这些信息,还会输出一些看似注释的可执行意见,比如如下信息。
/*!40101 SET NAMES utf8 */;
那么上述信息有什么用呢?我们来了解一下,因为,mysqldump备份出的信息为可执行的sql,所以,当我们使用这些sql进行数据还原的时候,则必须执行它们,而上述信息表示当mysql版本大于等于4.01.01的时候,才会执行 SET NAMES utf8这条语句,否则这条语句则不会被执行,如果使用mysqldump备份出的sql语句在其他关系型数据库上执行,那么这些信息将被当做注释处理,这是mysql为了使这些sql语句的兼容性更强而使用的一种手段,我们不用过分在意他们。
我们要关注的是上图中红色标注的信息。
首先,mysqldump将表a的表结构转换成了对应的sql语句,为了确保还原表a时能够正常的执行创建表的语句,所以,mysqldump自动生成了DROP表a的语句,然后又生成了CREATE表a的语句。完成上述步骤后,mysql开始将表a中的数据转换成对应的sql语句,那么我们看看表a中都有什么数据
表a中只有2条数据,而mysqldump就是将a表中的所有数据转换成了一条insert语句,当我们执行这条insert语句时,就相当于还原了a表数据,当然,上述示例中的insert语句只所以非常少,非常短,是因为我们的示例数据太少了,如果是真正的正在使用的数据库