mysql远程同步数据表_关于MYSQL的远程数据库表间同步的构思与测试

2023-10-27

关于MYSQL的远程数据库表间同步的构思与测试

前沿:由于业务需求,客户需要同步一个数据库部分表到另外一台服务器上。使用mysql日志复制方案行不通。只能从mysql触发器+mysql的 federated引擎来解决。

第一, 打开Mysql的federated引擎.

在my.cnf文件内的[mysqld]加入federated,重启mysql. 查询

mysql> show engines ;

+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

| Engine | Support | Comment | Transactions | XA | Savepoints |

+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

| CSV | YES | CSV storage engine | NO | NO | NO |

| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |

| MyISAM | YES | MyISAM storage engine | NO | NO | NO |

| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |

| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |

| FEDERATED | YES | Federated MySQL storage engine | NO | NO | NO |

| ARCHIVE | YES | Archive storage engine | NO | NO | NO |

| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |

| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |

+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

9 rows in set (0.00 sec)

操作成功。

第二, 建库表的图示

4d13931df60f2a18110f9449da11f0a9.png

830159

数据源:192.168.1.1

Federated:192.168.1.1

远程:192.168.1.2

第三, 除了源码,创建一个触发器维护的federated引擎库。

CREATE TABLE `db_admin` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`role_id` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '角色组',

`username` varchar(50) NOT NULL COMMENT '用户名',

`password` varchar(50) NOT NULL COMMENT '密码',

`realname` varchar(50) NOT NULL COMMENT '真实姓名',

`notepad` text NOT NULL COMMENT '备忘录',

`sex` char(5) NOT NULL DEFAULT '男' COMMENT '性别',

`telephone` varchar(50) NOT NULL COMMENT '电话',

`mobile_telephone` varchar(50) NOT NULL COMMENT '手机',

`fax` varchar(50) NOT NULL COMMENT 'FAX',

`web_url` varchar(100) NOT NULL COMMENT '网址',

`email` varchar(50) NOT NULL COMMENT '电子邮件',

`qq` varchar(50) NOT NULL COMMENT 'QQ',

`address` varchar(100) NOT NULL DEFAULT '' COMMENT '地址',

`login_count` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '登录次数',

`create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',

`update_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',

