Dockerに触れる

最近はDockerで遊んでます。 Chefとか黙々やっていたのですが、気分転換にDockerを使いました。
メモ代わりに。

公式が一番

公式

準備

git clone https://github.com/dotcloud/docker.git
cd docker
vagrant up

Puttyからの接続

vagrant ssh-config

putty用に鍵を生成する。 PuTTYgen -> 既存の秘密鍵の読込。

Dockerのバージョンを確認

$ docker version
Client version: 0.7.2 Go version (client): go1.2 Git commit (client): 28b162e Server version: 0.7.2 Git commit (server): 28b162e Go version (server): go1.2 Last stable version: 0.7.2 

 

Docker イメージを検索する

Dockerには色々なイメージがあり、簡単に検索出来るサイトが存在します。
こちらから


docker search 検索したいイメージ名

$ docker search tutorial
NAME DESCRIPTION STARS OFFICIAL TRUSTED learn/tutorial 0 mzdaniel/buildbot-tutorial 0 jbarbier/tutorial1 0 odewahn/parallel_ml_tutorial 0 modolo/redis Tutorial redis 0 mhubig/echo Simple echo loop from the tutorial. 0 ivarvong/redis From the redis tutorial. Just redis-server... 0 danlucraft/postgresql Postgresql 9.3, on port 5432, un:docker, p... 0 amattn/postgresql-9.3.0 precise base, PostgreSQL 9.3.0 installed w... 0 


Dockerのイメージをダウンロードする

pullすればダウンロード出来ます


$ docker pull learn/tutorial
Pulling repository learn/tutorial
8dbd9e392a96: Download complete

 

Docker上でechoコマンドを実行する

$ docker run learn/tutorial echo "hello world"
hello world

apt-getでpingコマンドをインストールする

