Ⅰ、mysqldump的简单使用与注意点

1.1 基本参数

只备份innodb,用不了几个参数,记住下面几个即可,其他的没什么卵用

-A 备份所有的database
-B 备份哪几个数据库
-R 备份存储过程(-- routines)
-E 备份定时任务(-- events)
-d 只备份表结构
-w 备份过滤数据
-t 只备份数据
-q 直接读数据,绕过缓冲池,默认已加
--triggers 备份触发器
--master-data=2 在备份文件中以注释的形式记录备份开始时binlog的position,默认值是1,不注释 tips:
①--set-gtid-purged=OFF 如果实例开了gtid最好加上这个参数,不然备份时候会报warning,且备份出来的数据恢复到其他版本的实例上会报错:A partial dump from a server that has GTIDs is not allowed.
②--dump-slave,该参数可以用作在从库做备份获取主库的位置点,来做一个新从库,避免在主库做备份影响业务,带该参数备份时,从上sql线程会被kill,备份完再拉起

常见用法:

mysqldump --single-transaction -B test a > backup.sql    备份test库和a库
mysqldump --single-transaction test a > backup.sql 备份test库下的a表
mysqldump --single-transaction test a -w "c=12"> backup.sql

1.2 其他参数

--lock-tables(-l)
在备份中依次锁住所有表,一般用于myisam备份,备份时数据库只能提供读操作,以此来保证数据一致性,该参数和--single-transaction是互斥的,所以实例中既存在myisam又存在innodb则,只能使用该参数 --lock-all-tables(-x)
比上面的参数力度更大,备份时将整个实例锁住

1.3 重点

--single-transaction
必须加(一个事务中导出数据,确保产生一致性的备份数据)

my.cnf中配上下面配置

[mysqldump]
single-transaction
master-data=2

Ⅱ、mysqldump实现原理剖析

2.1 开glog嗖哈一把看看嘛(__)

session 1:
(root@localhost) [(none)]> truncate mysql.general_log;
Query OK, 0 rows affected (0.02 sec) (root@localhost) [(none)]> set global general_log = 1;
Query OK, 0 rows affected (0.00 sec) (root@localhost) [(none)]> set global log_output = 'table';
Query OK, 0 rows affected (0.00 sec) session 2:
[root@VM_0_5_centos src]# mysqldump --single-transaction --master-data=2 -B dump_test > /tmp/back.sql session 1:
(root@localhost) [(none)]> set global general_log = 0;
Query OK, 0 rows affected (0.00 sec) (root@localhost) [(none)]> set global log_output = 'file';
Query OK, 0 rows affected (0.00 sec) (root@localhost) [(none)]> select thread_id,left(argument,64) from mysql.general_log; (root@localhost) [(none)]> select argument from mysql.general_log where thread_id=239 order by event_time; FLUSH /*!40101 LOCAL */ TABLES
# 先把表刷一把,减少ftwrl锁的等待时间
FLUSH TABLES WITH READ LOCK
# 把当前整个实例锁成只读
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
# 设置备份线程事务隔离级别为rr
START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
# 开启事务
SHOW VARIABLES LIKE 'gtid\_mode'                                                                    
SHOW MASTER STATUS
# 获得当前二进制日志位置
UNLOCK TABLES
# 释放实例级别的只读锁
SELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'UNDO LOG' AND FILE_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IN (SELECT DISTINCT LOGFILE_GROUP_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('dump_test'))) GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE ORDER BY LOGFILE_GROUP_NAME
SELECT DISTINCT TABLESPACE_NAME, FILE_NAME, LOGFILE_GROUP_NAME, EXTENT_SIZE, INITIAL_SIZE, ENGINE FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('dump_test')) ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME
SHOW VARIABLES LIKE 'ndbinfo\_version'
dump_test
SHOW CREATE DATABASE IF NOT EXISTS `dump_test`
SAVEPOINT sp
# 使用savepoint sp,便于回滚,用于快速释放metadata数据共享锁
show tables                                                                                        
show table status like 'dump\_inno'
SET SQL_QUOTE_SHOW_CREATE=1
SET SESSION character_set_results = 'binary'
show create table `dump_inno`
SET SESSION character_set_results = 'utf8'
show fields from `dump_inno`
show fields from `dump_inno`
SELECT /*!40001 SQL_NO_CACHE */ * FROM `dump_inno`
SET SESSION character_set_results = 'binary'
use `dump_test`
select @@collation_database
SHOW TRIGGERS LIKE 'dump\_inno'
SET SESSION character_set_results = 'utf8'
# 以上部分备份数据
ROLLBACK TO SAVEPOINT sp                                                                            
RELEASE SAVEPOINT sp
# 回到savepoint sp,释放metadata的锁
# 每取一张表的数据,就rollback to savepoint sp(一个savepoint就够了) root@localhost on using Socket
/*!40100 SET @@SQL_MODE='' */
/*!40103 SET TIME_ZONE='+00:00' */

