jk2K's 窝

休息,是为了更好的前行

哈喽, 我是叶萌(@jk2K), 一名来自中国的 PHP / iOS 开发者


用 Git 和 Git hooks 解决多地开发时 MySQL 同步问题

需求

我经常在家和公司的不同电脑上开发一个Web项目, 代码托管可以用GitLab或者GitHub, 这解决了代码的多地同步问题, 但是MySQL一直没发现一个好的方式来同步。
目前MySQL多地同步的方案主要有以下几种

  • 使用可远程连接的MySQL, 多地开发时直接连接这个数据库, 这个方案如果网速不好的话,就不合适
  • A 地使用mysqldump导出sql文件,发送给 B 地,B 地再恢复到MySQL中,这个方案手动操作的话很麻烦,费时
  • 使用gitgit hooks在提交和合并代码时自动相应的导出和恢复数据库, 这个方案自动化了MySQL的导出和恢复工作,简直完美

条件准备

  • mysql 5.6+, 修改my.cnf文件, 在[client]下面添加
    user=你的 MySQL 账号
    password=你的 MySQL 密码

以解决MySQL5.6 Using a password on the command line interface can be insecure的问题

  • git
  • 坚果云(用于差量同步导出的sql文件)

动手干

  1. 首先编辑pre-commit文件,这个钩子在代码commit之前可以执行脚本

    [your editor] /path/to/your/repo/.git/hooks/pre-commit
  2. pre-commit钩子, 我们将要告诉系统去把我们的数据库dump到坚果云里面

    mysqldump --skip-extended-insert demo > /Users/lee/我的坚果云/demo.sql
  3. pre-commit加上可执行权限

    chmod +x /path/to/your/repo/.git/hooks/pre-commit
  4. 现在我们来写post-merge钩子,我们将要告诉系统在git合并代码的时候,把放在坚果云上的sql文件恢复到本地的MySQL数据库中

    [your editor] /path/to/your/repo/.git/hooks/post-merge

    post-merge文件里写上

    mysql demo < ~/我的坚果云/demo.sql

    不要忘记给post-merge加上可执行权限啦

    chmod +x /path/to/your/repo/.git/hooks/post-merge
  5. 就是这样,现在当你commitpull代码时,MySQL数据库可以自动的在多个地方同步啦

总结

使用坚果云来同步导出的sql文件是因为坚果云在国内是唯一一家靠谱的云存储公司,其他国内的公司倒闭的倒闭,阉割的阉割,就是不让人省心
如果可以无障碍畅游网络的话,可以选择更好的Dropbox

享受生活吧

参考链接

comments powered by Disqus