MySQLdump之single-transaction详解

MySQLdump之single-transaction详解

single-transaction

  • 开启general log选项
  1. 查看目前general log的情况

    mysql> show variables like ‘%general_log%‘;
    +------------------+--------------------------------------------+
    | Variable_name    | Value                                      |
    +------------------+--------------------------------------------+
    | general_log      | OFF                                        |
    | general_log_file | /data/mysqldata/3306/general_statement.log |
    +------------------+--------------------------------------------+
    2 rows in set (0.00 sec)
  2. 开启general log的选项
    mysql> set global general_log=on;
  3. 使用mysqldump命令:。
    [[email protected] ~]$ /usr/local/mysql/bin/mysqldump -uroot -p‘[email protected]‘ -S /data/mysqldata/3306/mysql.sock --single-transaction --default-character-set=utf8 zdemo student > /tmp/studentbackup.sql

    其中使用了两个参数

  • --single-transaction

    ??此选项会将隔离级别设置为:REPEATABLE READ。并且随后再执行一条START TRANSACTION语句,让整个数据在dump过程中保证数据的一致性,这个选项对InnoDB的数据表很有用,且不会锁表。但是这个不能保证MyISAM表和MEMORY表的数据一致性。

    ??为了确保使用--single-transaction命令时,保证dump文件的有效性。需没有下列语句ALTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE,因为一致性读不能隔离上述语句。所以如果在dump过程中,使用上述语句,可能会导致dump出来的文件数据不一致或者不可用。

    ??如何验证上述的过程呢,可以开启general log看看过程是否如上述所说。

  • --default-character-set=utf8

    导出的dump文件字符集为uft8,检验文件字符集的命令可以使用file -i

通用查询日志文件如下:

2018-06-18T11:42:31.035205Z      9163 Query     /*!40100 SET @@SQL_MODE=‘‘ */
2018-06-18T11:42:31.036090Z      9163 Query     /*!40103 SET TIME_ZONE=‘+00:00‘ */
2018-06-18T11:42:31.036905Z      9163 Query     /*!80000 SET SESSION information_schema_stats_expiry=0 */
2018-06-18T11:42:31.037521Z      9163 Query     SET SESSION NET_READ_TIMEOUT= 700, SESSION NET_WRITE_TIMEOUT= 700
2018-06-18T11:42:31.038398Z      9163 Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2018-06-18T11:42:31.038977Z      9163 Query     START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
2018-06-18T11:42:31.039859Z      9163 Query     SHOW VARIABLES LIKE ‘gtid\_mode‘
2018-06-18T11:42:31.058093Z      9163 Query     UNLOCK TABLES
中间日志省略
......
2018-06-18T11:42:31.084432Z      9163 Query     SAVEPOINT sp
2018-06-18T11:42:31.087632Z      9163 Query     show create table `student`
2018-06-18T11:42:31.088094Z      9163 Query     SET SESSION character_set_results = ‘utf8‘
2018-06-18T11:42:31.088407Z      9163 Query     show fields from `student`
2018-06-18T11:42:31.092360Z      9163 Query     show fields from `student`
2018-06-18T11:42:31.094718Z      9163 Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `student`
2018-06-18T11:42:32.815435Z      9163 Query     ROLLBACK TO SAVEPOINT sp
2018-06-18T11:42:32.815546Z      9163 Query     RELEASE SAVEPOINT sp

从上述日志分析:

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ 设置隔离级别为REPEATABLE READ

START TRANSACTION 开启了事务

??事务的实现是通过InnoDB存储引擎的MVCC机制事项,细节如下:InnoDB是一个多版本控制的存储引擎。它可以对已修改的行保留一个旧版本的数据信息。用于支持事务特性。例如:并发和数据回滚。这个信息保留在数据结构中的表空间中,这个表空间称之为rollback segment回滚段。(在Oracle中也有一种类似的数据结构)。

??当事务需要回滚的时候,InnoDB会使用回滚段的信息,用于执行undo操作。对于某一行,InnoDB会用早先版本的信息来保障读一致性(consistent read)。

??Undo日志在回滚段(rollback segment)中被分为两部分,一部分叫做插入undo日志(insert undo logs),另外一部分叫做更新undo日志(update undo logs)。插入undo日志只用于事务回滚,如事务一旦提交,那么日志就可以被丢弃。更新undo日志用在读一致性,InnoDB会指定一个数据快照,这个快照的构建来自于更新undo日志中数据行的早期版本。通过数据行早期版本的快照来保证读一致性,如果不需要这种事务数据保护的时候,这个日志可以被丢弃。

保存点的日志分析

SAVEPOINT SP
......中间日志省略...
SELECT /*!40001 SQL_NO_CACHE */ * FROM `student`
......中间日志省略...
ROLLBACK TO SAVEPOINT sp
RELEASE SAVEPOINT sp

可以看到通过REPEATABLE READ事务,保证数据一致性数据,然后

