关于MySQL热备,可分为两种方式:
逻辑备份
物理备份
对于前者,常用的工具是MySQL自带的mysqldump,对于后者,常用的工具是Percona提供的XtraBackup。
对于规模比较小,业务并不繁忙的数据库,一般都是选择mysqldump。
那么,mysqldump的备份原理是什么呢?
抛开源码不谈,其实我们可以通过打开general log,查看mysqldump全库备份时执行的命令来了解mysqldump背后的原理。
只考虑innodb表的情况如下图所示:
打开general log
root@ 04:55: [sbtest]> set global general_log=on;
Query OK, 0 rows affected (0.00 sec)
其中,general log的存放路径可通过以下命令查看
root@ 04:59: [sbtest]> show variables like '%general_log_file%';
+------------------+---------------------------+
| Variable_name | Value |
+------------------+---------------------------+
| general_log_file | /data/mysql/localhost.log |
+------------------+---------------------------+
1 row in set (0.00 sec)
执行全库备份
[root@localhost ~]# mysqldump --master-data=2 -R --single-transaction -A -p123456 > lijingkuan.sql
Warning: Using a password on the command line interface can be insecure.
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events.
其中
–master-data指定为2指的是会在备份文件中生成CHANGE MASTER的注释。具体在本例中,指的是
-- CHANGE MASTER TO MASTER_LOG_FILE='mybinlog.000008', MASTER_LOG_POS=222448728;
如果该值设置为1,则生成的是CHANGE MASTER的命令,而不是注释。
-R 备份存储过程与函数
–single-transaction 获取InnoDB表的一致性备份。
-A 相当于–all-databases。
下面来看看general log中的内容
170529 5:00:47 215 Connect root@localhost on
215 Query /*!40100 SET @@SQL_MODE='' */
215 Query /*!40103 SET TIME_ZONE='+00:00' */
215 Query FLUSH /*!40101 LOCAL */ TABLES
215 Query FLUSH TABLES WITH READ LOCK
215 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
215 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
215 Query SHOW VARIABLES LIKE 'gtid\_mode'
215 Query SELECT @@GLOBA