6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

自律型データベース(Autonomous Transaction Processing)に Golang を使って接続

Last updated at Posted at 2019-02-06

はじめに

Oracle Cloud には、バージョンアップやチューニング、障害時の回復などの自動化を備えた DBaaS が存在しています。今回は、Autonomous Transaction Processingを使用して、Golang から接続する方法を確認します。

前提作業

oci cliの導入

oci cli と jq コマンドを使用可能なこと。次のQiita記事で導入した手順を書いています
https://qiita.com/sugimount/items/63a8cfe1163030ae8804

Autonomous Transaction Processing を作成

oci cliを使用して、Autonomous Transaction Processing のインスタンスを作成します。

oci db autonomous-database create --db-name tutorial1 --cpu-core-count 1 --data-storage-size-in-tbs 1 --admin-password nsfan824u789Fjfoijoj3098j --display-name tutorial-atp1 --license-model LICENSE_INCLUDED 

Instance(Ubuntu18.04) を作成して、SQL *Plus から接続する

OCI上でUbuntu18.04 を新規作成し、Oracleが提供しているcliツールの[SQL *Plus] から Autonomous Transaction Processing へアクセスします。

Instanceの作成

まずは、Instanceを作成するために、仮想ネットワーク関連の OCID を変数に格納します

set vcn_ocid (oci network vcn list | jq -r '.data | map(select(.["display-name"] == "TutorialVCN"))[].id')
set subnet1_ocid (oci network subnet list --vcn-id $vcn_ocid | jq -r '.data | map(select(.["display-name"] == "tutorial_subnet1"))[].id')

Ubuntu 18.04のImageの OCID を変数に格納します

oci compute image list --sort-by TIMECREATED --sort-order DESC | jq -r '.data | map(select( .["operating-system"] == "Canonical Ubuntu" and .["operating-system-version"] == "18.04"))'
set ubuntu1804_ocid (echo ocid1.image.oc1.iad.aaaaaaaahh6wjs5qp2sieliieujdnih7eyxt32ets3nuiifzjjfkqnbelcra)

Instanceを作成します

oci compute instance launch \
--availability-domain AJtg:US-ASHBURN-AD-1 \
--fault-domain FAULT-DOMAIN-1 \
--shape VM.Standard2.1 \
--display-name ins_ubuntu_1 \
--hostname-label ins-ubuntu-1 \
--image-id $ubuntu1804_ocid \
--subnet-id $subnet1_ocid \
--assign-public-ip true \
--private-ip 172.16.1.2 \
--ssh-authorized-keys-file ~/.ssh/id_rsa.pub

前提パッケージの導入

作成したインスタンスにSSHでアクセスし、以下の作業を行います。
必要なパッケージを導入します。

sudo apt install gcc unzip libaio1 pkg-config -y

gcc の version を確認

> gcc --version                                                                                                                       21sgcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Instant Client (18.3) の導入

Instant Client とは、Oracle Database に接続するために使用するライブラリ・ツール・ヘッダファイルを再パッケージ化したものです。PythonやPHP、NodeJS、Go などの言語から Oracle Database にアクセスするために必要なライブラリです。

下のURLにアクセスします。
https://www.oracle.com/database/technologies/instant-client/downloads.html

導入したいマシンに応じて必要なバージョンを選択します。Ubuntu18.04 の場合は、「Instant Client for Linux x86-64」を選択します。
http://download.oracle.com/otn/linux/instantclient/183000/instantclient-basic-linux.x64-18.3.0.0.0dbru.zip

以下の3種類のファイルをダウンロードします

  • instantclient-basic-linux.x64-18.3.0.0.0dbru.zip
  • instantclient-sqlplus-linux.x64-18.3.0.0.0dbru.zip
  • instantclient-sdk-linux.x64-18.3.0.0.0dbru.zip

Ubuntu18.04にダウンロードしてきたファイルを格納します

scp instantclient-basic-linux.x64-18.3.0.0.0dbru.zip ubuntu@132.145.175.40:/home/ubuntu
scp instantclient-sqlplus-linux.x64-18.3.0.0.0dbru.zip ubuntu@132.145.175.40:/home/ubuntu
scp instantclient-sdk-linux.x64-18.3.0.0.0dbru.zip ubuntu@132.145.175.40:/home/ubuntu

/opt/oracle に格納します

sudo mkdir /opt/oracle
cd /opt/oracle
mv /home/ubuntu/instantclient-basic-linux.x64-18.3.0.0.0dbru.zip /opt/oracle
mv /home/ubuntu/instantclient-sqlplus-linux.x64-18.3.0.0.0dbru.zip /opt/oracle
mv /home/ubuntu/instantclient-sdk-linux.x64-18.3.0.0.0dbru.zip /opt/oracle

zipを解凍します。/opt/oracle/instantclient_18_3 ディレクトリに3個のzipファイルが解凍されます。