$ docker run learn/tutorial apt-get install -y ping
Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
  iputils-ping
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 56.1 kB of archives.
After this operation, 143 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ precise/main iputils-ping amd64 3:20101006-1ubuntu1 [56.1 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 56.1 kB in 0s (69.6 kB/s)
Selecting previously unselected package iputils-ping.
(Reading database ... 7545 files and directories currently installed.)
Unpacking iputils-ping (from .../iputils-ping_3%3a20101006-1ubuntu1_amd64.deb) ...
Setting up iputils-ping (3:20101006-1ubuntu1) ...


 

イメージをコミット

docker psで今動いているDockerの確認を行います。 そしてCONTAINER IDを利用してコミットします。

$ docker ps -l
CONTAINER ID        IMAGE                   COMMAND                CREATED             STATUS              PORTS               NAMES
0710132af978        learn/tutorial:latest   apt-get install -y p   5 minutes ago       Exit 0                                  naughty_poincare


$ docker commit 0710 learn/ping
535f88073c7d71ce1045293ebe62fccf01071e8afa56e5a6019938f25100d677

 

Docerkの詳細の情報を見る

$ docker inspect 3f3
[{
    "ID": "3f32f9b50c7ca75ca3efdb78d9bd8291a5b5ce1c666cd6e02b889f1d083ca09b",
    "Created": "2013-12-23T09:56:42.372220573Z",
    "Path": "ping",
    "Args": [
        "google.com"
    ],
    "Config": {
        "Hostname": "3f32f9b50c7c",
        "Domainname": "",
        "User": "",
        "Memory": 0,
        "MemorySwap": 0,
        "CpuShares": 0,
        "AttachStdin": false,
        "AttachStdout": true,
        "AttachStderr": true,
        "PortSpecs": null,
        "ExposedPorts": null,
        "Tty": false,
        "OpenStdin": false,
        "StdinOnce": false,
        "Env": null,
        "Cmd": [
            "ping",
            "google.com"
        ],
        "Dns": null,
        "Image": "learn/ping",
        "Volumes": null,
        "VolumesFrom": "",
        "WorkingDir": "",
        "Entrypoint": null,
        "NetworkDisabled": false
    },
    "State": {
        "Running": false,
        "Pid": 0,
        "ExitCode": 1,
        "StartedAt": "2013-12-23T09:56:42.37846083Z",
        "FinishedAt": "2013-12-23T09:57:30.576440818Z",
        "Ghost": false
    },
    "Image": "535f88073c7d71ce1045293ebe62fccf01071e8afa56e5a6019938f25100d677",
    "NetworkSettings": {
        "IPAddress": "",
        "IPPrefixLen": 0,
        "Gateway": "",
        "Bridge": "",
        "PortMapping": null,
        "Ports": null
    },
    "SysInitPath": "/usr/bin/docker",
    "ResolvConfPath": "/etc/resolv.conf",
    "HostnamePath": "/var/lib/docker/containers/3f32f9b50c7ca75ca3efdb78d9bd8291a5b5ce1c666cd6e02b889f1d083ca09b/hostname",
    "HostsPath": "/var/lib/docker/containers/3f32f9b50c7ca75ca3efdb78d9bd8291a5b5ce1c666cd6e02b889f1d083ca09b/hosts",
    "Name": "/agitated_wozniak",
    "Driver": "aufs",
    "Volumes": {},
    "VolumesRW": {},
    "HostConfig": {
        "Binds": null,
        "ContainerIDFile": "",
        "LxcConf": [],
        "Privileged": false,
        "PortBindings": {},
        "Links": null,
        "PublishAllPorts": false
    }
}]%


アクセスやビルドは次回で。

ここからはUbuntuのお話です

初めてUbuntuを使いました。そこで日本語化のためにいくつか操作したのでメモとして残します。

日本語化について


wget -q https://www.ubuntulinux.jp/ubuntu-ja-archive-keyring.gpg -O- | sudo apt-key add - 
wget -q https://www.ubuntulinux.jp/ubuntu-jp-ppa-keyring.gpg -O- | sudo apt-key add - 
sudo wget https://www.ubuntulinux.jp/sources.list.d/precise.list -O /etc/apt/sources.list.d/ubuntu-ja.list 
sudo apt-get update 
sudo apt-get upgrade


vimの文字化け

sudo aptitude install language-pack-ja 
export LANG=ja_JP.UTF-8 
export LC_ALL=ja_JP.UTF-8 
export LC_CTYPE=ja_JP.UTF-8

rbenvのインストールで躓いた点

/opt/vagrant_ruby/bin/がすでに$PATHに設定されているため、
削除する必要がある。(rbenv global 2.0.0-p247が反映されないため)

PerlでのMRO::Compatの__get_linear_isa_dfsが遅い件について

# Perl MRO::Compat

経緯:
なんかやたらクローンでまわしている処理が重いためNYTProfで計測しました。
分かったことがMRO::Compatの__get_linear_isa_dfsを何十万回と呼び出していました。
何回もMRO::Compatを呼んでいたのは、DBIx::Class::Rowのinflate_resultを利用して動的にRoleを追加していた点でした。

対象環境
perl: 5.8.9
Moose: 2.0202
MRO::Compat: 0.11
DBIx::Class: 0.08119

分かったこと
1、MRO::Compatの__get_linear_isa_dfsはPerlのバージョンが5.009_005以下で呼ばれる。
2、最終的にどうすれば分からないことが判明した。

1、MRO::Compatの__get_linear_isa_dfsはPerlのバージョンが5.009_005以下で呼ばれる。

メソッド解決順序について


前回のブログとなんか繋がる内容ですね。

MRO-Compat-0.11/lib/MRO/Compat.pm
our $VERSION = '0.11';
 
BEGIN {
    # Alias our private functions over to
    # the mro:: namespace and load
    # Class::C3 if Perl < 5.9.5
    if($] < 5.009_005) {
        $mro::VERSION # to fool Module::Install when generating META.yml
            = $VERSION;
        $INC{'mro.pm'} = __FILE__;
        *mro::import            = \&__import;
        *mro::get_linear_isa    = \&__get_linear_isa;
        *mro::set_mro           = \&__set_mro;
        *mro::get_mro           = \&__get_mro;
        *mro::get_isarev        = \&__get_isarev;
        *mro::is_universal      = \&__is_universal;
        *mro::method_changed_in = \&__method_changed_in;
        *mro::invalidate_all_method_caches
                                = \&__invalidate_all_method_caches;
        require Class::C3;
        if($Class::C3::XS::VERSION && $Class::C3::XS::VERSION > 0.03) {
            *mro::get_pkg_gen   = \&__get_pkg_gen_c3xs;
        }
        else {
            *mro::get_pkg_gen   = \&__get_pkg_gen_pp;
        }
    }
 
    # Load mro.pm and provide no-op Class::C3::.*initialize() funcs for 5.9.5+
    else {
        require mro;
        no warnings 'redefine';
        *Class::C3::initialize = sub { 1 };
        *Class::C3::reinitialize = sub { 1 };
        *Class::C3::uninitialize = sub { 1 };
    }
} 



sub __get_linear_isa_dfs {
    no strict 'refs';
 
    my $classname = shift;
 
    my @lin = ($classname);
    my %stored;
    foreach my $parent (@{"$classname\::ISA"}) {
    	print "$parent\n"; ##ここを追加
        my $plin = __get_linear_isa_dfs($parent);
        foreach (@$plin) {
            next if exists $stored{$_};
            push(@lin, $_);
            $stored{$_} = 1;
        }
    }
    return \@lin;
}

以下結果です。  

