sstable2json/json2sstable

でエクスポート/インポート.

エクスポート

sstable2jsonコマンドを使います.

# rootで実行
# あらかじめデータを全てディスクに書き込む
nodetool flush MyKeyspace -h localhost

# JSONでエクスポート
sstable2json /var/lib/cassandra/data/MyKeyspace/Scores-1-Data.db > Scores-1-Data.json

結果はこのようにバッチリ.

cat Scores-1-Data.json
{
  "Dana": { "636f75726365": {"deletedAt": -9223372036854775808, "subColumns": [["617274", "3830", 1275403790763000, false], ["6d617468", "313030", 1275403790758000, false]]}, "6772616465": {"deletedAt": -9223372036854775808, "subColumns": [["6e756c6c", "32", 1275403790752000, false]]}},
  "Dan": { "636f75726365": {"deletedAt": -9223372036854775808, "subColumns": [["617274", "3937", 1275403790746000, false], ["6d617468", "3837", 1275403790741000, false]]}, "6772616465": {"deletedAt": -9223372036854775808, "subColumns": [["6e756c6c", "31", 1275403790697000, false]]}}
}

インポート前にデータを消してみる

そのままインポートしてもつまらないので,データを一部消しちゃいます.

# CLIで接続
cassandra-cli -host localhost -port 9160

# さよなら,Dan
del MyKeyspace.Scores['Dan']
row removed.

# そして本当にいなくなった
get MyKeyspace.Scores['Dan']
Returned 0 results.

インポート

ここまできたら,インポートします.

# 念のためflushしておく
nodetool flush MyKeyspace -h localhost

# Cassandraを一度停止させる
^C

# 元のSSTableは全部消す
rm /var/lib/cassandra/data/MyKeyspace/*.db

# JSONファイルをインポート
# キースペース名とカラムファミリ名は指定必須
json2sstable -K MyKeyspace -c Scores Scores-1-Data.json /var/lib/cassandra/data/MyKeyspace/Scores-1-Data.db

# おもむろに起動
cassandra -f

おかえりDan

復旧後の確認をしてみる.

# 生き返った!
get MyKeyspace.Scores['Dan']
=> (super_column=grade,
   (column=null, value=1, timestamp=1275403790697000))
=> (super_column=cource,
   (column=art, value=97, timestamp=1275403790746000)
   (column=math, value=87, timestamp=1275403790741000))
Returned 2 results.