cd /opt/oracle
unzip instantclient-basic-linux.x64-18.3.0.0.0dbru.zip
unzip instantclient-sqlplus-linux.x64-18.3.0.0.0dbru.zip
unzip instantclient-sdk-linux.x64-18.3.0.0.0dbru.zip

runtime のリンクパスを構成します

sudo sh -c "echo /opt/oracle/instantclient_18_3 > /etc/ld.so.conf.d/oracle-instantclient.conf"
sudo ldconfig

sqlplus のバイナリファイルにpathを通します

export PATH=/opt/oracle/instantclient_18_3:$PATH

root ユーザの .bashrc に設定します

echo 'export PATH=/opt/oracle/instantclient_18_3:$PATH' >> /root/.bashrc

個人的に使用するubuntu ユーザ(fish)にもpathの設定をします

echo 'set PATH /opt/oracle/instantclient_18_3 $PATH' >> ~/.config/fish/config.fish

Wallet をダウンロードして格納

Autonomous Transaction Processingを外部のプログラムから接続するには、Wallet というクレデンシャルファイル(zipファイル)をダウンロードする必要があります。OCIのサービスコンソールから、作成したAutonomous Transaction Processingのページへ遷移します。
001.jpg

その後、作成したATPを選択します。

002.jpg

詳細画面で、[DB Connection]を選択します。

003.jpg

Download を押して、Wallet(zipファイル) をダウンロードします。パスワードが求められるので、ATPを作成した時に指定した admin-password を入力します。

004.jpg

ダウンロードしてきたWalletをscpしてATPに接続したいインスタンスに格納します

scp Wallet_tutorial1.zip ubuntu@132.145.175.40:/home/ubuntu

zipで導入した instant client の以下のディレクトリに Wallet ファイルを格納します

mv /home/ubuntu/Wallet_tutorial1.zip /opt/oracle/instantclient_18_3/network/admin
cd /opt/oracle/instantclient_18_3/network/admin
unzip Wallet_tutorial1.zip

下記のディレクトリ構成になっていればOKです

root@ins-ubuntu-1:~# ls -la /opt/oracle/instantclient_18_3/network/admin/
total 68
drwxr-xr-x 2 root   root    4096 Feb  6 19:42 .
drwxr-xr-x 3 root   root    4096 Jun 28  2018 ..
-rw-r--r-- 1 root   root     502 Jun 28  2018 README
-rwxr-xr-x 1 ubuntu ubuntu 19791 Feb  6 19:19 Wallet_tutorial1.zip
-rw-r--r-- 1 root   root    6661 Feb  6 19:09 cwallet.sso
-rw-r--r-- 1 root   root    6616 Feb  6 19:09 ewallet.p12
-rw-r--r-- 1 root   root    3240 Feb  6 19:09 keystore.jks
-rw-r--r-- 1 root   root      87 Feb  6 19:09 ojdbc.properties
-rw-r--r-- 1 root   root     114 Feb  6 19:09 sqlnet.ora
-rw-r--r-- 1 root   root    1741 Feb  6 19:09 tnsnames.ora
-rw-r--r-- 1 root   root    3336 Feb  6 19:09 truststore.jks

SQL *Plus から接続テスト

adminユーザと、ATPを作成した時に指定したパスワード、TNSNAMEを指定することでログインが出来ます。TNSNAMEは、Autonomous Transaction Processingのサービスコンソール上でも確認できますし、ダウンロードしてきたWalletのファイルにも記載がされています。

sqlplus admin/nsfan824u789Fjfoijoj3098j@tutorial1_low

なお、TNSNAMEは5種類生成されています。以下の特徴があり、適切に選択します。

  • (name)_tpurgent : タイムクリティカルなトランザクション処理操作用に用意されている、最も処理を優先するTNS。このTSNは並列処理をサポートします。

  • (name)_tp : トランザクション処理用の一般的なTNS。このTSNは並列処理されません。

  • (name)_high : レポートおよびバッチ操作の用途で使用する、優先順位の高いTSN。すべての操作は並行して実行され、キューイングして処理されます。

  • (name)_medium : レポートおよびバッチ操作の用途で使用する、優先度中のTSN。すべての操作は並行して実行され、キューイングして処理されます。

  • (name)_low : レポートおよびバッチ操作の用途で使用する、最も優先度の低いTSN。並列処理されません。

SQL *Plus 実行例

# sqlplus admin/nsfan824u789Fjfoijoj3098j@tutorial1_low

SQL*Plus: Release 18.0.0.0.0 - Production on Wed Feb 6 19:46:21 2019
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Last Successful login time: Wed Feb 06 2019 19:45:40 +00:00

Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0

SQL>

バージョンなど確認

SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------
L2GTCWAXYFKYO55_TUTORIAL1

SQL>
SQL> SELECT * FROM PRODUCT_COMPONENT_VERSION;