设置保存点sp,当读取了所有数据的快照,就回退这个保存点sp。可以比喻为游戏中存档之后,然后取档备份成一个游戏外的文件,删除这个档。可以当作这个档在这个游戏内不存在。

查看当前会话级别

## 会话级当前事务级别
mysql> show variables like ‘%isolation%‘;
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.03 sec)
## 系统全局级当前事务级别
mysql> show global variables like ‘%isolation%‘;
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ
+-----------------------+-----------------+
1 row in set (0.11 sec)
## 修改全局级事务级别
mysql>set global transaction_isolation=‘read-committed‘

就算修改了全局事务级别,Mysqldump导出时也会设定隔离事务级别为:REPEATABLE READ。用于保证数据的读一致性。

导出文件的字符集类型

[[email protected] tmp]$ file -i studentbackup.sql
studentbackup.sql: text/plain; charset=utf-8

原文地址:https://www.cnblogs.com/zhangshengdong/p/9196128.html

时间: 2024-08-30 00:04:26

MySQLdump之single-transaction详解的相关文章

Hibernate Session & Transaction详解

Hibernate Session & Transaction详解 HIbernate中的Session Session是JAVA应用程序和Hibernate进行交互时使用的主要接口,它也是持久化操作核心API, 注意这里的Session的含义,它与传统意思上web层的HttpSession并没有关系,Hibernate Session之与Hibernate,相当于JDBC Connection相对与JDBC. Session对象是有生命周期的,它以Transaction对象的事务开始和结束边界

mysqldump数据库备份还原详解

mysqldump备份常见用法 1.导出整个数据库(包括数据库中的数据) mysqldump -u username -p dbname > dbname.sql 2.导出数据库结构(不含数据) mysqldump -u username -p -d dbname > dbname.sql 3.导出数据库中的某张数据表(包含数据) mysqldump -u username -p dbname tablename > tablename.sq mysqldump -uroot -p -B

mysql之 mysqldump 备份恢复详解

mysqldump 程序的实现原理是通过我们给的参数信息加上数据库中的系统表信息来一个表一个表获取数据然后生成 INSERT 语句再写入备份文件中的.这样就出现了一个问题,在系统正常运行过程中,很可能会不断有数据变更的请求正在执行,这样就可能造成在 mysqldump 备份出来的数据不一致.也就是说备份数据很可能不是同一个时间点的数据,而且甚至可能都没办法满足完整性约束.这样的备份集对于有些系统来说可能并没有太大问题,但是对于有些对数据的一致性和完整性要求比较严格系统来说问题就大了,就是一个完全

Spring事务Transaction配置的五种注入方式详解

Spring事务Transaction配置的五种注入方式详解 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ??? 总结如下: ??? Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. ???DataSou

mysqldump导入导出详解

mysqldump可以指定路径的,如果没指定路径,而只写了文件名的话,那么就在当前进入mysql命令行所在的目录,也就是mysql安装目录下 mysqldump  --default-character-set=utf8 -h127.0.0.1  -uroot -pabctrans -P33061 db table1 able2 |gzip > db`date +%Y%m%d`.tar.gz mysqldump  --default-character-set=utf8 -h127.0.0.1 

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

mysqldump -u 用户名 -p [--opt] DATABASENAME [Table] >导出SQL文件名 例子: mysqldump -h host -u user -p --opt databasename [table] > /home/user/databasename.sql 使用Mysqldump导出数据表结构 mysqldump -u root -p --no-data mysql user >D:\PHPWeb\sqlbackup\mysql_user.sql

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

Mysql本身提供了命令行导出工具Mysqldump和Mysql Source导入命令进行SQL数据导入导出工作,通过Mysql命令行导出工具Mysqldump命令能够将Mysql数据导出为文本格式(txt)的SQL文件,通过Mysql Source命令能够将SQL文件导入Mysql数据库中,下面通过Mysql导入导出SQL实例详解Mysqldump和Source命令的用法. 在PHP网站开发中,时常遇到Mysql数据库备份或数据库迁移工作,这时Mysql怎么导入导出数据库中的数据就非常关键,M

mysqldump使用详解

Mysql常用命令详解 Mysql安装目录数据库目录/var/lib/mysql/配置文件/usr/share/mysql(mysql.server命令及配置文件)相关命令/usr/bin(mysqladmin mysqldump等命令)启动脚本/etc/init.d/mysql(启动脚本文件mysql的目录) 系统管理连接MySQL格式: mysql -h 主机地址 -u用户名 -p用户密码例 1:连接到本机上的 MySQL.[email protected]:~$ mysql -uroot

MySQL数据库使用mysqldump导出数据详解

mysqldump是mysql用于转存储数据库的实用程序.它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等.接下来通过本文给大家介绍MySQL数据库使用mysqldump导出数据详解,需要的朋友一起学习吧 mysqldump是mysql用于转存储数据库的客户端程序.它主要产生一系列的SQL语句,可以封装到文件,该文件包含有所有重建您的数据库所 需要的 SQL命令如CREATE DATABASE,CREATE TABLE,INSERT等等.可