【20180206】mysqldump一致性備份流程

MySQLdump一致性快照備份流程

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

參數: --master-data=2 --single-transaction

  1. FLUSH /!40101 LOCAL / TABLES
    • 刷盤,將內存的數據fsync到磁盤上面
  2. FLUSH TABLES WITH READ LOCK
    • 設置全局讀鎖,禁止全局寫入
    • write和read倆者的區別在於就是設置read之後,當前session也不能對數據的寫入,修改等dml操作。write設置之後當前session可以進行修改,插入,刪除等操作
  3. SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
    • 設置MySQL的隔離級別是RR,主要是爲使用MVCC版本特性。
  4. START TRANSACTION /!40100 WITH CONSISTENT SNAPSHOT /
    • 顯性開啓事務,在當前事務內,由於RR隔離級別的MVCC版本控制,在當前事務內相同的select語句無論何時獲取的數據是一摸一樣的。
  5. SHOW VARIABLES LIKE 'gtid_mode'
  6. SHOW MASTER STATUS
    • 獲取當前的binlog的filename和position信息
  7. UNLOCK TABLES
    • 解鎖。
  8. 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
  9. 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
  10. SHOW VARIABLES LIKE 'ndbinfo_version'
  11. Init DB
    • use $databasename
  12. SAVEPOINT sp
    • 設置斷點
  13. show tables
  14. show table status like '$tablename'
  15. SET SQL_QUOTE_SHOW_CREATE=1
  16. SET SESSION character_set_results = 'binary'
  17. show create table `$tablename`
  18. SET SESSION character_set_results = 'utf8'
  19. show fields from `$tablename`
  20. SELECT /!40001 SQL_NO_CACHE / * FROM `$tablename`
    • SQL_NO_CACHE指的是query cache,但是一般qc不建議開啓,5.7默認是關閉的。
  21. SET SESSION character_set_results = 'binary'
  22. use `$databasename`
  23. select @@collation_database
  24. SHOW TRIGGERS LIKE '$tablename'
    • 備份觸發器
  25. SET SESSION character_set_results = 'utf8'
  26. ROLLBACK TO SAVEPOINT sp
  27. 以table爲單位重複循環14~26步驟直到所有的表循環完畢
  28. 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。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章