PRODUCT
--------------------------------------------------------------------------------
VERSION
--------------------------------------------------------------------------------
VERSION_FULL
--------------------------------------------------------------------------------
STATUS
--------------------------------------------------------------------------------
Oracle Database 18c Enterprise Edition
18.0.0.0.0
18.4.0.0.0
Production


SQL>

動作確認用のデータを作成

Table作成

CREATE TABLE emp 
  (
    empno VARCHAR2(10) NOT NULL,
    empname VARCHAR2(50),
    gender_f NUMBER(1,0)
  );

テストデータを挿入

INSERT INTO emp (
  empno,
  empname,
  gender_f
)
VALUES (
  '0000000001',
  'sugimount',
  1
);

INSERT INTO emp (
  empno,
  empname,
  gender_f
)
VALUES (
  '0000000002',
  'helloworld',
  0
);

INSERT INTO emp (
  empno,
  empname,
  gender_f
)
VALUES (
  '0000000003',
  'hellooracle',
  0
);

INSERT INTO emp (
  empno,
  empname,
  gender_f
)
VALUES (
  '0000000004',
  'hellowug',
  1
);

データの確認

SQL> select * from emp;

EMPNO      EMPNAME                                              GENDER_F
---------- -------------------------------------------------- ----------
0000000001 sugimount                                                   1
0000000002 helloworld                                                  0
0000000003 hellooracle                                                 0

Golang から ATPに接続

make を install

sudo apt install make -y

GolangをInstall (fish)

Golangのバイナリをダウンロードして、環境変数を設定

mkdir $HOME/go
wget -qO- "https://dl.google.com/go/go1.11.5.linux-amd64.tar.gz" | tar -zx --strip-components=1 -C $HOME/go
mkdir $HOME/go-third-party
export -x GOPATH=$HOME/go-third-party
export PATH=$PATH:$HOME/go/bin
export PATH=$PATH:$GOPATH/bin

fishの環境変数を設定 (bashを使用する場合は、適宜書き換えてください)

echo 'set -x GOPATH $HOME/go-third-party' >> ~/.config/fish/config.fish
echo 'set PATH $HOME/go/bin $PATH' >> ~/.config/fish/config.fish
echo 'set PATH $GOPATH/bin $PATH' >> ~/.config/fish/config.fish

dep の install

golang でのパッケージマネージャ的なdepをinstallします

go get -u github.com/golang/dep/cmd/dep

テスト実行用のコードをgitからclone

GitHubに動作確認したコードを載せています。これをcloneして動作確認をします。
https://github.com/Sugi275/go-oracledb-test/blob/master/src/go-oracledb-test.go

mkdir ~/go-third-party/src/github.com/Sugi275/
cd ~/go-third-party/src/github.com/Sugi275/
git clone https://github.com/Sugi275/go-oracledb-test.git

なお、以下の関数で接続先の userid と password, tnsname を指定しているので、環境に合わせて修正してください

func getDSN() string {
    return "admin/nsfan824u789Fjfoijoj3098j@tutorial1_low" // user/name@host:port/sid
}

go-oci8をinstall

oci8.pc ファイルを作成

mattnさんが作成されている、go-oci8ライブラリを使用するための準備を行います

pkgconfig用のファイルをroot権限で作成

vim /usr/lib/pkgconfig/oci8.pc
prefix=/opt/oracle/instantclient_18_3
libdir=${prefix}
includedir=${prefix}/sdk/include/

Name: oci8
Description: Oracle Instant Client
Version: 18.3
Libs: -L${libdir} -lclntsh
Cflags: -I${includedir}

環境変数 PKG_CONFIG_PATH の設定

echo 'set -x PKG_CONFIG_PATH /usr/lib/pkgconfig/' >> ~/.config/fish/config.fish

go-oci8をinstall

go get github.com/mattn/go-oci8

動作確認

以下のように実行すると、ATPに挿入したデータを取得し、正常にprintが出来ました。(すばらしー!)
これで、GolangとATP間と接続を確認することが出来ました

> cd /home/ubuntu/go-third-party/src/github.com/Sugi275/go-oracledb-test
> go run src/go-oracledb-test.go
empno:0000000004 empname:hellowug, gender:1
empno:0000000001 empname:sugimount, gender:1
empno:0000000002 empname:helloworld, gender:0
empno:0000000003 empname:hellooracle, gender:0

参考URL

go-oci8
https://github.com/mattn/go-oci8

各言語からATPへの接続方法
https://docs.oracle.com/en/cloud/paas/atp-cloud/atpug/connecting-nodejs.html#GUID-AB1E323A-65B9-47C4-840B-EC3453F3AD53

GoからOracleDB
https://blogs.oracle.com/developers/how-to-connect-a-go-program-to-oracle-database-using-goracle
https://qiita.com/kpppn/items/a65b855b6e758ed90796

Instant Client 導入手順
https://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html#ic_x64_inst

dockerからgo→oracle db
https://github.com/wendyeq/go-oracle-docker

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?