1. 程式人生 > >mysql跨伺服器查詢

mysql跨伺服器查詢

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://

[email protected]_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:[email protected]:port/database/tablename'

CONNECTION='mysql://[email protected]/database/tablename'

CONNECTION='mysql://username:[email protected]/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伺服器查詢

1 引擎說明 本地MySQL資料庫要訪問遠端MySQL資料庫的表中的資料, 必須通過FEDERATED儲存引擎來實現. 有點類似Oracle中的 資料庫連結(DBLINK). 要允許這個儲存引擎, 當構建MySQL時使用--with-federated-storage-engine來configure

mysql實現伺服器查詢資料

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

兩不同伺服器上的mysql查詢

業務場景:關聯不同資料庫中的表的查詢 比如說,要關聯的表是:機器A上的資料庫A中的表A && 機器B上的資料庫B中的表B。 這種情況下,想執行“select A.id,B.id from A left join B on ~~~;“那是不可能的,但業務需求不可變,資料庫設計不可變,這就

建立虛表兩不同伺服器上的mysql查詢

業務場景:關聯不同資料庫中的表的查詢 比如說,要關聯的表是:機器A上的資料庫A中的表A && 機器B上的資料庫B中的表B。 這種情況下,想執行“select A.id,B.id from A left join B on ~~~;“那是不可能

MySQL查詢例子

job sch spa activity 查詢 cti activit fun select 庫1 gxjob 庫2 funshixi SELECT a.`company_id`,b.`companyname` FROM `gxjob`.`qj_activity_thous

伺服器查詢資料

use master; go drop database mydata; go create database mydata; go use mydata; go create table t_user ( userguid uniqueidentifier not null defa

MS SQLSERVER如何實現伺服器查詢

--跨伺服器查詢如下: SELECT a.* FROM OPENROWSET('MSDASQL',    'DRIVER={SQL Server};SERVER=10.27.27.160;UID=sa;PWD=ncunicom_alarm',    BSC_ALARM.dbo.ALARM_LIS

SQL SERVER伺服器查詢

1.執行儲存過程 sp_addlinkedserver 以將伺服器新增到 sys.servers。 exec sp_addlinkedserver 'IPTV', ' ', 'SQLOLEDB ', '遠端伺服器名或ip地址 ' exec sp_addlink

sqlserver中伺服器查詢資料

[SQL SERVER] 跨伺服器查詢 方法一: 用OPENDATASOURCE 下面是個跨SQLServer查詢的示例 Select TableA.*,TableB.* From OPENDATASOURCE(          'SQLOLEDB',         

快取一致性和伺服器查詢的資料異構解決方案canal

當你的專案資料量上去了之後,通常會遇到兩種情況,第一種情況應是最大可能的使用cache來對抗上層的高併發,第二種情況同樣也是需要使用分庫 分表對抗上層的高併發。。。逼逼逼起來容易,做起來並不那麼樂觀,由此引入的問題,不見得你有好的解決方案,下面就具體分享下。 一:儘可

sql serve 伺服器查詢資料方法

 今天在做sql server 的資料查詢時,需要用到跨伺服器連線,在這裡記錄一下,如何在sql server 中,使用跨伺服器查詢的方法,有以下步驟。 /*建立中間資料庫連結 exec sp_addlinkedserver 'MiddleData', ' ', 'SQ

java Mysql伺服器不同表結構的聯合查詢,兩不同伺服器上的不同表查詢

由於業務的需要,需要從兩個資料庫中取得資料,伺服器A儲存有角色使用者配置表和角色表,伺服器B有使用者表和公司表。先不管架構為什麼要這樣設計資料表,因為確實有這樣的需求,但是這確實是一個令人頭疼的事情,但是還是要面帶微笑~ 解決思路一: 在資料庫中聯合不同資料庫的表中的DDL

mysql庫關聯查詢

1:使用show engines;檢視federated引擎是否等於YES,沒有在my.ini檔案後面加上federated重啟mysql 2:SELECT substring_index(a.account,"_",1) as account,sum(a.price) as price &nb

Mysql庫連結串列查詢

關於跨資料庫連表處理資料解決方案: 解決方式: 使用federated引擎進行資料表對映 1.檢視federated引擎是否開啟 輸入指令:show engines; federated如果有.但是為No.則是可以使用,但是未開啟. 需要開啟. 開啟方法: 在m

mysql 通過federated引擎 伺服器訪問資料

首先檢查本地mysql資料庫是否支援federated引擎, 如圖所示, 執行 show engines; 如圖所示: 說明不支援。 然後找到安裝目錄下的my.ini檔案,開啟編輯。 在[mysqld]  下面新增一行  federated   儲存即可。如果沒有[mysq

MySQL伺服器訪問資料(Windows版)

1. 簡介   mysql 提供了一個類似Oracle中的資料庫連結(DBLINK)功能的儲存引擎–FEDERATED。當我們建立一個以FEDERATED為儲存引擎的表時,伺服器在資料庫目錄只建立一個表定義檔案。檔案由表的名字開始,並有一個frm副檔名。無其它

伺服器匯入資料或查詢資料

跨伺服器匯入資料SQL語句及其問題解決方案 跨伺服器匯入資料SQL語句: --自定義表名,在匯入前建立表SELECT * INTO TbName FROM OPENROWSET('SQLOLEDB','192.168.0.7';'sa';'damon king',DBName

MySQL索引及查詢優化總結

存儲 一行 -1 type 一定的 關鍵技術 表示 智能 string類型 一個簡單的對比測試 前面的案例中,c2c_zwdb.t_file_count表只有一個自增id,FFileName字段未加索引的sql執行情況如下: 在上圖中,type=all,key=nul

Mysql 子類查詢所有父類

blog font cnblogs name order sel area logs div SELECT area_.id, area_.name FROM ( SELECT @r AS _id, (SELECT @r := parentid FROM

MySQL指定模糊查詢範圍 或 獲取或者查詢數據庫字段的特定幾位

length oracle 一個 中一 字段 範圍 htm 截取 模糊查詢 SUBSTR 函數 正常的: select * from sky_user WHERE name LIKE "%name%" 現在我需要匹配name的前五位 select * from sk