当前位置: 代码网 > it编程>数据库>Mysql > MySQL 存储引擎 FEDERATED使用方法

MySQL 存储引擎 FEDERATED使用方法

2026年03月12日 Mysql 我要评论
1. 什么是 federated 存储引擎federated 是 mysql 的一个特殊存储引擎,它允许你访问远程 mysql 服务器上的表数据,而无需使用复制(replication)或集群(clu

1. 什么是 federated 存储引擎

federated 是 mysql 的一个特殊存储引擎,它允许你访问远程 mysql 服务器上的表数据,而无需使用复制(replication)或集群(cluster)技术。本地创建一个 federated 表,它实际上是一个指向远程表的链接

2. 工作原理

本地 mysql 服务器          远程 mysql 服务器
┌─────────────────┐      ┌─────────────────┐
│ federated 表     │─────>│ 实际数据表       │
│ (只存结构)       │      │ (存储真实数据)   │
└─────────────────┘      └─────────────────┘
       ↓                        ↓
   元数据                    数据存储
   (无数据)                  (真实数据)

核心机制:
- 本地不存储任何数据,只保存表结构
- 所有查询操作通过 mysql client api 发送到远程服务器
- 每次查询都是实时的,直接获取远程数据
- 支持 insert、update、delete 等操作

3. 使用场景

✅ 适合的场景:

1. 数据整合:需要跨多个 mysql 实例查询数据
2. 分布式查询:避免数据迁移,实时访问远程数据
3. 数据同步中间方案:作为 etl 的临时方案
4. 报表系统:汇总多个数据源的数据
5. 遗留系统集成:访问旧系统数据而不影响原有架构

❌ 不适合的场景:

1. 高性能要求的应用
2. 频繁大量数据操作
3. 网络不稳定的环境
4. 需要事务一致性的关键业务

4. 使用方法

步骤 1:启用 federated 引擎

-- 检查是否启用
show engines;
-- 如果未启用,在 my.cnf/my.ini 中添加
[mysqld]
federated
-- 或者动态加载(如果已编译)
install plugin federated soname 'ha_federated.so';

步骤 2:创建远程表(在远程服务器)

-- 在远程服务器 (例如:192.168.1.100:3306) 
create database remote_db;
use remote_db;
create table users (
    id int primary key auto_increment,
    username varchar(50),
    email varchar(100),
    created_at datetime
) engine=innodb;

步骤 3:创建本地 federated 表

方法一:使用 connection 参数

use local_db;
create table users (
    id int primary key auto_increment,
    username varchar(50),
    email varchar(100),
    created_at datetime
) engine=federated
connection='mysql://username:password@192.168.1.100:3306/remote_db/users';

方法二:使用 data directory 和 index directory(旧版本)

create table users (
    id int primary key auto_increment,
    username varchar(50),
    email varchar(100),
    created_at datetime
) engine=federated
data directory='mysql://user:pass@host:port/db/table';

步骤 4:使用示例

-- 查询远程数据(和本地表一样使用)
select * from users where username = 'john';
-- 插入数据(实际插入到远程)
insert into users (username, email) values ('alice', 'alice@example.com');
-- 更新操作
update users set email = 'new@example.com' where id = 1;
-- 删除操作
delete from users where id = 1;
-- join 本地表和 federated 表
select l.*, f.* 
from local_table l 
inner join users f on l.user_id = f.id;

5. 配置选项

# my.cnf / my.ini
[mysqld]
# 启用 federated
federated
# 可选配置
federated_max_connections=100        # 最大连接数
read_buffer_size=256k                # 读缓冲区
read_rnd_buffer_size=256k            # 随机读缓冲区

6. 优缺点分析

✅ 优点:

1. 实时性:直接访问远程最新数据
2. 透明性:对应用层透明,像使用本地表一样
3. 灵活性:支持跨库、跨服务器查询
4. 无需复制:不需要配置主从复制
5. 节省空间:本地不存储数据

❌ 缺点:

1. 性能问题:每次查询都需要网络往返
2. 单点故障:远程服务器宕机则无法访问
3. 不支持索引下推:所有过滤在本地进行
4. 事务限制:不支持分布式事务
5. 调试困难:问题排查复杂

7. 废弃原因

federated 存储引擎在 mysql 8.0 中被标记为弃用(deprecated),主要原因:

1. 维护成本高:代码复杂,维护团队少
2. 性能瓶颈:网络延迟导致性能差
3. 功能限制多:
   - 不支持 alter table
   - 不支持索引优化
   - 不支持批量操作优化
   - 不支持子查询优化
4. 稳定性问题:容易出现连接中断、数据不一致
5. 更好的替代方案:
   - mysql replication:主从复制更可靠
   - mysql cluster:集群方案更强大
   - mysql fabric:高可用方案
   - etl 工具:定期同步数据
   - 应用层解决:微服务 api 调用

8. 替代方案示例

方案一:使用视图 + 复制

-- 在主库
create view all_users as
select * from db1.users
union all
select * from db2.users;
-- 通过复制到从库,从库查询视图

方案二:应用层聚合

// java 示例
@service
public class userservice {
    @autowired
    private userrepository localrepo;
    @autowired
    @qualifier("remoteuserrepository")
    private userrepository remoterepo;
    public list<user> getallusers() {
        list<user> all = new arraylist<>();
        all.addall(localrepo.findall());
        all.addall(remoterepo.findall());
        return all;
    }
}

方案三:使用 etl 工具

# 使用 datax 同步
{
  "job": {
    "content": [{
      "reader": {
        "name": "mysqlreader",
        "parameter": {
          "connection": [{
            "table": ["users"],
            "jdbcurl": ["jdbc:mysql://remote:3306/db"]
          }]
        }
      },
      "writer": {
        "name": "mysqlwriter",
        "parameter": {
          "connection": [{
            "table": ["users"],
            "jdbcurl": "jdbc:mysql://local:3306/db"
          }]
        }
      }
    }]
  }
}

9. 总结建议

如果是新项目,建议使用其他方案替代 federated。如果是现有系统在使用,建议制定迁移计划,逐步替换为更可靠的方案。

到此这篇关于mysql 存储引擎 federated的文章就介绍到这了,更多相关mysql存储引擎federated内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • MySQL停服务方式新增从库的实操指南

    MySQL停服务方式新增从库的实操指南

    在 mysql 主从复制架构中,当需要扩展从库节点时,若业务允许短时间停服务(比如夜间维护窗口),直接复用旧从库的数据和配置是最高效的方案。这种方式无需重新全量... [阅读全文]
  • MySQL分区表使用保姆级教程

    分区表是什么分区表就是把一张表的数据,按照设置好的条件,单独存储在磁盘的不同位置,也就是不同分区的数据是独立的,互不影响的。在没有分区表的情况下,一张表的数据就是存储在一个文件中,…

    2026年03月11日 数据库
  • 导致MySQL错误1064的原因及最佳解决方案

    用户可以通过修正相关的 sql 查询来解决 mysql 语法错误 1064。错误信息本身会突出显示查询中出现问题的行号。常见的修复方法包括检查输入错误的命令、替换已废弃的命令以及处…

    2026年03月10日 数据库
  • MySQL在Linux系统上的完整安装与配置流程

    MySQL在Linux系统上的完整安装与配置流程

    安装与卸载中,用户全部切换成为root,⼀旦安装,普通用户能使用的一:卸载不要的环境ps ajx |grep mariadb # 先检查是否有mariadb存在... [阅读全文]
  • MySQL强制索引中USE/FORCE INDEX用法与避坑

    MySQL强制索引中USE/FORCE INDEX用法与避坑

    mysql 的查询优化器会根据统计信息(如基数、数据分布)自动选择它认为 “最优” 的索引。但有时它的判断可能不准,这时就需要我们手动干... [阅读全文]
  • MySQL 数据库基础入门从概念到实战

    前言:在程序开发中,数据存储是核心需求之一。虽然文件也能保存数据,但面对安全性、查询效率、海量存储等场景,文件存储的短板暴露无遗。而数据库作为专门的数据分析和管理工具,完美解决了这…

    2026年03月10日 数据库

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com