MYSQLdump备份如何使数据统一

您所在的位置:网站首页 mysqldump备份全库 MYSQLdump备份如何使数据统一

MYSQLdump备份如何使数据统一

#MYSQLdump备份如何使数据统一| 来源: 网络整理| 查看: 265

  欢迎各位阅读本篇,mysqldump是MySQL用于转存储数据库的实用程序。它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等。本篇文章讲述了MYSQLdump备份如何使数据统一,课课家教育平台提醒各位:本篇文章纯干货~因此大家一定要认真阅读本篇文章哦!

MYSQLdump备份如何使数据统一_Excel_数据_MYSQL_课课家教育

  1、对mysql数据进行备份,常见的方式如以下三种,可能有很多人对备份时数据一致性并不清楚1、直接拷贝整个数据目录下的所有文件到新的机器。优点是简单、快速,只需要拷贝;缺点也很明显,在整个备份过程中新机器处于完全不可用的状态,且目的无法释放源数据文件中因为碎片导致的空间浪费和无法回收已发生扩展的innodb表空间。

  2、用xtrabackup进行热备。优点是备份过程中可继续提供服务;缺点和第一种方法差不多,目的分区无法释放源数据文件中因为碎片导致的空间浪费和无法回收已发生扩展的innodb表空间。

  3、使用官方自带的mysqldump逻辑重做。优点是在整个备份过程中可以向外提供服务,最重要的一点是可以解决碎片浪费。

  以上几种方法相信大家也都很熟悉,就不再详细介绍。下面主要讲解一下mysqldump备份时如何保持数据的一致性。mysqldump对不同类型的存储引擎,内部实现也不一样。主要是针对两种类型的存储引擎:支持事务的存储引擎(如InnoDB)和不支持事务的存储引擎(如MyISAM),下面分别看看这两种存储引擎的实现:

  1、对于支持事务的引擎如InnoDB,参数上是在备份的时候加上--single-transaction保证数据一致性

  --single-transaction实际上通过做了下面两个操作:

  ①、在开始的时候把该session的事务隔离级别设置成repeatable read;

  ②、然后启动一个事务(执行bigin),备份结束的时候结束该事务(执行commit)

  有了这两个操作,在备份过程中,该session读到的数据都是启动备份时的数据(同一个点)。可以理解为对于innodb引擎来说加了该参数,备份开始时就已经把要备份的数据定下来了,备份过程中的提交的事务时是看不到的,也不会备份进去。

  2、对于不支持事务的引擎如MyISAM,只能通过锁表来保证数据一致性,这里分三种情况:

  ①、导出全库:加--lock-all-tables参数,这会在备份开始的时候启动一个全局读锁(执行flush tables with read lock),其他session可以读取但不能更新数据,备份过程中数据没有变化,所以最终得到的数据肯定是完全一致的;

  ②、导出单个库:加--lock-tables参数,这会在备份开始的时候锁该库的所有表,其他session可以读但不能更新该库的所有表,该库的数据一致;

  ③、导出单个表:加--lock-tables参数,这会在备份开始的时候锁该表,其他表不受影响,该表数据一致。

  上面只是展示了对不同引擎来讲加的参数只是为了让数据保持一致性,但在备份中业务并没有停止,时刻可能有新的数据进行写入,为了让我们知道备份时是备份了哪些数据,或者截止到那个指针(二进制日志),我们可以再加入 --master-data参数,备份好的sql文件就会记录从备份截至到哪个指针,指针之后的数据更新我们可以通过二进制日志进行恢复。

  # mysqldump -u root -p --single-transaction --master-data --flush-log --database test > test.sql   --> --flush-log 表示备份开始之后的更行都切到下一个二进制日志

  可以在备份的test.sql文件中前几行看到记录着备份当时的二进制日志信息

  # vim test.sql   --   CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=436263492;   --   -- Current Database: `test`   .....   # mysqlbinlog --start-position=436263492 mysql-bin.000004 > 00004.sql   -->在全备恢复之后,我们可以通过之后的二进制日志进行恢复

  另外解释下mysqldump备份时为什么要锁表才能保持数据的一致性:

