MSDE FunClub
Microsoft Data Engine FunClub
現在までのアクセスカウント数
Since 2006.11.17
最終更新日:2006/11/27
 
 [MSDE FunClub TOP]  > [MSDE 技術サポート情報]   > [MySQL に対する リンクサーバーの設定(How to Linked Server)] 
 
MySQL に対する
リンクサーバーの設定
(How to Linked Server)
 
 
SQLServer2005時代でも
開発の基本は T-SQL
上巻で T-SQL の基礎作り
 
SQLServer2005時代でも
運用の基本はバックアップ
下巻でバックアップ手法を学びましょう
PASSJ人気コンテンツで学んだ後は下巻でさらなる学習を!
 
SQLServer必携の書
ご購入をお願いします
 

 
 
MSDE FunClub
メニュー
■ MSDE 2000
技術情報一覧に
戻る
■ MSDE 2000
初心者向け
メーリングリスト
ご案内
■ MSDE 2000
技術者向け
メーリングリスト
ご案内
■ MSDE FunClub
HOME へ戻る
 
マイクロソフト
関連ページ
■ 文書番号:306212
SQL Server でリンク サーバーを使用するときに発生するエラー 7391 のトラブルシューティングを行う方法
■ 文書番号:814398
Microsoft Jet の OLE DB プロバイダを使用するリンク サーバー クエリを実行するとエラー 7399 が表示される
■ 文書番号:327489
DisallowAdHocAccess 設定を使用してリンク サーバーへのアクセスを制御する方法
■ 文書番号:327969
SQL Server Service Pack 3 ではシステム管理者のみがアドホック クエリを実行できる
■ 文書番号:319138
four-part リンク サーバーのクエリでのユーザー定義関数呼び出しは、エラー メッセージ 170 で失敗します。
■ 文書番号:297368
T-SQL Function OpenQuery Fails to Execute on Linked Servers
■ 文書番号:200796
SEM ではリンク サーバー名は大文字
■ 文書番号:290415
Jet プロバイダを使用して SQL Server からリンク サーバーのテキスト ファイルをクエリすると、速度が低下する
■ 文書番号:306397
SQL Server のリンク サーバーおよび分散クエリで Excel を使用する方法
■ 文書番号:285833
Access データベースに接続したリンク サーバーにクエリを実行するには、デフォルトの管理者アカウントにマップし、パスワードに NULL を使用する必要がある
■ 文書番号:839279
Windows Server 2003 または Windows XP Service Pack 2 のインストール後、リンク サーバーに対して分散トランザクションを実行すると SQL Server 2000 でエラー メッセージ 7391 が表示される
■ 文書番号:314530
SQL Server でリンク サーバー クエリを実行するとエラー メッセージ "タイムアウトが発生しました" が表示される
■ 文書番号:827805
コンピュータが同じドメインで実行されていない場合に MSDTC による相互認証が失敗する
■ 文書番号:270119
Error messages when you perform an UPDATE, INSERT, or DELETE Transact-SQL statement on a remote table by using the OpenQuery function: "7357" and "7320"
■ 文書番号:218592
OLAP サーバーを使用して SQL Server 分散クエリを実行する方法
■ 文書番号:321686
Excel から SQL Server にデータをインポートする方法
■ 文書番号:286370
OpenQuery 関数は、8,000文字を超えるクエリに失敗します
■ 文書番号:303774
SQL Server Books Online の「サーバーの名前の変更」における記述の不備について
■ 文書番号:296711
"Unspecified error" Error 7399 Using OPENROWSET Against Jet Database
■ 文書番号:252225
名前付きインスタンスへの分散クエリでエラーが発生する
■ Microsoft SQL Server 2000 の分散クエリ: OLE DB 接続
 
 
MySQL
関連ページ
■ MySQL Forums
Microsoft SQL Server
■ Linked server using OLE db
■ Running queries against Linked Server and MyODBC
■ How-To: MySQL as a linked server in MS SQL Server
■ connection strings
 
 
MySQLに対するリンクサーバーの設定
 
[MySQLに対するリンクサーバーの設定:MySQLのバージョン-00010]

この文書で使用しているMySQLのバージョンは
mysql> select version();
+------------+
| version()  |
+------------+
| 5.0.21-log |
+------------+
です。