2.2 mysqldump流程小结

- 操作 解析
step1 flush tables/flush tables with read lock 将实例锁成只读
step2 SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ/START TRANSACTION 开启rr隔离级别的事务
step3 SHOW MASTER STATUS/UNLOCK TABLES 获取二进制日志位置并释放全局读锁
step4 SAVEPOINT sp 设置回滚点
step5 select xxx 备份数据
step6 ROLLBACK TO SAVEPOINT sp/RELEASE SAVEPOINT sp 结束一张表备份,回到sp

2.3 关键点细说

  • start transaction with consistent snapshot

位置点问题:事务隔离级别是rr,开始事务,并且马上创建一个read_view,所以mysqldump备份的数据是备份开始时候的数据而不是备份结束时的数据(备份了30min,整个过程实例一直可读可写,备份的是30min之前的数据而不是30min之后的数据)

执行start transaction同时(而不是等到执行第一条sql)建立与本事务一致性读的snapshot

  • --single-transaction

所有的数据都是在一个事务里面读出来,而且事务隔离级别是如rr的,所以读到的数据是一致的

一致性备份:整个备份从start transaction开始,备份所有的表,所有的表的数据都是在一个事务里面,通过select导出来

  • savepoint保存点(4.1还是5.0加进来的)

savepoint很少用,真正用的最多就是备份的时候,一张表备份完,会回滚到对应保存点,此时对应备份的表上面的元数据锁都释放,这时候可以这个表可以做ddl操作。

否则在一个事务里,持有元数据锁,要做ddl(比如其他线程想对这里一个表创建索引),即使备份完了也做不了,要等所有备份结束才能动

没有savepoint时,只读锁要持有整个事务时间,而不是表备份的时间

Ⅲ、常规操作

①备份并且压缩

mysqldump --single-transaction --master-data=1 --triggers -R -E -B sbtest | pv | gzip -c > sbtest.backup.tgz

压缩过的备份恢复

gunzip < sbtest.backup.tgz | mysql

②备份并且压缩到远程服务器

mysqldump --single-transaction --master-data=1 --triggers -R -E -B sbtest | gzip -c | ssh root@test-3 'cat > /tmp/sbtest.sql.gz'

备份校验,另行考虑

③备份文件使用

mysql < xxx.sql;

tips:

备份占用带宽很大,需要调度算法确保同一个集群中同时只有一个机器做备份,或者不每天做备份从而错开备份时间

