代码之家  ›  专栏  ›  技术社区  ›  Matt Rogish

从SQL Server高效更新mysql表

  •  2
  • Matt Rogish  · 技术社区  · 16 年前

    我们在数据中心有一个mysql数据库(大部分是只读的,所以是myisam表),它与现场的SQL Server数据库进行对话。广域网存在一些明显的延迟(超过100毫秒);大约6个月后,SQL Server DBMS将向上移动到数据中心(例如,相同的千兆局域网)。

    在mysql数据库中,我有几千行需要从SQL Server数据库的结果中更新。MySQLdb连接到一个运行在Linux上的Rails应用程序上,所以我想保留逻辑,以便在任何一个应用程序中尽可能多地迁移数据。 shell脚本或rake/ruby任务 (我们不是Windows应用程序开发人员,因此Win32应用程序等 马上出来 !).

    这是一个相当简单的过程。在伪代码中:

    SELECT id
         , amount
      FROM bank_account.on_SQL_Server
     WHERE (some logic)
    
    FOREACH ROW:
      UPDATE bank_account.on_MySQL
         SET amount = $some_amount
       WHERE id     = $some_id
    

    假设有几千行需要更新,并且经常更新(每5分钟一次)。另外,假设我无法知道SQL Server中哪些行发生了数量更改(不幸的是!)所以我不能把它限制在只修改过的行上——我必须把它们发送到所有地方(是的,但是SQL Server数据库是一个不能修改的第三方应用程序 编辑:我们确实可以控制DBMS,所以我们可以做一些简单的修改,例如表上的触发器或新的存储过程——只是不更改表模式来添加,比如说,最后一个更新的列——但是我想把这个选项保存为最后一个方法。 )

    如何最好地做这个更新过程最小化运行时?这个过程需要每隔几分钟运行一次(越快越好),从Ruby向SQL Server和MySQL发出双重连接的速度太慢了。这可能是一些由myisam引擎发出的写表锁,但转换到innodb似乎不会使其更快(系统正在测试中,因此不容易模拟生产将接收的相同类型的负载,这让我相信它与锁无关)。

    我目前倾向于将视图(对应于上面的SQL Server语句)映射到一个文件,将FTP映射到Linux服务器,然后使用Ruby来前移该文件(并执行许多序列化的SQL语句),但我必须想象有更好的方法。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Nick Kavadias    16 年前

    可以将mysql作为链接服务器添加到SQL Server,如下所示 these instructions

    从那里你可以做一些事情,比如在你的mysql表和mssql表之间做一个连接,在这个连接中,数量不相等,并相应地更新它们。 然后,您可以将其作为SQL作业运行,以使数据库每5分钟保持同步。

    如。

    SELECT * FROM mysql.dbo.bank_account myb 
    INNER JOIN bank_account sqlb 
    ON myb.id = sqlb.id 
    AND sqlb.amount <> myb.amount
    

    一旦您可以从使用较少资源的SQL Server内部查询mysql表,就可能有更聪明的方法来确定哪些数据发生了更改,但这只是一个开始。

        2
  •  0
  •   BCS    16 年前

    您可能可以将另一个表添加到MSSQL端,以免通过缓存旧值或通过 triggers (yuck) .

    与之正交的是,您可能会看到是否有一个mysql引擎提供类似mssql db的远程视图 federated engine 为MySQL做的。