MySQLdump一致性快照备份流程

版本: 5.7.17-log MySQL Community Server (GPL)

参数: --master-data=2 --single-transaction

  1. FLUSH /!40101 LOCAL / TABLES
  • 刷盘,将内存的数据fsync到磁盘上面
  1. FLUSH TABLES WITH READ LOCK
  • 设置全局读锁,禁止全局写入
  • write和read俩者的区别在于就是设置read之后,当前session也不能对数据的写入,修改等dml操作。write设置之后当前session可以进行修改,插入,删除等操作
  1. SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
  • 设置MySQL的隔离级别是RR,主要是为使用MVCC版本特性。
  1. START TRANSACTION /!40100 WITH CONSISTENT SNAPSHOT /
  • 显性开启事务,在当前事务内,由于RR隔离级别的MVCC版本控制,在当前事务内相同的select语句无论何时获取的数据是一摸一样的。
  1. SHOW VARIABLES LIKE 'gtid_mode'
  2. SHOW MASTER STATUS
  • 获取当前的binlog的filename和position信息
  1. UNLOCK TABLES
  • 解锁。
  1. 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 ('$databasename'))) GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE ORDER BY LOGFILE_GROUP_NAME
  2. 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 ('$databasename')) ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME
  3. SHOW VARIABLES LIKE 'ndbinfo_version'
  4. Init DB
  • use $databasename
  1. SAVEPOINT sp
  • 设置断点
  1. show tables
  2. show table status like '$tablename'
  3. SET SQL_QUOTE_SHOW_CREATE=1
  4. SET SESSION character_set_results = 'binary'
  5. show create table `$tablename`
  6. SET SESSION character_set_results = 'utf8'
  7. show fields from `$tablename`
  8. SELECT /!40001 SQL_NO_CACHE / * FROM `$tablename`
  • SQL_NO_CACHE指的是query cache,但是一般qc不建议开启,5.7默认是关闭的。
  1. SET SESSION character_set_results = 'binary'
  2. use `$databasename`
  3. select @@collation_database
  4. SHOW TRIGGERS LIKE '$tablename'
  • 备份触发器
  1. SET SESSION character_set_results = 'utf8'
  2. ROLLBACK TO SAVEPOINT sp
  3. 以table为单位重复循环14~26步骤直到所有的表循环完毕
  4. RELEASE SAVEPOINT sp

问题

  1. 针对一致性快照备份,no_innodb表的备份也是在unlock之后才进行备份的,但是因为非事务表并不支持一次性快照读,所以在备份的过程中假如存在非事务表的写入的话,在进行备份的时候可能会将这些已经写入的数据进行备份,由于在备份表之前就已经获取得到了binlog的filename和position,所以实际上你的备份结果的filename或者position是大于之前你获取得到的binlog的filename和position,这个时候将这个备份拿去做主从搭建的话那么可能会存在一些误差和错误之列的。
  2. 在针对备份有MyISAM引擎的表的时候建议在备份的时候加上-x参数,这个参数表示lock all tables,并且这个参数不能和--single-transaction这个参数一起使用。使用-x这个参数的时候,备份过程中时候是全程锁表的
  3. mysqldump备份是将数据从磁盘读入到内存,再从内存中读入到备份的文件当中,在这个过程中mysqldump备份会使用innodb_buffer_pool_size分配的内存,在5.7.2之前是没有做限制的,也就是会所很有可能将innodb_buffer_pool_size内存使用完毕,导致将BF里面的缓存数据全部冲洗掉,导致备份期间MySQL的访问会有比较严重的IO操作,性能存在一定的下降。但是在MySQL5.7.2版本MySQL出了一个参数可以控制mysqldump备份使用内存限制,innodb_buffer_pool_dump_pct默认参数是25,即innodb_buffer_pool_size的百分之25。


转载于:https://blog.51cto.com/11819159/2069410