遇到这么一个情况: 数据库A 依赖数据库B, B依赖数据库C, C又依赖A. 我称之为 三角关系. 最终要完成数据结构的升级. 其实这个case中, 一共牵涉到12个数据库,为了说明清楚, 只以数据库 A B C 为例.

完成升级,包括:

  1. 保留原数据;
  2. 替换所有存储过程, 函数, 触发器, 视图;
  3. 升成必要数据, 插入配置数据;

把过程理顺一下:

  1. 导出新数据库A,B,C 的结构;
  2. 倒出新数据库A,B,C的存储过程,视图;
  3. 单独导出新数据库A,B,C 的触发器;
  4. 只导出旧数据库A,B,C 的数据;
  5. 重建A,B,C 结构, 导入旧数据(可以用VIM适当调整数据), 导入存储过程,视图,函数;
  6. 导入A,B,C 的触发器;
  7. 升成必要的数据(python 脚本+存储过程 的方案不错!);

把基本代码写一下, 根据不同情况修改:

3.1 导出表结构
mysqldump -uroot -p’123456′ –default-character-set=utf8 –add-drop-database –add-drop-table –opt -l –no-data -B A B C | sed ‘s/AUTO_INCREMENT=[0-9]*\s//g’ > structure.sql
最后的sed 可以把auto_increment 去除, 为什么? 不多说.

3.2 导出数据
mysqldump -uroot -p’123456′ -c –no-create-db –no-create-info -B A B C > data.sql
如果数据库编码不同, 不能加 –skip-opt

3.3 导出存储过程/函数
SELECT * FROM mysql.proc WHERE db in(‘A’,'B’,'C’);

3.4 导出触发器
mysqldump -uwgz -p’123456′ –default-character-set=utf8 –skip-opt -l –no-create-db –no-create-info –no-data –trigger -B A B C > trigger.sql

3.5 删除触发器
drop trigger /*!50032 if exists */ `A`.`XXOO`;
…… 这里可以改进, 以后有空再说吧.

3.6 建立表结构, 倒入旧数据, 导入存储过程,函数,触发器;

3.7 生成必要的数据
存储过程 + Python 脚本

后记: 本想详写, 但成熟的DBA 一定会有一套自己的备份、还原、升级脚本, 这里只点个意思, 仅此而已.