MySQL FEDERATED 存儲引擎的使用

 FEDERATED 存儲引擎描述

FEDERATED存儲引擎能讓你訪問遠程的MySQL數據庫而不使用replication或cluster技術(相似於Oracle的dblink),使用FEDERATED存儲引擎的表,本地只存儲表的結構信息,數據都存放在遠程數據庫上,查詢時經過建表時指定的鏈接符去獲取遠程庫的數據返回到本地。
FEDERATED存儲引擎默認不啓用
    若是是使用的源碼,須要使用CMake 加上DWITH_FEDERATED_STORAGE_ENGINE選項。
    若是是二進制包,則在啓動MySQL時指定 [--federated] 選項開啓或在my.cnf文件中的[mysqld]部分加上federated參數

 

 FEDERATED 存儲引擎架構

1 本地服務器 FEDERATED 存儲引擎的表只存放表的.frm結構文件
2 遠程服務器 存放了.frm和數據文件
3 增刪改查操做都是經過創建的鏈接來訪問遠程數據庫進行操做,把結果返回給本地。
4 遠程數據表的存儲引擎爲MySQL支持的存儲引擎,如MyISAM,InnoDB等

 

 

 FEDERATED 存儲引擎操做步驟

操做步驟:
    遠程庫:
        開啓 FEDERATED 存儲引擎
        創建遠程訪問用戶
        授予訪問對象的權限
    本地庫:
        測試登錄遠程庫是否能成
        建立 FEDERATED 表
        查詢是否成功

 

遠程庫

開啓 FEDERATED 存儲引擎

(root@localhost) [(none)]>select engine,support from information_schema.engines where engine='FEDERATED';
+-----------+---------+
| engine | support |
+-----------+---------+
| FEDERATED | YES |
+-----------+---------+
1 row in set (0.00 sec)html

--也可以使用show engines查看支持的存儲引擎mysql

(root@localhost) [(none)]>show engines;  --排版問題不貼出執行結果sql

--若是support 爲NO,則須要在my.cnf中[mysqld]增長federated參數,並重啓MySQL服務器生效配置數據庫

 

創建遠程訪問用戶並受權

(root@localhost) [(none)]>select user,host from mysql.user;   --查看數據庫用戶 +-----------+-----------+
| user      | host      |
+-----------+-----------+
| root      | %         |
| mysql.sys | localhost |
| root      | localhost |
+-----------+-----------+
3 rows in set (0.00 sec)

(root@localhost) [(none)]>create user 'fed'@'%' identified by 'fed_test'; --建立一個federated鏈接的用戶
Query OK, 0 rows affected (0.00 sec)

(root@localhost) [(none)]>grant all on employees.* to 'fed'@'%';   --授予建立的fed用戶訪問employees數據庫全部表的權限
Query OK, 0 rows affected (0.00 sec)

(root@localhost) [(none)]>select user,host from mysql.user;   --查看用戶信息 +-----------+-----------+
| user      | host      |
+-----------+-----------+
| fed       | %         |
| root      | %         |
| mysql.sys | localhost |
| root      | localhost |
+-----------+-----------+
4 rows in set (0.00 sec)

(root@localhost) [(none)]>show grants for 'fed'@'%';   --查看用戶權限 +----------------------------------------------------+
| Grants for fed@%                                   |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO 'fed'@'%'                    |
| GRANT ALL PRIVILEGES ON `employees`.* TO 'fed'@'%' |
+----------------------------------------------------+
2 rows in set (0.00 sec)

 

本地庫

測試登錄遠程庫是否能成

[root@RHEL6 ~]# mysql -ufed -h172.25.21.10 -P3306 -p --在本地服務器上去鏈接遠程庫
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 23
Server version: 5.7.10-log MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

fed@172.25.21.10 [(none)]> --成功經過遠程機新建的用戶登陸上遠程數據庫

--若是沒有鏈接成功
  判斷是否防火牆的問題
查看端口是否正確

 

建立本地 FEDERATED 表

root@localhost [(none)]>create database test; --在本地建立一個數據庫,也可以使用已存在的數據庫
Query OK, 1 row affected (0.01 sec)

root@localhost [(none)]>use test; --使用新建的數據庫
Database changed
root@localhost [test]>CREATE TABLE `employees_fed` (
    ->   `emp_no` int(11) NOT NULL,
    ->   `birth_date` date NOT NULL,
    ->   `first_name` varchar(14) NOT NULL,
    ->   `last_name` varchar(16) NOT NULL,
    ->   `gender` enum('M','F') NOT NULL,
    ->   `hire_date` date NOT NULL,
    ->   PRIMARY KEY (`emp_no`)
    -> ) ENGINE=federated DEFAULT CHARSET=utf8mb4
    -> connection='mysql://fed:fed_test@172.25.21.10:3306/employees/employees'; 
Query OK, 0 rows affected (0.00 sec)

connection語法:
scheme://user_name[:password]@host_name[:port_num]/db_name/tbl_name
具體語法及含義參考官方文檔連接:
http://dev.mysql.com/doc/refman/5.7/en/federated-create-connection.html

--建立完成federated存儲引擎的表,注意:本地表employees_fed的結構要和遠程表employees同樣,能夠提早在遠程表中經過show create table table_name來獲取表結構並修改或增長標紅的語句。

 

驗證是否配置成功

