GitDDL::Migrator もしくは App::RunCron

MySQL Casual

Oct 25th, 2013

profile

songmu

GitDDL::Migrator

マイグレーションやスキーマのバージョン管理

GitDDL::Migrator

SQL::Translator (SQLFairy)

SQLFairy

SQL::Translator::Diff

GitDDLの考え方

バージョニングテーブル

CREATE TABLE git_ddl_version (
    `version`     VARCHAR(40) NOT NULL,        -- commit hash
    `upgraded_at` VARCHAR(20) NOT NULL UNIQUE,
    `sql_text`    TEXT
);

何が便利か?

a <-> b <-> c ブランチを行き来しながら適切に差分SQLを当て込むことができる。

gitddl

DBからmysqldumpしてそれとの差分をとって当て込めばいいのでは?

GitDDL::Migrator

今後やりたいこと

コマンドラインツール

できないこと

Partitioningはdailyバッチで切ってるので、その部分まではバージョン管理してない

App::RunCron (runcron)

https://metacpan.org/module/App::RunCron

cron

cronの現状

cronの難点

やりたいこと

cronlog

https://github.com/kazuho/kaztools/blob/master/cronlog

runcron

cronlogからかなりコピペなので安心してお使いいただけます

LOGGER="/usr/local/bin/fluent-agent-lite -f msg"
RUN="/home/app/project/env.sh runcron -- "
* * * * * $RUN command ...  2>&1 | $LOGGER cron.cmd - fluentd-srv

env.sh

http://blog.riywo.com/2012/05/26/005232

環境変数一式設定してから、プロジェクトディレクトリにcdするラッパーシェル。

#!/bin/sh
export USER=app
export HOME=/home/$USER
export PATH="extlib/bin:local/bin:/opt/perl-5.16/bin:$PATH"
export PERL5OPT="-Mlib=lib,extlib/lib/perl5,local/lib/perl5"
export PLACK_ENV=production
cd $(dirname $0)
exec "$@"

runcron.yml

実行ディレクトリに配置して、Reporter情報を登録する。

timestamp: 1
reporter: None
error_reporter:
    - +MyApp::Reporter::Alert
common_reporter:
    - Fluentd
    - File
    -   file: log/cron%Y-%m-%d.log
    - +MyApp::Reporter::IRC

レポーターの書き方

Perlだけど非常に簡単。newメソッドと$runcronオブジェクトを受け取るrunメソッドの2つが定義されていればOK。

package App::RunCron::Reporter::Stdout;
use strict;
use warnings;
use utf8;

use parent 'App::RunCron::Reporter';
sub run {
    my ($self, $runner) = @_;
    print STDOUT $runner->report;
}

自分でラッパーコマンドを書く

% cat my-runcron
#!perl
use strict;
use warnings;
use App::RunCron;
my $runner = App::RunCron->new(
    timestamp => 1,
    command   => [@ARGV],
    logfile   => 'tmp/log%Y-%m-%d.log',
    reporter  => 'Stdout',
    error_reporter => [
        'Stdout',
        'File', {
            file => 'tmp/error%Y-%m-%d.log'
        },
    ],
);
$runner->run;