`last_login_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '最后登录时间',

`country_tag_id` int(11) NOT NULL COMMENT '国家标签',

`disable_login` tinyint(1) NOT NULL COMMENT '是否可以登录',

`mid` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '媒体id',

PRIMARY KEY (`id`)

) ENGINE=FEDERATED DEFAULT CHARSET=utf8 CONNECTION='mysql://root:root@192.168.1.2/remote_db/db_admin'

说明:mysql://root:root@192.168.1.2/remote_db/admin 格式是:用户名:密码@IP/数据库/表名

第四, 在原表192.168.1.1创建触发器。以admin表为示例。

1,插入

DELIMITER $$

USE `dbforex`$$

DROP TRIGGER /*!50032 IF EXISTS */ `t_db_admin_insert`$$

CREATE

/*!50017 DEFINER = 'root'@'%' */

TRIGGER `t_db_admin_insert` AFTER INSERT ON `db_admin`

FOR EACH ROW BEGIN

INSERT INTO dbforex_remote.`db_admin` (`id`, `role_id`, `username`, `password`, `realname`, `notepad`, `sex`, `telephone`, `mobile_telephone`, `fax`, `web_url`, `email`, `qq`, `address`, `login_count`, `create_time`, `update_time`, `last_login_time`, `country_tag_id`, `disable_login`, `mid`) VALUES (NEW.id, NEW.role_id, NEW.username, NEW.password, NEW.realname, NEW.notepad, NEW.sex, NEW.telephone, NEW.mobile_telephone, NEW.fax, NEW.web_url, NEW.email, NEW.qq, NEW.address, NEW.login_count, NEW.create_time, NEW.update_time, NEW.last_login_time, NEW.country_tag_id, NEW.disable_login, NEW.mid); END; $$

DELIMITER ;

2,修改

DELIMITER $$

USE `dbforex`$$

DROP TRIGGER /*!50032 IF EXISTS */ `t_update_db_admin`$$

CREATE

/*!50017 DEFINER = 'root'@'%' */

TRIGGER `t_update_db_admin` AFTER UPDATE ON `db_admin`

FOR EACH ROW BEGIN

UPDATE `dbforex_remote`.db_admin SET `id`=new.id,`role_id`=new.role_id, `username`=new.username,`password`=new.password,`realname`=new.realname, `notepad`=new.notepad,`sex`=new.sex,`telephone`=new.telephone, `mobile_telephone`=new.mobile_telephone, `fax`=new.fax, `web_url`=new.web_url, `email`=new.email, `qq`=new.qq, `address`=new.address, `login_count`=new.login_count, `create_time`=new.create_time, `update_time`=new.update_time,`last_login_time`=new.last_login_time, `country_tag_id`=new.country_tag_id, `disable_login`=new.disable_login, `mid`=new.mid WHERE id=OLD.id;

END;

$$

DELIMITER ;

3,删除

DELIMITER $$

USE `dbforex`$$

DROP TRIGGER /*!50032 IF EXISTS */ `tr_delete_db_admin`$$

CREATE

/*!50017 DEFINER = 'root'@'%' */

TRIGGER `tr_delete_db_admin` AFTER DELETE ON `db_admin`

FOR EACH ROW BEGIN

-- 检查当前 环境,避免递归.

IF @disable_trigger IS NULL THEN

-- 设置禁用触发器标志.

SET @disable_trigger = 1;

-- 删除目标表

DELETE FROM dbforex_remote.db_admin WHERE id=old.id;

-- 恢复禁用触发器标志.

SET @disable_trigger = NULL;

END IF;

END;

$$

以上的触发器完成,对需要操作的表都是跟以上操作。(但是维护表字段,暂时只能不能用此方案)。

第五, 在远程服务器创建数据库,也创建表db_admin,表字段跟源服务器一致。

第六, 测试

在源表192.168.1.1内插入一条记录:

INSERT INTO `dbforex`.`db_admin` (`id`, `role_id`, `username`, `password`, `realname`, `notepad`, `sex`, `telephone`, `mobile_telephone`, `fax`, `web_url`, `email`, `qq`, `address`, `login_count`, `create_time`, `update_time`, `last_login_time`, `country_tag_id`, `disable_login`, `mid`) VALUES (NULL, '19', 't_test05_q19', '', 'wx1', '', '男', '', '', '', '', '', '', '', '0', '1466488294', '1466488294', '0', '8', '0', '134');

查看192.168.1.2

SELECT * FROM  `dbforex`.`db_admin` ; //结果有记录,操作成功。结果略。

同样操作修改和删除,都正常。还有未考虑批量数据的维护。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql远程同步数据表_关于MYSQL的远程数据库表间同步的构思与测试 的相关文章

随机推荐

  • Android. 解决依赖冲突 Program type already present

    目录 常用引用 解决方案 在实际开发中 为了提高开发速度和效率 避免不了引用第三方提供的依赖和类库 如果含有相同依赖的类库被我们引用时 而他们的版本又不相同 就有可能会导致一系列问题和异常 常用引用 网络相关 okhttp retrofit
  • OpenCV使用CMake和MinGW的编译安装及其在Qt配置运行

    前言 本篇博文是使用 32 位的 MinGW 在 Windows 下编译 OpenCV 生成 32 位的 dll 关于使用 64 位的 MinGW 编译 OpenCV 生成 64 位的 dll 见 OpenCV使用CMake和MinGW w
  • Spark基础概念

    概念 Spark 提供了一个全面 统一的框架用于管理各种有着不同性质 文本数据 图表数据等 的数据集和数据源 批量数据或实时的流数据 的大数据处理的需求 核心架构 Spark Core 包含Spark 的基本功能 尤其是定义RDD 的API
  • google v8使用示例

    概念解释 Handle V8里使用Handle类型来托管 JavaScript对象 与C 的std shared pointer类似 Handle类型间的赋值均是直接传递对象引用 但不同的是 V8使用自己的GC来管理对象生命周期 而不是智能
  • 【转载】CSS3之Clip(裁剪)拓展阅读

    Clip属性是大家经常会误解的一个属性 这篇文章帮助大家充分的了解和学习clip属性 用这个属性制作出更好的效果 我可以确定Clip属性有很多同学并不知道 因为这个属性使用率非常的底 我初次接触是在Drupal的主题之中 他们有一段用来隐藏
  • 人才管理是什么意思_复合型人才是什么意思(复合型人才八种能力)

    有人经常会这样想 自己专业性知识很扎实 可为啥还是找不到满意的工作 原文来自www 777n com 复合型人才 自媒体www 777n com 对 一个优秀的企业在决定是否录用你 考虑的肯定不只是一点 学历 专业知识 工作经验等等方面 企
  • ios post上传文件到服务器,iOS 使用Post方法上传文件或图片

    在iOS开发中使用POST请求上传文件分为三步 1 设置请求行 NSURL url NSURL URLWithString NSString stringWithFormat 2 设置post请求 post请求抽出到NSMutableURL
  • 比较两个set是否相等?(C++)

    假设有两个set如下 include
  • Python中数据类型和变量的使用

    常用数据类型 计算机能处理的远远不止数值 还可以处理文本 图形 音频 视频 网页等各种各样的数据 而处理不同的数据 需要使用不同的数据类型来进行表示 数字型 整型 int 浮点型 float 复数 complex 布尔型 bool 只有两个
  • Ubuntu 安装 Samba 服务器

    1 Ubuntu 安装 Samba 服务器 确认安装 dpkg l grep samba 安装 sudo apt get install samba samba common 卸载 sudo apt get autoremove samba
  • 【YOLOv7/v5系列算法改进NO.46】融合DLinkNet模型中协同双注意力机制CDAM2

    文章目录 前言 一 解决问题 二 基本原理 三 改进办法 前言 作为当前先进的深度学习目标检测算法YOLOv7 已经集合了大量的trick 但是还是有提高和改进的空间 针对具体应用场景下的检测难点 可以不同的改进方法 此后的系列文章 将重点
  • 保证分布式系统数据一致性的6种方案

    原文 http weibo com ttarticle p show id 2309403965965003062676 问题的起源 在电商等业务中 系统一般由多个独立的服务组成 如何解决分布式调用时候数据的一致性 具体业务场景如下 比如一
  • 解决pycharm中unresolved reference ‘ ’无法导入工程中的包的问题

    跑一篇论文中的代码 一直有错误 显示无法导入包 明明我的导入的包都在工程中 但当我在main py中添加trainers包时 from trainers import 会出现这种错误 经过改正 有两种方法解决 一 将 py文件全部移出src
  • 【JavaEE】多线程(二)

    多线程 二 文章目录 多线程 二 第一个多线程程序 观察线程 sleep 创建线程 继承Thread类 重写run方法 实现Runnable 重写run 继承Thread 重写run 实现Runnable 重写run 基于lambda表达式
  • 内存卡数据删除了怎么恢复?sd卡数据恢复,3个步骤找回

    sd卡就是常见的内存卡 它作为数据的存储设备之一 通常用来保存照片 音频 视频等数据 但是因为误删除或者格式化原因把里面的数据删除了怎么办 让小编来告诉你sd卡数据恢复的方法 无须再为sd卡数据丢失而烦恼了 一 sd卡数据丢失的原因 在恢复
  • 中文文本摘要提取 (文本摘要提取 有代码)基于python

    任务简介 文本摘要旨在将文本或文本集合转换为包含关键信息的简短摘要 文本摘要按照输入类型可分为单文档摘要和多文档摘要 单文档摘要从给定的一个文档中生成摘要 多文档摘要从给定的一组主题相关的文档中生成摘要 按照输出类型可分为抽取式摘要和生成式
  • 在QWidget中使用QML的控件,举一个例子

    好的 在 QWidget 中使用 QML 的控件 你需要使用 Qt Quick 的 QQuickWidget 控件 下面是一个例子 include
  • UE4 C++ 位移枚举类型

    UE4中的移位枚举 枚举经常被序列化并存储为int 一般UE4中的枚举为uint8
  • Java 补全两个年份之间缺失的年份\计算两个日期相差年数

    计算两个日期相差年数 public static int yearDateDiff Date startDate Date endDate Calendar calBegin Calendar getInstance 获取日历实例 Cale
  • mysql远程同步数据表_关于MYSQL的远程数据库表间同步的构思与测试

    关于MYSQL的远程数据库表间同步的构思与测试 前沿 由于业务需求 客户需要同步一个数据库部分表到另外一台服务器上 使用mysql日志复制方案行不通 只能从mysql触发器 mysql的 federated引擎来解决 第一 打开Mysql的