[toc]





实验环境:

- MySQL 5.7.25 
- Redhat 6.10


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

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


今天的内容为按条件备份表数据

## 1. 备份语句


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

从这起开始在备份语句中加入--single-transaction 参数

该参数在innodb中可以不对表施加写入锁进行导出,MyISAM引擎还是锁表的

```
mysqldump -h127.0.0.1 -usystem -p123456  --single-transaction --set-gtid-purged=OFF  --databases test --tables innodb_table  isam_table --where='id=10'  > /tmp/table_id.sql
```





注意这里 innodb_table 拥有id为10的数据 而 isam_table则没有

```
mysqldump -h127.0.0.1 -usystem -p123456  --single-transaction --set-gtid-purged=OFF  --databases test --tables innodb_table  isam_table --where='1 limit 1000000'  > /tmp/table_id.sql
```
导出前1000000行数据

## 2. 内容解析

### 2.1 版本信息


[image:516 size:orig]



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

已经一些变量的设置

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

详情看上一节介绍


### 2.2 表的结构


[image:517 size:orig]

接下来是表的信息

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

之后建立表(CREATE TABLE)

### 2.3 表数据的备份

[image:518 size:orig]


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

这里有提示只备份id=10的数据

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

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

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

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

最后释放锁(UNLOCK TABLES)


### 2.4 备份没有符合条件的表

[image:519 size:orig]
[image:520 size:orig]

可以看出虽然isam_table表没有符合条件的数据 

但是还是会导出表结构 只是没有数据的导入

### 2.5 触发器的导出

[image:521 size:orig]

可以看到isam_table表的触发器会一并导出



## 3. 总结

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


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


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

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

同时如果表中没有符合条件的行,表结构也是会导出的

同样不会导出存储过程和函数


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