【问题标题】:Best strategy to run multiple flyway migration in parallel并行运行多个飞行路径迁移的最佳策略
【发布时间】:2018-01-30 23:31:13
【问题描述】:

我想升级在单个 mysql 实例上运行的旧系统上的多个模式。

在开发中我有大约 10 个模式,而在生产中我有大约 100 个模式。

在开发过程中,我使用一个简单的 bash 循环为每个模式启动一个 flyway migrate

schemas=$(echo "SET SESSION group_concat_max_len=8192; select GROUP_CONCAT(SCHEMA_NAME SEPARATOR ' ') from information_schema.SCHEMATA where SCHEMA_NAME like 'FOO_%'" | mysql -h$DB_URL -P$DB_PORT -u$DB_USER -p$DB_PASSWORD -sN)
for schema in $schemas; do
    echo "Starting Migration for :  $schema"
    flyway -configFile=src/flyway.conf -user=$DB_USER -password=$DB_PASSWORD -url="jdbc:mysql://$DB_URL:$DB_PORT" -schemas=$schema -locations=filesystem:src/schema/ migrate 2>&1 | tee $schema.log &
done

这个策略在开发中运行良好。在生产中,我很快将运行 flyway migrate 的 gitlab 运行器的 ram 最大化。

在您看来,在不耗尽内存的情况下尽快实现数据库迁移的最佳方法是什么?

【问题讨论】:

    标签: flyway


    【解决方案1】:

    您似乎需要限制并行运行的进程数。目前,您将运行与模式一样多的进程,在 prod 中您有 100 个,因此会用完所有 ram。有很多方法可以实现这一点,包括pexecparallel 甚至xargs。我假设您可以访问xargs 其他人需要安装软件。

    mklement0 写了一封great answer ,其中包含有关如何使用带有 -P 选项的 xargs 的示例:

        -P, --max-procs=MAX-PROCS    Run up to max-procs processes at a time
    

    编辑:用 -P 试验后更新示例。

    这个命令演示了-P:

    echo -e "a\nb\nc\nd\n" | xargs -i -P 2 sh -c 'touch {}.log; sleep 3;'
    ls --full-time
    

    用 flyway 试试这个命令:

    $(echo "SET SESSION group_concat_max_len=8192; select GROUP_CONCAT(SCHEMA_NAME SEPARATOR ' ') from information_schema.SCHEMATA where SCHEMA_NAME like 'FOO_%'" | mysql -h$DB_URL -P$DB_PORT -u$DB_USER -p$DB_PASSWORD -sN) | xargs -i -P 10 sh -c 'echo "Starting Migration for :  {}"; flyway -configFile=src/flyway.conf -user=$DB_USER -password=$DB_PASSWORD -url="jdbc:mysql://$DB_URL:$DB_PORT" -schemas={} -locations=filesystem:src/schema/ migrate 2>&1 | tee {}.log'
    

    【讨论】:

      猜你喜欢
      • 2022-07-12
      • 2018-12-05
      • 1970-01-01
      • 2020-01-26
      • 2019-12-16
      • 2016-03-13
      • 2016-09-19
      • 2014-01-29
      • 2016-11-27
      相关资源
      最近更新 更多