SlideShare a Scribd company logo
1 of 254
Download to read offline
同期と複製
同期と複製
同期と複製
『典型的な操作をコマンドひとつで実現』
同期と複製
『典型的な操作をコマンドひとつで実現』
同期と複製
レコードの書き出し
『典型的な操作をコマンドひとつで実現』
同期と複製
レコードの書き出し
ファイルの移動
『典型的な操作をコマンドひとつで実現』
▼
同期と複製
レコードの書き出し
ファイルの移動
レコードの読み込み
『典型的な操作をコマンドひとつで実現』
▼
▼
同期と複製
同期と複製
役割と名称
同期と複製
役割と名称
命令!
同期と複製
役割と名称
命令!
DATA
同期と複製
役割と名称
マスター
スレイブ
ローカル
リモート命令!
DATA
同期と複製
役割と名称
マスタースレイブ
ローカル リモート
命令!
DATA
同期と複製
役割と名称
マスタースレイブ
ローカル リモート
命令!
DATA
命令する方が僕
同期と複製
役割と名称
マスタースレイブ
ローカル リモート
命令!
DATA
命令する方が僕
供給する方が主
同期と複製
マスタースレイブ
ローカル リモート
同期と複製
マスタースレイブ
ローカル リモート
(トランザクション)
コマンド実行
(エラー処理)
完全に自動
同期と複製
同期と複製
複製
同期と複製
レコードの書き出し
複製
同期と複製
レコードの書き出し
ファイルの移動
▼
複製
同期と複製
レコードの書き出し
ファイルの移動
レコードの読み込み
▼
▼
複製
同期と複製
レコードの書き出し
ファイルの移動
レコードの読み込み
▼
▼
複製 同期
同期と複製
レコードの書き出し
ファイルの移動
レコードの読み込み
▼
▼
複製
▶ レコードの書き出し
同期
同期と複製
レコードの書き出し
ファイルの移動
レコードの読み込み
▼
▼
複製
▶ レコードの書き出し
▲
ファイルの移動
同期
同期と複製
レコードの書き出し
ファイルの移動
レコードの読み込み
▼
▼
複製
▶ レコードの書き出し
▲
ファイルの移動
▲
レコードの読み込み
同期
同期と複製
複製 同期
同期と複製
複製
同期
同期と複製
複製
同期
リモートからローカルに
レコードをコピーすること
同期と複製
複製
同期
リモートからローカルに
レコードをコピーすること
リモートからローカルに
レコードをコピーした後,
ローカルからリモートに
レコードをコピーすること
同期と複製
複製
同期
同期と複製
複製
同期 複製 複製≠ +
同期と複製
複製
同期 複製 複製≠ +
無限ループに陥ってしまう
複製の設定
マスタースレイブ
ローカル リモート
(トランザクション)
コマンド実行
(エラー処理)
完全に自動
複製の設定
マスタースレイブ
ローカル リモート
(トランザクション)
コマンド実行
(エラー処理)
完全に自動
複製の設定
マスタースレイブ
ローカル リモート
(トランザクション)
コマンド実行
(エラー処理)
主キーを作成
複製を有効にする
複製の設定
複製の設定
複製の設定
複製の設定
複製の設定
複製の設定
複製の設定
複製の設定
プライマリーキー(主キー)
複製の設定
プライマリーキー(主キー)
複製の設定
ALTER TABLE table ADD PRIMARY KEY column
プライマリーキー(主キー)
複製の設定
ALTER TABLE table ENABLE REPLICATE
ALTER TABLE table ADD PRIMARY KEY column
プライマリーキー(主キー)
複製の設定
ALTER TABLE table ENABLE REPLICATE
ALTER TABLE table ADD PRIMARY KEY column
プライマリーキー(主キー)
ALTER TABLE table ADD column
UUID AUTO_GENERATE
複製の設定
複製の設定
4DB/4DC
ストラクチャファイル
4DIndy
ストラクチャインデックスファイル
複製の設定
4DSyncHeader
シンクヘッダーファイル
4DSyncData
シンクデータファイル
4DB/4DC
ストラクチャファイル
4DIndy
ストラクチャインデックスファイル
複製の設定
複製の設定
レコードのタッチ
複製の設定
複製の設定
設定の解除
複製の設定
ALTER TABLE table DISABLE REPLICATE
あるいはストラクチャエディターで『複製』を無効に。
設定の解除
複製の設定
ALTER TABLE table DISABLE REPLICATE
あるいはストラクチャエディターで『複製』を無効に。
4DSyncHeader/4DSyncData
複製有効テーブルが存在する限り削除してはならない。
設定の解除
複製の設定
ALTER TABLE table DISABLE REPLICATE
あるいはストラクチャエディターで『複製』を無効に。
4DSyncHeader/4DSyncData
複製有効テーブルが存在する限り削除してはならない。
設定の解除
複製の仕組み
複製の仕組み
データベースエンジンレベルで発生するイベントを再現
Create,Read,Update,Delete
アクション
何が起きた
複製の仕組み
データベースエンジンレベルで発生するイベントを再現
Create,Read,Update,Delete
レコード番号
どこで
アクション
何が起きた
複製の仕組み
データベースエンジンレベルで発生するイベントを再現
Create,Read,Update,Delete
レコード番号
どこで
アクション
何が起きた
複製の仕組み
データベースエンジンレベルで発生するイベントを再現
Create,Read,Update,Delete
スタンプ
いつ
レコード番号
どこで
アクション
何が起きた
複製の仕組み
スタンプ
いつ
レコード番号
どこで
アクション
何が起きた
複製の仕組み
スタンプ
いつ
レコード番号
どこで
アクション
何が起きた
複製の仕組み
スタンプ
いつ
バーチャルフィールド
複製が有効にされたテーブルに作成される疑似フィールド
ダブルアンダースコアから始まる名前
レコード番号: __ROW_ID
どこで
スタンプ: __ROW_STAMP
いつ
アクション: __ROW_ACTION
何が起きた
複製の仕組み
バーチャルフィールド
複製が有効にされたテーブルに作成される疑似フィールド
ダブルアンダースコアから始まる名前
レコード番号: __ROW_ID
どこで
スタンプ: __ROW_STAMP
いつ
アクション: __ROW_ACTION
何が起きた
複製の仕組み
レコード番号: __ROW_ID
どこで
スタンプ: __ROW_STAMP
いつ
アクション: __ROW_ACTION
何が起きた
複製の仕組み
レコード番号: __ROW_ID
どこで
スタンプ: __ROW_STAMP
いつ
アクション: __ROW_ACTION
何が起きた
複製の仕組み
レコード操作の種類【Int16】
1=更新(新規作成も)
2=削除
利用:複製・同期のみ
レコード番号: __ROW_ID
どこで
スタンプ: __ROW_STAMP
いつ
アクション: __ROW_ACTION
何が起きた
複製の仕組み
レコード操作の種類【Int16】
1=更新(新規作成も)
2=削除
利用:複製・同期のみ
更新
レコード番号: __ROW_ID
どこで
スタンプ: __ROW_STAMP
いつ
アクション: __ROW_ACTION
何が起きた
複製の仕組み
レコード操作の種類【Int16】
1=更新(新規作成も)
2=削除
利用:複製・同期のみ
更新
更新, 更新, 更新, 更新, 更新, 更新, 更新, 更新, 更新
レコード番号: __ROW_ID
どこで
スタンプ: __ROW_STAMP
いつ
アクション: __ROW_ACTION
何が起きた
複製の仕組み
レコード操作の種類【Int16】
1=更新(新規作成も)
2=削除
利用:複製・同期のみ
更新
更新, 更新, 更新, 更新, 更新, 更新, 更新, 更新, 更新
削除。←大事なのはこのアクションだけ
レコード番号: __ROW_ID
どこで
スタンプ: __ROW_STAMP
いつ
アクション: __ROW_ACTION
何が起きた
複製の仕組み
レコード番号: __ROW_ID
どこで
スタンプ: __ROW_STAMP
いつ
アクション: __ROW_ACTION
何が起きた
複製の仕組み
Record number【Int32】
0から始まる
再利用される
利用:複製・同期以外
レコード番号: __ROW_ID
どこで
スタンプ: __ROW_STAMP
いつ
アクション: __ROW_ACTION
何が起きた
複製の仕組み
Record number【Int32】
0から始まる
再利用される
利用:複製・同期以外
ID=0/PK= A 削除
レコード番号: __ROW_ID
どこで
スタンプ: __ROW_STAMP
いつ
アクション: __ROW_ACTION
何が起きた
複製の仕組み
Record number【Int32】
0から始まる
再利用される
利用:複製・同期以外
ID=0/PK= A 削除
ID=0/PK= B 作成
レコード番号: __ROW_ID
どこで
スタンプ: __ROW_STAMP
いつ
アクション: __ROW_ACTION
何が起きた
複製の仕組み
Record number【Int32】
0から始まる
再利用される
利用:複製・同期以外
ID=0/PK= A 削除
ID=0/PK= B 作成
プライマリーキーが違うので,混乱することはない
レコード番号: __ROW_ID
どこで
スタンプ: __ROW_STAMP
いつ
アクション: __ROW_ACTION
何が起きた
複製の仕組み
レコード番号: __ROW_ID
どこで
スタンプ: __ROW_STAMP
いつ
アクション: __ROW_ACTION
何が起きた
複製の仕組み
シーケンシャル番号【Int64】
1から始まる
1ずつ増えるとは限らない
利用:すべて
レコード番号: __ROW_ID
どこで
スタンプ: __ROW_STAMP
いつ
アクション: __ROW_ACTION
何が起きた
複製の仕組み
シーケンシャル番号【Int64】
1から始まる
1ずつ増えるとは限らない
利用:すべて
1個のレコードに対する1個のアクションで1個のスタンプ
レコード番号: __ROW_ID
どこで
スタンプ: __ROW_STAMP
いつ
アクション: __ROW_ACTION
何が起きた
複製の仕組み
シーケンシャル番号【Int64】
1から始まる
1ずつ増えるとは限らない
利用:すべて
1個のレコードに対する1個のアクションで1個のスタンプ
100個のレコードに対する1個のアクションで100個のスタンプ
レコード番号: __ROW_ID
どこで
スタンプ: __ROW_STAMP
いつ
アクション: __ROW_ACTION
何が起きた
複製の仕組み
シーケンシャル番号【Int64】
1から始まる
1ずつ増えるとは限らない
利用:すべて
1個のレコードに対する1個のアクションで1個のスタンプ
100個のレコードに対する1個のアクションで100個のスタンプ
1個のレコードに対する100個のアクションで1個のスタンプ
複製の設定
複製の設定
レコードのタッチ
複製の設定
レコードのタッチ
あるいは特別なスタンプ -1
制約
制約
トリガ
削除制御
自動UUID
重複不可
ヌル値の入力を許可しない
制約
トリガ
削除制御
自動UUID
重複不可
ヌル値の入力を許可しない
すべて無視
制約
制約
妥当性を検証する必要がある場合
複製コマンドに配列を使用する
トランザクション
マスタースレイブ
ローカル リモート
(トランザクション)
コマンド実行
(エラー処理)
完全に自動
トランザクション
マスタースレイブ
ローカル リモート
(トランザクション)
コマンド実行
(エラー処理)
完全に自動
トランザクション
マスタースレイブ
ローカル リモート
(トランザクション)
コマンド実行
(エラー処理)
完全に自動
トランザクションも自動
トランザクション
マスタースレイブ
ローカル リモート
(トランザクション)
コマンド実行
(エラー処理)
完全に自動
トランザクションも自動
トランザクション
マスタースレイブ
ローカル リモート
(トランザクション)
コマンド実行
(エラー処理)
完全に自動
トランザクションも自動
トランザクション
マスタースレイブ
ローカル リモート
(トランザクション)
コマンド実行
(エラー処理)
完全に自動
トランザクションも自動
トランザクション
マスタースレイブ
ローカル リモート
(トランザクション)
コマンド実行
(エラー処理)
完全に自動
トランザクションも自動
トランザクション
トランザクション
複製中にリモートのレコードが更新された場合
ページネーションされた複製の途中でスタンプが変わったとき
▶複製を最初からやり直す必要がある
トランザクション
トランザクション
トランザクション
複製中にローカルのレコードが更新された場合
そんなことがあってはいけない
▶セレクションをロックする必要がある
トランザクション
複製中にローカルのレコードが更新された場合
そんなことがあってはいけない
▶セレクションをロックする必要がある
トランザクション
複製中にローカルのレコードが更新された場合
そんなことがあってはいけない
▶セレクションをロックする必要がある
SELECT FOR UPDATE
トランザクション
複製中にローカルのレコードが更新された場合
そんなことがあってはいけない
▶セレクションをロックする必要がある
SELECT FOR UPDATE
SET QUERY AND LOCK
REPLICATE
REPLICATE
Begin SQL
REPLICATE ....
End SQL
REPLICATE
Begin SQL
REPLICATE ....
End SQL
$SQL:= REPLICATE ...
Begin SQL
EXECUTE IMMEDIATE :$SQL
End SQL
REPLICATE
Begin SQL
REPLICATE ....
End SQL
$SQL:= REPLICATE ...
Begin SQL
EXECUTE IMMEDIATE :$SQL
End SQL
$SQL:= REPLICATE ...
SQL EXECUTE ($SQL)
REPLICATE
Begin SQL
REPLICATE ....
End SQL
$SQL:= REPLICATE ...
Begin SQL
EXECUTE IMMEDIATE :$SQL
End SQL
$SQL:= REPLICATE ...
SQL EXECUTE ($SQL)
$SQL:= C:¥¥script.sql
SQL EXECUTE SCRIPT ($SQL; ...)
$SQL:= REPLICATE ...
SQL EXECUTE ($SQL)
$SQL:= C:¥¥script.sql
SQL EXECUTE SCRIPT ($SQL; ...)
REPLICATE
Begin SQL
REPLICATE ....
End SQL
$SQL:= REPLICATE ...
Begin SQL
EXECUTE IMMEDIATE :$SQL
End SQL
$SQL:= REPLICATE ...
SQL EXECUTE ($SQL)
$SQL:= C:¥¥script.sql
SQL EXECUTE SCRIPT ($SQL; ...)
REPLICATE
Begin SQL
REPLICATE ....
End SQL
$SQL:= REPLICATE ...
Begin SQL
EXECUTE IMMEDIATE :$SQL
End SQL
$SQL:= REPLICATE ...
SQL EXECUTE ($SQL)
$SQL:= C:¥¥script.sql
SQL EXECUTE SCRIPT ($SQL; ...)
REPLICATE
Begin SQL
REPLICATE ....
End SQL
$SQL:= REPLICATE ...
Begin SQL
EXECUTE IMMEDIATE :$SQL
End SQL
SQL LOGIN( IP:192.168.1.1 ; ... ;*)
$SQL:= REPLICATE ...
SQL EXECUTE ($SQL)
$SQL:= C:¥¥script.sql
SQL EXECUTE SCRIPT ($SQL; ...)
REPLICATE
Begin SQL
REPLICATE ....
End SQL
$SQL:= REPLICATE ...
Begin SQL
EXECUTE IMMEDIATE :$SQL
End SQL
SQL LOGIN( IP:192.168.1.1 ; ... ;*)
SQL LOGIN( 4D:MyServer ; ... ;*)
$SQL:= REPLICATE ...
SQL EXECUTE ($SQL)
$SQL:= C:¥¥script.sql
SQL EXECUTE SCRIPT ($SQL; ...)
REPLICATE
Begin SQL
REPLICATE ....
End SQL
$SQL:= REPLICATE ...
Begin SQL
EXECUTE IMMEDIATE :$SQL
End SQL
SQL LOGIN( IP:192.168.1.1 ; ... ;*)
SQL LOGIN( 4D:MyServer ; ... ;*)
SQL LOGIN( ODBC:MyDSN ; ... ;*)
$SQL:= REPLICATE ...
SQL EXECUTE ($SQL)
$SQL:= C:¥¥script.sql
SQL EXECUTE SCRIPT ($SQL; ...)
REPLICATE
Begin SQL
REPLICATE ....
End SQL
$SQL:= REPLICATE ...
Begin SQL
EXECUTE IMMEDIATE :$SQL
End SQL
SQL LOGIN( IP:192.168.1.1 ; ... ;*)
SQL LOGIN( 4D:MyServer ; ... ;*)
SQL LOGIN( ODBC:MyDSN ; ... ;*)
REPLICATE
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
STAMP
1
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
STAMP
1
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
STAMP
1
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
STAMP
1
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
STAMP
1
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
STAMP
2
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
STAMP
3
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
STAMP
4
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
STAMP
5
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
STAMP
6
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
STAMP
7
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
STAMP
8
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
STAMP
9
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
STAMP
9
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
STAMP
9
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
マスタースレイブ
ローカル リモート
STAMP
9
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
マスタースレイブ
ローカル リモート
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
マスタースレイブ
ローカル リモート
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
マスタースレイブ
ローカル リモート
REPLICATE
REPLICATE
複製の途中でスタンプが変わったとき!!
REPLICATE
複製の途中でスタンプが変わったとき!!
最初からやり直してください
REPLICATE
複製の途中でスタンプが変わったとき!!
最初からやり直してくださいトランザクション
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
WHERE :condition
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
WHERE :condition
REPLICATE
REPLICATE
レコードがWHERE句で取れなくなったとき!!
REPLICATE
レコードがWHERE句で取れなくなったとき!!
オーファンレコード
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
WHERE :condition
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
WHERE :condition
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
WHERE :condition
LOCAL STAMP :inStampLocal
LOCAL OVER REMOTE REMOTE OVER LOCALl
LATEST LOCAL STAMP :outStampLocal
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
WHERE :condition
LOCAL STAMP :inStampLocal
LOCAL OVER REMOTE REMOTE OVER LOCAL
LATEST LOCAL STAMP :outStampLocal
REPLICATE
REPLICATE
コンフリクトレゾリューション
REPLICATE
コンフリクトレゾリューション
REPLICATE
コンフリクトレゾリューション
REPLICATE
コンフリクトレゾリューション
特定のレコードが,複製と複製の間に,
リモートとローカルの両方で更新された状況
REPLICATE
コンフリクトレゾリューション
特定のレコードが,複製と複製の間に,
リモートとローカルの両方で更新された状況
REPLICATE
コンフリクトレゾリューション
特定のレコードが,複製と複製の間に,
リモートとローカルの両方で更新された状況
マスタースレイブ
ローカル リモート
STAMP
3
REPLICATE
コンフリクトレゾリューション
特定のレコードが,複製と複製の間に,
リモートとローカルの両方で更新された状況
マスタースレイブ
ローカル リモート
STAMP
3
REPLICATE
コンフリクトレゾリューション
特定のレコードが,複製と複製の間に,
リモートとローカルの両方で更新された状況
マスタースレイブ
ローカル リモート
STAMP
3
REPLICATE
コンフリクトレゾリューション
特定のレコードが,複製と複製の間に,
リモートとローカルの両方で更新された状況
マスタースレイブ
ローカル リモート
STAMP
34
REPLICATE
コンフリクトレゾリューション
特定のレコードが,複製と複製の間に,
リモートとローカルの両方で更新された状況
マスタースレイブ
ローカル リモート
STAMP
35
REPLICATE
コンフリクトレゾリューション
特定のレコードが,複製と複製の間に,
リモートとローカルの両方で更新された状況
マスタースレイブ
ローカル リモート
STAMP
36
REPLICATE
コンフリクトレゾリューション
特定のレコードが,複製と複製の間に,
リモートとローカルの両方で更新された状況
マスタースレイブ
ローカル リモート
STAMP
37
REPLICATE
コンフリクトレゾリューション
マスタースレイブ
ローカル リモート
特定のレコードが,複製と複製の間に,
リモートとローカルの両方で更新された状況
STAMP
7 3
REPLICATE
コンフリクトレゾリューション
マスタースレイブ
ローカル リモート
特定のレコードが,複製と複製の間に,
リモートとローカルの両方で更新された状況
STAMP
5
STAMP
7 3
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LIMIT :inLimit
OFFSET :inOffset
WHERE :condition
LOCAL STAMP :inStampLocal
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LIMIT :inLimit
OFFSET :inOffset
WHERE :condition
LOCAL STAMP :inStampLocal
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LOCAL OVER REMOTE REMOTE OVER LOCALl
LATEST LOCAL STAMP :outStampLocal
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
WHERE :condition
LOCAL STAMP :inStampLocal
LOCAL OVER REMOTE REMOTE OVER LOCALl
LATEST LOCAL STAMP :outStampLocal
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
WHERE :condition
LOCAL STAMP :inStampLocal
LOCAL OVER REMOTE REMOTE OVER LOCALl
LATEST LOCAL STAMP :outStampLocal
REPLICATE
REPLICATE column, column,...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
WHERE :condition
LOCAL STAMP :inStampLocal
LOCAL OVER REMOTE REMOTE OVER LOCALl
LATEST LOCAL STAMP :outStampLocal
REPLICATE
マスタースレイブ
ローカル リモート
STAMP
5
STAMP
7 3
LOCAL OVER REMOTE REMOTE OVER LOCALl
REPLICATE
マスタースレイブ
ローカル リモート
STAMP
5
STAMP
7 3
LOCAL OVER REMOTE REMOTE OVER LOCALl
YOU
WIN!
YOU
LOSE!
REPLICATE
マスタースレイブ
ローカル リモート
STAMP
5
STAMP
7 3
LOCAL OVER REMOTE REMOTE OVER LOCALl
YOU
LOSE!
REPLICATE
マスタースレイブ
ローカル リモート
STAMP
5
STAMP
7 3
LOCAL OVER REMOTE REMOTE OVER LOCALl
YOU
WIN!
SYNCHRONIZE
SYNCHRONIZE
SYNCHRONIZE
SYNCHRONIZE LOCAL TABLE table (column, ...)
WITH REMOTE TABLE table (column, ...)
LATEST LOCAL STAMP :outStampLocal;
LOCAL OVER REMOTE REMOTE OVER LOCAL
LATEST REMOTE STAMP :outStamp
LOCAL STAMP :inStampLocal
SYNCHRONIZE
SYNCHRONIZE LOCAL TABLE table (column, ...)
WITH REMOTE TABLE table (column, ...)
LATEST LOCAL STAMP :outStampLocal;
LOCAL OVER REMOTE REMOTE OVER LOCAL
LATEST REMOTE STAMP :outStamp
LOCAL STAMP :inStampLocal
ローカル リモート
SYNCHRONIZE
SYNCHRONIZE LOCAL TABLE table (column, ...)
WITH REMOTE TABLE table (column, ...)
LATEST LOCAL STAMP :outStampLocal;
LOCAL OVER REMOTE REMOTE OVER LOCAL
LATEST REMOTE STAMP :outStamp
LOCAL STAMP :inStampLocal
ローカル リモート
SYNCHRONIZE
SYNCHRONIZE LOCAL TABLE table (column, ...)
WITH REMOTE TABLE table (column, ...)
LATEST LOCAL STAMP :outStampLocal;
LOCAL OVER REMOTE REMOTE OVER LOCAL
LATEST REMOTE STAMP :outStamp
LOCAL STAMP :inStampLocal
ローカル リモート
SYNCHRONIZE
SYNCHRONIZE LOCAL TABLE table (column, ...)
WITH REMOTE TABLE table (column, ...)
LATEST LOCAL STAMP :outStampLocal;
LOCAL OVER REMOTE REMOTE OVER LOCAL
LATEST REMOTE STAMP :outStamp
LOCAL STAMP :inStampLocal
ローカル リモート
SYNCHRONIZE
SYNCHRONIZE LOCAL TABLE table (column, ...)
WITH REMOTE TABLE table (column, ...)
LATEST LOCAL STAMP :outStampLocal;
LOCAL OVER REMOTE REMOTE OVER LOCAL
LATEST REMOTE STAMP :outStamp
LOCAL STAMP :inStampLocal
ローカル リモート
REPLICATEと同じ
SYNCHRONIZE
SYNCHRONIZE LOCAL TABLE table (column, ...)
WITH REMOTE TABLE table (column, ...)
LATEST LOCAL STAMP :outStampLocal;
LOCAL OVER REMOTE REMOTE OVER LOCAL
LATEST REMOTE STAMP :outStamp
LOCAL STAMP :inStampLocal
SYNCHRONIZE
SYNCHRONIZE LOCAL TABLE table (column, ...)
WITH REMOTE TABLE table (column, ...)
LATEST LOCAL STAMP :outStampLocal;
LOCAL OVER REMOTE REMOTE OVER LOCAL
LATEST REMOTE STAMP :outStamp
LOCAL STAMP :inStampLocal
SYNCHRONIZE
SYNCHRONIZE LOCAL TABLE table (column, ...)
WITH REMOTE TABLE table (column, ...)
LATEST LOCAL STAMP :outStampLocal;
LOCAL OVER REMOTE REMOTE OVER LOCAL
LATEST REMOTE STAMP :outStamp
LOCAL STAMP :inStampLocal
LIMIT :inLimit
OFFSET :inOffset
WHERE :condition
SYNCHRONIZE
SYNCHRONIZE LOCAL TABLE table (column, ...)
WITH REMOTE TABLE table (column, ...)
LATEST LOCAL STAMP :outStampLocal;
LOCAL OVER REMOTE REMOTE OVER LOCAL
LATEST REMOTE STAMP :outStamp
LOCAL STAMP :inStampLocal
LIMIT :inLimit
OFFSET :inOffset
WHERE :condition
意味がないでしょう!
SYNCHRONIZE
SYNCHRONIZE LOCAL TABLE table (column, ...)
WITH REMOTE TABLE table (column, ...)
LATEST LOCAL STAMP :outStampLocal;
LOCAL OVER REMOTE REMOTE OVER LOCAL
LATEST REMOTE STAMP :outStamp
LOCAL STAMP :inStampLocal
LIMIT :inLimit
OFFSET :inOffset
WHERE :condition
SYNCHRONIZE
REPLICATE
SYNCHRONIZE
できるだけコンフリクトを起こさない!
REPLICATE
SYNCHRONIZE
できるだけコンフリクトを起こさない!
最良の運用スタイル
▶間隔をできるだけ短くすること
REPLICATE
4DSYNC
4DSYNC
4DSYNC
4DSYNC
GET!
4DSYNC
GET!
DATA
DATA
DATA
DATA
4DSYNC
GET!
DATA
DATA
DATA
DATA
4DSYNC
POST
4DSYNC
POST
DATA
DATA
DATA
DATA
4DSYNC
4DSYNC
(JavaScript) 完全に自動
4DSYNC
4DSYNC
4DSYNC
4DSYNC
4DSYNC
4DSYNC
4DSYNC
4DSYNC
複製 + Webサーバー = 4DSYNC稼働中
4DSYNC
4DSYNC
GET /4DSYNC/$catalog
4DSYNC
GET /4DSYNC/$catalog
Table_1 34
4DSYNC
GET /4DSYNC/$catalog
4DSYNC
GET /4DSYNC/$catalog/Table_1
4DSYNC
GET /4DSYNC/$catalog/Table_1
<?xml version="1.0" encoding="UTF-8"?>
<Table_1 name="Table_1" uuid="8AD069A45F4B43DAA9B3A69C0F2C8349"
leave_tag_on_delete="true" keep_record_sync_info="true" sql_schema_id="0">
<field name="Field_1" uuid="7AE0A739EC8049FB99D2708B83D53D0D"
type="10" limiting_length="255" never_null="true" id="1" />
</Table_1>
4DSYNC
GET /4DSYNC/$catalog/Table_1
<?xml version="1.0" encoding="UTF-8"?>
<Table_1 name="Table_1" uuid="8AD069A45F4B43DAA9B3A69C0F2C8349"
leave_tag_on_delete="true" keep_record_sync_info="true" sql_schema_id="0">
<field name="Field_1" uuid="7AE0A739EC8049FB99D2708B83D53D0D"
type="10" limiting_length="255" never_null="true" id="1" />
</Table_1>
4DSYNC
GET /4DSYNC/$catalog/Table_1
<?xml version="1.0" encoding="UTF-8"?>
<Table_1 name="Table_1" uuid="8AD069A45F4B43DAA9B3A69C0F2C8349"
leave_tag_on_delete="true" keep_record_sync_info="true" sql_schema_id="0">
<field name="Field_1" uuid="7AE0A739EC8049FB99D2708B83D53D0D"
type="10" limiting_length="255" never_null="true" id="1" />
</Table_1>
4DSYNC
GET /4DSYNC/$catalog/Table_1
4DSYNC
GET /4DSYNC/$catalog/Table_1/Field_1
4DSYNC
GET /4DSYNC/$catalog/Table_1/Field_1
,
4DSYNC
GET /4DSYNC/$catalog/Table_1/Field_1
,Field_2Field_3,
4DSYNC
GET /4DSYNC/$catalog/Table_1/Field_1
,Field_2Field_3, ,
4DSYNC
GET /4DSYNC/$catalog/Table_1/Field_1
,Field_2Field_3, ,,Field_3
4DSYNC
GET /4DSYNC/$catalog/Table_1/Field_1
,Field_2,Field_3,
REPLICATE column,column,column...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
4DSYNC
GET /4DSYNC/$catalog/Table_1/Field_1
,Field_2,Field_3
REPLICATE column,column,column...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
4DSYNC
GET /4DSYNC/$catalog/Table_1/Field_1
,Field_2,Field_3
REPLICATE column,column,column...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
4DSYNC
GET /4DSYNC/$catalog/Table_1/Field_1
,Field_2,Field_3
REPLICATE column,column,column...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
4DSYNC
GET /4DSYNC/$catalog/Table_1/Field_1
,Field_2,Field_3
REPLICATE column,column,column...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
4DSYNC
GET /4DSYNC/$catalog/Table_1/Field_1
,Field_2,Field_3
REPLICATE column,column,column...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
?$stamp=0&$top=3&$skip=1
4DSYNC
GET /4DSYNC/$catalog/Table_1/Field_1
,Field_2,Field_3
REPLICATE column,column,column...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
?$stamp=0&$top=3&$skip=1
4DSYNC
GET /4DSYNC/$catalog/Table_1/Field_1
,Field_2,Field_3
REPLICATE column,column,column...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
?$stamp=0&$top=3&$skip=1
4DSYNC
GET /4DSYNC/$catalog/Table_1/Field_1
,Field_2,Field_3
REPLICATE column,column,column...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
?$stamp=0&$top=3&$skip=1
&$format=json
4DSYNC
GET /4DSYNC/$catalog/Table_1/Field_1
,Field_2,Field_3
REPLICATE column,column,column...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
?$stamp=0&$top=3&$skip=1
&$format=json
4DSYNC
GET /4DSYNC/$catalog/Table_1/Field_1
,Field_2,Field_3
REPLICATE column,column,column...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
?$stamp=0&$top=3&$skip=1
&$format=json
"__LATEST_STAMP": "230",
"__ACTIONS": [{
"__ACTION": "delete",
"__PRIMARY_KEY_COUNT": 1,
"__PRIMARY_KEY": {
"Field_1": "A2D7D202E6CF486788D12DAA1A943259"
},
"__STAMP": 100,
"__TIMESTAMP": "Fri, 02 Oct 2012 04:50:19 GMT"
},
{
"__ACTION": "update",
"__PRIMARY_KEY_COUNT": 1,
"__PRIMARY_KEY": {
"Meeting_ID": "72A13E4FE0254679829028E15C4F999B"
4DSYNC
GET /4DSYNC/$catalog/Table_1/Field_1
,Field_2,Field_3
REPLICATE column,column,column...
FROM table
FOR REMOTE STAMP :inStamp
LATEST REMOTE STAMP :outStamp
INTO table (column, column, ...);
LIMIT :inLimit
OFFSET :inOffset
?$stamp=0&$top=3&$skip=1
&$format=json
4DSYNC
4DSYNC
複製 + Webサーバー = 4DSYNC稼働中
4DSYNC
複製 + Webサーバー = 4DSYNC稼働中
4DSYNC
複製 + Webサーバー = 4DSYNC稼働中
セキュリティ?
4DSYNC
4DSYNC
On Web Authentication
Case of
:($1=”/4DSYNC/@”)
Else
End case
4DSYNC
4DSYNC
同期と複製

More Related Content

Similar to Replication 2012-02-02

初めてのCPUを作ってみた
初めてのCPUを作ってみた初めてのCPUを作ってみた
初めてのCPUを作ってみたEric Sartre
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについてdekosuke
 
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!Kiwamu Okabe
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
Integral - New O/R Mapper for Common Lisp
Integral - New O/R Mapper for Common LispIntegral - New O/R Mapper for Common Lisp
Integral - New O/R Mapper for Common Lispfukamachi
 
20100717tobesetu
20100717tobesetu20100717tobesetu
20100717tobesetuakitsukada
 
恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツールtotty jp
 

Similar to Replication 2012-02-02 (10)

初めてのCPUを作ってみた
初めてのCPUを作ってみた初めてのCPUを作ってみた
初めてのCPUを作ってみた
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについて
 
Haskell超入門 Part.1
Haskell超入門 Part.1Haskell超入門 Part.1
Haskell超入門 Part.1
 
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
 
Move semantics
Move semanticsMove semantics
Move semantics
 
Swiftおさらい
SwiftおさらいSwiftおさらい
Swiftおさらい
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
Integral - New O/R Mapper for Common Lisp
Integral - New O/R Mapper for Common LispIntegral - New O/R Mapper for Common Lisp
Integral - New O/R Mapper for Common Lisp
 
20100717tobesetu
20100717tobesetu20100717tobesetu
20100717tobesetu
 
恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツール
 

More from kmiyako

Build an iOS app with Ionic and 4D
Build an iOS app with Ionic and 4DBuild an iOS app with Ionic and 4D
Build an iOS app with Ionic and 4Dkmiyako
 
4D WORLD TOUR 2017
4D WORLD TOUR 20174D WORLD TOUR 2017
4D WORLD TOUR 2017kmiyako
 
Inside Multi-Threading
Inside Multi-ThreadingInside Multi-Threading
Inside Multi-Threadingkmiyako
 
Mirroring
MirroringMirroring
Mirroringkmiyako
 
Objects Fields
Objects FieldsObjects Fields
Objects Fieldskmiyako
 
Code Optimisation
Code OptimisationCode Optimisation
Code Optimisationkmiyako
 
Auto Update
Auto UpdateAuto Update
Auto Updatekmiyako
 
Classic Query Editor
Classic Query EditorClassic Query Editor
Classic Query Editorkmiyako
 
Web area-phone-home
Web area-phone-homeWeb area-phone-home
Web area-phone-homekmiyako
 
MONET研究会 #14
MONET研究会 #14MONET研究会 #14
MONET研究会 #14kmiyako
 
初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~
初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~
初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~kmiyako
 
Journaling slides
Journaling slidesJournaling slides
Journaling slideskmiyako
 
Unicode-v11-5
Unicode-v11-5Unicode-v11-5
Unicode-v11-5kmiyako
 
Unicode-v11-0
Unicode-v11-0Unicode-v11-0
Unicode-v11-0kmiyako
 
アップグレードセミナー
アップグレードセミナーアップグレードセミナー
アップグレードセミナーkmiyako
 
4D Write Pro
4D Write Pro4D Write Pro
4D Write Prokmiyako
 

More from kmiyako (20)

Build an iOS app with Ionic and 4D
Build an iOS app with Ionic and 4DBuild an iOS app with Ionic and 4D
Build an iOS app with Ionic and 4D
 
4D WORLD TOUR 2017
4D WORLD TOUR 20174D WORLD TOUR 2017
4D WORLD TOUR 2017
 
Leaflet
LeafletLeaflet
Leaflet
 
Inside Multi-Threading
Inside Multi-ThreadingInside Multi-Threading
Inside Multi-Threading
 
4D Tags
4D Tags4D Tags
4D Tags
 
Mirroring
MirroringMirroring
Mirroring
 
Objects Fields
Objects FieldsObjects Fields
Objects Fields
 
Code Optimisation
Code OptimisationCode Optimisation
Code Optimisation
 
Auto Update
Auto UpdateAuto Update
Auto Update
 
Classic Query Editor
Classic Query EditorClassic Query Editor
Classic Query Editor
 
Web area-phone-home
Web area-phone-homeWeb area-phone-home
Web area-phone-home
 
MONET研究会 #14
MONET研究会 #14MONET研究会 #14
MONET研究会 #14
 
4d
4d4d
4d
 
初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~
初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~
初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~
 
Xslt
XsltXslt
Xslt
 
Journaling slides
Journaling slidesJournaling slides
Journaling slides
 
Unicode-v11-5
Unicode-v11-5Unicode-v11-5
Unicode-v11-5
 
Unicode-v11-0
Unicode-v11-0Unicode-v11-0
Unicode-v11-0
 
アップグレードセミナー
アップグレードセミナーアップグレードセミナー
アップグレードセミナー
 
4D Write Pro
4D Write Pro4D Write Pro
4D Write Pro
 

Replication 2012-02-02