MySQL FEDERATED引擎使用示例, 類似Oracle DBLINK 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