iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mysqldump流程举例分析
  • 336
分享到

mysqldump流程举例分析

2024-04-02 19:04:59 336人浏览 薄情痞子
摘要

本篇内容主要讲解“Mysqldump流程举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysqldump流程举例分析”吧!重要参数 首先我们把参数和内

本篇内容主要讲解“Mysqldump流程举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习mysqldump流程举例分析”吧!

重要参数

首先我们把参数和内部变量对应起来,并且看一下它们的注释:

–single-transaction: opt_single_transaction

Creates a consistent snapshot by dumping all tables in a single transaction. Works ONLY for tables stored in storage engines which support multiversioning (currently only InnoDB does); the dump is NOT guaranteed to be consistent for other storage engines. While a –single-transaction dump is in process, to ensure a valid dump file (correct table contents and binary log position), no other connection should use the following statements: ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE, as consistent snapshot is not isolated from them. Option automatically turns off –lock-tables.

通过将导出操作封装在一个事务内来使得导出的数据是一个一致性快照。只有当表使用支持mvcC的存储引擎(目前只有InnoDB)时才可以工作;其他引擎不能保证导出是一致的。当导出开启了–single-transaction选项时,要确保导出文件有效(正确的表数据和二进制日志位置),就要保证没有其他连接会执行如下语句:ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE,这会导致一致性快照失效。这个选项开启后会自动关闭lock-tables。

–master-data: opt_master_data

This causes the binary log position and filename to be appended to the output. If equal to 1, will print it as a CHANGE MASTER command; if equal to 2, that command will be prefixed with a comment symbol. This option will turn –lock-all-tables on, unless –single-transaction is specified too (in which case a global read lock is only taken a short time at the beginning of the dump; don’t forget to read about –single-transaction below). In all cases, any action on logs will happen at the exact moment of the dump. Option automatically turns –lock-tables off.

这个选项可以把binlog的位置和文件名添加到输出中,如果等于1,将会打印成一个CHANGE MASTER命令;如果等于2,会加上注释前缀。并且这个选项会自动打开–lock-all-tables,除非同时设置了–single-transaction(这种情况下,全局读只会在开始dump的时候加上一小段时间,不要忘了阅读–single-transaction的部分)。在任何情况下,所有日志中的操作都会发生在导出的准确时刻。这个选项会自动关闭–lock-tables。

–lock-all-tables: opt_lock_all_tables

Locks all tables across all databases. This is achieved by taking a global read lock for the duration of the whole dump. Automatically turns –single-transaction and –lock-tables off.

锁定所有库中所有的表。这是通过在整个dump的过程中持有全局读锁来实现的。会自动关闭–single-transaction 和 –lock-tables。

–lock-tables: lock_tables

Lock all tables for read. (Defaults to on; use –skip-lock-tables to disable.)

对所有表加读锁。(默认是打开的;用–skip-lock-tables来关闭)

–flush-logs: flush_logs

Flush logs file in server before starting dump. Note that if you dump many databases at once (using the option –databases= or –all-databases), the logs will be flushed for each database dumped. The exception is when using –lock-all-tables or –master-data: in this case the logs will be flushed only once, corresponding to the moment all tables are locked. So if you want your dump and the log flush to happen at the same exact moment you should use –lock-all-tables or –master-data with –flush-logs。

在开始导出前刷新服务器的日志文件。注意,如果你一次性导出很多数据库(使用 –databases= 或 –all-databases 选项),导出每个库时都会触发日志刷新。例外是当使用了 –lock-all-tables 或 –master-data 时:日志只会被刷新一次,那个时候所有表都会被锁住。所以如果你希望你的导出和日志刷新发生在同一个确定的时刻,你需要使用–lock-all-tables,或者 –master-data 配合 –flush-logs。

–delete-master-logs: opt_delete_master_logs

Delete logs on master after backup. This automatically enables –master-data.

备份完成后删除主库上的日志。这个选项会自动打开 –master-data.

–apply-slave-statements: opt_slave_apply(5.5)

Adds ‘STOP SLAVE’ prior to ‘CHANGE MASTER’ and ‘START SLAVE’ to bottom of dump.

在’CHANGE MASTER’前加上’STOP SLAVE’,在导出文件的末尾加上’START SLAVE’.

主要代码流程

我们分别看一下5.1和5.5的代码,都基于最新的trunk(5.1-rev.3909; 5.5-rev.4148)。

5.1版本主要流程

我们首先看下5.1版本的。

5320 if ((opt_lock_all_tables || opt_master_data) && 5321 do_flush_tables_read_lock(mysql)) 5322 Goto err;

如果设置了master-data或lock-all-tables,则做FLUSH TABLES的操作。
来看下do_flush_tables_read_lock()里面是怎么做的,

