Ubuntu 14.04 Gerrit 数据库迁移: H2 迁移为 Mysql(包括 changes/group/account/permissions):

标签:

ubuntu /

gerrit /

mysql /

H2 /

数据库迁移

Gerrit 数据库迁移 H2 迁移为 mysql(包括 changes):

历史环境:

当前系统安装 Gerrit 为 2.11,且数据库使用 H2;

但随着开发规模扩大,H2 数据库逐渐无法满足上百个开发的提交;

因此决定将 Gerrit 的 H2 数据库更换为 Mysql;

需要用到一个工具 h2tomysql_for_gerrit ,网上说这个工具只是在 gerrit 2.9.1 上测试通过;

我本地是用的 2.11 版本也可以通过

下载地址:

https://github.com/uppet/h2tomysql_for_gerrit

需要注意的是:下载后要编译里面的java文件(可以用 eclipse build)

从理论上分析需要的步骤:

分两种情况:

1. 在同一台服务器上迁移:

a. 先 stop 原先的 gerrit 服务;

b. 安装新的 gerrit 站点服务(安装时设置 mysql 数据库),

需要与原先的不同站点目录,例如原先为  gerrit_site ,新服务为 gerrit_site2;

不要启动该 gerrit 服务,如果启动了,就停止;

c. 拷贝原 gerrit 站点中的所有 git 库到新的 gerrit 指向的git库目录(如果新旧 gerrit 的代码库目录一致,则跳过),

注意:不包括 All-Projects 和 All-Users ;

d. 通过 h2tomysql_for_gerrit 这个工具,将原始 gerrit 的 H2 数据导入到新站点的 Mysql 数据库中;

e. 由于数据库已经被更新,因此需要更新新 gerrit 中 All-Project 的 groups 文件中的 Administrator UUID;

并且,需要更新 data-gerrit/All-Projects.git/refs/meta/config 中的 hash 值为更新上述group文件之后的commit点;

f. 进入新 gerrit 站点目录 gerrit_site2,需要重建索引(这步尤其重要,否则 changes 不会被显示出来):

java -jar bin/gerrit.war reindex

这个操作比较耗时,主要取决于当前包含的git代码库和changes;

g. 启动新 gerrit 服务;

h. 清除旧的 gerrit 站点;

2. 在不同服务器上迁移:

原理与同一台服务器上一样,只是需要注意两点:

a. 将旧 gerrit 的服务站点目录,例如 gerrit_site 拷贝到新的服务器;

b. 将旧 gerrit 服务器中所有的 git 代码库拷贝到新 gerrit 服务器中指定目录(All-Projects 和 All-Users)

其他的步骤都跟在同一个服务器操作完全一致

具体实施步骤:

以本地为例,新旧 gerrit 处于不同服务器中(本人亲测成功):

服务器 A 为 Gerrit 2.11,H2

服务器 B 为 Gerrit 2.11,Mysql

上述新旧 gerrit 服务器请优先安装

(注意,一定要保证两个服务器的 gerrit 版本一致,因为不同 gerrit 版本的数据库结构可能是不一样的)

所有 Gerrit 的安装配置步骤略过,安装过程没有特殊情况,可以参考网上其他文章。

开始执行:

1. 在服务器 B 上安装相同版本的 gerrit+mysql

2. 在 A 上将 gerrit_site 目录(目录下所有文件),scp 到 B 上;

3. 拷贝 A 上的所有 git 库到 B 上 gerrit 指定的 git 代码库目录(注意不要拷贝原始 gerirt 的 All-Projects 和 All-Users);

4. 在 B 上 stop gerrit 服务;

5. 下载 h2tomysql_for_gerrit 工具到任意目录,并通过 eclipse 编译其中的 java 文件,然后会生成 bin 目录:

bin/
└── com
└── ucweb
└── gerrit
└── tools
└── converter
├── GerritDatabaseConverter.class
├── H2DatabaseSession.class
├── H2ToMySQLLauncher.class
├── IDatabaseSession.class
├── MySQLDatabaseSession.class
└── Util.class

6. 命令行进入 h2tomysql_for_gerrit 目录,执行命令:

java -cp "bin:lib/*" com.ucweb.gerrit.tools.converter.H2ToMySQLLauncher [path/to/old/gerrit.config] [path/to/new/gerrit.config]

此命令将会将旧 gerrit H2 中的数据导入到新 gerrit mysql 中(需要注意最后两个参数的顺序);

错误提示:

a. Database may be already in use: "Locked by another process". Possible solutions: close all other connection(s); use the server mode [90020-174]

在执行上述命令时必须要将所有 gerrit 服务关闭;

b. Access denied for user "gerrit"@"127.0.0.1" (using password: YES)

由于 mysql 数据库是需要指定账号密码的,而在 gerrit.config 中默认是没有密码的明文显示,因此需要在 gerrit.config 中指定mysql的账号密码:

[database]
type = mysql
hostname = localhost
database = gerrit
username = gerrit
password = <password>

出现如下提示,表示执行成功:

Feeding data into patch_set_approvals
Feeding data into patch_sets
Feeding data into schema_version
Feeding data into starred_changes
Feeding data into submodule_subscriptions
Feeding data into system_config
Fixing increment into change_message_id
Fixing increment into account_id
Fixing increment into change_id
Special fix for account_group_id
Special fix for account_id
Special fix for uuid of admin
Done tranfer database data from H2 to MySQL.
REMEMBER to update `groups" file in meta/config tag of `All-Project" to make Administrator UUID correct.

请尤其注意最后一行提示 "REMEMBER to update `groups" file in meta/config tag of `All-Project" to make Administrator UUID correct."

由于更新之后数据库中所有数据都是旧 gerrit 服务器中的数据,因此对于新 gerrit 中的 All-Project 这个 git 库中的内容是需要手动更新的;

具体更新方法稍后再提。

7. 需要重建索引表(这一步非常重要):

进入 B 服务器的 Gerrit 站点目录(gerrit_site),执行命令:

java -jar gerrit-site/bin/gerrit.war reindex          #注意不要完全复制,用自己实际情况的目录

此步骤一般不会有太大的问题,主要就是耗时,视当前 git 库的多少和 changes 数目定。

8. 更新 B 服务器的 All-Projects(针对步骤6中的最后说明):

此库主要保存的是 All-Projects 设置的权限配置,以及各个 group 的UUID

更新(只有1个文件):

groups -------各个groups的UUID ,这个文件暂时先不更新

project.config 项目的权限配置,这个文件如果没有改动,也可跳过

具体操作:

分别 clone 新旧 Gerrit 服务器上对应的 All-Projects 库,然后将旧的同步到新的上;

修改完成,然后 commit push (在新的gerrit中)

记录下最后一次 commit 的 hash 值,可以通过 git log 查看

将这个 hash 值更新到新 gerrit git 代码库中的:

All-Projects.git/refs/meta/config (注意此处不是刚才clone的库)文件中,删除原有内容,直接替换为新的 hash。

9. 启动 B 服务器(新)Gerrit 服务;

注意,别忘记拷贝用户密码文件,如果你用的是 http 认证,则 gerrit_site/etc/passwords .

10. 就可以登录新的 Gerrit 服务了,一切数据都完好;

最后,扩展一下:

如果既要迁移数据库,又要升级 gerrit 版本,那么只能分为两步走:

1. 先在同一个 gerrit 版本中迁移数据库(H2 --> Mysql);

2. 然后再安装新的 gerrit 版本;

本地试验从 Gerrit 2.11 + H2 ---> Gerrit 2.14.5 + Mysql 是可以成功的。

写得比较啰嗦,希望可以帮到大家,欢迎指正!