VoltDBの操作（起動・停止、ストアドプロシージャの操作やsqlcmdユーティリティの実行）

VoltDBを3台でクラスタを組んでいる環境で、コマンドラインでの起動・停止、ストアドプロシージャの操作やsqlcmdユーティリティの実行を実行してみます。


# クラスタの情報を確認

- voltadmin status

```bash
# voltadmin status
Cluster 0, version 8.2, hostcount 3, kfactor 1
 3 live hosts, 0 missing host, 0 live client, uptime 0 days 00:08:59.343
----------------------------------------------
  HostId       Host Name
       0     voltserver1
       1     voltserver2
       3     voltserver3
```


# 起動

- voltdb start

```bash
# voltdb start -D /opt/voltdb/voltdbroot -H volt1 -c 3 -B
```

-D：　VoltDBのルートディレクトリ。省略可。
-H：　接続先のクラスタのサーバ
　例ではvolt1に接続していますが、3台構成であればvolt1,volt2,volt3と書きます。1台の場合は省略可。
-c：　クラスタ中のサーバ台数。1台の場合は省略可。
-B：　バックグラウンドで実行

# サーバ停止

- voltadmin stop [サーバ名]

サーバ1からサーバ3をリモートで停止しています。最初にvoltadmin statusでHost Nameを確認し、確認したHost Nameを指定してサーバを停止しています。

```bash
# voltadmin status
Cluster 0, version 8.2, hostcount 3, kfactor 1
 3 live hosts, 0 missing host, 0 live client, uptime 0 days 00:06:33.305
----------------------------------------------
  HostId       Host Name
       0     voltserver1
       1     voltserver2
       2     voltserver3

# voltadmin stop voltserver3
INFO: Connecting to 192.168.10.121:21211 (voltserver1) to issue "stop" command
INFO: Stopping host 2: voltserver3:3021
Status: 1
Information: SUCCESS
```

クラスタ構成時のみ利用できます。K-safeの値によりクラスタ内のノードに余裕がある場合のみノードは停止されます。
ノードの停止によりクラスタがダウンする場合はノードは停止されないため、安全にノードを停止することができます。
また、ノード停止前にトランザクションの終了も待つなど安全に停止できるように、停止前に前処理が行われます。


# スナップショット取得

VoltDBはデータがメモリ上に格納されているため、クラスタを停止させるとデータが消えます。
そのため、停止前にメモリ上のデータのスナップショットとしてローカルディスクへバックアップを作成します。

voltadmin save

コマンドを実行すると「/opt/voltdb/voltdbroot/snapshots/MANUAL*」のファイルが生成されます。
voltdb startコマンドで起動すると、自動でスナップショットから復元されます。

```bash
# voltadmin save

-- Snapshot Save Results --

HOST_ID HOSTNAME    TABLE     RESULT  ERR_MSG
------- ----------- --------- ------- -------
1       voltserver2 TEST_DATA SUCCESS        
3       voltserver3           SUCCESS        
1       voltserver2           SUCCESS        
0       voltserver1 TEST_DATA SUCCESS        
1       voltserver2           SUCCESS        
0       voltserver1           SUCCESS        
1       voltserver2           SUCCESS        
0       voltserver1           SUCCESS        
1       voltserver2           SUCCESS        
0       voltserver1           SUCCESS        
0       voltserver1           SUCCESS        
3       voltserver3 TEST_DATA SUCCESS        
0       voltserver1           SUCCESS        
3       voltserver3           SUCCESS        
1       voltserver2           SUCCESS        
3       voltserver3           SUCCESS        
1       voltserver2           SUCCESS        
3       voltserver3           SUCCESS        
1       voltserver2           SUCCESS        
3       voltserver3           SUCCESS        
0       voltserver1           SUCCESS        
3       voltserver3           SUCCESS        
0       voltserver1           SUCCESS        
3       voltserver3           SUCCESS
```

# クラスタ停止

voltadmin shutdown

