MySQL数据库备份探究01
1.深度分析mysqldump --single-transaction 和不加该参数的内部实现机制。
1.1 --single-transaction的作用
此选项将事务隔离模式设置为REPEATABLE READ,并在转储数据之前向服务器发送START TRANSACTION SQL语句。它仅适用于诸如InnoDB这样的事务表,因为在发出START TRANSACTION时,它会转储数据库的一致状态,而不会阻止任何应用程序。
使用此选项时,只有InnoDB表被转储为一致的状态。例如,使用此选项时转储的任何MyISAM或MEMORY表仍可能更改状态。
在进行单事务转储时,为确保有效的转储文件(正确的表内容和二进制日志坐标),没有其他连接应使用以下语句:ALTER TABLE,CREATE TABLE,DROP TABLE,RENAME TABLE,TRUNCATE表。一致的读取并不与这些语句隔离,因此在转储表上使用它们可能导致由mysqldump执行的SELECT检索表内容以获取不正确的内容或失败。
--single-transaction选项和--lock-tables选项是互斥的,因为LOCK TABLES导致任何未处理的事务被隐式提交。
要转储大型表,请将--single-transaction选项与--quick选项相结合。
1.2 --single-transaction的逻辑实现
-- single-transaction备份日志1.设置事务隔离级别REPEATABLE READ
2.创建事务一致性快照
3.对所有表释放锁
4.保持还原点
5.处理表数据
6.回滚到还原点
1.3 普通备份 mysqldump tbl_table > dump.sql
普通备份对所有表建立本地读锁,然后再进行数据的处理。
2.FLUSH TABLES WITH READ LOCK了解该锁是干什么的
2.1 FLUSH TABLES WITH READ LOCK;
建立一个读锁;使其他客户端可以在数据库目录中复制文件时继续查询表。 需要刷新以确保在开始备份之前将所有活动索引页写入磁盘。(关闭所有打开的表,并使用全局读锁锁定所有数据库的所有表。 如果您具有可以及时拍摄快照的文件系统(如Veritas或ZFS),这是一种非常方便的备份方式。 使用UNLOCK TABLES释放锁。)
具有READ LOCK的FLUSH表获取全局读取锁而不是表锁,因此它不会受到与LOCK TABLES和UNLOCK TABLES相关的表锁定和隐式提交的相同行为:
1.UNLOCK TABLES仅当任何表当前已使用LOCK TAB锁定时才隐式提交任何活动的事务。 在FLUSH TABLES WITH READ LOCK之后,UNLOCK TABLES不会发生提交,因为后一个语句不会获取表锁。
2.开始一个事务会导致使用LOCK TABLES获取的表锁被释放,就好像你已经执行了UNLOCK TABLES一样。 开始事务不会释放使用FLUSH TABLES WITH READ LOCK获取的全局读锁。
3.FLUSH TABLES WITH READ LOCK和分布式XA事务不兼容
注意:FLUSH LOGS,FLUSH TABLES WITH READ LOCK,FLUSH TABLES tbl_name ... FOR EXPORT在任何情况下都不会写入二进制日志,因为它们会在复制到从属设备时引起问题。
2.2 FLUSH TABLEStbl_name[,tbl_name] ... WITH READ LOCK
此语句刷新并获取命名表的读取锁。该语句首先获取表的独占元数据锁,因此它等待具有这些表的交易完成。然后该语句从表缓存中刷新表,重新打开表,获取表锁(如LOCK TABLES ... READ),并将元数据锁从独占级别降级为共享。在语句获取锁定和降级元数据锁之后,其他会话可以读取但不能修改表。
因为此语句获取表锁,除了使用任何FLUSH语句所需的RELOAD特权之外,还必须为每个表提供LOCK TABLES特权。
此语句仅适用于现有的基础(非TEMPORARY)表。如果名称引用基表,则使用该表。如果它是指TEMPORARY表,它将被忽略。如果名称适用于视图,则会发生ER_WRONG_OBJECT错误。否则,将发生ER_NO_SUCH_TABLE错误。
使用UNLOCK TABLES释放锁,LOCK TABLES释放锁并获取其他锁,或START TRANSACTION释放锁并开始新的事务。
此FLUSH TABLES变量使表能够在一个操作中刷新和锁定。它提供了一个解决方法,当有活动的LOCK TABLES ... READ时,不允许使用FLUSH TABLES。
此语句不执行隐式UNLOCK TABLES,因此如果在存在任何活动的LOCK TABLES时使用该语句,或者在不首先释放所获取的锁的情况下再次使用该语句,则会导致错误。