xDevAPI動かしてみよう編

xDevAPI

動作検証です。

公式ドキュメントから引き続き「4.3 Installing Connector/C++ from Source」からですが、

Verifying Connector/C++ Functionality

コネクタ/C++ 機能の検証

の部分ですね。

To verify connector functionality, build and run one or more of the test programs included in the testapp directory of the source distribution. Create a directory to use and change location into it. Then issue the following commands:

ここで説明されているのは、インストール編でZIPまたは、GITから取得したソースディレクトリに「testapp」というサンプルプログラムが含まれており、それをビルド実行することで、動作確認ができますよ。といった内容になります。
(/・ω・)/「testapp」については、インストール編でディレクトリ構成を記載しているので思いだし頂けると…
念のため、git clone直後のmysql-connector-cppディレクトリの内容を以下に張り付けておきます。

-rw-r--r--  1 root root  15041  1月  3 11:51 CMakeLists.txt
-rw-r--r--  1 root root    129  1月  3 11:51 INFO_SRC.in
-rw-r--r--  1 root root    366  1月  3 11:51 INFO_BIN.in
-rw-r--r--  1 root root   1834  1月  3 11:51 CONTRIBUTING.md
-rw-r--r--  1 root root   5604  1月  3 11:51 buildinfo.cmake
-rw-r--r--  1 root root   1345  1月  3 11:51 README.txt
-rw-r--r--  1 root root   4127  1月  3 11:51 README.md
-rw-r--r--  1 root root 145547  1月  3 11:51 LICENSE.txt
drwxr-xr-x  3 root root     60  1月  3 11:51 cmake
drwxr-xr-x 11 root root   4096  1月  3 11:51 cdk
-rw-r--r--  1 root root     55  1月  3 11:51 coverage.ignore
drwxr-xr-x  3 root root   4096  1月  3 11:51 common
drwxr-xr-x  3 root root    117  1月  3 11:51 devapi
drwxr-xr-x  4 root root     52  1月  3 11:51 include
drwxr-xr-x  2 root root   4096  1月  3 11:51 doc
-rw-r--r--  1 root root  11545  1月  3 11:51 jdbc.cmake
-rw-r--r--  1 root root   6692  1月  3 11:51 install_layout.cmake
drwxr-xr-x 11 root root   4096  1月  3 11:51 jdbc
drwxr-xr-x  2 root root     85  1月  3 11:51 testapp★
drwxr-xr-x  4 root root   4096  1月  3 11:51 packaging
-rw-r--r--  1 root root   1725  1月  3 11:51 try_jdbc.cc
-rw-r--r--  1 root root   1817  1月  3 11:51 try.cc
drwxr-xr-x  3 root root   4096  1月  3 11:51 testing
-rw-r--r--  1 root root   3217  1月  3 11:51 version.cmake
drwxr-xr-x  3 root root   4096  1月  3 11:51 xapi

★印のところが「testapp」ですね。マンマですけど・・・
サンプルプログラムの実行のために、また、自分の好きな名前でディレクトリを作って、そのディレクトリに移動して公式マニュアル記載のコマンド実行。という手順です。
以下、公式マニュアル記載のコマンドです。

01:cmake [other_options] -DWITH_CONCPP=concpp_install concpp_source/testapp
02:cmake --build . --config=build_type

パッと見、必要なコマンド2つ。
01は、環境のカスタマイズのコマンド、02のコマンドはビルド実行になります。
01のコマンドは自分の環境に合わせて、「concpp_install」と「concpp_source」は置換が必要です。
build_type」はインストール編で説明した通りです。省略するとDebugになります。

例として/tmp/sutekinadirを作ってコマンドを実行する手順を以下に記載します。
インストールの時に、ZIPまたはGITから取得したソースディレクトリは
concpp_source」->「/tmp/mysql-connector-cpp」とし
conector c++がインストールされたディレクトリは、
concpp_install」->「/usr/local/mysql/connector-c++-8.2.0」
であるとします。
build_typeは指定しない感じで・・・

01:> mkdir -p /tmp/sutekinadir
02:> cd /tmp/sutekinadir
03:> cmake -DWITH_CONCPP=/usr/local/mysql/connector-c++-8.2.0 /tmp/mysql-connector-cpp/testapp
04:> cmake --build .

