MySQL跨服务器连接表及分表自动路由查询实现问询
数据库跨服务器连接与分表路由实现方案
一、跨服务器连接数据库表的具体实现
MySQL 环境(基于FEDERATED引擎)
- 确认目标服务器(服务器2)的MySQL已开启FEDERATED引擎:
-- 检查引擎状态 SHOW ENGINES; -- 未开启则在my.cnf中添加配置后重启服务 federated
- 在服务器1的数据库1中创建映射表,关联服务器2的目标表:
CREATE TABLE product_log_server2 ( id INT NOT NULL AUTO_INCREMENT, log_content TEXT, create_time DATETIME, PRIMARY KEY (id) ) ENGINE=FEDERATED DEFAULT CHARSET=utf8mb4 CONNECTION='mysql://用户名:密码@服务器2IP:端口/目标数据库名/product_log';
PostgreSQL 环境(基于dblink扩展)
- 安装并启用dblink扩展:
CREATE EXTENSION IF NOT EXISTS dblink;
- 跨服务器查询示例:
SELECT * FROM dblink( 'host=服务器2IP port=5432 dbname=目标数据库名 user=用户名 password=密码', 'SELECT * FROM product_log WHERE create_time >= ''2024-10-01''' ) AS t(id INT, log_content TEXT, create_time TIMESTAMP);
二、按月份自动路由的配置(以MySQL为例)
基础实现:视图+静态路由
创建统一视图product_log,根据月份自动匹配对应服务器的表:
CREATE VIEW product_log AS -- 匹配服务器1的9月数据 SELECT * FROM product_log WHERE MONTH(create_time) = 9 UNION ALL -- 匹配服务器2的10、11月数据 SELECT * FROM product_log_server2 WHERE MONTH(create_time) IN (10, 11);
若需支持动态月份范围,可结合存储过程或触发器实现更灵活的逻辑判断。
高性能进阶:分表中间件(如ShardingSphere-JDBC)
配置分表规则实现自动路由,适合高并发场景:
# ShardingSphere-JDBC 核心配置示例 rules: - !SHARDING tables: product_log: actualDataNodes: server1_db.product_log, server2_db.product_log tableStrategy: standard: shardingColumn: create_time shardingAlgorithmName: month-router shardingAlgorithms: month-router: type: INLINE props: algorithm-expression: $->{MONTH(create_time) == 9 ? 'server1_db.product_log' : 'server2_db.product_log'}
内容的提问来源于stack exchange,提问作者Александр Коваленко
相关产品推荐
相关产品推荐

