[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所有的内容 今天的内容就到这里,欢迎查看