・・・と勢いでここまで説明しましたが、私の場合また、エラー・・・が今度はCのコンパイラが古くてインストールが失敗。
(・´з`・)C++なのにCコンパイラ使うんかいっ!
って思いましたけど・・・使っているんですね。
03の手順の最終的なコマンドラインは以下になりました。同じ悩みを抱えている人は参考にして下さい。

cmake3 -DBUILD_STATIC=ON -DCMAKE_CXX_STANDARD=17 \
       -DCMAKE_CXX_COMPILER=/opt/rh/devtoolset-11/root/usr/bin/g++ \
       -DCMAKE_C_COMPILER=/opt/rh/devtoolset-11/root/usr/bin/gcc \
       -DWITH_CONCPP=/usr/local/mysql/connector-c++-8.2.0 \
       /root/work/GIT/mysql-connector-cpp/testapp

これを実行すると、インストール先ディレクトリは以下のようになるはずです。

-rw-r--r-- 1 root root 16825  1月  5 22:53 CMakeCache.txt
-rw-r--r-- 1 root root  1523  1月  5 22:53 cmake_install.cmake
-rw-r--r-- 1 root root  6559  1月  5 22:53 Makefile
drwxr-xr-x 3 root root    52  1月  5 22:54 run
drwxr-xr-x 6 root root  4096  1月  5 22:54 CMakeFiles

(‘ω’)ノよっし、じゃ動かすか!って思いますが!残念ながら・・・その前にやることがあります。

DBがない!

検証するために、アクセス先のDBが必要やん!
ってことですね!
そういえばまだないし、mysqlのサーバーを準備するのは面倒ですよって・・・私は思いました。
(´・ω・)では、どうしましょう?
ってことなんですが、ここでDockerさんを使おうと思います。
でも今回の記事では、Dockerとかは扱う部分ではないので、長くなっちゃうし、この部分は簡単な説明に抑えておきます。
また、Dockerの準備をする前に、サンプルプログラムを実行するにあたりDBに必要な前提条件が公式ドキュメントに記載してあります。
簡単に書くと、
・rootユーザーでログイン。ログインパスワードはなしであるDBが必要。
・接続は、13009ポートを使います。(ディフォルトは33060)
とのこと。このあたりをカスタマイズしつつ、準備する必要がありますね。

Docker

Dockerを良く知らない人向けに、まずはDockerの紹介です。
Dockerは自分の使っているPCの中で別のサーバーを起動する感じですね。
仮想マシンっていうものですかね。
この仮想マシンの元ネタみたいのを色々な人が作って公開しているので、それを使って簡単に目的のサーバーが「手に入るよっ!」っていうものです。
この元ネタをDockerの世界ではDockerイメージって言います。
でDockerイメージをもとに、起動するサーバーをDockerコンテナって呼んでます。
この辺は単なる言葉遊び・・・習うより慣れろ!って感じです。
今回はMySQLサーバーのDockerイメージを元に、MySQLサーバーのDockerコンテナを作りましょう~ってお話になります。

まずはさておき・・・Dockerインストールから始めないとですね。
・・・と・・・ここは公式ページリンクをペタッと張り付けておきます。
しかもCentOS用のページですね。ググってくれれば色々出てくるので、調べて頂けると~(・´з`・)

Docker Engine インストール(CentOS 向け)

さて・・・Dockerインストール完了っと・・・(・´з`・)
どうです。3分クッキングのようなこの端折り方は・・・(`・ω・´)b
次は、利用するMySQLのDocker Imageのページのリンクですね。

mysql Docker Official Image

公式イメージみたいなので、安心して使えるかなと・・・
使い方も書いてあるので、読んでもらえると良いかと思います。
ふーこれでMySQLサーバーもOKっと・・・(`・ω・´)b
あとは、この辺のことを紹介しているサイトのリンクもペタペタ貼っちゃいます。
この辺は他力本願ってやつですね。

・Docker + MySQLで開発環境用DBの作成
こちらでは、DockerでDB環境を作るというまさに今回のテーマにあったサイトです。

・【入門】DockerでMySQL環境を構築する方法とデータの永続化手順まとめ
こちらは、Dockerはコンテナを停止してしまうとDBに蓄積されたデータも消えてしまいます。
そんなのは嫌や!っていう人は参考頂けると良いかと思います。

でっ・・・っと、
皆さんDocker Comporseを使うパターンが多いですね・・・
でも私はComporseいる?って思ったので使いませんでした。
MySQLのDocker Imageのページでもコマンド投入だけでできちゃうぜ!みたいな感じで書いてありますが、コマンドだけだとさすがにちょっと・・・って思ったので、Dockerfileは作りました。
Dockerfileとは?(・´з`・)なんぞ?
Dockerfileは事前に設定とかを書いておいてそれをもとにサーバー作ってね!って使うものですね。

では、ネタもそろってきたので、実際のDockerfileの内容と手順を説明しながら、MySQLサーバーを立ち上げてみましょ~

Dockerfile~

ここはドラえもん風に「どっかーふぁいる~♪」って読んでもらえるとうれしいっ!!(/ω\)
で、それが以下です。
この先は説明は、結果だけ知りたいって人はすっ飛ばして、以下のコードをDockerfileってファイル作って張り付け、あと少し下に書いてあるmy.cnfファイルも作って内容張り付けておいて次の「DB起動」までジャンプしましょ~(/・ω・)/せい!