なお、新しいバージョンがリリースされているので、そのバージョンに変えることをおすすめします。

この文書で使用している MySQL は、Linux上で稼働しているものです。

 
 
[MySQLに対するリンクサーバーの設定:キャラクタセット-00020]

MySQLサーバー(Linux上で稼働)のキャラクタセットの設定状況は、次の通り。

mysql> show variables like 'char%';
+--------------------------+--------------------------------------+
| Variable_name            | Value                                |
+--------------------------+--------------------------------------+
| character_set_client     | eucjpms                              |
| character_set_connection | eucjpms                              |
| character_set_database   | eucjpms                              |
| character_set_filesystem | binary                               |
| character_set_results    | eucjpms                              |
| character_set_server     | eucjpms                              |
| character_set_system     | utf8                                 |
| character_sets_dir       | /usr/local/var/share/mysql/charsets/ |
+--------------------------+--------------------------------------+
 
 
[MySQLに対するリンクサーバーの設定:サーバー側に組み込まれているキャラクタセットの状況-00030]

この文書で使用しているMySQLには、以下のキャラクタセットが組み込まれています。
mysql> show character set;
+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese    | big5_chinese_ci     |      2 |
| dec8     | DEC West European           | dec8_swedish_ci     |      1 |
| cp850    | DOS West European           | cp850_general_ci    |      1 |
| hp8      | HP West European            | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European        | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                    | ascii_general_ci    |      1 |
| ujis     | EUC-JP Japanese             | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese          | sjis_japanese_ci    |      2 |
| hebrew   | ISO 8859-8 Hebrew           | hebrew_general_ci   |      1 |
| tis620   | TIS620 Thai                 | tis620_thai_ci      |      1 |
| euckr    | EUC-KR Korean               | euckr_korean_ci     |      2 |
| koi8u    | KOI8-U Ukrainian            | koi8u_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |      2 |
| greek    | ISO 8859-7 Greek            | greek_general_ci    |      1 |
| cp1250   | Windows Central European    | cp1250_general_ci   |      1 |
| gbk      | GBK Simplified Chinese      | gbk_chinese_ci      |      2 |
| latin5   | ISO 8859-9 Turkish          | latin5_turkish_ci   |      1 |
| armscii8 | ARMSCII-8 Armenian          | armscii8_general_ci |      1 |
| utf8     | UTF-8 Unicode               | utf8_general_ci     |      3 |
| ucs2     | UCS-2 Unicode               | ucs2_general_ci     |      2 |
| cp866    | DOS Russian                 | cp866_general_ci    |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak  | keybcs2_general_ci  |      1 |
| macce    | Mac Central European        | macce_general_ci    |      1 |
| macroman | Mac West European           | macroman_general_ci |      1 |
| cp852    | DOS Central European        | cp852_general_ci    |      1 |
| latin7   | ISO 8859-13 Baltic          | latin7_general_ci   |      1 |
| cp1251   | Windows Cyrillic            | cp1251_general_ci   |      1 |
| cp1256   | Windows Arabic              | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic              | cp1257_general_ci   |      1 |
| binary   | Binary pseudo charset       | binary              |      1 |
| geostd8  | GEOSTD8 Georgian            | geostd8_general_ci  |      1 |
| cp932    | SJIS for Windows Japanese   | cp932_japanese_ci   |      2 |
| eucjpms  | UJIS for Windows Japanese   | eucjpms_japanese_ci |      3 |
+----------+-----------------------------+---------------------+--------+
36 rows in set (0.00 sec)
 
実際は、不要なもの(使わないもの)は、インストールしない方がよいでしょう。

Windowsからリンクサーバーの設定を行なうときは、マイクロソフトコードページ番号932(cp932)を必ず組み込んでください。

cp932キャラクターセット
新キャラクタセット cp932 / eucjpms
Microsoftコードページ932
Legacy Encoding Project

 
 
[MySQLに対するリンクサーバーの設定:クライアント側ODBCドライバのインストール-00040]

MySQLデータベースサーバーに対して、リンクサーバーを設定する方法は、

Microsoft OLE DB  Provider for ODBC Drivers

によって、MySQLのODBCドライバが使われます。

