2017-08-22 12 views
1

単一のmysqlインスタンス上で動作するレガシーシステム上で複数のスキーマをアップグレードしたいと考えています。複数のマイグレーションを並行して実行するベストプラクティス

私は〜10個のスキーマを持っていますが、制作時には〜100個のスキーマがあります。

は開発では、私は、スキーマごとにflyway migrateを開始するには、単純なbashのループを使用していました:

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 

この戦略は、devに罰金働いていました。プロダクションでは、flyway migrateを実行するgitlabランナーのRAMをすばやく最大限に活用します。

あなたの意見では、RAMを最大限に活用せずにできるだけ早くデータベースの移行を達成するにはどうすればよいでしょうか?

答えて

0

並列実行するプロセスの数を制限する必要があるようです。現在、あなたはスキーマと同じプロセスを実行しますが、すべてのラムを使い切るために100を持っています。これを達成するには、pexec,parallel、さらにはxargsなどの方法があります。 xargsへのアクセス権があると仮定します。他のソフトウェアはインストールする必要があります。

mklement0は、-Pオプションでxargsのを使用する方法の例でgreat answerを書いた:

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

EDIT:-Pを使って実験した後の例での更新を。

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

フライウェイで次のコマンドを試してみてください:

このコマンドは、-P実証

$(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' 
関連する問題