FROM mysql:8.0.35

ENV MYSQL_DATABASE test_nopass_db
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
ENV TZ Asia/Tokyo

EXPOSE 3306 13009

ADD ./my.cnf /etc/mysql/conf.d/my.cnf

CMD ["mysqld"]

そんなに長くないし、難しくもないですが、少し説明を…
大体MySQL公式HPに書いてあるので・・・自分で調べたいなど、思う方がおられたら参考に・・・

MYSQL_DATABASE
This variable is optional and allows you to specify the name of a database to be created on image startup. If a user/password was supplied (see below) then that user will be granted superuser access (corresponding to GRANT ALL) to this database.

MYSQL_ALLOW_EMPTY_PASSWORD
This is an optional variable. Set to a non-empty value, like yes, to allow the container to be started with a blank password for the root user. NOTE: Setting this variable to yes is not recommended unless you really know what you are doing, since this will leave your MySQL instance completely unprotected, allowing anyone to gain complete superuser access.

以下はMySQLの指定
MYSQL_DATABASEはディフォルトのデータベースの指定。
MYSQL_ALLOW_EMPTY_PASSWORDはパスワード不要の指定です。

以下はDockerコンテナの指定
EXPOSE 3306 13009
Dockerコンテナのポート3306、13009が開くという指定です。
ADD ./my.cnf /etc/mysql/conf.d/my.cnf
これはのポート指定を変更するために必要なもので以下の内容です。
xDevAPIのディフォルトは33060なので、13009に変更するために必要です。
my.cnfの内容は以下です。このファイルをDockerfileと同じディレクトリに格納して下さい。

[mysqld]
mysqlx_port=13009

システムイメージは以下になります。

DB起動

Dockerfileからのコンテナのビルド~起動までの手順です。
起動前に起動ディレクトリの構成確認です。
以下のように同じディレクトリにDockerfileとmy.cnfができているか確認してくださいね。

任意のディレクトリ
├ Dockerfile
└ my.cnf

ではビルド、これでいったんDockerに必要なイメージとかを持ってきて、Dockerイメージというシステムの元となる物を作ります。

sudo docker build ./ -t testmysqlnopass:0.0

赤字の部分は好きな名前にしてくれてよいです。
このコマンド実行すると、以下に感じでログが出てイメージを作りますね。
一度実施してしまったので、ダウンロードの部分でてませんが、初めてだとレジストリからダウンロードするログが出るかと・・・(‘ω’)ノ

# sudo docker build ./ -t testmysqlnopass:0.0
DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
            Install the buildx component to build images with BuildKit:
            https://docs.docker.com/go/buildx/

Sending build context to Docker daemon  4.096kB
Step 1/7 : FROM mysql:8.0.35
 ---> ba048db12589
Step 2/7 : ENV MYSQL_DATABASE test_nopass_db
 ---> Using cache
 ---> f95c3c5d736b
Step 3/7 : ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
 ---> Using cache
 ---> 0b0288648a82
Step 4/7 : ENV TZ Asia/Tokyo
 ---> Using cache
 ---> f0cca99f0ff5
Step 5/7 : EXPOSE 3306 13009
 ---> Using cache
 ---> 63eff7b0456b
Step 6/7 : ADD ./my.cnf /etc/mysql/conf.d/my.cnf
 ---> Using cache
 ---> 6a319bc2a135
Step 7/7 : CMD ["mysqld"]
 ---> Using cache
 ---> 9c8293d9cdad
Successfully built 9c8293d9cdad
Successfully tagged testmysqlnopass:0.0

以下のコマンドでできたかどうかを確認します・・・

[root@localhost nopass]# sudo docker image ls
REPOSITORY        TAG        IMAGE ID       CREATED         SIZE
testmysqlnopass   0.0        9c8293d9cdad   3 months ago    591MB

これでDockerコンテナの元のDockerイメージができました。
ここから、Dockerコンテナを起動します。
以下のコマンドを実行します。

sudo docker run -it -d --privileged --rm --name testmysqlnopass testmysqlnopass:0.0

以下のコマンド実行すると以下のようなリプライがでます。
ちなみに、「–privileged」パラメータはスーパー権限を与えるもので、「あまり使うんじゃねーよ」みたいなことが書いてあることありますけど…使っちゃいますよ!

# sudo docker run -it -d --privileged --rm --name testmysqlnopass testmysqlnopass:0.0
b2341e7e8f9d26d0daa4c4f4e264da6da12e97679bbb7b2e6dfcc429f4c417d5

以下のコマンドでDockerコンテナの起動を確認します。

# sudo docker ps
CONTAINER ID   IMAGE                 COMMAND                   CREATED         STATUS         PORTS                            NAMES
b2341e7e8f9d   testmysqlnopass:0.0   "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   3306/tcp, 13009/tcp, 33060/tcp   testmysqlnopass