SQL Server 2000/MSDE 2000 のリンクサーバーは、OLE DB ドライバ経由で接続されます。
ここで使用されるOLE DB ドライバは、ODBCドライバを抱合するMicrosoft OLE DB  Provider for ODBC Drivers が使われます。

実際のMySQL ODBCドライバは、安定版である 3.51.12.00 の、ドライバを使います。

mysql-connector-odbc-3.51.12-win32.msi から、インストールを行ないます。

 
 
[MySQLに対するリンクサーバーの設定:クライアント側ODBCドライバの設定-00050]

MySQLデータベースサーバー上にある、Sampleデータベースに対するODBCドライバの設定を行ないます。

「管理ツール」の「データソース(ODBC)」 の選択 「管理ツール」の「データソース(ODBC)」 の選択をします。
「システムDSN」の登録 このコンピュータ上の誰でも利用できるように、システムDSNを登録します。
追加ボタンを押します。
MySQL ODBC 3.51 Driver MySQL ODBC 3.51 Driver を選択します。
MySQLデータベースサーバーに接続するときのログイン情報の設定 MySQLデータベースサーバーへ接続するときのログイン情報を設定します。

データソース名は、ここでは、SAMPLE-DB とします。

接続先サーバー名、ユーザ名、パスワードを、入力します。

MySQLの接続先データベースは、SAMPLE です。

SET NAMES cp932の初期化コマンドの登録 MySQLデータベースサーバーへ接続した直後に、cp932キャラクタセットに初期化するための命令を登録します。

Advance項目の設定(Flag1) Advance(Flag1)の設定

参照:ODBCパラメータの解説

Advance項目の設定(Flag2) Advance(Flag2)の設定

Advance項目の設定(Flag3) Advance(Flag3)の設定

Advance項目の設定(Debug) Advance(Debug)の設定

Testボタンにより、MySQLサーバーに正しく接続することができました MySQLサーバーへの、接続試験を行ないます。

正しく、接続することができました。

 
[MySQLに対するリンクサーバーの設定:リンクサーバーの登録-00060]

SQL Server 2000/MSDE 2000 上で、MySQLデータベースに対するリンクサーバーを登録します。

ODBCデータソース SAMPLE-DB を使って、リンクサーバー名 MySQL_LinkedDB を登録します。

SQL Server 2000/MSDE 2000 上で、次のTransact-SQLスクリプトを実行します。


--
-- MySQLに対するリンクサーバーを設定します
--

DECLARE  @DSN       VARCHAR(80)
DECLARE  @SRVName   VARCHAR(80)


-- ODBCのシステムデータソースの名前
SELECT @DSN = 'SAMPLE-DB'


-- リンクサーバーの名前
SELECT @SRVName = 'MySQL_LinkedDB'

--
-- すでに同じ名前のリンクサーバーが登録済みのときは、それを削除します
-- 注意して下さい
--
IF EXISTS(
    SELECT * FROM master.dbo.sysservers where srvname = @SRVName
)
BEGIN

  -- 同じ名前のリンクサーバーが見つかりました。削除します。
  EXEC  sp_dropserver @server = @SRVName

END


--
-- リンクサーバーを登録します
--

EXEC  sp_addlinkedserver 
      @server         = @SRVName, 
      @srvproduct     = 'MySQL',
      @provider       = 'MSDASQL', 
      @datasrc        = @DSN

 
 
[MySQLに対するリンクサーバーの設定:MySQL上のSAMPLEデータベース内にtestテーブルの作成-00070]

MySQLのSAMPLEデータベース内に、テスト用テーブルtestを作成します。

MySQL上で、次のSQL文を実行します。

mysql> create table test ( code int primary key , name varchar(80) );
Query OK, 0 rows affected (0.02 sec)

mysql> desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| code  | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(80) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
 
 
[MySQLに対するリンクサーバーの設定:リンクサーバーにレコードを挿入する-00080]

SQL Server 2000/MSDE 2000 から、リンクサーバーにレコードを挿入します(INSERT命令の実行)

SQL Server 2000/MSDE 2000上で、次のSQL文を実行します。

INSERT  INTO
    OPENQUERY (
              MySQL_LinkedDB , 'SELECT * FROM test WHERE(1=2)'
     )
 ( code , [name] )  values( 100 ,  '堀川 明' )
