用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中增長一行
- federated
- 重啓mysql服務後,
- mysql> show engines;
創建鏈接處理
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://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創建測試表
- 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 u_fed@192.168.41.196 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:iamwangnc@192.168.41.197: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