[AWS] MariaDBからSQL ServerにCONNECTエンジンでDBリンクを張る方法

前回の記事ではMariaDBから同一ネットワーク上にあるOracleにCONNECTストレージエンジンを使って接続してみた。

今回はその続きで、MariaDBからSQL Serverにリンクしてみた。

 

参考記事

今回はこちらの記事を参考にした。

【MySQL】MariaDB使用connect引擎直接访问SQLServer数据库 - abce - 博客园

使用するODBC Driver for SQL Serverのバージョンが違うことを除けば、ほぼこの手順のとおりで完了する。

その他の細かい設定などは前の記事で実施済みなので割愛する。

 

 

SQL ServerのODBCドライバーをインストール

ODBCドライバーのインストール方法はこちら。

Microsoft ODBC Driver forSQL Serverをインストールする (Linux) - ODBC Driver for SQL Server | Microsoft Learn

#RHEL 9
curl https://packages.microsoft.com/config/rhel/9/prod.repo | sudo tee /etc/yum.repos.d/mssql-release.repo

sudo yum remove unixODBC-utf16 unixODBC-utf16-devel #to avoid conflicts
sudo ACCEPT_EULA=Y yum install -y msodbcsql18
# optional: for bcp and sqlcmd
sudo ACCEPT_EULA=Y yum install -y mssql-tools18
echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc
source ~/.bashrc
# optional: for unixODBC development headers
sudo yum install -y unixODBC-devel

unixODBCのインストールは前回の記事で実施済みなのでパス。実質初めの一行と、msodbcsql18、mssql-tools18のインストールだけ。

 

/etc/odbcinst.ini にODBC設定を書き込む

前回の記事ではファイルを直接編集したが、今回は参考記事のやり方で試してみる。

# sudo odbcinst -q -d -n "ODBC Driver 18 for SQL Server"
[ODBC Driver 18 for SQL Server]
Description=Microsoft ODBC Driver 18 for SQL Server
Driver=/opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.3.so.3.1
UsageCount=1

このコマンドを叩くだけで /etc/ddbcinst.iniに書き込まれるらしい。便利。

 

ドライバーの接続テスト

# sudo /opt/mssql-tools18/bin/sqlcmd -S xxx.xxx.xxx.xxx -U user -P pass -d TestDB -Q 'select "Hello World"' -C
-----------
Hello World
(1 rows affected)

SQL ServerのODBCで無事接続できた。SQL ServerがTrusted_Connection=yesを必要とする場合は -C オプションを忘れずに。

 

/etc/odbc.ini にDNS設定を書き込む

こちらも前回の記事ではファイルを直接編集したが、今回は参考記事のやり方で試してみる。

# sudo vim /etc/MariaDB_odbc_data_source_for_MSSQL_template.ini

下記内容でテンプレートファイルを新規作成する。

[SQLServerDSN]
Driver=ODBC Driver 18 for SQL Server
Server=xxx.xxx.xxx.xxx
Port=1433
UID=user
PWD=pass
Database=TestDB
TrustServerCertificate=yes
Trace=Yes
TraceFile=/var/log/odbc_MSSQL.log

下記コマンドでテンプレートファイルの内容をodbc.iniに書き込む

# sudo odbcinst -i -s -l -f MariaDB_odbc_data_source_for_MSSQL_template.ini

 

odbc.iniの接続テスト

odbc.iniに設定した内容で接続テストをしてみる。

# sudo isql -v SQLServerDSN user pass
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select name from sys.databases;
+---------------------------------------------------------------------------------------------------------------------------------+
| name                                                                                                                            |
+---------------------------------------------------------------------------------------------------------------------------------+
| master                                                                                                                          |
| tempdb                                                                                                                          |
| model                                                                                                                           |
| msdb                                                                                                                            |
+---------------------------------------------------------------------------------------------------------------------------------+
SQLRowCount returns 0
4 rows fetched

ログインもSQLの発行も問題なく実行できた。

 

CREATE TABLEしてみる

試しに下記内容でCREATE TABLEしてみた。

CREATE TABLE Test_Table (
id int not null,
remark nvarchar(255) not null
) ENGINE=CONNECT
DEFAULT CHARSET=utf8mb4
CONNECTION='DSN=SQLServerDSN;Database=TestDB;UID=user;PWD=pass'
TABLE_TYPE='ODBC'

CREATE TABLEは無条件で成功するのは同じとして、 SELECT * FROM Test_Table; で無事データを取得できた。

文字化けもなくいい感じ。

 

カラム名に予約語が使われているとダメ

一点だけ問題点があるとすれば、カラム名に「KEY」のような予約語が使われているとSELECT時にエラーになる。

予約語であったとしても、SQL Serverでは[KEY]、MariaDBは`KEY`と囲めば使用できるのだが、CONNECTエンジンはこういった記法を解釈できないらしい。SQL Server側で別名でビューを定義してそっちをCONNECTして回避するしかなさそう。

 

とりあえず設定完了

前回の記事でOracleが大変だっただけに、思ったよりはサクサク進んでよかった。

実はもう一つだけ問題が残っているので、次の記事で解決する予定・・・。

コメントする