mysqldump详解的更多相关文章

  1. MySQL程序之mysqldump详解

    mysqldump命令详解 mysqldump是mysql用于转存储数据库的实用程序.它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等 用法: ...

  2. MySQL(十五)之数据备份中mysqldump详解

    前言 其实前面一篇数据备份已经是非常的详细了,这里我想单独的讲解一下mysqldump,相信很多程序员都是用过这个命令的! 一.MySQL数据库的备份与还原 1.1.MySQL数据库备份 1)语法 m ...

  3. mysqldump详解之--master-data

    在前一篇文章中,有提到mysqldump的--single-transaction参数.另外还有个很重要,也是运维中经常用到的参数:--master-data,网上很多关于MySQL不停机备份的实现都 ...

  4. Mysql的mysqldump详解

    一.导出 1.1 导出表结构及数据 mysqldump -uroot -p --set-gtid-purged=OFF database table1 table2 > mysqldump.sq ...

  5. MySQL数据备份 mysqldump 详解

    MySQL数据备份流程 1 打开cmd窗口 通过命令进行数据备份与恢复: 需要在Windows的命令行窗口中进行: l 开始菜单,在运行中输入cmd回车: l 或者win+R,然后输入cmd回车,即可 ...

  6. Mysqldump 参数详解(全)

    Mysqldump 参数详解(全) http://www.open-open.com/lib/view/open1358172843762.html mysqldump -S /tmp/mysql33 ...

  7. Mysql导入导出工具Mysqldump和Source命令用法详解

    Mysql本身提供了命令行导出工具Mysqldump和Mysql Source导入命令进行SQL数据导入导出工作,通过Mysql命令行导出工具Mysqldump命令能够将Mysql数据导出为文本格式( ...

  8. mysqldump的常用语句及各参数详解

    mysqldump的常用语句及各参数详解 分类: MySQL 2011-01-11 17:55 1368人阅读 评论(0) 收藏 举报 数据库mysql服务器tableinsertdatabase m ...

  9. [转]Mysql导入导出工具Mysqldump和Source命令用法详解

    Mysql本身提供了命令行导出工具Mysqldump和Mysql Source导入命令进行SQL数据导入导出工作,通过Mysql命令行导出工具Mysqldump命令能够将Mysql数据导出为文本格式( ...

随机推荐

  1. 队列顺序存储 - 设计与实现 - API函数

    队列是一种特殊的线性表 队列仅在线性表的两端进行操作 队头(Front):取出数据元素的一端 队尾(Rear):插入数据元素的一端 队列不允许在中间部位进行操作! queue常用操作 销毁队列 清空队 ...

  2. Linux常用命令(第二版) --网络通信命令

    网络通信命令 1.write /usr/bin/write 格式: write [用户名] #用于向用户发送信息,前提是这个用户已经登录到了这台服务器主机,不然的话,也没有办法给他留言,所以,writ ...

  3. iOS开发讲解SDWebImage,你真的会用吗?

    SDWebImage作为目前最受欢迎的图片下载第三方框架,使用率很高.但是你真的会用吗?本文接下来将通过例子分析如何合理使用SDWebImage. 使用场景:自定义的UITableViewCell上有 ...

  4. jdk8中tomcat修改配置PermSize为MetaspaceSize

    JDK8中用metaspace代替permsize,因此在许多我们设置permsize大小的地方同样需要修改配置为metaspace 将-XX:PermSize=200m;-XX:MaxPermSiz ...

  5. PS 图像调整算法——反相

    这个顾名思义,对图像做减法. Image_new=1-Image_old; 原图: 反相:

  6. Mina源码阅读笔记(七)—Mina的拦截器FilterChain

    Filter我们很熟悉,在Mina中,filter chain的用法也类似于Servlet的filters,这种拦截器的设计思想能够狠轻松的帮助我们实现对资源的统一处理.我们先大致连接下mina中的f ...

  7. 将文件内容转化为byte数组返回

    如何将文件内容转化为byte数组并返回呢?对于这个问题,我献上我第一次成功的代码~ package com.succez.task1; import java.io.ByteArrayOutputSt ...

  8. Mongodb3.6 基操命令(二)——如何使用help

    前言 在上一篇文章Mongodb3.6 快速入门(一)中,我们主要使用两个命令: 1.mongod #启动服务 2.mongo #连接mongodb 对于刚接触mongo的人来说,该怎么给命令传递参数 ...

  9. Swap Nodes in Pairs(交换节点)

    Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2-&g ...

  10. Maximum Subarray(最大子数组)

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...