-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmysql.struct.xml
134 lines (127 loc) · 5.38 KB
/
mysql.struct.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V5.0//EN"
"/usr/share/xml/docbook/schema/dtd/5.0/docbook.dtd" [
<!ENTITY article.author.xml SYSTEM "../common/article.author.xml">
<!ENTITY book.info.legalnotice.xml SYSTEM "../common/book.info.legalnotice.xml">
<!ENTITY book.info.abstract.xml SYSTEM "../common/book.info.abstract.xml">
]>
<article xml:base="http://netkiller.github.io/journal/" xmlns="http://docbook.org/ns/docbook" xml:lang="zh-cn">
<articleinfo>
<title>数据库结构版本控制</title>
<subtitle>http://netkiller.github.io/journal/mysql.struct.html</subtitle>
&article.author.xml;
<copyright>
<year>2014</year>
<holder>http://netkiller.github.io</holder>
</copyright>
&book.info.legalnotice.xml;
<abstract>
</abstract>
&book.info.abstract.xml;
<keywordset>
<keyword>mysql, mysqldump</keyword>
<keyword>git, subversion</keyword>
<keyword></keyword>
<keyword></keyword>
</keywordset>
<pubdate>$Date$</pubdate>
<release>$Id$</release>
</articleinfo>
<section id="what">
<title>什么是数据库结构版本控制</title>
<para>首先说说什么是数据库结构,什么事版本控制。</para>
<para>数据库结构是指数据库表结构,数据库定义语言导出的DDL语句。主要由CREATE TABLE, DROP TABLE等等构成。</para>
<para>再来说说什么事版本控制,如果你从事开发工作应该会很容易理解,版本控制就是记录每一次变化,可以随时查看历史记录,并可回撤到指定版本。</para>
</section>
<section id="why">
<title>为什么要做数据库结构本版控制</title>
<para>软件开发过程中需要常常对数据库结构作调整,这是无法避免的,甚至很多想起启动后,需求还不明确,开发人员只能按照所理解需求创建表。需求往往会发生变化,一旦变化,代码需要修改,表结构也避免不了。
我们常常刚改好数据库结构,需求部门有发来通知,不用修改了,维持原有设计。甚至是过了几周再次回撤。</para>
<para>所以我们要将数据库结构的变化进行版本控制,通常的做法是DBA人工管理,但我觉完全可以自动化的工作,没有必要浪费人力资源,且自动化不会犯错更稳定,仅仅需要人工定期查看工作状态即可。</para>
</section>
<section id="when">
<title>何时做数据库结构本版控制</title>
<para>任何时候都可以部署下面的脚本,对现有系统无任何影响。</para>
</section>
<section id="where">
<title>在哪里做数据库结构本版控制</title>
<para>可以在版本控制服务器上,建议GIT仓库push到远程。</para>
</section>
<section id="who">
<title>谁来负责数据库结构本版控制</title>
<para>DBA与配置管理员都可以做,通常DBA不接触版本库这块,建议创建一个backup用户给配置管理员。</para>
</section>
<section id="how">
<title>怎样做数据库结构本版控制</title>
<section>
<title>安装脚本</title>
<para>首先下载脚本 https://github.com/oscm/devops/blob/master/shell/backup.mysql.struct.sh</para>
<screen><![CDATA[
wget https://raw.githubusercontent.com/oscm/devops/master/shell/backup.mysql.struct.sh
mv backup.mysql.struct.sh /usr/local/bin
chmod +x /usr/local/bin/backup.mysql.struct
]]></screen>
<para>创建备份用户</para>
<screen><![CDATA[
CREATE USER 'backup'@'localhost' IDENTIFIED BY 'SaJePoM6BAPOmOFOd7Xo3e1A52vEPE';
GRANT SELECT, LOCK TABLES ON *.* TO 'backup'@'localhost';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'backup'@'localhost';
]]></screen>
<para>配置脚本</para>
<screen><![CDATA[
BACKUP_HOST="localhost" 数据库主机
BACKUP_USER="backup" 备份用户
BACKUP_PASS="chen" 备份密码
BACKUP_DBNAME="test aabbcc" 版本控制那些数据库,多个数据库使用空格分隔
BACKUP_DIR=~/backup 数据库结构放在那里
]]></screen>
<para>初始化仓库</para>
<screen><![CDATA[
# /usr/local/bin/backup.mysql.struct init
Initialized empty Git repository in /www/database/struct/.git/
]]></screen>
</section>
<section>
<title>启动脚本,停止脚本</title>
<screen><![CDATA[
# /usr/local/bin/backup.mysql.struct
Usage: /usr/local/bin/backup.mysql.struct {init|start|stop|status|restart}
]]></screen>
<para>开始脚本</para>
<screen><![CDATA[
# /usr/local/bin/backup.mysql.struct start
]]></screen>
<para>查看状态</para>
<screen><![CDATA[
# /usr/local/bin/backup.mysql.struct status
9644 pts/1 S 0:00 /bin/bash /usr/local/bin/backup.mysql.struct start
]]></screen>
<para>停止脚本</para>
<screen><![CDATA[
# /usr/local/bin/backup.mysql.struct status
]]></screen>
</section>
<section>
<title>查看历史版本</title>
<para>通过 git log 命令查看历史版本</para>
<screen>
<![CDATA[
# cd /www/database/struct/
# git status
# On branch master
nothing to commit (working directory clean)
# git log
commit d38fc624c21cad0e2f55f0228bff0c1be981827c
Author: root <[email protected]>
Date: Wed Dec 17 12:33:55 2014 +0800
2014-12-17.04:33:55
]]>
</screen>
<para>
这里仅仅将数据库结构版本控制,关于版本控制软件更多细节,延伸阅读
<ulink url="http://netkiller.github.io/version/index.html">《Netkiller Version 手札》</ulink>
</para>
</section>
</section>
</article>