`

一个将mysql表导入到mongodb的ruby脚本

阅读更多

功能:

将mysql指定表的数据导入到mongodb的指定表,导入过程保证数据不丢失,如果数据有更新也会重新再导。

 

要求:

源表必须要有两个字段:id:主键 mmm_ts:最后更新时间戳

 

 

 

 

require 'rubygems'
require 'mongo'
require 'active_record'

mongo_server =
    {:local =>
         {:server => "localhost", :port => 27017}
    }
mysql_server =
    {:local =>
         {
             :adapter => 'mysql',
             :host => 'localhost',
             :username => 'root',
             :password => '$$$',
             :encoding => 'utf8'
         }         ,
      :main_db =>
         {
             :adapter => 'mysql',
             :host => 'mydb.com',
             :username => 'abc',
             :password => 'cba',
             :encoding => 'utf8'
         }
    }

#从mysql指定的表中将数据导入到mongodb中
#源表必须有两个字段:id,自增, mmm_ts, 时间戳
#导数据的时候先按上次操作截止的时间戳获取指定数量的数据,然后再将数据存入到目标库中(如果id相同则更新数据)
#导入完毕更新截止点
class MMM
  def initialize(mysql_server, mongo_server, operation_type)
    @mysql_server= mysql_server
    @mongo_server = mongo_server
    @operation_type = operation_type
  end

  def migrate(source_db, source_table, process_items_each_time, target_db, target_table)
    mongodb = Mongo::Connection.new(@mongo_server[:server], @mongo_server[:port]).db(target_db)
    mongo_collection = mongodb.collection(target_table)
    @mysql_server[:database] = source_db
    ActiveRecord::Base.establish_connection(@mysql_server)
    model = Class.new(ActiveRecord::Base) do
      set_table_name source_table
    end
    operation_point = OperationPoint.new(mongodb)
    opt = operation_point.get(@operation_type)
    if opt == nil
      opt = 0
      mongo_collection.create_index("id", :unique => true)
    else
      opt = opt["point"].getlocal()
    end
    cnt = model.count( :conditions => ["mmm_ts=?", opt])
    #防止在过多mmm_ts字段的值都一样的情况下无法进行到下一步,这里一定要避免大量mmm_ts字段的值相同
    process_items_each_time = cnt + 1 if cnt >= process_items_each_time
    records = model.find(:all, :conditions => ["mmm_ts>=?", opt], :order => "mmm_ts", :limit => process_items_each_time)
    puts("#{records.length} records read from mysql")
    records.each do |record|
      record_hash = {}
      model.column_names.each do |column|
        record_hash[column] = record.read_attribute(column)
      end

      mongo_collection.update({:id => record.id}, record_hash, :upsert => true)
      opt = record.mmm_ts

    end
    operation_point.save(@operation_type, opt)
    puts("#{records.length} records saved to mongodb")
  end
end

#操作点
class OperationPoint
  def initialize(db)
    @table = db.collection("operation_point")
    @table.create_index("operation", :unique => true)
  end

  def save(operation, point)
    @table.update({:operation => operation}, {:operation => operation, :point => point}, :upsert => true)
  end

  def get(operation)
    return @table.find_one({:operation => operation})
  end
end


mmm = MMM.new(mysql_server[:main_db], mongo_server[:local], "export_mdb")
while (true) do
  begin
    mmm.migrate("mdb_production", "bet_plans", 3000, "mdb_production", "export_mdb")
  rescue Exception => ex
    puts ex.message
    puts ex.backtrace.join("\n")
    sleep(30)
  ensure
    sleep(0.001)
  end


end
 

 

分享到:
评论

相关推荐

    logstash抽取mongodb 和 mysql 的全套 ruby脚本

    本文将详细介绍如何使用Logstash结合Ruby脚本来从MongoDB和MySQL数据库中抽取数据。 首先,我们来看`mongodb.rb`脚本。这是一个Logstash插件,通常用于定义如何从MongoDB中提取数据。MongoDB是一个流行的NoSQL...

    simple-s3-backup:一个简单的 Ruby 备份解决方案,用于将 MySQL 和 MongoDB 数据库、文件目录和单个文件备份到 Amazon S3

    简单的 S3 备份一个简单的 Ruby 脚本,用于将 MySQL 数据库表、MongoDB 数据库、完整目录和单个文件组备份到 Amazon S3(简单存储服务)。 使用步骤: 设置 Amazon S3 账户: : 安装 aws/s3 Ruby gem: : 将 ...

    mongodb安装培训文档

    对于一对一、一对多关系,可以直接在一个文档内表示。当数据量过大超出单个文档限制时,可以使用引用策略。然而,引用可能导致性能下降和事务性问题,因此在强事务需求的场景下需谨慎使用。 安装 MongoDB 时,可能...

    服务器脚本.zip

    【服务器脚本.zip】是一个包含有关服务器脚本的资源压缩包,通过提供的链接(已省略实际URL,这里仅作概念说明)可以下载。密码为“1km0”,解压后,用户可以获取到名为“服务器脚本”的一系列文件,这些文件通常...

    mongo开发指南

    本MongoDB开发指南为初学者提供了一个全面的入门知识体系,从数据库基础分类到NoSQL的使用场景,再到MongoDB的核心概念和基本操作,帮助读者能够快速上手并理解MongoDB的基本使用方法。随着学习的深入,开发者能够...

    setup:个人设置脚本

    【setup:个人设置脚本】是一个面向开发者的自动化配置脚本,主要用于简化个人工作环境的搭建过程。在描述中提到的命令行安装方法是通过运行一个bash shell脚本来执行的,该脚本从GitHub仓库`mataku/mac-setup`的`...

    mongorails:在Rails应用中使用mongoDB测试应用

    MongoDB是一个NoSQL数据库,它使用文档型数据模型,提供了灵活性和高性能,而Rails是Ruby语言的一个流行Web开发框架,基于MVC(模型-视图-控制器)架构模式。在Rails应用中集成MongoDB,可以为开发者提供一种不同于...

    MongoDB数据库的特色和优点介绍

    首先,MongoDB是一个独立的服务器,它可以像MySQL或PostgreSQL那样监听端口进行连接,提供了丰富的查询、创建、更新和删除数据的工具,使得开发者能够方便地与数据库交互。 其次,MongoDB基于文档而非表格,这使得...

    xp-git-redmine

    5. **MongoDB**:虽然未直接提及,但`mongrel.rb`可能是指 Mongrel,一个Ruby web服务器,有时用于运行Redmine。Redmine可以通过多种web服务器运行,如Apache或Nginx,而Mongrel则提供了一个直接的Ruby接口。 6. **...

    基于Python的Web技术

    LAMP 是一种流行的 Web 开发平台,由 Linux、Apache、MySQL 和 PHP、Perl、Python 或 Ruby 等脚本语言组成。LAMP 具有开放灵活、开发迅速、部署方便、高可配置、安全可靠、成本低廉等优点,是目前最流行的 Web 开发...

    webapp.zip

    标题“webapp.zip”暗示了这是一个与Web应用程序相关的压缩文件,通常包含开发或部署Web应用所需的资源和配置。从描述中我们没有获得更多的具体信息,但我们可以基于常见Web应用程序的结构来探讨相关知识点。 Web...

    自己做的一个简单的网上书店~~~

    标题中的“自己做的一个简单的网上书店”表明这是一个个人开发的基于Web的应用程序,可能是为了学习或实践MVC(Model-View-Controller)架构而创建的。MVC是一种流行的设计模式,广泛应用于Web应用开发,旨在将业务...

    2009.8-2010.2(web_zy)

    4. **数据库脚本**:SQL文件可能包含数据库表结构、数据导入导出或查询语句,表明项目涉及数据库管理,如MySQL、PostgreSQL或MongoDB。 5. **版本控制**:如果项目遵循良好实践,可能会有版本控制系统如Git的提交...

    情人节表白小代码valentines-day-confession-code-master.zip

    总的来说,这个压缩包可能包含了一个全面的、情人节主题的软件项目,涵盖了从前端到后端的多种技术,并且可能涉及到数据库管理、API通信以及软件开发的最佳实践。对于想要学习和理解全栈开发或者希望在特殊日子里给...

    单个生成静态页面例子

    3. **静态化过程**:在后台运行一个脚本或工具,遍历所有需要静态化的动态页面。这个过程通常在网站更新后或者在特定时间自动进行。工具会模拟用户的请求,执行动态页面的渲染过程,但这次不是返回给浏览器,而是...

    个人博客网站

    考虑到博客内容的发布和管理,一个强大的内容管理系统(CMS)可以简化这一过程。例如,WordPress是一个广泛使用的开源CMS,它提供了丰富的主题和插件,让非程序员也能轻松创建和管理博客。 最后,性能优化是提升...

    表白源码-我想你需要.7z

    这可能涉及到MySQL、SQLite、MongoDB等数据库系统的使用。 4. **API整合**:为了增加趣味性和互动性,表白源码可能调用了第三方API,例如天气API、地图API、音乐播放服务API等,以提供实时信息或个性化体验。 5. *...

    plogbook-源码.rar

    我们可以推测,由于是关于博客系统的源码,它可能涉及到常见的技术如HTML、CSS、JavaScript(用于前端),Python、Node.js、Ruby或PHP(用于后端),以及可能使用了某种数据库系统如MySQL、PostgreSQL或MongoDB。...

Global site tag (gtag.js) - Google Analytics