動作検証です。
公式ドキュメントから引き続き「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インストール完了っと・・・(・´з`・)
どうです。3分クッキングのようなこの端折り方は・・・(`・ω・´)b
次は、利用するMySQLのDocker 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ですね。
説明がめんどいので興味ある人は、以下を見て頂けると…自分も詳しくはないんで…
と言う訳で、以下を実行です。(‘◇’)ゞ
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
コメント