[toc]

## 前情提要



实验环境:

- MySQL 5.7.25 
- Redhat 6.10


前面我们建立了数据库并建立相关的对象

- 数据库
- 表
- 存储过程
- 函数
- 触发器
- 事件


今天的内容为备份全库

## 1. 备份语句


我们来备份test数据库中的innodb_table表和isam_table表

```
mysqldump -h127.0.0.1 -usystem -p123456  --set-gtid-purged=OFF  --databases test --tables innodb_table  isam_table > /tmp/table.sql
```



## 2. 内容解析

### 2.1 版本信息


[image:511 size:orig]



首先依然是mysqldump的版本信息 主机名信息

已经一些变量的设置

再次提醒 \/*!123456*\/ 不是注释 

详情看上一节介绍


### 2.2 表的结构

[image:512 size:orig]

接下来是表的信息

首先是如果表存在则删除表(DROP TABLE IF EXISTS)

之后建立表(CREATE TABLE)

### 2.3 表数据的备份

[image:513 size:orig]

接下来是表数据的备份(Dumping data for table)


首先锁定表不让其他进程写(LOCK TABLE WRITE)

然后使MySQL停止更新非唯一索引(ALTER TABLE DISABLE KEYS),这样能加快插入速度

之后将数据转换成insert语句(INSERT INTO)

之后重新建立丢失的索引(ALTER TABLE ENABLE KEYS)

最后释放锁(UNLOCK TABLES)

### 2.4 触发器的导出

[image:514 size:orig]

可以看到单独导出表的话,该表的触发器会一并导出



## 3. 总结

可以看出单独导出表有如下内容


- 删除表(如果存在)
- 建表
- 锁表
- 禁用非唯一索引
- 插入数据
- 启用非唯一索引(重建索引)
- 释放锁
- 触发器(如果有)


不同于全库备份没有如下内容

- 建立数据库(如果不存在)
- 使用数据库

同时一条语句不能导出多个数据库中的表


今天的内容就到这里,欢迎查看