MySQL federated引擎 --- 實現相似oracle dblink功能

1.查看是否安裝了federated引擎php

    show engines;html

2.開啓federated引擎mysql

windows下在my.ini中加入federated,便可開啓;
linux中,須要編譯時加入選項,再在my.ini中加入federated,方可開啓.

3.創建遠程數據表連接linux

    舉例說明:A(192.168.0.233:3306)、B(192.168.0.233:3307)、C(192.168.0.233:3308)、D(192.168.0.234:3306)sql

在A、B、C、D四個數據庫分別建立庫testfed;
數據庫

在B、C上創建受權用戶, windows

mysql>grant all privileges on testfed.t_test to test@'%' identified by 'test';緩存

    (或者服務器

  grant select on testfed.t_test to test@'192.85.1.113' identified by 'test';ide

flush privileges;

在B上,建立

mysql> create table t_testB (id int not null auto_increment primary key, c_str char(20) not null) engine innodb;
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;

在C上,建立

mysql> create table t_testC (id int not null auto_increment primary key, c_str char(20) not null) engine innodb;
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;

建立federated引擎;

在A上,

mysql> create table t_testA (id int not null auto_increment primary key, c_str char(20) not null)engine federated connection = 'mysql://root:123456@192.168.0.233:3307/testfed/t_testB';
Query OK, 0 rows affected (0.04 sec)

在D上,

mysql> create table t_2 (id int not null auto_increment primary key, c_str char(20) not null)engine federated connection = 'mysql://root:123456@192.168.0.233:3308/testfed/t_testC';
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t_1(c_str) values (rand());



若是你的mysql是5.1或者低版本的請看這裏,若是是5.6請參考http://dev.mysql.com/doc/refman/5.6/en/federated-storage-engine.html 

15.7. FEDERATED存儲引擎

15.7.1. 安裝FEDERATED存儲引擎

15.7.2. FEDERATED存儲引擎的 介紹

15.7.3. 如何使用FEDERATED表

15.7.4. FEDERATED存儲引擎的 侷限性

FEDERATED存儲引擎訪問在遠程數據庫的表中的數據,而不是本地的表。

FEDERATED存儲引擎僅在-MAX版的MySQL上可用。

要爲FEDERATED引擎檢查 源碼,請查看MySQL源碼分發版的sql目錄。

對於FEDERATED存儲引擎,在http://forums.mysql.com/list.php?105上有一個專門的論壇。

15.7.1. 安裝FEDERATED存儲引擎

要容許這個存儲引擎,當你構建MySQL時請使用--with-federated-storage-engine來configure

15.7.2FEDERATED存儲引擎的描述

當你建立一個FEDERATED表的時候,服務器在數據庫目錄建立一個表定義文件。文件由表的名字開始,並有一個.frm擴展名。無其它表被建立,由於實際的數據在一個遠程數據庫上。這不一樣於爲本地表工做的存儲引擎的方式。

對於本地的數據錄表,數據文件是本地的。例如,若是你建立一個名爲user的MyISAM表,MyISAM處理器建立一個名爲users.MYD的數據文件。對本地表讀,插入,刪除和更新在本地數據文件裏的數據的處理器和記錄被以對處理器的特定格式存儲。 爲了讀記錄,處理器必須把數據分解進列。爲了寫記錄,列值必須被轉換到被處理器使用的行格式而且被寫進本地的數據文件。

使用MySQL FEDERATED存儲引擎,沒有對錶的本地數據文件(好比,沒有.MYD文件)。取而代之地,一個遠程數據庫存儲那些正常地應該在表中的數據。這使得MySQL客戶端API來讀,刪除,更新和插入數據的使用成爲必要。數據取回被經過SELECT * FROM tbl_name SQL語句來初始化。要讀這個結果,經過使用mysql_fetch_row() C API函數,行被一次取一個,而後從SELECT結果包中的列轉換成FEDERATED處理器指望的格式。

基本流程以下:

1.    SQL調用被本地發佈

2.    MySQL處理器API (數據以處理器格式)

3.    MySQL客戶端API (數據被轉換成SQL調用)

4.    遠程數據庫-> MySQL客戶端API

5.    轉換結果包(若是有的話)處處理器格式

6.    處理器 API -> 結果行或受行影響的對本地的計數

15.7.3. 如何使用FEDERATED

使用FEDERATED表的步驟是很是簡單的。一般,你運行兩個服務器,要麼在同一個主機上,要麼在不一樣主機上。(一個FEDERATED表使用其它被同一服務器管理的表也是可能的。雖然只有極少的點要這麼作)。

首先,你必須在你想要用FEDERATED表訪問的遠程服務器上有一個表。假設,遠程的表在FEDERATED數據庫中而且被以下定義:

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
DEFAULT CHARSET=latin1;

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
DEFAULT CHARSET=latin1
CONNECTION='mysql://root@remote_host:9306/federated/test_table';

注意: CONNECTION 替代 用在先前版本的MySQL裏的COMMENT)。

除了ENGINE表選項應該是FEDERATED,而且CONNECTION表選項是給FEDERATED指明如何鏈接到遠程服務器上的鏈接字符串以外, 這個表的結構必須徹底與遠程表的結構相同。

FEDERATED引擎僅建立在已聯盟數據庫中的test_table.frm文件。

遠程主機信息指明本地服務器要鏈接到的遠程服務器,數據庫和表信息指明哪個遠程表要被做爲數據文件來用。在這個例子中。遠程服務器被指定來做爲遠程主機在9306端口上運行,因此你要啓動服務器,讓它監聽9306端口。

在CONNECTION選項中的鏈接字符串的通常形式以下:

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

只有mysql在這一點被支持爲scheme,密碼和端口號時可選的。

這裏有一些鏈接字符串的例子:

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

爲指定鏈接字符串使用CONNECTION是非可選,而且在未來可能會改變。當你使用FEDERATED表的時候,要記得這個,由於這意味着當未來發生那種改變之時,可能被要求。

由於任何被用的密碼做爲純文本被存在鏈接字符串中,它能夠被任何使對FEDERATED表使用SHOW CREATE TABLE或SHOW TABLE STATUS的用戶,或者在INFORMATION_SCHEMA數據庫中查詢TABLES表的用戶看見。

對於FEDERATED存儲引擎,在http://forums.mysql.com/list.php?105上有一個專門的論壇。

15.7.4FEDERATED存儲引擎的侷限 性

FEDERATED支持及不支持的以下:

·         在第一個版本中,遠程服務器必須是一個MySQL服務器。FEDERATED對其它數據庫引擎的支持可能會在未來被添加。

·         FEDERATED表指向的遠程表在你經過FEDERATED表訪問它以前必須存在。

·         一個FEDERATED表指向另外一個FEDERATED表是可能的,可是你必須當心不要建立一個循環。

·         沒有對事務的支持。

·         若是遠程表已經改變,對FEDERATED引擎而言是沒有辦法知道的。這個的緣由是由於這個表必須象數據文件同樣工做,除了數據庫其它任何都不會被寫入。若是有任何對遠程數據庫的改變,本地表中數據的完整性可能會被破壞。

·         FEDERATED存儲引擎支持SELECT, INSERT, UPDATE, DELETE和索引。它不支持ALTER TABLE, DROP TABLE或任何其它的數據定義語言語句。當前的實現不使用預先準備好的語句。

·         執行使用SELECT, INSERT, UPDATE和DELETE,但不用HANDLER。

·         FEDERATED表不能對查詢緩存不起做用。

這些限制中的一些在FEDERATED處理機的未來版本可能被消除。

http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#federated-storage-engine 

相關文章
相關標籤/搜索