root@localhost [test]>select * from employees_fed limit 10; --成功獲取到遠程數據庫中的數據
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  10001 | 1953-09-02 | Georgi     | Facello   | M      | 1986-06-26 |
|  10002 | 1964-06-02 | Bezalel    | Simmel    | F      | 1985-11-21 |
|  10003 | 1959-12-03 | Parto      | Bamford   | M      | 1986-08-28 |
|  10004 | 1954-05-01 | Chirstian  | Koblick   | M      | 1986-12-01 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak  | M      | 1989-09-12 |
|  10006 | 1953-04-20 | Anneke     | Preusig   | F      | 1989-06-02 |
|  10007 | 1957-05-23 | Tzvetan    | Zielinski | F      | 1989-02-10 |
|  10008 | 1958-02-19 | Saniya     | Kalloufi  | M      | 1994-09-15 |
|  10009 | 1952-04-19 | Sumant     | Peac      | F      | 1985-02-18 |
|  10010 | 1963-06-01 | Duangkaew  | Piveteau  | F      | 1989-08-24 |
+--------+------------+------------+-----------+--------+------------+
10 rows in set (0.36 sec)
root@localhost [test]>show variables like 'datadir'; --查看數據文件存放目錄
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)

root@localhost [test]>system ls -l /var/lib/mysql/test/* 
-rw-rw----. 1 mysql mysql   61 Mar 30 13:41 /var/lib/mysql/test/db.opt
-rw-rw----. 1 mysql mysql 8768 Mar 30 13:41 /var/lib/mysql/test/employees_fed.frm --肯定本地只保存了表的結構信息

--配置成功

 

使用 CREATE SERVER 方式建立 FEDERATED表

--建立一個server

root@localhost [test]>CREATE SERVER emp_link -> FOREIGN DATA WRAPPER mysql -> OPTIONS (USER 'fed', PASSWORD 'fed_test',HOST '172.25.21.10',PORT 3306,DATABASE 'employees');

CREATER SERVER語法:
CREATE SERVER server_name
FOREIGN DATA WRAPPER wrapper_name
OPTIONS (option [, option] ...)
 
 
具體語法及含義參考官方文檔連接:
http://dev.mysql.com/doc/refman/5.7/en/federated-create-server.html

--查看已建立的server

root@localhost [test]>select * from mysql.servers\G;
*************************** 1. row ***************************
Server_name: emp_link
Host: 172.25.21.10
Db: employees
Username: fed
Password: fed_test
Port: 3306
Socket:
Wrapper: mysql
Owner:
1 row in set (0.00 sec)服務器

 

 

建立基於SERVER 的FEDERATED表

root@localhost [test]>CREATE TABLE `employees_link` (
    ->   `emp_no` int(11) NOT NULL,
    ->   `birth_date` date NOT NULL,
    ->   `first_name` varchar(14) NOT NULL,
    ->   `last_name` varchar(16) NOT NULL,
    ->   `gender` enum('M','F') NOT NULL,
    ->   `hire_date` date NOT NULL,
    ->   PRIMARY KEY (`emp_no`)
    -> ) ENGINE=FEDERATED DEFAULT CHARSET=utf8mb4
    -> CONNECTION='emp_link/employees';
Query OK, 0 rows affected (0.01 sec)

 

驗證是否配置成功

root@localhost [test]>select * from employees_link limit 10;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  10001 | 1953-09-02 | Georgi     | Facello   | M      | 1986-06-26 |
|  10002 | 1964-06-02 | Bezalel    | Simmel    | F      | 1985-11-21 |
|  10003 | 1959-12-03 | Parto      | Bamford   | M      | 1986-08-28 |
|  10004 | 1954-05-01 | Chirstian  | Koblick   | M      | 1986-12-01 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak  | M      | 1989-09-12 |
|  10006 | 1953-04-20 | Anneke     | Preusig   | F      | 1989-06-02 |
|  10007 | 1957-05-23 | Tzvetan    | Zielinski | F      | 1989-02-10 |
|  10008 | 1958-02-19 | Saniya     | Kalloufi  | M      | 1994-09-15 |
|  10009 | 1952-04-19 | Sumant     | Peac      | F      | 1985-02-18 |
|  10010 | 1963-06-01 | Duangkaew  | Piveteau  | F      | 1989-08-24 |
+--------+------------+------------+-----------+--------+------------+
10 rows in set (0.35 sec)
--配置成功
--這種方式的好處在於建立本地FEDERATED表時,在connection中直接指定已經建立好的server link,不須要每次都配置一個新的鏈接。
--而且便於統一管理,只須要修改server link便可

 

FEDERATED 引擎使用注意事項

一、FEDERATED 表可能會被複制到其餘的slave數據庫,你須要確保slave服務器也可以使用定義在connection中或mysql.servers表中的link的用戶名/密碼 鏈接上遠程服務器。網絡

二、遠程服務器必須是MySQL數據庫架構

三、在訪問FEDERATED表中定義的遠程數據庫的表前,遠程數據庫中必須存在這張表。app

四、FEDERATED 表不支持一般意義的索引,服務器從遠程庫獲取全部的行而後在本地進行過濾,不論是否加了where條件或limit限制。ide

  --查詢可能形成性能降低和網絡負載,由於查詢返回的數據必須存放在內存中,因此容易形成使用系統的swap分區或掛起。性能

五、FEDERATED表不支持字段的前綴索引

六、FEDERATED表不支持ALTER TABLE語句或者任何DDL語句

七、FEDERATED表不支持事務

八、本地FEDERATED表沒法知道遠程庫中表結構的改變

九、任何drop語句都只是對本地庫的操做,不對遠程庫有影響

 

詳細信息連接:

http://dev.mysql.com/doc/refman/5.7/en/federated-usagenotes.html

相關文章
相關標籤/搜索