1. 程式人生 > >MySQL 儲存過程查詢遠端資料庫的方法

MySQL 儲存過程查詢遠端資料庫的方法

這幾天有個任務,需要在儲存過程中讀取遠端資料庫一個表的資料存到本地表,然後進行計算。

在網上查找了資料,Oracle和SQL Server查詢遠端資料庫是比較方便的,MySQL麻煩一些,需要在本地建立一個需要查詢的遠端的表結構完全一樣的表,並且是Federate引擎。

1、首先,用show ENGINES語句檢視是否安裝Federate引擎。
如果有Federate記錄但是Support欄位是no就需要配置,修改my.ini(如果是linux就是my.cnf),在[mysqld]下面新增一行federated,儲存退出後重啟mysql服務。
如果沒有記錄,就需要編譯安裝federated 引擎,就不說了

2、在本地資料庫中建表,結構和需要讀取的遠端資料庫中的表完全一樣,但是需要在最後指定Federate引擎:

    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),
    INDEX name (name),
    INDEX other_key (other)
)
ENGINE=FEDERATED
DEFAULT
CHARSET=latin1 CONNECTION='mysql://username:password@remote_host:port/federated/test_table';

對CONNECTION後面的字串解釋一下
mysql:支援的連線協議,在這裡只支援mysql
username:本地資料庫連線遠端資料庫的使用者名稱
password:密碼
remote_host:遠端資料庫地址
port:埠號,例如3306,3936
federated:遠端資料庫例項
test_table:需要查詢的資料庫表名

3、在遠端資料庫上賦予本地資料庫查詢許可權
在本地建立Federate表後是無法直接讀取的,會出現如下錯誤:

1429 -  Unable to connect to foreign data source: Can't connect to MySQL server on 'hostname'

這是因為本地資料庫沒有許可權查詢遠端資料庫的表,需要在遠端資料庫中新增本地username的查詢許可權
在遠端資料庫的mysql例項中賦予本地資料庫查詢許可權:

GRANT SELECT ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

其中:
SELECT是賦予的許可權,也可以是UPDATE,DELETE等,用逗號分隔開
username是需要賦予的本地資料庫使用者名稱
localhost是本地資料庫地址
password是本地資料庫使用者密碼

這樣就可以像查詢本地表一樣查詢遠端資料庫表了