hanah0310 / Problem-summary

0 stars 0 forks source link

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

Open hanah0310 opened 4 years ago

hanah0310 commented 4 years ago

https://blog.csdn.net/u012637358/article/details/90439038

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

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

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

需要注意的几点:

本地的表结构必须与远程的完全一样。 2.远程数据库目前仅限MySQL 3.不支持事务 4.不支持表结构修改 名称 IP OS MYSQL版本 数据库名称 服务器A 192.168.8.172 WINDOWS MySQL 5.7 db_a 服务器B 192.168.0.189 CentOS6.5 5.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跨库的同步操作,若不存在,很遗憾,检查那个地方语句是否存在问题。谢谢 大家加油! ———————————————— 版权声明:本文为CSDN博主「寻找手艺人」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/u012637358/article/details/90439038

hanah0310 commented 4 years ago

mysql row_format 参数详解

https://www.cnblogs.com/bing-yu12/p/7735652.html