代码之家  ›  专栏  ›  技术社区  ›  CDR

在MySQL中同步两个数据库模式

  •  13
  • CDR  · 技术社区  · 17 年前

    我正在寻找一个可移植的脚本或命令行程序,可以同步两个MySQL数据库模式。我不是在寻找一个基于GUI的解决方案,因为它不能自动化,也不能用buid/deployment工具运行。

    基本上,它应该做的是扫描数据库1和数据库2。检查模式差异(表和索引),并建议在其中一个上运行一组SQL语句,以便获得与另一个相似的结构,从而尽可能减少数据损坏。

    很多MySQL GUI工具可能都可以做到这一点,但我正在寻找一种可编写脚本的解决方案。

    1. 安装基地遍布全州。
    2. 我们希望安装程序根据最新版本中的chagnes对数据库执行动态修复,而不管最终用户可能使用的是哪个旧版本。
    3. 更改主要类似于向表中添加新列、创建新索引或删除索引、添加表或删除系统内部使用的表(我们不删除用户数据表)。

    如果它是GUI:不,它不能被使用。我们不想把一个20MB的应用程序和我们的安装程序捆绑在一起,特别是当原始安装程序小于1MB时。

    6 回复  |  直到 11 年前
        1
  •  6
  •   csl    17 年前

    你考虑过使用吗 MySQL replication ?

        2
  •  5
  •   Egor Pavlikhin    16 年前

    SQLyog 这样做真是太棒了。我们经常在生产中使用它。

        3
  •  2
  •   Radu    13 年前

    我在这里找到了答案,但我不记得网址了 这是一个从以下内容开始的脚本:

    mysqldump --skip-comments --skip-extended-insert -u root -p dbName1>file1.sql
    mysqldump --skip-comments --skip-extended-insert -u root -p dbName2>file2.sql
    diff file1.sql file2.sql
    

    结果更像这样

    #!/bin/sh
    
    echo "Usage: dbdiff [user1:pass1@dbname1] [user2:pass2@dbname2] [ignore_table1:ignore_table2...]"
    
    dump () {
      up=${1%%@*}; user=${up%%:*}; pass=${up##*:}; dbname=${1##*@};
      mysqldump --opt --compact --skip-extended-insert -u $user -p$pass $dbname $table > $2
    }
    
    rm -f /tmp/db.diff
    
    # Compare
    up=${1%%@*}; user=${up%%:*}; pass=${up##*:}; dbname=${1##*@};
    for table in `mysql -u $user -p$pass $dbname -N -e "show tables" --batch`; do
      if [ "`echo $3 | grep $table`" = "" ]; then
        echo "Comparing '$table'..."
        dump $1 /tmp/file1.sql
        dump $2 /tmp/file2.sql
        diff -up /tmp/file1.sql /tmp/file2.sql >> /tmp/db.diff
      else
        echo "Ignored '$table'..."
      fi
    done
    less /tmp/db.diff
    rm -f /tmp/file1.sql /tmp/file2.sql
    
        4
  •  1
  •   Eduardo    17 年前

    http://versabanq.com/products/schemamatic.php )。此链接显示GUI应用程序,但它所做的只是操作命令行软件。在这个页面上有到谷歌代码网站的链接,在那里可以找到Schemamatic的C#.Net版本。您的完美解决方案是在Schemamatic中添加对MySQL的支持。对于SQL Server,它是完美的,并且完全符合您提到的要求。

    mysqldump-A-c-uroot-ppassword>bkpmysql.sql

    玩它,尽管它需要相当长的时间才能达到你想要的。在我看来,Schemamatic真的是你最好的选择。如果您在尝试Schemamatic时需要任何澄清,请告诉我。

        5
  •  1
  •   Evan    17 年前

    dbdeploy (这是java或.net版本)和 liquidbase others

    尽管我认为其中的大多数将以受控的方式对DB应用一组更改。不知道他们是否可以从现有模式进行反向工程并进行比较。

    E