```
DBIx::Class::InflateColumn::DateTime
DBIx::Class::InflateColumn
DBIx::Class::Componentised
Class::C3::Componentised
Class::Accessor::Grouped
DBIx::Class::Componentised
Class::C3::Componentised
Class::Accessor::Grouped
DBIx::Class::UUIDColumns
DBIx::Class::Componentised
Class::C3::Componentised
Class::Accessor::Grouped
DBIx::Class::Relationship
DBIx::Class::Relationship::Helpers
DBIx::Class::Relationship::HasMany
DBIx::Class::Relationship::HasOne
DBIx::Class::Relationship::BelongsTo
DBIx::Class::Relationship::ManyToMany
DBIx::Class::Componentised
Class::C3::Componentised
Class::Accessor::Grouped
DBIx::Class::Relationship::Accessor
DBIx::Class::Relationship::CascadeActions
DBIx::Class::Relationship::ProxyMethods
DBIx::Class::Componentised
Class::C3::Componentised
Class::Accessor::Grouped
DBIx::Class::Relationship::Base
DBIx::Class::Componentised
Class::C3::Componentised
Class::Accessor::Grouped
DBIx::Class::Componentised
Class::C3::Componentised
Class::Accessor::Grouped
DBIx::Class::InflateColumn
DBIx::Class::Componentised
Class::C3::Componentised
Class::Accessor::Grouped
DBIx::Class::PK::Auto
DBIx::Class::Componentised
Class::C3::Componentised
Class::Accessor::Grouped
DBIx::Class::Componentised
Class::C3::Componentised
Class::Accessor::Grouped
DBIx::Class::Componentised
Class::C3::Componentised
Class::Accessor::Grouped
DBIx::Class::ResultSourceProxy::Table
DBIx::Class::ResultSourceProxy
DBIx::Class::Componentised
Class::C3::Componentised
Class::Accessor::Grouped
DBIx::Class::Componentised
Class::C3::Componentised
Class::Accessor::Grouped
Moose::Object

```

めっちゃDBIx::Class::ComponentisedとClass::C3::ComponentisedとClass::Accessor::Groupedを呼んでいる

次はさらに2回目のforeachも見てみました。

sub __get_linear_isa_dfs {
    no strict 'refs';
 
    my $classname = shift;
 
    my @lin = ($classname);
    my %stored;
    foreach my $parent (@{"$classname\::ISA"}) {
    	print "$parent\n"; ##ここを追加
        my $plin = __get_linear_isa_dfs($parent);
        foreach (@$plin) {
        	print "OYA:::$_\n"; ##ここを追加
            next if exists $stored{$_};
            push(@lin, $_);
            $stored{$_} = 1;
        }
    }
    return \@lin;
}