INSERT構文のテーブル名を指定する部分に、OPENQUERY命令を記述します。

WHERE(1=2)のWHERE句によって、絶対成立しない条件を指定します。
無意味なレコードセットを戻さないようにします。
なお、上記の命令を実行する前に、適切なセキュリティ権限設定をMySQL上で行なって下さい。

mysql> select * from test;
+------+----------+
| code | name     |
+------+----------+
|  100 | 堀川 明 |
+------+----------+
1 row in set (0.00 sec)
 
MySQLデータベースのキャラクタセットをcp932に設定したので、Windows機種依存文字の登録も許されます。
INSERT  INTO
    OPENQUERY (
              MySQL_LinkedDB , 'SELECT * FROM test WHERE(1=2)'
     )
 ( code , [name] )  values( 200 ,  '@ A B   √ ' )
Windowsの機種依存文字を使いました。
mysql> select * from test;
+------+----------------------+
| code | name                 |
+------+----------------------+
|  100 | 堀川 明             |
|  200 | @ A B   √  |
+------+----------------------+
2 rows in set (0.00 sec)
 
 
[MySQLに対するリンクサーバーの設定:リンクサーバーのレコードの表示-00090]

MySQLのリンクサーバーのテーブルに存在するレコードを、取得します。

SELECT文の実行です。

次のTransact-SQLの命令を、SQL Server 2000/MSDE 2000 で、実行します。

SELECT * FROM 
     OPENQUERY(
              MySQL_LinkedDB ,  
                'SELECT * FROM test'
     )
クエリアナライザでの実行
osqlコマンドでの実行
 
レコードの選択条件(WHERE句)は、リンクサーバー側(MySQL側)で絞り込めるように、OPENQUERY句の中に記述します。

SELECT * FROM 
     OPENQUERY (
              MySQL_LinkedDB ,  
                 'SELECT * FROM  test WHERE code=100'
     )
レコードの選択条件の指定
 
 
[MySQLに対するリンクサーバーの設定:リンクサーバーのレコードの表示(2)-00100]

OPENQUERY句の中に記述するSELECT文は、リンクサーバー側で実行されるパススルークエリです。
MySQLで提供されている関数などを記述することができます。
SELECT * FROM 
     OPENQUERY (
              MySQL_LinkedDB ,  
                 'SELECT version() AS Version'
     )

SELECT * FROM 
     OPENQUERY (
              MySQL_LinkedDB ,  
                 'SELECT concat(123,''456'') AS Num'
     )


SELECT * FROM 
     OPENQUERY (
              MySQL_LinkedDB ,  
                 'SELECT * FROM  mysql.user where User=''Tarou'''
     )
 
 
[MySQLに対するリンクサーバーの設定:レコードの更新-00110]

UPDATE文は、次のように実行します。
UPDATE 
    OPENQUERY (
              MySQL_LinkedDB , 'SELECT * FROM test'
     )
SET name = '山田 太郎'
WHERE( code = 200 )
レコードの絞込み条件(WHERE句)は、OPENQUERY句の外側に記述しました。

OPENQUERY句の中のSELECT文では、すべてのレコードを返すようにします。

なおこの例では、WHERE句をパススルークエリ内部に記述しても動きますが、ドライバなどの内部仕様が不明なので、レコードの更新や削除では、すべてのレコードを取得するのが安全だと思われます。

 
 
[MySQLに対するリンクサーバーの設定:レコードの削除-00120]

DELETE文は、次のように実行します。
DELETE FROM 
    OPENQUERY (
              MySQL_LinkedDB , 'SELECT * FROM test'
     )
WHERE( code = 200 )
 
 
[MySQLに対するリンクサーバーの設定:four-part names形式の指定はできない-00130]

現行のドライバを使用するときは、リンクサーバーに対する完全形式名は、エラーが発生します。

   完全形式による書式:リンクサーバー名.データベース名.所有者名.オブジェクト名

このため、OPENQUERY命令などを使用します。

 
 
 
 
MSDE FunClubに関するご意見・ご要望等ございましたら、
msdefun@horikawa.ne.jp までご連絡下さい。
MSDEを始めとする各種データベースシステムの開発、コンサルタントに関するご要望等は、
msdedev@horikawa.ne.jp までご連絡下さい。