これでMySQLサーバーが起動完了です。
簡単でしょ~ヽ(^。^)ノパチパチ
Dokcerサーバーへのログインの仕方もちょっと書いて起きます。
まずはコンテナにログインします。
コンテナへのログインは、以下のコマンド

sudo docker exec -it testmysqlnopass /bin/bash

でOK!
ログインできると以下のようなプロンプトでます。

bash-4.4#

でここでmysqlへログイン

bash-4.4# mysql

でログインできるはず!以下のようなリプライ出たら成功です。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.35 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

何か実感わかない人は以下のコマンドでデータベーススキーマとかを確認してみましょう。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| test_nopass_db     |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

テストプログラムの起動

話が脱線しすぎたので、ここで改めて動作確認用のサンプルプログラムのディレクトリ構成を再掲します。

-rw-r--r-- 1 root root 16825  1月  5 22:53 CMakeCache.txt
-rw-r--r-- 1 root root  1523  1月  5 22:53 cmake_install.cmake
-rw-r--r-- 1 root root  6559  1月  5 22:53 Makefile
drwxr-xr-x 3 root root    52  1月  5 22:54 run
drwxr-xr-x 6 root root  4096  1月  5 22:54 CMakeFiles

run」ってディレクトリがありますね。ここにサンプルプログラム以下が入っています。

drwxr-xr-x 2 root root        6  1月  5 22:53 debug
-rwxr-xr-x 1 root root 31404160  1月  5 22:54 xapi_test
-rwxr-xr-x 1 root root 31306872  1月  5 22:54 devapi_test

xapi_testはC言語、devapi_testがC++だったと思います。今回ターゲットはdevapi_testの方です。
テストアプリの起動時の注意点!
Dockerコンテナで起動しているので公式ドキュメントとは接続先が違います。
まずは公式ドキュメントの内容です。

run/devapi_test mysqlx://root@127.0.0.1:13009
run/xapi_test mysqlx://root@127.0.0.1:13009

上記の127.0.0.1通称localhostの指定を変えないとだめですね。
でどこなんだよって話ですよ…
これはsudo docker network inspect bridgeで確認できるところ…
リプライが長いので省略しますけど…

# sudo docker network inspect bridge
[
    {
        "Name": "bridge",★ここは違うので以下省略…
        "Id": "c7454dbe86caf5f2e1c1b014e61bd75fa36938f0ade2c7aa8409a7745c8b1a82",
…省略…
        "ConfigOnly": false,
        "Containers": {★ここ注目
            "b2341e7e8f9d26d0daa4c4f4e264da6da12e97679bbb7b2e6dfcc429f4c417d5": {
                "Name": "testmysqlnopass",★この子が対象
                "EndpointID": "de2b7e45f12f2c1ecd4a18991bc022c82af80cb078cc15c49316ac6c2360fc1e",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",★これです!
                "IPv6Address": ""
            }
        },
…省略…
    }
]

詳しくは説明しませんが…172.17.0.2ですね。
説明がめんどいので興味ある人は、以下を見て頂けると…自分も詳しくはないんで…

Docker コンテナ・ネットワークの理解

と言う訳で、以下を実行です。(‘◇’)ゞ

run/devapi_test mysqlx://root@172.17.0.2:13009

実行結果が以下の感じなればOKです。ヽ(^。^)ノパチパチ

# run/devapi_test mysqlx://root@172.17.0.2:13009
Creating session on mysqlx://root@172.17.0.2:13009 ...
Session accepted, creating collection...
Inserting documents...
- added doc with id: 00006623b4670000000000000001
- added doc with id: 00006623b4670000000000000001
- added doc with id: 00006623b4670000000000000001
- added doc
Fetching documents...
doc#0: {"_id": "00006623b4670000000000000002", "age": 2, "name": "bar", "toys": ["car", "ball"]}
 field `_id`: 00006623b4670000000000000002
 field `age`: 2
 field `name`: bar
 field `toys`: ["car", "ball"]
 name: bar
- toys:
  car
  ball

doc#1: {"_id": "00006623b4670000000000000003", "age": 3, "date": {"day": 20, "month": "Apr"}, "name": "baz"}
 field `_id`: 00006623b4670000000000000003
 field `age`: 3
 field `date`: {"day": 20, "month": "Apr"}
 field `name`: baz
 name: baz
- date field
  date `day`: 20
  date `month`: Apr
  month: Apr
  day: 20

Done!

長かった・・・がこれで終わりです・・・
次章はついに「THEコーディング編」になります。(‘◇’)ゞ

Dockerコンテナを止める

これを書くの忘れてたので…追記。
止め方は以下です。

# sudo docker stop testmysqlnopass

コメント

タイトルとURLをコピーしました