```
Tachyon::Schema::Result
DBIx::Class::InflateColumn::DateTime
DBIx::Class::InflateColumn
DBIx::Class::Componentised

Class::C3::Componentised
OYA:::Class::C3::Componentised
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised

Class::Accessor::Grouped

OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Row
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::InflateColumn
OYA:::DBIx::Class::Row
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped

DBIx::Class::Componentised

Class::C3::Componentised
OYA:::Class::C3::Componentised
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised

Class::Accessor::Grouped
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::InflateColumn::DateTime
OYA:::DBIx::Class::InflateColumn
OYA:::DBIx::Class::Row
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped

DBIx::Class::UUIDColumns
DBIx::Class::Componentised

Class::C3::Componentised
OYA:::Class::C3::Componentised
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised

Class::Accessor::Grouped
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::UUIDColumns
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped

DBIx::Class::Relationship
DBIx::Class::Relationship::Helpers

DBIx::Class::Relationship::HasMany
OYA:::DBIx::Class::Relationship::HasMany

DBIx::Class::Relationship::HasOne
OYA:::DBIx::Class::Relationship::HasOne

DBIx::Class::Relationship::BelongsTo
OYA:::DBIx::Class::Relationship::BelongsTo

DBIx::Class::Relationship::ManyToMany
OYA:::DBIx::Class::Relationship::ManyToMany

DBIx::Class::Componentised

Class::C3::Componentised
OYA:::Class::C3::Componentised
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised

Class::Accessor::Grouped
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Relationship::Helpers
OYA:::DBIx::Class::Relationship::HasMany
OYA:::DBIx::Class::Relationship::HasOne
OYA:::DBIx::Class::Relationship::BelongsTo
OYA:::DBIx::Class::Relationship::ManyToMany
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped

DBIx::Class::Relationship::Accessor
OYA:::DBIx::Class::Relationship::Accessor

DBIx::Class::Relationship::CascadeActions
OYA:::DBIx::Class::Relationship::CascadeActions

DBIx::Class::Relationship::ProxyMethods
DBIx::Class::Componentised

Class::C3::Componentised
OYA:::Class::C3::Componentised
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised

Class::Accessor::Grouped
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Relationship::ProxyMethods
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped

DBIx::Class::Relationship::Base
DBIx::Class::Componentised

Class::C3::Componentised
OYA:::Class::C3::Componentised
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised

Class::Accessor::Grouped
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Relationship::Base
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped

DBIx::Class::Componentised

Class::C3::Componentised
OYA:::Class::C3::Componentised
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised

Class::Accessor::Grouped
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Relationship
OYA:::DBIx::Class::Relationship::Helpers
OYA:::DBIx::Class::Relationship::HasMany
OYA:::DBIx::Class::Relationship::HasOne
OYA:::DBIx::Class::Relationship::BelongsTo
OYA:::DBIx::Class::Relationship::ManyToMany
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Relationship::Accessor
OYA:::DBIx::Class::Relationship::CascadeActions
OYA:::DBIx::Class::Relationship::ProxyMethods
OYA:::DBIx::Class::Relationship::Base

DBIx::Class::InflateColumn
DBIx::Class::Componentised

Class::C3::Componentised
OYA:::Class::C3::Componentised
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised

Class::Accessor::Grouped
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Row
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::InflateColumn
OYA:::DBIx::Class::Row
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped

DBIx::Class::PK::Auto
DBIx::Class::Componentised

Class::C3::Componentised
OYA:::Class::C3::Componentised
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised

Class::Accessor::Grouped
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::PK::Auto
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped

DBIx::Class::Componentised

Class::C3::Componentised
OYA:::Class::C3::Componentised
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised

Class::Accessor::Grouped
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Row
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::PK
OYA:::DBIx::Class::Row
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped

DBIx::Class::Componentised

Class::C3::Componentised
OYA:::Class::C3::Componentised
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised

Class::Accessor::Grouped
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Row
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped

DBIx::Class::ResultSourceProxy::Table
DBIx::Class::ResultSourceProxy
DBIx::Class::Componentised

Class::C3::Componentised
OYA:::Class::C3::Componentised
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised

Class::Accessor::Grouped
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::ResultSourceProxy
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::ResultSourceProxy::Table
OYA:::DBIx::Class::ResultSourceProxy
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped

DBIx::Class::Componentised

Class::C3::Componentised
OYA:::Class::C3::Componentised
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised

Class::Accessor::Grouped
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Core
OYA:::DBIx::Class::Relationship
OYA:::DBIx::Class::Relationship::Helpers
OYA:::DBIx::Class::Relationship::HasMany
OYA:::DBIx::Class::Relationship::HasOne
OYA:::DBIx::Class::Relationship::BelongsTo
OYA:::DBIx::Class::Relationship::ManyToMany
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Relationship::Accessor
OYA:::DBIx::Class::Relationship::CascadeActions
OYA:::DBIx::Class::Relationship::ProxyMethods
OYA:::DBIx::Class::Relationship::Base
OYA:::DBIx::Class::InflateColumn
OYA:::DBIx::Class::Row
OYA:::DBIx::Class::PK::Auto
OYA:::DBIx::Class::PK
OYA:::DBIx::Class::ResultSourceProxy::Table
OYA:::DBIx::Class::ResultSourceProxy
OYA:::Tachyon::Schema::Result
OYA:::DBIx::Class::InflateColumn::DateTime
OYA:::DBIx::Class::InflateColumn
OYA:::DBIx::Class::Row
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::UUIDColumns
OYA:::DBIx::Class::Core
OYA:::DBIx::Class::Relationship
OYA:::DBIx::Class::Relationship::Helpers
OYA:::DBIx::Class::Relationship::HasMany
OYA:::DBIx::Class::Relationship::HasOne
OYA:::DBIx::Class::Relationship::BelongsTo
OYA:::DBIx::Class::Relationship::ManyToMany
OYA:::DBIx::Class::Relationship::Accessor
OYA:::DBIx::Class::Relationship::CascadeActions
OYA:::DBIx::Class::Relationship::ProxyMethods
OYA:::DBIx::Class::Relationship::Base
OYA:::DBIx::Class::PK::Auto
OYA:::DBIx::Class::PK
OYA:::DBIx::Class::ResultSourceProxy::Table
OYA:::DBIx::Class::ResultSourceProxy
Moose::Object
OYA:::Moose::Object
$VAR1 = [
          'Tachyon::Schema::Result::Campaign',
          'Tachyon::Schema::Result',
          'DBIx::Class::InflateColumn::DateTime',
          'DBIx::Class::InflateColumn',
          'DBIx::Class::Row',
          'DBIx::Class',
          'DBIx::Class::Componentised',
          'Class::C3::Componentised',
          'Class::Accessor::Grouped',
          'DBIx::Class::UUIDColumns',
          'DBIx::Class::Core',
          'DBIx::Class::Relationship',
          'DBIx::Class::Relationship::Helpers',
          'DBIx::Class::Relationship::HasMany',
          'DBIx::Class::Relationship::HasOne',
          'DBIx::Class::Relationship::BelongsTo',
          'DBIx::Class::Relationship::ManyToMany',
          'DBIx::Class::Relationship::Accessor',
          'DBIx::Class::Relationship::CascadeActions',
          'DBIx::Class::Relationship::ProxyMethods',
          'DBIx::Class::Relationship::Base',
          'DBIx::Class::PK::Auto',
          'DBIx::Class::PK',
          'DBIx::Class::ResultSourceProxy::Table',
          'DBIx::Class::ResultSourceProxy',
          'Moose::Object'
        ];
```

