single-transaction 和master-data的用法

mysqldump -p -S /data/mysqldata1/sock/mysql.sock --single-transaction  --master-data=2  --database db1 db2 db3 > db.sql
1、single-transaction
官方解释如下:
--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 avalid 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.   

由上面加粗的黑体字可以看到几个关键信息:
    (1)可以在一个事务里对全部表获取一个一致性快照这里保证了可以在此时获得此一时刻的一致性数据;
    (2)只对有版本控制的存储引擎,目前为止是只有innodb有这个功能同样大众的myisam引擎使用不了;
    (3)在这个过程中,alter、drop、rename和truncate是无法隔离的,即不能使用额表操作
    (4)自动关闭 --lock-tables 选项
    
    我们打开mysql的general-log,来查看 mysqldump --single-transaction -B test >t.log到底发生了什么,查看general-log,如下:
    (1) SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
    (2)START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
    (3)UNLOCK TABLES
    第一行是使当前session的事务级别为可重复读;
    第二行是开始一个事务并且获得一个一致性快照,其实这个时候就是对当前所有表的数据进行了一个保存,其实这里应该使用了MVCC多版本控制,这就是为什么只有innodb才有的功能;
    第三行是释放锁,这也解释了为什么说使用mysqldump不会锁表(因为第二行已经取得了快照,不需要锁表了)。

2、master-data
    master-data主要是为了记录binlog的log和pos,用于之后基于时间点的恢复,所以非常重要。    
     同样执行mysqldump  --master-data=2 -B test >t.log
      (1)FLUSH  TABLES
      (2)FLUSH TABLES WITH READ LOCK
      (3)SHOW MASTER STATUS
      第一行flush tables To execute FLUSH, you must have the RELOAD privilege.    
        执行flush,需要reload权限
        Closes all open tables, forces all tables in use to be closed, and flushes the query cache. FLUSH TABLES also removes all query results from the query cache, like the RESET QUERY CACHE statement

          关闭打开的表,清除query-cache里的缓存!一句话:使所有表回写到db;

      第二行FLUSH TABLES WITH READ LOCK
        Closes all open tables and locks all tables for all databases with a global read lock until you explicitly release the lock by executing UNLOCK TABLES. This is a very convenient way to get backups if you have a file system such as Veritas or ZFS that can take snapshots in time.       

        对所有表获得一个全局的读锁,并且直到你显式地“UNLOCK TABLES”才会释放锁;

      第三行无非是是记录下当前的binlog的log和pos。
                   
3、从上面第二个例子可以看到没有出现出现unlock tables,因为没有 single-transaction,所以,是会锁表的!所以一般以上两个参数是会一起使用的:
      mysqldump --single-transaction  --master-data=2
            (1)FLUSH TABLES
            (2)FLUSH TABLES WITH READ LOCK
            (3)SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
            (4)START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
            (5)SHOW MASTER STATUS
            (6)UNLOCK TABLES
            又上面六行可知,既保证不会锁表的情况下获得一致性快照、又可以精确地记下binlog位置!

可以总结上面的问题是:
    当在执行“mysqldump –single-transaction –master-data”之前,如果有一个很长时间的查询(select)没有结束,那么“mysqldump –single-transaction –master-data”里的FLUSH TABLES WITH READ LOCK将会一直等待前一个查询结束才会执行,而更加严重的是,在没有执行完FLUSH TABLES WITH READ LOCK之前,其他的所有update、delete等更改操作都将会被阻塞!
    以上的结论很恐怖,比如一不小心写了个很烂的每名中索引的全表扫描,执行了一晚上都没跑完,而凌晨的备份也将阻塞,同样也导致了数据无法写入和更改,这其实也就等同于整个系统已经瘫痪了!

参考:
    http://www.mysqlperformanceblog.com/2010/04/24/how-fast-is-flush-tables-with-read-lock/
    http://dev.mysql.com/doc/refman/5.0/en/flush.html 

    http://linuxcommand.org/man_pages/mysqldump1.html 


实例:如下是导出的文件中记录的日志文件的起始位置,在复制后改为主备复制需要用到此日志文件的信息及其位置

-- MySQL dump 10.13  Distrib 5.1.61, for redhat-linux-gnu (x86_64)
--
-- Host: localhost    Database: fnbl_core
-- ------------------------------------------------------
-- Server version       5.5.24-log


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Position to start replication or point-in-time recovery from
--
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.002799', MASTER_LOG_POS=91553713;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`--master-data` 和 `--single-transaction` 是两个 mysqldump 命令的选项,可以结合使用以实现更一致的备份。 `--master-data` 参数用于在备份文件中添加二进制日志文件和位置信息,以便在恢复时确定备份点。它可以通过设置不同的值来控制额外添加的信息量。 `--single-transaction` 参数用于在备份过程中开启一个事务,并使用一致性读取来获取数据。这意味着备份过程中的数据读取不会被其他事务的修改所影响,确保备份的一致性。 结合使用 `--master-data` 和 `--single-transaction` 可以达到以下效果: 1. 保证备份的一致性:使用 `--single-transaction` 可以确保备份过程中的数据读取一致,避免了其他事务对数据的修改。这对于需要备份大型数据库或者备份过程需要较长时间的情况非常有用。 2. 提供备份点信息:使用 `--master-data` 可以在备份文件中添加二进制日志文件和位置信息。结合 `--single-transaction`,可以在备份时获取一个一致性的备份点,并在恢复时可以方便地确定备份点进行恢复操作。 以下是使用 `--master-data` 和 `--single-transaction` 结合进行备份的示例命令: ``` mysqldump --master-data=2 --single-transaction -u <username> -p <database> > backup.sql ``` 在备份完成后,备份文件 backup.sql 中将包含二进制日志文件和位置信息的注释,并且备份点是在一个一致性的状态下获取的。 综上所述,结合使用 `--master-data` 和 `--single-transaction` 可以实现一致性备份,并提供备份点信息,以便在恢复时进行准确的还原。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值