打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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

原创 2017年10月27日 17:07:08
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 是可以成功的。


希望可以帮到大家,欢迎指正!


 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
apache2 + git + gerrit + mysql 配备、简单git操作
CI 系统搭建:五. GitLab、Gerrit、Jenkins 三者整合 ? Geek Blog | Python Linux 云计算 | OpenStack 虚拟技术 HPC | 性能调优 自动
Liferay Portal 应用之安装
TestLink 1.8.5的安装、配置和汉化
推荐一款开源的接口测试练手实战项目!
git&gerrit学习
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服