Exporterが便利でした

今回、仕事の開発でExporterを利用しての開発を行いました。
その際に先輩にExporterの便利さに感動したので簡単にメモを残します。
今まで知らなかったのが恥ずかしかったです。

Exporterはこちら(metacpan)

use Encode qw(encode);  

Perlで上のuseの使い方を見かけることがあると思います。

これはEncodeクラスのなかでencodeというメソッドを利用することを宣言しています。

① @EXPORT
 該当するクラスをuseすると使用できる。

② @EXPORT_OK
 該当するクラスをuseのみでは使用できない。
 上記のように
  use モジュール名 qw( 使用したいモジュール名 );

③ %EXPORT_TAGS
  タグですね。複数メソッドをグループ化し、一括で読み込むことが出来ます。

詳しくはmetacpanを見ていただけると分かると思います。

どんな時に使うか?

あくまで自分が活用した例です。

会社では Perl + Catalystで開発をしています。
今回、Schema(DBIx::Class::Schema)やMemcached(Cache::Memcached::Fast)を全て
Role化したら楽じゃねと思いRole化に取り掛かりました。

package MyApp::API;

with 'MyApp::Role::Schema', 'MyApp::Role::Memcached';

sub ...

お。出来たと思ったのですが、そうでもなかったです。

実は上記の二つのロールのほかに別のロールも作成してました。  
それは「MyApp::Role::Config」です。  
Catalystの設定(ymlファイル)を読み込みハッシュリファレンスを返す役割を担ってます。  
SchemaやMemcachedはこの設定を元にインスタンスを生成してるからです。
さらに MyApp::Role::SchemaとMyApp::Role::Memcahedでwithしてました。
 
package MyApp::Role::Schema;

with 'MyApp::Role::Config';

sub ...

package MyApp::Role::Memcached;

with 'MyApp::Role::Config';

sub ...
 
ここで問題となるのがオブジェクト指向での菱形継承問題です。 
ただ今回の使い方はRoleなので、厳密には菱形継承問題にはならないかもしれません。
しかし、なんか変なので変更することにしました。
Role_2

この解決のためにExporterを利用しました。

さらにBase.pmを作成して、API側ではBase.pmを継承することにしています。

package MyApp::Base;

use MyApp::Bootstrap qw ( get_schema get_memcached );

has 'schema' => {
・・・
lazy_build => 1,
);

sub _build_schema {
return get_schema;

Role_2



 メリット  
- 必要なときに簡単に呼び出せる。  
- 便利な関数を一つに集約できる点。  

これがあるので凄いと思いました。



仕組みはとても簡単で。
perlのモジュールをuseする際必ず呼ばれる関数でimportが存在します。
今回のExporter.pmでのソースがほとんどがimport内で処理が書かれています。


Exporterのみの簡単なサンプルですが
Githubのコードはこちら
 

CentOSでのMySQLのダウングレード


CentOSでのMySQLのダウングレードする方法。

MySQL5.6 → MySQL5.5

yum --disableexclude=all downgrade \
http://dev.mysql.com/get/Downloads/MySQL-5.5/MySQL-shared-compat-5.5.34-1.el6.x86_64.rpm \ http://dev.mysql.com/get/Downloads/MySQL-5.5/MySQL-shared-5.5.34-1.el6.x86_64.rpm \ http://dev.mysql.com/get/Downloads/MySQL-5.5/MySQL-server-5.5.34-1.el6.x86_64.rpm \ http://dev.mysql.com/get/Downloads/MySQL-5.5/MySQL-devel-5.5.34-1.el6.x86_64.rpm \


でおk 。yumすばらしい。 

mod_perl × Catalyst でPOST時Apache2::RequestRecを取得できない

Catalystを最新にしたら、詰まった点があったのでメモします。

mod_perlCatalystを動かしているのですが、今回Catalystを最新にしたらPOST時にエラーが出た。

Catalystのバージョンは5.90051(2013-11-07)です。

エラーの内容としては
POST or PUT 時に下のコードで Apach2::RequestRecではなく、FileHandleが返ってきて
Apacheのログをいじれないという内容である。
Caught exception in "Can't locate object method "user" via package "FileHandle" 

利用しているのこんなコード。
if ( $ENV{ MOD_PERL } ) { 
    my $r = $c->req->env->{'psgi.input'}; 
    $r->user( $c->user->uid ); 
} 
 
Catalyst.pmとか色々とCarp && Dumperして分からず、バージョンを下げたらエラーが出なくなっていた。

どうやら5.90049_004 DEVのアップデートが原因でした。

Changesを見てみると
たぶん下のやつが原因かなと思われる。
If incoming input (from a POST or PUT) is not buffered, create the
    buffer and set the correct psgi env keys to note this for downstream
    psgi apps / middleware.  This should solve some issues where Catalyst
    sucks up the body input but its not buffered so downstream apps can't
    read it (for example FCGI does not buffer).  We now also try to make
    sure the body content input is reset to the start of the filehandle
    so that we are polite to downstream middleware /apps.

書いてありました。
POST or PUT時はFileHandleにリセットされるそうです。

やったこと
Catalystのバージョンを下げる。

結論、脱mod_perlですね。頑張ります。

Use innobackupex of Xtrabackup and create MySQL backup

Xtrabackupのinnobackupexというコマンドを利用してバックアップを作成したいと思います。
前回はこちら) 

