[toc]

## 前情提要



实验环境:

- MySQL 5.7.25 
- Redhat 6.10


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

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


今天的内容为导出MySQL所有的对象

事件 函数 存储过程

## 1. 备份语句


我们来备份数据库并且备份其中的触发器,函数和存储过程

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

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

通过前面实验我们知道了 备份单独数据库或表的话触发器是会导出的

而其他的是不会导出的



**备份所有数据库**

```
mysqldump -h127.0.0.1 -usystem -p123456  --single-transaction --set-gtid-purged=OFF  --all-databases  --triggers --events --routines> /tmp/test_all.sql
```

**备份test数据库**

```
mysqldump -h127.0.0.1 -usystem -p123456  --single-transaction --set-gtid-purged=OFF  --databases test  --triggers --events --routines> /tmp/test_all.sql
```

这里备份test数据库及下面的触发器 事件 存储过程和函数



## 2. 内容解析

### 2.1 版本信息


[image:522 size:orig]



第一行是mysqldump的版本

这里为10.13的版本 

第二三行显示主机名为127.0.0.1 

数据库版本为5.7.25


接下来为一些系统变量的设置 

注意这里/\* !12345 \*/   不是注释  (/\*  \*/ 是MySQL的多行注释符)

它表示如果MySQL的版本大于4.1.1 则执行相应的语句



### 2.2 数据库和表的信息


[image:523 size:orig]



接下来是备份数据库的语句

Current Database :test 代表当前进行的是mysql数据库

后面跟的是建数据库的语句(CREATE DATABASE test)

如果不存在的话(IF NOT EXISTS),如果存在也不会删除

之后使用该数据库(use test)

接下来是表结构相关的(Table structure for table)

如果已经有该表则先删除(DROP TABLE IF EXISTS)

之后是建立mysql数据库下表的表结构的语句(Create TABLE )

### 2.3 表数据的备份

[image:524 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 备份events

[image:525 size:orig]

接下来是备份事件

导出事件(Dumping events  for database 'test')

### 2.5 备份routines

MySQL中的routines 代表存储过程和函数

[image:526 size:orig]

导出routines(Dumping routines for database 'test')

之后是详细的建立语句



### 2.6 结束备份

[image:527 size:orig]

最后是备份的完成日期


## 3. 总结

可以看出导出mysql所有对象有如下内容


- 建立数据库(如果不存在)
- 使用数据库
- 删除表(如果存在)
- 建表
- 锁表
- 禁用非唯一索引
- 插入数据
- 启用非唯一索引(重建索引)
- 释放锁
- 导出视图
- 导出events
- 导出routines(存储过程和函数)



这里就是一个完整的备份语句,包含了MySQL所有的内容


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