mysql跨伺服器查詢

2021-07-13 14:17:50 字數 4718 閱讀 3064

2013-8-22 10:34| 發布者: 天空之城

| 檢視: 16547

摘要: 本地mysql資料庫要訪問遠端mysql資料庫的表中的資料, 必須通過federated儲存引擎來實現. 有點類似oracle中的資料庫鏈結(dblink). 要允許這個儲存引擎, 當構建mysql時使用--with-federated-storage-engine來configure ...

1 引擎說明

本地mysql資料庫要訪問遠端mysql資料庫的表中的資料, 必須通過federated儲存引擎來實現. 有點類似oracle中的

資料庫鏈結(dblink). 要允許這個儲存引擎, 當構建mysql時使用--with-federated-storage-engine來configure.  

當建立乙個federated表的時候, 伺服器在資料庫目錄建立乙個表定義檔案. 檔案由表的名字開始, 並有乙個.frm副檔名. 

無其它檔案被建立, 因為實際的資料在乙個遠端資料庫上. 使用federated表的步驟是非常簡單的. 通常, 執行兩個伺服器, 

要麼在同乙個主機上, 要麼在不同主機上. 

首先, 必須在想要用federated表訪問的遠端伺服器上有乙個表. 假設, 遠端的表在db_fed資料庫中並且被如下定義:  

create table test_table (

id     int(20) not null auto_increment,

name   varchar(32) not null default '',

other  int(20) not null default '0',

primary key  (id),

key name (name),

key other_key (other)

) engine=myisam;

接著, 在本地伺服器上為訪問遠端表建立乙個federated表:  

create table federated_table (

id     int(20) not null auto_increment,

name   varchar(32) not null default '',

other  int(20) not null default '0',

primary key  (id),

key name (name),

key other_key (other)

) engine=federated connection='mysql://remote_user@remote_host:9306/db_fed/test_table';

除了engine選項應該是federated, 並且connection表選項是給federated指明如何連線到遠端伺服器上的連線字串之外, 

這個表的結構必須完全與遠端表的結構相同.  

遠端主機資訊指明本地伺服器要連線到的遠端伺服器, 資料庫和表資訊指明哪乙個遠端表要被作為資料檔案來用. 在這個例子中. 

遠端伺服器被指定來作為遠端主機在9306埠上執行, 所以要啟動伺服器, 讓它監聽9306埠.  

在connection選項中的連線字串的一般形式如下(密碼和埠號是可選的):  

mysql://user_name[:password]@host_name[:port_num]/db_name/tbl_name

這裡有一些連線字串的例子:  

connection='mysql://username:password@hostname:port/database/tablename'

connection='mysql://username@hostname/database/tablename'

connection='mysql://username:password@hostname/database/tablename'

因為任何被用的密碼作為純文字被存在連線字串中, 它可以被任何使對federated表使用show create table或 show table status的使用者, 或者在information_schema資料庫中查詢tables表的使用者看見.  

federated支援及不支援的如下:  

·遠端伺服器必須是乙個mysql伺服器. federated對其它資料庫引擎的支援可能會在將來被新增.  

·federated表指向的遠端表在通過federated表訪問它之前必須存在.  

·乙個federated表指向另乙個federated表是可能的, 但是必須小心不要建立乙個迴圈.  

·沒有對事務的支援.  

·如果遠端表已經改變, 對federated引擎而言是沒有辦法知道的. 這個的原因是因為這個表必須象資料檔案一樣工作, 

除了資料庫其它任何都不會被寫入. 如果有任何對遠端資料庫的改變, 本地表中資料的完整性可能會被破壞.  

·federated儲存引擎支援select,insert,update,delete和索引. 它不支援alter table,drop table或任何

其它的資料定義語言語句. 當前的實現不使用預先準備好的語句.  

·執行使用select,insert,update和delete, 但不用handler.  

·federated表不能對查詢快取不起作用.  

這些限制中的一些在federated處理機的將來版本可能被消除.  

2 使用示例

mysql例項a(主機192.168.41.196)下, 建立對遠端mysql例項b(主機192.168.41.197)的表db_fed.tab_test訪問.

1) mysql例項b建立測試表

mysql> create database db_fed;

mysql> use db_fed

mysql> create table tab_test (

id     int(20) not null auto_increment,

name   varchar(32) not null default '',

primary key (id)

) engine=myisam;

mysql> insert into tab_test set name = 'test1';

mysql> insert into tab_test set name = '測試1';

mysql> select * from tab_test;

+----+-------+

| id | name  |

+----+-------+

|  1 | test1 |

|  3 | 測試1 |

+----+-------+

--建立乙個使用者專門用於遠端federated引擎訪問, 這個使用者的許可權決定了遠端federated表的操作許可權:

mysql> grant select on db_fed.* to [email protected] identified by 'iamwangnc';

2) mysql例項a建立federated引擎表

--確認federated引擎已啟用:

mysql> show engines;

...| federated  | yes     | federated mysql storage engine                                 | no           | no   | no         |

...--如果未啟用, 先確保configure mysql時加了--with-federated-storage-engine選項, 另外還確保啟動mysqld時加了--federated引數, 

或者在my.cnf裡[mysqld]段後面加了federated引數, 如下, 然後重啟mysqld:

--------------------------------

[mysqld]

federated

--------------------------------

--在某個庫下建立federated引擎表:

mysql> create database db_test;

mysql> use db_test

mysql> create table tab_test_fed (

id     int(20) not null auto_increment,

name   varchar(32) not null default '',

primary key (id)

) engine=federated connection = 'mysql://u_fed:[email protected]:3306/db_fed/tab_test';

--測試是否可以訪問:

mysql> select * from tab_test_fed;

+----+-------+

| id | name  |

+----+-------+

|  1 | test1 |

|  3 | 測試1 |

+----+-------+

--測試是否可以修改:

mysql> delete from tab_test_fed;

error 1296 (hy000): got error 10000 'error on remote system: 1142: drop command denied to user 'u_fed'@'comp196' 

for table 'tab_test'' from federated 

MySQL實現跨伺服器查詢

案例b伺服器資料庫進行查詢時需要用到a伺服器資料庫表資料,需要對資料進行誇伺服器查詢,辦法有很多,這裡簡單介紹下通過儲存引擎層實現跨伺服器查詢 a伺服器 192.168.1.76 b伺服器 192.168.1.77 1 mysql例項a建立測試表 mysql create database lian...

跨伺服器查詢

select from openrowset msdasql driver server 0.uid pwd kft.dbo.user 建立乙個鏈結的伺服器 引數 1被訪問的伺服器別名 4要訪問的伺服器 exec sp addlinkedserver l ms sqloledb 0.gogo 登陸l...

mysql實現跨伺服器查詢資料

在日常的開發中經常進行跨資料庫進行查詢資料。同伺服器下跨資料庫進行查詢在表前加上資料庫名就可以查詢到資料。mysql跨伺服器進行查詢提供了federated引擎進行對映表,然後進行查詢。mysql資料庫federated引擎是關閉的,首先需要先啟用該引擎。mysql執行show engines命令檢...