クラスタを停止させるとメモリ上のデータは全て消えてしまいます。
そのため、あらかじめスナップショットを取得するか、「--save」オプションをつけて停止時にスナップショットを作成します。

voltadmin shutdown --save

 --blocking：　クライアントからのトランザクション処理をブロックする。

```bash
# voltadmin shutdown
INFO: Cluster shutdown in progress.
INFO: Preparing for shutdown...
INFO: The cluster is paused prior to shutdown.
INFO: Writing out all queued export data...
INFO: Completing outstanding client transactions...
INFO:   Outstanding transactions=0, Outstanding request bytes=0, Outstanding response messages=0
INFO: Completing outstanding importer requests...
INFO: Completing outstanding exporter transactions...
INFO: The cluster shutdown process has stopped. The cluster is still in a paused state.
ERROR: Unexpected errors to collect statistics for TABLE: Connection broken.
```

"voltadmin shutdown --save"は以下とほぼ同様の動作になります。

```
$ voltadmin pause --wait
$ voltadmin save --blocking ./ mydb 
$ voltadmin shutdown
```


# クラスタを管理モードに変更

クラスタを管理モードに変更するとクライアントからのトランザクション処理を実行せず、エラーを返します。管理ポートからのトランザクション処理は実行します。

voltadmin pause

```bash
# voltadmin pause
INFO: The cluster is paused.
```

# クラスタを管理モードを終了

voltadmin resume

```bash
# voltadmin resume
INFO: The cluster has resumed.
```


# ストアドプロシージャの操作

## ストアドプロシージャをロードする

load classes [ストアドプロシージャJarファイル]

```
$ sqlcmd
1> load classes XXX.jar;
```

## ストアドプロシージャを削除する

DROP PROCEDURE [ストアドプロシージャ名]

```
$ sqlcmd
1> DROP PROCEDURE XXXX;
```

## ストアドプロシージャを表示する

show classes

```
$ sqlcmd
show classes;
--- Active Procedure Classes ---------------------------------
 test.GetData              
 test.InsertData           

```


## ストアドプロシージャを実行する

exec GetData [ストアドプロシージャ名] [プロシージャの引数]...

```
$ sqlcmd
1> exec GetData aaa;
DATA 
-----
    2        

```


## ストアドプロシージャ一覧を表示する

list procedures

```
$ sqlcmd
1> list procedures;
～省略～
--- User Procedures ------------------------------------------
GetData                         varchar
InsertData                      varchar, integer
～省略～

```

## ストアドプロシージャの実行計画を表示する

explainproc [ストアドプロシージャ名]

```
# echo "explainproc TEST_DATA.insert" | sqlcmd

explainproc TEST_DATA.insert;
STATEMENT_NAME  SQL_STATEMENT                   EXECUTION_PLAN                 
--------------- ------------------------------- -------------------------------
sql0            INSERT INTO TEST_DATA VALUES (?, ?); INSERT into "TEST_DATA"
 MATERIALIZE TUPLE from parameters and/or literals
```

# スキーマをロードする

DDLをスキーマファイル（例ではmyschema.sql）に書いて、以下のコマンドを実行する。

```
$ sqlcmd < myschema.sql
```

もしくは以下でも同じ結果になる。

```
$ sqlcmd
1> file myschema.sql;
```

スキーマファイルは以下のようにDDLを記載する。

