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が反映されないため)
Ubuntuでsourceコマンドが無かった
Ubuntuを使っていてsourceコマンドが無かったのでインストール方法をググりました。
sudo apt-get install build-essential checkinstall
だけでおkだった。以上。
PerlでのMRO::Compatの__get_linear_isa_dfsが遅い件について
経緯:
なんかやたらクローンでまわしている処理が重いため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
分かったこと
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::Row
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::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::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::Row
DBIx::Class::Componentised
Class::C3::Componentised
Class::Accessor::Grouped
DBIx::Class::PK::Auto
DBIx::Class::Componentised
Class::C3::Componentised
Class::Accessor::Grouped
DBIx::Class::PK
DBIx::Class::Row
DBIx::Class::Componentised
Class::C3::Componentised
Class::Accessor::Grouped
DBIx::Class::Row
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::Row
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
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Row
OYA:::DBIx::Class
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::InflateColumn
OYA:::DBIx::Class::Row
OYA:::DBIx::Class
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
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
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
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::UUIDColumns
OYA:::DBIx::Class
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
DBIx::Class::Core
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
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
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
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Relationship::ProxyMethods
OYA:::DBIx::Class
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
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Relationship::Base
OYA:::DBIx::Class
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
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
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::Row
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
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Row
OYA:::DBIx::Class
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::InflateColumn
OYA:::DBIx::Class::Row
OYA:::DBIx::Class
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
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::PK::Auto
OYA:::DBIx::Class
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
DBIx::Class::PK
DBIx::Class::Row
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
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Row
OYA:::DBIx::Class
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::PK
OYA:::DBIx::Class::Row
OYA:::DBIx::Class
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
DBIx::Class::Row
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
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::Row
OYA:::DBIx::Class
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
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::ResultSourceProxy
OYA:::DBIx::Class
OYA:::DBIx::Class::Componentised
OYA:::Class::C3::Componentised
OYA:::Class::Accessor::Grouped
OYA:::DBIx::Class::ResultSourceProxy::Table
OYA:::DBIx::Class::ResultSourceProxy
OYA:::DBIx::Class
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
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
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
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)
Perlで上のuseの使い方を見かけることがあると思います。
これはEncodeクラスのなかでencodeというメソッドを利用することを宣言しています。
① @EXPORT
該当するクラスをuseすると使用できる。
② @EXPORT_OK
該当するクラスをuseのみでは使用できない。
上記のように
use モジュール名 qw( 使用したいモジュール名 );
③ %EXPORT_TAGS
タグですね。複数のメソッドをグループ化し、一括で読み込むことが出来ます。
詳しくはmetacpanを見ていただけると分かると思います。
どんな時に使うか?
あくまで自分が活用した例です。
会社では Perl + Catalystで開発をしています。
お。出来たと思ったのですが、そうでもなかったです。
さらにBase.pmを作成して、API側ではBase.pmを継承することにしています。
メリット
仕組みはとても簡単で。
Exporterのみの簡単なサンプルですが
Githubのコードはこちら
その際に先輩にExporterの便利さに感動したので簡単にメモを残します。
今まで知らなかったのが恥ずかしかったです。
Exporterはこちら(metacpan)
use Encode qw(encode);
Perlで上のuseの使い方を見かけることがあると思います。
これはEncodeクラスのなかでencodeというメソッドを利用することを宣言しています。
① @EXPORT
該当するクラスをuseすると使用できる。
② @EXPORT_OK
該当するクラスをuseのみでは使用できない。
上記のように
use モジュール名 qw( 使用したいモジュール名 );
③ %EXPORT_TAGS
タグですね。複数のメソッドをグループ化し、一括で読み込むことが出来ます。
詳しくはmetacpanを見ていただけると分かると思います。
どんな時に使うか?
あくまで自分が活用した例です。
会社では Perl + Catalystで開発をしています。
Role化したら楽じゃねと思いRole化に取り掛かりました。
package MyApp::API; with 'MyApp::Role::Schema', 'MyApp::Role::Memcached'; sub ...
お。出来たと思ったのですが、そうでもなかったです。
実は上記の二つのロールのほかに別のロールも作成してました。
それは「MyApp::Role::Config」です。
Catalystの設定(ymlファイル)を読み込みハッシュリファレンスを返す役割を担ってます。
さらに 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なので、厳密には菱形継承問題にはならないかもしれません。
しかし、なんか変なので変更することにしました。
この解決のためにExporterを利用しました。
しかし、なんか変なので変更することにしました。
この解決のために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;
}
メリット
- 必要なときに簡単に呼び出せる。
- 便利な関数を一つに集約できる点。
これがあるので凄いと思いました。
仕組みはとても簡単で。
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_perlでCatalystを動かしているのですが、今回Catalystを最新にしたらPOST時にエラーが出た。
Catalystのバージョンは5.90051(2013-11-07)です。
エラーの内容としては
POST or PUT 時に下のコードで Apach2::RequestRecではなく、FileHandleが返ってきて
Apacheのログをいじれないという内容である。
利用しているのこんなコード。
Catalyst.pmとか色々とCarp && Dumperして分からず、バージョンを下げたらエラーが出なくなっていた。
どうやら5.90049_004 DEVのアップデートが原因でした。
Changesを見てみると
たぶん下のやつが原因かなと思われる。
POST or PUT時はFileHandleにリセットされるそうです。
やったこと
Catalystのバージョンを下げる。
結論、脱mod_perlですね。頑張ります。
mod_perlでCatalystを動かしているのですが、今回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のバックアップを作成する。
オプション説明
--user
・・・MySQLで利用するユーザ名
--password
・・・userで指定したパスワード
/data/backup
・・・バックアップデータの出力先
作成されるデータは /data/backup/2013-11-11_21-04-42 と日付のフォルダが作成される。
ログは長いですが、以下の通りです。
バックアップしたファイルからデータベースを構築しなおす
/data/backup/2013-11-11_21-04-42
バックアップが存在するフォルダ
/var/lib/mysqlへバックアップのデータが作成されます。
mysqlでアクセスすると削除したはずのtestのデータベースが存在していると思います
以下はログです。
感想
楽だった。コマンドのオプションなど面白そうなものがたくさんあるので色々と試してみたい。
(前回はこちら)
かなりシンプルな内容です。
やることは、以下の通りです。
①ローカルの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!
感想
楽だった。コマンドのオプションなど面白そうなものがたくさんあるので色々と試してみたい。