かなりシンプルな内容です。

やることは、以下の通りです。

①ローカルのMySQLのバックアップを作成する。
②ローカルのデータベースを削除する。
③バックアップを元に復元する。

①ローカルのMySQLのバックアップを作成する。
 

#innobackpex --user=root --password=pass /data/backup/ 

オプション説明

--user
・・・MySQLで利用するユーザ名

--password
・・・userで指定したパスワード

/data/backup
・・・バックアップデータの出力先


作成されるデータは /data/backup/2013-11-11_21-04-42 と日付のフォルダが作成される。

ログは長いですが、以下の通りです。

#innobackpex --user=root --password=pass /data/backup
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona LLC and/or its affiliates 2009-2013.  All Rights Reserved.

This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.

131111 21:04:42  innobackupex: Connecting to MySQL server with DSN
'dbi:mysql:;mysql_read_default_group=xtrabackup' as 'root'  (using password:
YES).
131111 21:04:42  innobackupex: Connected to MySQL server
IMPORTANT: Please check that the backup run completes successfully.
           At the end of a successful backup run innobackupex
           prints "completed OK!".

innobackupex: Using mysql server version 5.5.32

innobackupex: Created backup directory /data/backup/2013-11-11_21-04-42

131111 21:04:42  innobackupex: Starting ibbackup with command: xtrabackup_55
--defaults-group="mysqld" --backup --suspend-at-end
--target-dir=/data/backup/2013-11-11_21-04-42 --tmpdir=/tmp
innobackupex: Waiting for ibbackup (pid=22602) to suspend
innobackupex: Suspend file
'/data/backup/2013-11-11_21-04-42/xtrabackup_suspended_2'

xtrabackup_55 version 2.1.5 for Percona Server 5.5.31 Linux (x86_64) (revision
id: 680)
xtrabackup: uses posix_fadvise(.
xtrabackup: cd to /var/lib/mysql
xtrabackup: using the following InnoDB configuration:
xtrabackup:   innodb_data_home_dir = ./
xtrabackup:   innodb_data_file_path = ibdata1:10M:autoextend
xtrabackup:   innodb_log_group_home_dir = ./
xtrabackup:   innodb_log_files_in_group = 2
xtrabackup:   innodb_log_file_size = 5242880
>> log scanned up to (24059404)
[01] Copying ./ibdata1 to /data/backup/2013-11-11_21-04-42/ibdata1
[01]        ...done
>> log scanned up to (24059404)
xtrabackup: Creating suspend file
'/data/backup/2013-11-11_21-04-42/xtrabackup_suspended_2' with pid '22602'

131111 21:04:44  innobackupex: Continuing after ibbackup has suspended
131111 21:04:44  innobackupex: Starting to lock all tables...
131111 21:04:44  innobackupex: All tables locked and flushed to disk

131111 21:04:44  innobackupex: Starting to backup non-InnoDB tables and files
innobackupex: in subdirectories of '/var/lib/mysql'
innobackupex: Backing up files
'/var/lib/mysql/test/*.{frm,isl,MYD,MYI,MAD,MAI,MRG,TRG,TRN,ARM,ARZ,CSM,CSV,opt,par}'
(10 files)
131111 21:04:45  innobackupex: Finished backing up non-InnoDB tables and files

131111 21:04:45  innobackupex: Waiting for log copying to finish

>> log scanned up to (24059404)
xtrabackup: The latest check point (for incremental): '24059404'
xtrabackup: Stopping log copying thread.
.>> log scanned up to (24059404)

xtrabackup: Creating suspend file
'/data/backup/2013-11-11_21-04-42/xtrabackup_log_copied' with pid '22602'
xtrabackup: Transaction log of lsn (24059404) to (24059404) was copied.
131111 21:04:46  innobackupex: All tables unlocked

innobackupex: Backup created in directory '/data/backup/2013-11-11_21-04-42'
131111 21:04:46  innobackupex: Connection to database server closed
131111 21:04:46  innobackupex: completed OK!)

