mysqldump 备份数据库原理

myql备份数据库可以分为冷备和热备

冷备的话就是,将数据库关停,利用操作系统命令老板数据库相关文件, 而热备数据是指这些热备,不需要关闭数据库.热备也可以分两种方式

  1. 使用 mysqldump 进行逻辑备份
  2. 使用 percona 提供的xtrabackup 进行物理备份

根据mysqldump可以备份远端的数据库这一点来确定, mysqldump 也是使用mysql交互协议来进行发送命令的

我们可以通过打开general log 来看 mysqldump 全库备份时执行的命令来了解 mysqldump背后的逻辑

可以通过 如下命令来开启 general log, general log 开启后, mysql执行的所有sql语句都会被记录下来,因为比较耗费性能,所以一般都会关闭

   set global general_log=on;

可以通过如下语句获取到 general_log的状态和和存放位置

   show variables like '%general_log_file%'

mysqldump --master-data=2 -R --single-tansaction -A -phello > xxx.sql

--master-data=1 是讲数据库吃 change master 命令注释掉

-R 会备份存储过程和函数

--single-transation 获取表的一致性备份,即开启事物

-A 相当于 --all-databases


FLUSH  TABLE

FLUSH TABLE WITH READ LOCK

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ

START TRANSACTION

SHOW VARIABLES LIKE 'gtid\_mode'

SHOW MASTER STATUS

UNLOCK TABLES

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 GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE ORDER BY LOGFILE_GROUP_NAME

SELECT DISTINCT TABLESPACE_NAME, FILE_NAME, LOGFILE_GROUP_NAME, EXTENT_SIZE, INITIAL_SIZE, ENGINE FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME

SHOW DATABASES

SHOW VARIABLES LIKE 'ndbinfo\_version'

后面就是些查表结构,表数据的语句了

  1. flush table 这语句的目标是,等其他的的锁表语句执行完

  2. flush table with read lock 加一个全局锁, 这个时间点内表是被锁住的

  3. set session transaction isolation level repeatable read 这个语句的作用是讲本次会话的事物级别调整到可重复读, 这样保证在事物开启后,对于任何一张表的多次查询能保证一致的结果 (其实mysql的默认事物级别也是 REPEATABLE-READ,但是为了保险还是执行一下)

  4. start transaction 开始事物,从这里开始,在当前会话视图下,整个数据库是静止状态下的了

  5. show master status 获取当前数据库当前时间点的 binglog位置,为后面重放binglog做准备

  6. unlock tables 释放锁,这里之前锁表的话是因为,一般的事物是没法阻止表结构更改的, 表结构更改也会变化 binglog的位置.

接下来的话就是, 常规的对数据库的备份了.

这里面,需要注意的点是,在开启读事物时,mysql为保证 mvcc 会把数据写到undolog里面,如果在这过程中有大量的写入 undolog会快速的增加, 而且这个时间点如果有dml语句,会改变表结构照常备份有问题.