do_flush_tables_read_lock() 4665 return 4666 ( mysql_query_with_error_report(mysql_con, 0, 4667 ((opt_master_data != 0) ? // 如果设置了--master-data 4668 "FLUSH  TABLES" : // 那么用FLUSH LOCAL TABLES  4669 "FLUSH TABLES")) || // 如果没设置那么使用FLUSH TABLE 4670 mysql_query_with_error_report(mysql_con, 0, 4671 "FLUSH TABLES WITH READ LOCK") ); // 如果上面的语句执行成功了,再执行这个

先FLUSH TABLES,成功后用FLUSH TABLES WITH READ LOCK加全局读锁。
再往下会判断single-transaction,

5323 if (opt_single_transaction && start_transaction(mysql)) 5324 goto err;

如果定义了–single-transaction则打开一个事务来读取数据。
我们看下start_transaction()的实现,

start_transaction() 4741 return (mysql_query_with_error_report(mysql_con, 0, 4742 "SET SESSION TRANSACTION ISOLATION " 4743 "LEVEL REPEATABLE READ") || // 先设置会话的隔离级别为RR 4744 mysql_query_with_error_report(mysql_con, 0, 4745 "START TRANSACTION " 4746 "")); // 再用一致性快照模式(RR)启动事务

会先设置隔离级别为RR,然后START TRANSACTION加上一致性快照的Hint。
接下来是获取Master的状态,

5338 if (opt_master_data && do_show_master_status(mysql)) 5339 goto err;

如果设置了–master-data 则把当前的Master status打印出来。
接下来再判断如果启用了–single-transaction,则可以释放表锁的,因为事务已经启动了。

5340 if (opt_single_transaction && do_unlock_tables(mysql))  5341 goto err;

do_unlock_tables()里面就发一条UNLOCK TABLES语句释放全局表锁。

do_unlock_tables() 4677 return mysql_query_with_error_report(mysql_con, 0, "UNLOCK TABLES");

然后开始调用dump_*函数根据需要导出整个实例或者一个库或者一个表。

dump_all_databases()->dump_all_tables_in_db() 4307 if (lock_tables) 4308 { 4309 DYNAMIC_STRING query; 4310 init_dynamic_string_checked(&query, "LOCK TABLES ", 256, 1024); 4311 for (numrows= 0 ; (table= getTableName(1)) ; ) 4312 { 4313 char *end= strmov(afterdot, table); 4314 if (include_table((uchar*) hash_key,end - hash_key)) 4315 { 4316 numrows++; 4317 dynstr_append_checked(&query, quote_name(table, table_buff, 1)); 4318 dynstr_append_checked(&query, " READ ,"); 4319 } 4320 } 4321 if (numrows && mysql_real_query(mysql, query.str, query.length-1)) 4322 DB_error(mysql, "when using LOCK TABLES"); 4323  4324 dynstr_free(&query); 4325 }  ... 4332 while ((table= getTableName(0))) 4333 { 4334 char *end= strmov(afterdot, table); 4335 if (include_table((uchar*) hash_key, end - hash_key)) 4336 { 4337 dump_table(table,database); // 导出一张表 4338 my_free(order_by, MYF(MY_ALLOW_ZERO_PTR)); 4339 order_by= 0; 4340 if (opt_dump_triggers && mysql_get_server_version(mysql) >= 50009) 4341 { 4342 if (dump_triggers_for_table(table, database)) // 导出 trigger 4343 { 4344 if (path) 4345 my_fclose(md_result_file, MYF(MY_WME)); 4346 maybe_exit(EX_MYSQLERR); 4347 } 4348 } 4349 } 4350 }  ... 4366 if (lock_tables) 4367 VOID(mysql_query_with_error_report(mysql, 0, "UNLOCK TABLES")); 

所以我们可以知道,如果用–master-data和–single-transaction来导出数据,因为–lock-tables被自动关闭,所以导出过程中只会对当前正在做导出操作的表有IS锁,已经完成或没有开始的表,则不会加锁。
如果用的是默认–lock-tables打开的选项,则会先把所有库的锁加上,再进行导出操作,最后一次性释放所有锁。

5.5版本主要流程

接下来我们再比较一下,5.5的mysqldump有哪些变化。

5464 if ((opt_lock_all_tables || opt_master_data || 5465 (opt_single_transaction && flush_logs)) && 5466 do_flush_tables_read_lock(mysql)) 5467 goto err;

这里有所不同,增加了flush_logs的判断,如果只是单纯的–single-transaction,不会调用do_flush_tables_read_lock(),必须同时制定–flush-logs。

5469  5473 if (opt_lock_all_tables || opt_master_data || 5474 (opt_single_transaction && flush_logs) || 5475 opt_delete_master_logs) 5476 { 5477 if (flush_logs || opt_delete_master_logs) 5478 { 5479 if (mysql_refresh(mysql, REFRESH_LOG)) 5480 goto err; 5481 verbose_msg("-- main : logs flushed successfully!\n"); 5482 } 5483 5484  5485 flush_logs= 0; 5486 }

5.5里面会尝试FLUSH LOGS。

5488 if (opt_delete_master_logs) 5489 { 5490 if (get_bin_log_name(mysql, bin_log_name, sizeof(bin_log_name))) 5491 goto err; 5492 }

5.5新增的变量,删除master上的log,这里先获取binlog的文件名。

5494 if (opt_single_transaction && start_transaction(mysql)) 5495 goto err;

这一段没有变化

5497  5498 if (opt_slave_apply && add_stop_slave()) 5499 goto err; 5500 if (opt_master_data && do_show_master_status(mysql)) 5501 goto err; 5502 if (opt_slave_data && do_show_slave_status(mysql)) 5503 goto err; 5504 if (opt_single_transaction && do_unlock_tables(mysql))  5505 goto err;

这里有新加的opt_slave_apply和opt_slave_data部分,添加STOP SLAVE语句和显示SHOW SALVE STATUS的结果。
之后也是调用dump_*来导出数据。
但是因为5.5有了MDL(Meta data lock),所以–single-transaction时,事务内操作过的表都会持有MDL,因此不会被DDL破坏。
例如,mysqldump已经备份了a,b,c表,因为它们在事务内,事务还没提交,它们的MDL不会释放,因此另外的线程如果做a,b,c中任意一张表的DDL操作,都会出现Waiting for table metadata lock,而还没备份到的表不会持有MDL,因此还可以做DDL。

到此,相信大家对“mysqldump流程举例分析”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

您可能感兴趣的文档:

--结束END--

本文标题: mysqldump流程举例分析

本文链接: https://www.lsjlt.com/news/66886.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysqldump流程举例分析
    本篇内容主要讲解“mysqldump流程举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysqldump流程举例分析”吧!重要参数 首先我们把参数和内...
    99+
    2024-04-02
  • node.js中的文件流举例分析
    这篇文章主要介绍“node.js中的文件流举例分析”,在日常操作中,相信很多人在node.js中的文件流举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”node.js中...
    99+
    2024-04-02
  • C#多线程举例分析
    这篇文章主要讲解了“C#多线程举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#多线程举例分析”吧!线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中...
    99+
    2023-06-22
  • C++程序代码举例分析
    本篇内容主要讲解“C++程序代码举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++程序代码举例分析”吧!对C++程序代码如下:#include <iostream>...
    99+
    2023-06-17
  • mysqldump问题的示例分析
    mysqldump问题的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。导出:mysqldump数据库[表]>/t...
    99+
    2024-04-02
  • C++编程技巧举例分析
    本篇内容介绍了“C++编程技巧举例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在C++中,Windows类中的Sort方法将成为Lis...
    99+
    2023-06-17
  • mysql存储过程举例分析
    这篇文章主要讲解了“mysql存储过程举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql存储过程举例分析”吧!(1).格式MySQL存储过程创...
    99+
    2024-04-02
  • WCF编程运行举例分析
    这篇文章主要介绍“WCF编程运行举例分析”,在日常操作中,相信很多人在WCF编程运行举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”WCF编程运行举例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-17
  • Hibernate API举例分析
    本篇内容介绍了“Hibernate API举例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java代码<STRONG>Hi...
    99+
    2023-06-17
  • C#枚举类型举例分析
    本篇内容主要讲解“C#枚举类型举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#枚举类型举例分析”吧!C#枚举类型实例演示  using System&nb...
    99+
    2023-06-17
  • ADO.NET库举例分析
    这篇文章主要介绍“ADO.NET库举例分析”,在日常操作中,相信很多人在ADO.NET库举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ADO.NET库举例分析”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-17
  • Magic Index举例分析
    这篇文章主要讲解了“Magic Index举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Magic Index举例分析”吧!面试题:给定一个数组A,...
    99+
    2024-04-02
  • WCF编程应用程序举例分析
    这篇文章主要讲解了“WCF编程应用程序举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“WCF编程应用程序举例分析”吧!在后台运行WCF编程应用程序。出现提示后,单击OK按钮激活Web....
    99+
    2023-06-17
  • PHP协程与阻塞举例分析
    本篇内容介绍了“PHP协程与阻塞举例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!进程、线程、协程关于进程、线程、协程,有非常详细和丰富...
    99+
    2023-06-17
  • MySQL主线程状态举例分析
    这篇文章主要介绍“MySQL主线程状态举例分析”,在日常操作中,相信很多人在MySQL主线程状态举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL主线程状态举例...
    99+
    2024-04-02
  • mysqld got signal举例分析
    这篇文章主要介绍“mysqld got signal举例分析”,在日常操作中,相信很多人在mysqld got signal举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • C++语言举例分析
    这篇文章主要介绍“C++语言举例分析”,在日常操作中,相信很多人在C++语言举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++语言举例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!因为依赖开...
    99+
    2023-06-17
  • Python中栈举例分析
    本篇内容主要讲解“Python中栈举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中栈举例分析”吧!1、问题描述Python中数据类型有列表,元组,字典,队列,栈,树等等。像列...
    99+
    2023-06-25
  • ADO.NET参数举例分析
    本篇内容主要讲解“ADO.NET参数举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ADO.NET参数举例分析”吧!我们假设数据可的结构如下图(设置的数据库为Oracle10g):crea...
    99+
    2023-06-17
  • ADO.NET技术举例分析
    这篇文章主要介绍“ADO.NET技术举例分析”,在日常操作中,相信很多人在ADO.NET技术举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ADO.NET技术举例分析”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作