mysql實現類似於oracle dblink的功能

用mysql實現類似於oracle dblink的功能
首先看看有沒有federated 引擎。
mysql> show engines;
+------------+----------+----------------------------------------------------------------+
| Engine     | Support  | Comment                                                        |
+------------+----------+----------------------------------------------------------------+
| MyISAM     | DEFAULT  | Default engine as of MySQL 3.23 with great performance         |
| MEMORY     | YES      | Hash based, stored in memory, useful for temporary tables      |
| InnoDB     | YES      | Supports transactions, row-level locking, and foreign keys     |
| BerkeleyDB | NO       | Supports transactions and page-level locking                   |
| BLACKHOLE  | YES      | /dev/null storage engine (anything you write to it disappears) |
| EXAMPLE    | YES      | Example storage engine                                         |
| ARCHIVE    | YES      | Archive storage engine                                         |
| CSV        | YES      | CSV storage engine                                             |
| ndbcluster | DISABLED | Clustered, fault-tolerant, memory-based tables                 |
| FEDERATED  | YES      | Federated MySQL storage engine                                 |
| MRG_MYISAM | YES      | Collection of identical MyISAM tables                          |
| ISAM       | NO       | Obsolete storage engine                                        |
+------------+----------+----------------------------------------------------------------+

參考一下在windows下的解決辦法,在my.cnf中增加一行
Sql代碼

 收藏代碼

  1. federated   
  2. 重啓mysql服務後,  
  3. mysql> show engines;   
federated 
重啓mysql服務後,
mysql> show engines; 



建立連接處理

1 引擎說明
本地MySQL數據庫要訪問遠程MySQL數據庫的表中的數據, 必須通過FEDERATED存儲引擎來實現. 有點類似Oracle中的
數據庫鏈接(DBLINK). 要允許這個存儲引擎, 當構建MySQL時使用--with-federated-storage-engine來configure. 
當創建一個FEDERATED表的時候, 服務器在數據庫目錄創建一個表定義文件. 文件由表的名字開始, 並有一個.frm擴展名.
無其它文件被創建, 因爲實際的數據在一個遠程數據庫上. 使用FEDERATED表的步驟是非常簡單的. 通常, 運行兩個服務器,
要麼在同一個主機上, 要麼在不同主機上.
首先, 必須在想要用FEDERATED表訪問的遠程服務器上有一個表. 假設, 遠程的表在DB_FED數據庫中並且被如下定義: 
Sql代碼

 收藏代碼

  1. CREATE TABLE test_table (  
  2.     id     int(20) NOT NULL auto_increment,  
  3.     name   varchar(32) NOT NULL default '',  
  4.     other  int(20) NOT NULL default '0',  
  5.     PRIMARY KEY  (id),  
  6.     KEY name (name),  
  7.     KEY other_key (other)  
  8. ) ENGINE=MyISAM;  
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表: 
Sql代碼

 收藏代碼

  1. CREATE TABLE federated_table (  
  2.     id     int(20) NOT NULL auto_increment,  
  3.     name   varchar(32) NOT NULL default '',  
  4.     other  int(20) NOT NULL default '0',  
  5.     PRIMARY KEY  (id),  
  6.     KEY name (name),  
  7.     KEY other_key (other)  
  8. ) ENGINE=FEDERATED CONNECTION='mysql://username:password@remote_host:3306/db_name/table_name';  
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://username:password@remote_host:3306/db_name/table_name';


除了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建立測試表
Sql代碼

 收藏代碼

  1. mysql> create database db_fed;  
  2. mysql> use db_fed  
  3. mysql> CREATE TABLE tab_test (  
  4.     id     int(20) NOT NULL auto_increment,  
  5.     name   varchar(32) NOT NULL default '',  
  6.     PRIMARY KEY (id)  
  7. ) ENGINE=MyISAM;  
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;


Sql代碼

 收藏代碼

  1. mysql> insert into tab_test set name = 'test1';  
  2. mysql> insert into tab_test set name = '測試1';  
  3. mysql> select * from tab_test;  
  4. +----+-------+  
  5. | id | name  |  
  6. +----+-------+  
  7. |  1 | test1 |  
  8. |  3 | 測試1 |  
  9. +----+-------+  
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章