②ローカルのデータベースを削除する。

#mysql -u root -p
< drop database test; 
データベースを削除する

③バックアップを元に復元する。

#service mysql stop
#mv /var/lib/mysql /var/lib/mysql_def
#mkdir /var/lib/mysql
#chown mysql:mysql  -R /var/lib/mysql
#innobackupex --copy-back /data/backup/2013-11-11_21-04-42
--copy-back
バックアップしたファイルからデータベースを構築しなおす

/data/backup/2013-11-11_21-04-42
バックアップが存在するフォルダ

/var/lib/mysqlへバックアップのデータが作成されます。
mysqlでアクセスすると削除したはずのtestのデータベースが存在していると思います

以下はログです。


InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona LLC and/or its affiliates 2009-2013.  All Rights Reserved.

This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.

IMPORTANT: Please check that the copy-back run completes successfully.
           At the end of a successful copy-back run innobackupex
           prints "completed OK!".

innobackupex: Starting to copy files in
'/data/backup/mysql/2013-11-11_21-04-42'
innobackupex: back to original data directory '/var/lib/mysql'
innobackupex: Creating directory '/var/lib/mysql/test'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/test/T_Attribute.MYI' to
'/var/lib/mysql/test/T_Attribute.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/test/M_Attribute.MYI' to
'/var/lib/mysql/test/M_Attribute.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/test/AddressTable.frm' to
'/var/lib/mysql/test/AddressTable.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/test/T_Attribute.MYD' to
'/var/lib/mysql/test/T_Attribute.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/test/M_Attribute.frm' to
'/var/lib/mysql/test/M_Attribute.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/test/M_Attribute.MYD' to
'/var/lib/mysql/test/M_Attribute.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/test/AddressTable.MYI' to
'/var/lib/mysql/test/AddressTable.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/test/db.opt' to
'/var/lib/mysql/test/db.opt'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/test/AddressTable.MYD' to
'/var/lib/mysql/test/AddressTable.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/test/T_Attribute.frm' to
'/var/lib/mysql/test/T_Attribute.frm'
innobackupex: Creating directory '/var/lib/mysql/mysql'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/help_topic.MYI' to
'/var/lib/mysql/mysql/help_topic.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/procs_priv.MYD' to
'/var/lib/mysql/mysql/procs_priv.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/procs_priv.MYI' to
'/var/lib/mysql/mysql/procs_priv.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/host.MYI' to
'/var/lib/mysql/mysql/host.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/tables_priv.MYD' to
'/var/lib/mysql/mysql/tables_priv.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/time_zone_transition_type.MYD'
to '/var/lib/mysql/mysql/time_zone_transition_type.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/time_zone_transition.frm'
to '/var/lib/mysql/mysql/time_zone_transition.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/time_zone_leap_second.MYD'
to '/var/lib/mysql/mysql/time_zone_leap_second.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/func.MYD' to
'/var/lib/mysql/mysql/func.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/columns_priv.MYI' to
'/var/lib/mysql/mysql/columns_priv.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/plugin.frm' to
'/var/lib/mysql/mysql/plugin.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/time_zone_name.MYI' to
'/var/lib/mysql/mysql/time_zone_name.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/slow_log.frm' to
'/var/lib/mysql/mysql/slow_log.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/tables_priv.MYI' to
'/var/lib/mysql/mysql/tables_priv.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/time_zone_name.frm' to
'/var/lib/mysql/mysql/time_zone_name.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/user.frm' to
'/var/lib/mysql/mysql/user.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/servers.MYD' to
'/var/lib/mysql/mysql/servers.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/time_zone_transition.MYI'
to '/var/lib/mysql/mysql/time_zone_transition.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/help_category.MYD' to
'/var/lib/mysql/mysql/help_category.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/event.MYD' to
'/var/lib/mysql/mysql/event.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/help_keyword.MYD' to
'/var/lib/mysql/mysql/help_keyword.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/proc.frm' to
'/var/lib/mysql/mysql/proc.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/ndb_binlog_index.MYI' to
'/var/lib/mysql/mysql/ndb_binlog_index.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/servers.MYI' to
'/var/lib/mysql/mysql/servers.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/help_relation.MYI' to
'/var/lib/mysql/mysql/help_relation.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/help_category.MYI' to
'/var/lib/mysql/mysql/help_category.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/func.frm' to
'/var/lib/mysql/mysql/func.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/db.MYD' to
'/var/lib/mysql/mysql/db.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/time_zone.MYD' to
'/var/lib/mysql/mysql/time_zone.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/time_zone_transition_type.frm'
to '/var/lib/mysql/mysql/time_zone_transition_type.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/time_zone_leap_second.MYI'
to '/var/lib/mysql/mysql/time_zone_leap_second.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/db.MYI' to
'/var/lib/mysql/mysql/db.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/time_zone_transition.MYD'
to '/var/lib/mysql/mysql/time_zone_transition.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/time_zone_name.MYD' to
'/var/lib/mysql/mysql/time_zone_name.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/db.frm' to
'/var/lib/mysql/mysql/db.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/event.frm' to
'/var/lib/mysql/mysql/event.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/help_relation.MYD' to
'/var/lib/mysql/mysql/help_relation.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/columns_priv.MYD' to
'/var/lib/mysql/mysql/columns_priv.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/plugin.MYI' to
'/var/lib/mysql/mysql/plugin.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/event.MYI' to
'/var/lib/mysql/mysql/event.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/host.MYD' to
'/var/lib/mysql/mysql/host.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/proc.MYI' to
'/var/lib/mysql/mysql/proc.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/user.MYD' to
'/var/lib/mysql/mysql/user.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/general_log.frm' to
'/var/lib/mysql/mysql/general_log.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/time_zone_transition_type.MYI'
to '/var/lib/mysql/mysql/time_zone_transition_type.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/servers.frm' to
'/var/lib/mysql/mysql/servers.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/user.MYI' to
'/var/lib/mysql/mysql/user.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/help_keyword.frm' to
'/var/lib/mysql/mysql/help_keyword.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/host.frm' to
'/var/lib/mysql/mysql/host.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/plugin.MYD' to
'/var/lib/mysql/mysql/plugin.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/ndb_binlog_index.frm' to
'/var/lib/mysql/mysql/ndb_binlog_index.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/time_zone_leap_second.frm'
to '/var/lib/mysql/mysql/time_zone_leap_second.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/columns_priv.frm' to
'/var/lib/mysql/mysql/columns_priv.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/tables_priv.frm' to
'/var/lib/mysql/mysql/tables_priv.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/ndb_binlog_index.MYD' to
'/var/lib/mysql/mysql/ndb_binlog_index.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/general_log.CSV' to
'/var/lib/mysql/mysql/general_log.CSV'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/time_zone.frm' to
'/var/lib/mysql/mysql/time_zone.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/help_topic.MYD' to
'/var/lib/mysql/mysql/help_topic.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/help_keyword.MYI' to
'/var/lib/mysql/mysql/help_keyword.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/general_log.CSM' to
'/var/lib/mysql/mysql/general_log.CSM'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/slow_log.CSV' to
'/var/lib/mysql/mysql/slow_log.CSV'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/time_zone.MYI' to
'/var/lib/mysql/mysql/time_zone.MYI'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/slow_log.CSM' to
'/var/lib/mysql/mysql/slow_log.CSM'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/help_relation.frm' to
'/var/lib/mysql/mysql/help_relation.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/proc.MYD' to
'/var/lib/mysql/mysql/proc.MYD'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/procs_priv.frm' to
'/var/lib/mysql/mysql/procs_priv.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/help_category.frm' to
'/var/lib/mysql/mysql/help_category.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/help_topic.frm' to
'/var/lib/mysql/mysql/help_topic.frm'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/mysql/func.MYI' to
'/var/lib/mysql/mysql/func.MYI'

innobackupex: Starting to copy InnoDB system tablespace
innobackupex: in '/data/backup/mysql/2013-11-11_21-04-42'
innobackupex: back to original InnoDB data directory '/var/lib/mysql'
innobackupex: Copying '/data/backup/mysql/2013-11-11_21-04-42/ibdata1'
to '/var/lib/mysql/ibdata1'

innobackupex: Starting to copy InnoDB undo tablespaces
innobackupex: in '/data/backup/mysql/2013-11-11_21-04-42'
innobackupex: back to '/var/lib/mysql'

innobackupex: Starting to copy InnoDB log files
innobackupex: in '/data/backup/mysql/2013-11-11_21-04-42'
innobackupex: back to original InnoDB log directory '/var/lib/mysql'
innobackupex: Finished copying back files.

131111 20:30:00  innobackupex: completed OK!

感想
楽だった。コマンドのオプションなど面白そうなものがたくさんあるので色々と試してみたい。