サポートしているDDLは、[Appendix A. Supported SQL DDL Statements](https://docs.voltdb.com/UsingVoltDB/AppxDDL.php)を参照。

```
CREATE TABLE Customer (
  CustomerID INTEGER UNIQUE NOT NULL,
  FirstName VARCHAR(15),
  LastName VARCHAR (15),
  PRIMARY KEY(CustomerID)
);
```

# sqlcmdユーティリティ

sqlcmdは以下の2つの実行方法がある。

```
$ sqlcmd
1> list tables;
もしくは
$ echo "list tables" | sqlcmd
```


## テーブル一覧を表示する

list tables

```
$ sqlcmd
1> list tables;
--- User Tables ----------------------------------------------
KEISOKU_DATA
TEST_DATA
```

もしくは

```
$ echo "list tables" | sqlcmd
```

## テーブルの定義を表示する

describe [テーブル名]

```
# echo "describe test_data" | sqlcmd
COLUMN    |DATATYPE        |SIZE       |NULLABLE |REMARKS         
------------------------------------------------------------------
NAME      |VARCHAR         |         50|NOT NULL |PARTITION_COLUMN
DATA      |SMALLINT        |          2|         |                
------------------------------------------------------------------
Type: TABLE, Primary Key (NAME)
```

## CPU負荷等の各種情報を表示する。

CPU負荷等の各種情報を表示する。

表示できる情報は以下を参照。
https://docs.voltdb.com/UsingVoltDB/sysprocstatistics.php

例）CPU負荷の場合

```
# echo "exec @Statistics CPU 0" | sqlcmd

exec @Statistics CPU 0;
TIMESTAMP      HOST_ID  HOSTNAME     PERCENT_USED 
-------------- -------- ------------ -------------
 1538900630738        1 voltserver3              8
 1538900630739        0 voltserver1             10
 1538900630739        3 voltserver2              7
```

CPU負荷以外の代表的な情報の表示

```
# echo "exec @Statistics LATENCY 0" | sqlcmd

exec @Statistics LATENCY 0;
TIMESTAMP      HOST_ID  HOSTNAME     INTERVAL  COUNT  TPS  P50  P95  P99  P99.9  P99.99  P99.999  MAX 
-------------- -------- ------------ --------- ------ ---- ---- ---- ---- ------ ------- -------- ----
 1538900704543        1 voltserver3       5000      0    0    0    0    0      0       0        0    0
 1538900704509        0 voltserver1       5000      0    0    0    0    0      0       0        0    0
 1538900704457        3 voltserver2       5000      0    0    0    0    0      0       0        0    0


# echo "exec @Statistics liveclients 0" | sqlcmd

exec @Statistics liveclients 0;
TIMESTAMP      HOST_ID  HOSTNAME     CONNECTION_ID  CLIENT_HOSTNAME  ADMIN  OUTSTANDING_REQUEST_BYTES  OUTSTANDING_RESPONSE_MESSAGES  OUTSTANDING_TRANSACTIONS 
-------------- -------- ------------ -------------- ---------------- ------ -------------------------- ------------------------------ -------------------------
 1538900743656        1 voltserver3              13 voltserver3           0                          0                              0                         0
 1538900743657        3 voltserver2               3 voltserver2           0                          0                              0                         0

# echo "exec @Statistics MEMORY 0" | sqlcmd

exec @Statistics MEMORY 0;
TIMESTAMP      HOST_ID  HOSTNAME     RSS     JAVAUSED  JAVAUNUSED  TUPLEDATA  TUPLEALLOCATED  INDEXMEMORY  STRINGMEMORY  TUPLECOUNT  POOLEDMEMORY  PHYSICALMEMORY  JAVAMAXHEAP 
-------------- -------- ------------ ------- --------- ----------- ---------- --------------- ------------ ------------- ----------- ------------- --------------- ------------
 1538900787190        1 voltserver3   439160     85051       21736          0           32768         1404             0           3        106874         2915328      2088640
 1538900787190        3 voltserver2   438820     83183       20216          0           32768          936             0           2        103802         2915328      2088640
 1538900787190        0 voltserver1   517712    108413       46366          0           32768         1404             0           3        106874         2915328      3137216

# echo "exec @Statistics PARTITIONCOUNT 0" | sqlcmd

exec @Statistics PARTITIONCOUNT 0;
TIMESTAMP      HOST_ID  HOSTNAME     PARTITION_COUNT 
-------------- -------- ------------ ----------------
 1538900817392        1 voltserver3                12

# echo "exec @Statistics TABLE 0" | sqlcmd

exec @Statistics TABLE 0;
TIMESTAMP      HOST_ID  HOSTNAME     SITE_ID  PARTITION_ID  TABLE_NAME        TABLE_TYPE       TUPLE_COUNT  TUPLE_ALLOCATED_MEMORY  TUPLE_DATA_MEMORY  STRING_DATA_MEMORY  TUPLE_LIMIT  PERCENT_FULL 
-------------- -------- ------------ -------- ------------- ----------------- ---------------- ------------ ----------------------- ------------------ ------------------- ------------ -------------
 1538900871653        1 voltserver3         1             1 KEISOKU_DATA      PersistentTable             0                    2048                  0                   0         NULL             0
 1538900871653        1 voltserver3         1             1 TEST_DATA         PersistentTable             1                    2048                  0                   0         NULL             0
～省略～

# echo "exec @Statistics SNAPSHOTSTATUS 0" | sqlcmd

exec @Statistics SNAPSHOTSTATUS 0;
TIMESTAMP      HOST_ID  HOSTNAME     TABLE         PATH                            FILENAME                        NONCE                TXNID             START_TIME     END_TIME       SIZE  DURATION  THROUGHPUT             RESULT   TYPE 
-------------- -------- ------------ ------------- ------------------------------- ------------------------------- -------------------- ----------------- -------------- -------------- ----- --------- ---------------------- -------- -----
 1538900933740        1 voltserver3  KEISOKU_DATA  /opt/voltdb-community-8.2/voltdbroot/snapshots MANUAL1538900930633-KEISOKU_DATA-host_1.vpt MANUAL1538900930633   3619631923298303  1538900930697  1538900931151   809         0  0.0032895462103352145 SUCCESS  AUTO 
 1538900933740        1 voltserver3  TEST_DATA     /opt/voltdb-community-8.2/voltdbroot/snapshots MANUAL1538900930633-TEST_DATA-host_1.vpt MANUAL1538900930633   3619631923298303  1538900930697  1538900931151   757         0  0.0032895462103352145 SUCCESS  AUTO 
 1538900933742        0 voltserver1  KEISOKU_DATA  /opt/voltdb-community-8.2/voltdbroot/snapshots MANUAL1538900930633-KEISOKU_DATA-host_0.vpt MANUAL1538900930633   3619631923298303  1538900930691  1538900930984   811         0   0.005110132002586391 SUCCESS  AUTO 
 1538900933742        0 voltserver1  TEST_DATA     /opt/voltdb-community-8.2/voltdbroot/snapshots MANUAL1538900930633-TEST_DATA-host_0.vpt MANUAL1538900930633   3619631923298303  1538900930691  1538900930984   759         0   0.005110132002586391 SUCCESS  AUTO 
 1538900933742        3 voltserver2  KEISOKU_DATA  /opt/voltdb-community-8.2/voltdbroot/snapshots MANUAL1538900930633-KEISOKU_DATA-host_3.vpt MANUAL1538900930633   3619631923298303  1538900930700  1538900931119   811         0  0.0035438446554762085 SUCCESS  AUTO 
 1538900933742        3 voltserver2  TEST_DATA     /opt/voltdb-community-8.2/voltdbroot/snapshots MANUAL1538900930633-TEST_DATA-host_3.vpt MANUAL1538900930633   3619631923298303  1538900930700  1538900931119   746         0  0.0035438446554762085 SUCCESS  AUTO 
```

# snapshotの情報取得

- voltadmin show snapshots

最大10個の取得済みのsnapshotの情報を表示します。saveコマンドで取得したsnapshotが成功したかどうかを確認することができます。

```
# voltadmin show snapshots

-- Snapshot Status --

TIMESTAMP     HOST_ID HOSTNAME    TABLE        PATH FILENAME                                       NONCE                  TXNID            START_TIME    END_TIME      SIZE DURATION THROUGHPUT       RESULT  TYPE  
------------- ------- ----------- ------------ ---- ---------------------------------------------- ---------------------- ---------------- ------------- ------------- ---- -------- ---------------- ------- ------
1561182384387 0       voltserver1 KEISOKU_DATA      Rejoin_3_1561171876679-KEISOKU_DATA-host_0.vpt Rejoin_3_1561171876679 3619631923232767 1561171876855 1561171877246 0    0        0.00431470553893 SUCCESS MANUAL
1561182384387 0       voltserver1 TEST_DATA         Rejoin_3_1561171876679-TEST_DATA-host_0.vpt    Rejoin_3_1561171876679 3619631923232767 1561171876855 1561171877246 1769 0        0.00431470553893 SUCCESS MANUAL
1561182384388 1       voltserver2 KEISOKU_DATA      Rejoin_3_1561171876679-KEISOKU_DATA-host_1.vpt Rejoin_3_1561171876679 3619631923232767 1561171876843 1561171877275 0    0        0.00390520802251 SUCCESS MANUAL
1561182384388 1       voltserver2 TEST_DATA         Rejoin_3_1561171876679-TEST_DATA-host_1.vpt    Rejoin_3_1561171876679 3619631923232767 1561171876843 1561171877275 1769 0        0.00390520802251 SUCCESS MANUAL
```


# DBの各種情報を表示する

@SystemInformationの後にoverviewかdeploymentを指定する。

```
# echo "exec @SystemInformation overview" | sqlcmd

exec @SystemInformation overview;
HOST_ID  KEY                       VALUE                          
-------- ------------------------- -------------------------------
       0 IPADDRESS                 192.168.10.121                 
       0 HOSTNAME                  voltserver1                    
       0 CLIENTINTERFACE                                          
       0 CLIENTPORT                21212                          
       0 ADMININTERFACE                                           
       0 ADMINPORT                 21211                          
       0 HTTPINTERFACE                                            
       0 HTTPPORT                  8080                           
       0 INTERNALINTERFACE                                        
       0 INTERNALPORT              3021                           
       0 ZKINTERFACE               127.0.0.1                      
       0 ZKPORT                    7181                           
       0 DRINTERFACE                                              
       0 DRPORT                    0                              
       0 PUBLICINTERFACE                                          
       0 BUILDSTRING               8.2_voltdb-8.2-0-g6115baf-local
       0 VERSION                   8.2                            
       0 CATALOG                   /opt/voltdb/voltdbroot/config/staged-catalog.jar
       0 DEPLOYMENT                /opt/voltdb/voltdbroot/config/deployment.xml
       0 CLUSTERSTATE              RUNNING                        
       0 INITIALIZED               true                           
       0 REPLICATIONROLE           NONE                           
       0 CATALOGCRC                3685888977  
～省略～                   
```

```
# echo "exec @SystemInformation deployment" | sqlcmd

exec @SystemInformation deployment;
PROPERTY            VALUE                          
------------------- -------------------------------
voltdbroot          /opt/voltdb-community-8.2/voltdbroot
hostcount           3                              
kfactor             1                              
sitesperhost        8                              
httpport            8080                           
httpenabled         true                           
jsonenabled         true                           
snapshotenabled     false                          
export              false                          
partitiondetection  true                           
heartbeattimeout    90                             
adminport           21211                          
commandlogenabled   false                          
users                                              
elasticduration     50                             
elasticthroughput   2                              
snapshotpriority    6                              
temptablesmaxsize   100                            
querytimeout        10000                          

(Returned 19 rows in 0.03s)
```

# 参考


- [Appendix A. Supported SQL DDL Statements](https://docs.voltdb.com/UsingVoltDB/AppxDDL.php)を参照。
- [sqlcmd](https://docs.voltdb.com/UsingVoltDB/clisqlcmd.php)
- [voltadmin](https://docs.voltdb.com/UsingVoltDB/clivoltadmin.php)
- [voltdb](https://docs.voltdb.com/UsingVoltDB/clivoltdb.php)
- [Appendix G. System Procedures](https://docs.voltdb.com/UsingVoltDB/AppSysProc.php)