MySQL开启federated引擎实现数据库表映射[案例]

    xiaoxiao2022-06-30  117

    1 准备环境

    MySQL中针对不同的功能需求提供了不同的存储引擎。所谓的存储引擎也就是MySQL下特定接口的具体实现。

    FEDERATED是其中一个专门针对远程数据库的实现。一般情况下在本地数据库中建表会在数据库目录中生成相应的表定义文件,并同时生成相应的数据文件。 但通过FEDERATED引擎创建的表只是在本地有表定义文件,数据文件则存在于远程数据库中(这一点很重要)。

    使用FEDERATED建表语句如下: CREATE TABLE (…) ENGINE =FEDERATED CONNECTION=‘mysql://[name]:[pass]@[location]:[port]/[db-name]/[table-name]’ 创建成功后就可直接在本地查询相应的远程表了。

    需要注意的几点:

    本地的表结构必须与远程的完全一样。 2.远程数据库目前仅限MySQL 3.不支持事务 4.不支持表结构修改 名称IPOSMYSQL版本数据库名称服务器A192.168.8.172WINDOWSMySQL 5.7db_a服务器B192.168.0.189CentOS6.55.7.17 MySQL Community Server (GPL)db_b

    2 需求

    将服务器A数据库db_a表中数据,同步更新到服务器B数据库db_b表中(即:实现mysql跨库同步操作)

    3 查看federated引擎是否开启

    通过Navicat链接服务器A上面的数据库db_a,在查询页面中输入一下指令:

    show engines;

    FEDERATED引擎没有启动

    4 开启federated引擎

    Windows系统 : 在my.ini中加入federated 打开my.ini文件 在[mysqld]下方添加federated 修改完之后再任务管理器中重新启动mysql服务 再次数据指令查看,FEDERATED 已开启

    show engines;

    5 建立映射关系

    在服务器A上有MySQL数据库db_a,在服务器B上有MySQL数据库db_b。现在需要将db_a库中的jg_student表数据映射到数据库db_b中。此时需要在数据库db_b中建立表t_student数据库表,注意ENGINE和CONNECTION。

    db_a中jg_student表(服务器A)

    CREATE TABLE `jg_student` ( `sfzh` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `xm` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `xb` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `mz` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `ksly` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `xy` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `rz` tinyint(4) DEFAULT NULL, PRIMARY KEY (`sfzh`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

    db_b中t_student表(服务器B)

    CREATE TABLE `t_student` ( `student_id` int(20) NOT NULL, `college_name` varchar(255) DEFAULT NULL, `province_name` varchar(255) DEFAULT NULL, PRIMARY KEY (`student_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    在db_a中建立fed_student表,表结构同db_b中t_student一致

    -- 创建学生基本信息表fed_student CREATE TABLE `fed_student` ( `student_id` varchar(30) NOT NULL, `college_name` varchar(255) NOT NULL, `province_name` varchar(255) NOT NULL, PRIMARY KEY (`student_id`) ) ENGINE=FEDERATED CONNECTION='mysql://root:898@192.168.0.189:3306/db_a/t_student';

    其中root为访问服务器B上mysql的用户名,后面898是密码。先要保证这个帐户可以访问到服务器B(192.168.0.189)这台服务器的mysql。 当然要注意3306这个端口。若不能访问看下是不是没有这个帐户在当前服务器ip下的访问权限。

    创建触发器

    触发器具体方法不明白的可以百度

    -- 创建触发器 DELIMITER $$ CREATE TRIGGER `student_insert_trigger` AFTER INSERT ON `jg_student` FOR EACH ROW BEGIN -- 插入数据 INSERT INTO `fed_student`( `student_id`, `college_name`, `province_name` ) VALUES ( new.`sfzh`, new.`xy`, new.`ksly` ); END; $$ DELIMITER;

    6 测试

    服务器A(192.168.8.172)链接db_a中的jg_student表,手动添加一条数据,提交commit后,观察服务器B(192.168.0.189)db_b库中t_student表是否已拥有新添加的数据,若存在,那恭喜你成功完成mysql跨库的同步操作,若不存在,很遗憾,检查那个地方语句是否存在问题。谢谢 大家加油!


    最新回复(0)