另外解释下mysqldump备份时为什么要锁表才能保持数据的一致性:

  说明:

  1、在t1时间点,用mysqldump启动不锁表备份;

  2、先导出a表,共耗时5分钟,因为没有锁表,在这5分钟内b表insert了10行数据;

  3、到了t2时间点,a表导出完成,开始导出b表;

  4、导出b表耗时10分钟,在导出b表的过程中,a、b表均没有数据变化;

  5、到了t3时间点,b表导出完成,全部备份结束;

  6、然后备机从t1时间点的binlog位置开始应用binlog,最后备机中b表的数据比主机多10行,数据不一致。

  从这个图可以看出,对于不支持事务的存储引擎如MyISAM如果备份过程中不锁表,不同表开始备份时对应的binlog和pos是不一致的,这时候所有表都从备份开始的点应用binlog,有很大肯会出现数据不一致(备份过程中所有表均无数据更新除外)。

  mysqldump:

  mysqldump工具很多方面类似相反作用的工具mysqlimport。它们有一些同样的选项。但mysqldump能够做更多的事情。它可以把整个数据库装载到一个单独的文本文件中。这个文件包含有所有重建您的数据库所需要的SQL命令。这个命令取得所有的模式(Schema,后面有解释)并且将其转换成DDL语法(CREATE语句,即数据库定义语句),取得所有的数据,并且从这些数据中创建INSERT语句。这个工具将您的数据库中所有的设计倒转。因为所有的东西都被包含到了一个文本文件中。这个文本文件可以用一个简单的批处理和一个合适SQL语句导回到MySQL中。这个工具令人难以置信地简单而快速。决不会有半点让人头疼地地方。

  因此,如果您想装载整个数据库Meet_A_Geek的内容到一个文件中,可以使用下面的命令:

  bin/mysqldump –p Meet_A_Geek > MeetAGeek_Dump_File.txt

  这个语句也允许您指定一个表进行dump(备份/导出/装载?)。如果您只是希望把数据库Meet_A_Geek中的表Orders中的整个内容导出到一个文件,可以使用下面的命令:

  bin/mysqldump –p Meet_A_Geek Orders >MeetAGeek_Orders.txt

  这个非常的灵活,您甚至可以使用WHERE从句来选择您需要的记录导出到文件中。要达到这样的目的,可以使用类似于下面的命令:

  bin/mysqldump –p –where="Order_ID > 2000" Meet_A_Geek Orders > Special_Dump.txt

  mysqldump工具有大量的选项,部分选项如下表:

  选项/Option 作用/Action Performed

  --add-drop-table

  这个选项将会在每一个表的前面加上DROP TABLE IF EXISTS语句,这样可以保证导回Mysql数据库的时候不会出错,因为每次导回的时候,都会首先检查表是否存在,存在就删除

  --add-locks

  这个选项会在INSERT语句中捆上一个LOCK TABLE和UNLOCK TABLE语句。这就防止在这些记录被再次导入数据库时其他用户对表进行的操作

  -c or - complete_insert

  这个选项使得mysqldump命令给每一个产生INSERT语句加上列(field)的名字。当把数据导出导另外一个数据库时这个选项很有用。

  --delayed-insert 在INSERT命令中加入DELAY选项

  -F or -flush-logs 使用这个选项,在执行导出之前将会刷新MySQL服务器的log.

  -f or -force 使用这个选项,即使有错误发生,仍然继续导出

  --full 这个选项把附加信息也加到CREATE TABLE的语句中

  -l or -lock-tables 使用这个选项,导出表的时候服务器将会给表加锁。

  -t or -no-create- info

  这个选项使的mysqldump命令不创建CREATE TABLE语句,这个选项在您只需要数据而不需要DDL(数据库定义语句)时很方便。

  -d or -no-data 这个选项使的mysqldump命令不创建INSERT语句。

  在您只需要DDL语句时,可以使用这个选项。

  --opt 此选项将打开所有会提高文件导出速度和创造一个可以更快导入的文件的选项。

  -q or -quick 这个选项使得MySQL不会把整个导出的内容读入内存再执行导出,而是在读到的时候就写入导文件中。

  -T path or -tab = path 这个选项将会创建两个文件,一个文件包含DDL语句或者表创建语句,另一个文件包含数据。DDL文件被命名为table_name.sql,数据文件被命名为table_name.txt.路径名是存放这两个文件的目录。目录必须已经存在,并且命令的使用者有对文件的特权。

  -w "WHERE Clause" or -where = "Where clause "

  如前面所讲的,您可以使用这一选项来过筛选将要放到 导出文件的数据。

  假定您需要为一个表单中要用到的帐号建立一个文件,经理要看今年(2004年)所有的订单(Orders),它们并不对DDL感兴趣,并且需要文件有逗号分隔,因为这样就很容易导入到Excel中。 为了完成这个任务,您可以使用下面的句子:

  bin/mysqldump –p –where "Order_Date >='2000-01-01'"

  –tab = /home/mark –no-create-info –fields-terminated-by=, Meet_A_Geek Orders

  这将会得到您想要的结果。

  schema:模式

  The set of statements, expressed in data definition language, that completely describe the structure of a data base.

  一组以数据定义语言来表达的语句集,该语句集完整地描述了数据库的结构。

一组以数据定义语言来表达的语句集,该语句集完整地描述了数据库的结构。

  小结:相信最后大家阅读完毕本篇文章,肯定学到了不少知识吧?其实大家私下还得多多自学,当然如果大家还想了解更多方面的详细内容的话呢,不妨关注课课家教育平台,在这个学习知识的天堂中,您肯定会有意想不到的收获的!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3