这片博文主要用来介绍MySQL的备份与恢复:
MySQL的备份形式可以分为如下几种:
- 热备----即不停机备份
- 冷备----需要关闭MySQL,然后备份其数据文件。(停机备份一般是直接拷贝其datadir目录)
- 温备----在线备份,对应用影响大,通常加一个读锁【会阻塞写的应用】,意义不大,基本不用。
从导出的备份文件结构可分为如下几种:
- 逻辑备份---备份的数据是导出的SQL语句(如mysqldump, mysqlpump【MySQL5.7加入的】,mydumper)
- 物理备份--备份的是物理文件(如xtracebackup)
接下来会详细介绍这四种命令的通常用法(如果不特别说明,数据库存储引擎为INNODB):
mysqldump备份与恢复
mysqldump的用法如下:
[root@test3 ~]# mysqldump Usage: mysqldump [OPTIONS] database [tables] #备份单个库 OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] #备份多个库 OR mysqldump [OPTIONS] --all-databases [OPTIONS] #备份所有的数据库
#可以使用mysqldump --help查看mysqldump的更多参数,会在下面使用的时候介绍到经常用的参数。
备份单张表:
[root@test3 ~]# mysqldump -uroot -p123456 --single-transaction employees departments > dep.sql
#备份INNODB存储引擎时建议加上参数--single-transaction【实际上是必须加】,这样会保证数据的一致性。
查看一下备份出来的数据:
[root@test3 ~]# cat dep.sql #可以看到基本就是SQL语句
-- MySQL dump 10.13 Distrib 5.7.22, for linux-glibc2.12 (x86_64)
--
-- Host: localhost Database: employees
-- ------------------------------------------------------
-- Server version 5.7.22-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `departments`
--
DROP TABLE IF EXISTS `departments`; #看到这里发现了建表语句,也就是没有建库语句,因此若想把sql语句导入指定库,需要先创建库
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,
PRIMARY KEY (`dept_no`),
UNIQUE KEY `dept_name` (`dept_name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `departments`
--
LOCK TABLES `departments` WRITE;
/*!40000 ALTER TABLE `departments` DISABLE KEYS */; #插入语句
INSERT INTO `departments` VALUES ('d009','Customer Service'),('d005','Development'),('d002','Finance'),('d003','Human Resources'),('d001','Marketing'),('d004','Production'),('d006','Quality Management'),('d008','Research'),('d007','Sales');
/*!40000 ALTER TABLE `departments` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2018-11-28 9:51:01
在备份文件中插入二进制日志的信息
该选项将binlog的位置和文件名追加到输出文件中。如果为1,将会输出CHANGE MASTER 命令;如果为2,输出的CHANGE MASTER命令前添加注释信息。该选项将打开
--lock-all-tables 选项,除非--single-transaction也被指定(在这种情况下,全局读锁在开始导出时获得很短的时间)。该选项自动关闭--lock-tables选项。
[root@test3 mysql]# mysqldump -uroot -p123456 --single-transaction --master-data employees departments > dep.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@test3 mysql]# cat dep.sql
-- MySQL dump 10.13 Distrib 5.7.22, for linux-glibc2.12 (x86_64)
--
-- Host: localhost Database: employees
-- ------------------------------------------------------
-- Server version 5.7.22-log
......
--
-- Position to start replication or point-in-time recovery from #这里有个提示基于这个点开始复制或者PIT恢复
--
CHANGE MASTER TO MASTER_LOG_FILE='test3-bin.000001', MASTER_LOG_POS=20182;
.....
#mysqldump备份时常用的两个选项
--single-transaction Creates a consistent snapshot by dumping all tables in a single transaction. Works ONLY for tables stored in storage engines which support multiversioning (currently only InnoDB does); the dump is NOT guaranteed to be consistent for other storage engines. While a --single-transaction dump is in process, to ensure a valid dump file (correct table contents and binary log position), no other connection should use the following statements: ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE, as consistent snapshot is not isolated from them. Option automatically turns off --lock-tables. 在备份INNODB数据库时,事实上必须加上--single-transaction参数,这个参数会保证备份出的数据是一致的,也就是备份的数据是当前执行此命令时刻点的数据。 --single-transaction利用INNODB的MVCC特性,在备份数据会根据undo和redo得到一份快照数据。INNODB的MVCC特性在RR和RC的隔离级别下,得到的快照数据是不同,在RR 得到的是当前事务开始时的快照数据,在RC时得到的最新的事务数据。因为数据库的正式环境一般是RC模式,因此这条命令在备份开始时,会设置当前会话的隔离级别为RR模式!