保持许多数据库始终同步

时间:2015-02-08 19:04:38

标签: .net oracle sqlite synchronization

我有一个桌面PC网络(Windows 7),这些桌面PC在地理位置上彼此分开(与LAN连接)。

网络有一个Oracle后端。

我想在每台PC上本地安装一个数据库(其中大约12个,目前正在考虑SQLite,但对其他可能性开放)。

我需要保证本地数据库始终保持同步,并始终与Oracle数据库保持同步,或者至少只要有网络连接(网状拓扑)就保持同步。

同步只涉及一个表。

对于这个问题,有哪些可行的有效解决方案?最好事先与你合作过。

2 个答案:

答案 0 :(得分:2)

由于我不知道这个领域的知识,我不确定这会完全解决你的问题,但是阅读这个问题我意识到你需要一个数据库复制软件包,所以我想建议你是否可以研究一下SymmetricDS 为什么我建议这样做?来自其官方网站的基本介绍。 SymmetricDS是可免费使用的开源软件

  

SymmetricDS是用于多主数据库的开源软件   复制,过滤同步或跨越的转换   异构环境中的网络。它支持多种   具有单向或双向异步数据的订户   复制。它使用Web和数据库技术来复制表   在关系数据库之间,如果需要,几乎实时。该   软件旨在扩展到大量数据库,工作   跨越低带宽连接,并承受网络时间   中断。

     

通过使用数据库触发器,SymmetricDS可确保数据更改   被捕获并保持原子性。支持数据库供应商   通过数据库方言层提供,实现   MySQL,Oracle,SQL Server,SQL Server Azure,PostgreSQL,DB2,   Informix,Interbase,Firebird,HSQLDB,H2,Apache Derby,Greenplum,   和SQLite包括在内。

可以将同步配置为定期推送数据或提取数据。 SymmetricDS允许在两个或更多层节点之间进行同步,如以下场景中可能需要的那样:

  • 少数区域服务器与一般办公室同步 到偏远的地理区域
  • 使用嵌入式数十个销售点(POS)注册节点 数据库与商店服务器同步
  • 使用部门类数据库的数千个商店服务器节点 与区域节点同步

功能

  • 数据通道 - 表同步被分组为独立的 信道
  • 保证交付 - 保证同步数据到达 目标目的地。如果同步失败,则同一批次 数据将被重试,直到成功或手动干预为止 拍摄。失败的所有其他数据同步都将暂停 仅限渠道。
  • 交易意识 - 数据更新被记录并重播 相同的原子性
  • 集中配置 - 从a下载所有配置 中央注册服务器
  • 多个部署选项 - 独立引擎,Web应用程序, 嵌入式软件组件
  • 数据过滤和重新路由 - 允许本地化密码和 敏感数据过滤/路由
  • HTTP传输 - 可插入传输默认为表示状态 传输(REST风格)HTTP服务
  • 有效负载压缩 - 可选择压缩传输数据
  • 通知方案 - 推(涓流数据)或拉(涓流轮询) 数据)改变
  • 对称数据协议 - 一种简单快速的流数据格式 生成,解析和加载
  • 插件API - 通过扩展和插件添加自定义项 点
  • 双向表同步 - 可以同步相同的表 进出主机系统,同时避免更新循环
  • 数据库版本控制 - 按版本指定数据同步 目标数据库
  • 自动创建数据库 - 可选择允许创建和升级 数据库架构
  • 可嵌入 - 足够小以嵌入或引导另一个 应用程序(即POS应用程序)
  • 多个架构 - 自然支持多个数据库架构 通过数据通道的存在
  • 主键更新 - 捕获“之前”和“之后”数据 已更改,允许更新主键数据
  • 远程管理 - 通过Java管理进行管理 扩展(JMX)控制台
  • 远程数据库管理 - 可以交付和运行SQL 通过同步基础设施建立远程数据库
  • 初始数据加载 - 使用初始或。准备卫星数据库 恢复数据负载

希望我的回答有帮助!

答案 1 :(得分:-4)

你需要一个PHP脚本来检查一行中一个表的变化。 $ dbArray是一个包含数据库的所有Computernames的数组。

$dbArray[0]="Comp1";
$dbArray[1]="Comp2";
$checkvalue="";
foreach ($dbArray as $value){
  $db=mysqli_connect($value,"Username","Password");
  mysqli_set_charset($db,"utf8");
  mysqli_select_db($db,"DB_NAME");
  $sql = "SELECT * FROM TABLE_NAME WHERE id=1";
  $result = mysqli_query($db,$sql);
  while ($row = mysqli_fetch_assoc($result)){
    if($row["Rowname"]!=$checkvalue&&$checkvalue!=""){
      UpdateData ($value);
    }else{
      //Value did not change
    }
  }
}

你需要一个函数UpdateData来交换数据。

function UpdataData ($ComputerChancedData){
}

该功能必须从计算机$ComputerChancedData读取数据并将其写入所有非$ComputerChancedData的计算机。

// function UpdateData
// Here have to be the Code which gets the new Value
$checkvalue="";
foreach ($dbArray as $value){
  if($value!=$ComputerChancedData){
    $db=mysqli_connect($value,"Username","Password");
    mysqli_set_charset($db,"utf8");
    mysqli_select_db($db,"DB_NAME");
    $sql = "UPDATE TABLE_NAME SET ROW_NAME='$NEWVALUE' WHERE id=1";
    $result = mysqli_query($db,$sql);
  }
}

因为必须在每分钟重新加载,所以必须重新加载Javascript:

<script>
(function(){(setTimeout(function(){window.location.href="servername/seitenname.php";},60000))});
</script>

编辑:我使用MySqli作为此脚本

EDIT2:所有数据库必须具有相同的用户名和密码。如果不是,您必须使用正确的用户创建新用户。