myql备份数据库可以分为冷备和热备
冷备的话就是,将数据库关停,利用操作系统命令老板数据库相关文件, 而热备数据是指这些热备,不需要关闭数据库.热备也可以分两种方式
- 使用 mysqldump 进行逻辑备份
- 使用 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'
后面就是些查表结构,表数据的语句了
-
flush table 这语句的目标是,等其他的的锁表语句执行完
-
flush table with read lock 加一个全局锁, 这个时间点内表是被锁住的
-
set session transaction isolation level repeatable read 这个语句的作用是讲本次会话的事物级别调整到可重复读, 这样保证在事物开启后,对于任何一张表的多次查询能保证一致的结果 (其实mysql的默认事物级别也是 REPEATABLE-READ,但是为了保险还是执行一下)
-
start transaction 开始事物,从这里开始,在当前会话视图下,整个数据库是静止状态下的了
-
show master status 获取当前数据库当前时间点的 binglog位置,为后面重放binglog做准备
-
unlock tables 释放锁,这里之前锁表的话是因为,一般的事物是没法阻止表结构更改的, 表结构更改也会变化 binglog的位置.
接下来的话就是, 常规的对数据库的备份了.
这里面,需要注意的点是,在开启读事物时,mysql为保证 mvcc 会把数据写到undolog里面,如果在这过程中有大量的写入 undolog会快速的增加, 而且这个时间点如果有dml语句,会改变表结构照常备份有问题.