`

RAILS项目中MYSQL数据库同步到ORACLE数据库

阅读更多
方法一:直接在mysql中查找到数据然后遍历保存到oracle中
 #load wifi_units data
  def load_wifi_units_data(now)
    wifi_units = Wifi::MobileUnit.find(:all,:conditions=>"length(sta_mac) > 15")
    puts "total wifi_units:  #{wifi_units.length}"
    wifi_infos = Array.new
      wifi_units.each do |wifi_unit|
        wifi_info = WlanWifiUnits.new(:sampletime => now)
        wifi_info.ap_dn          = wifi_unit.ap_dn
        wifi_info.mac            = wifi_unit.mac
        wifi_info.first_seen     = wifi_unit.first_seen
        wifi_info.last_seen      = wifi_unit.last_seen
        wifi_info.duration       = wifi_unit.duration
        wifi_info.sta_mac        = wifi_unit.sta_mac
        wifi_info.sta_ip         = wifi_unit.sta_ip
        wifi_info.sta_power      = wifi_unit.sta_power
        wifi_info.sta_rssi       = wifi_unit.sta_rssi
        wifi_info.sta_channel    = wifi_unit.sta_channel
        wifi_info.sta_vlan       = wifi_unit.sta_vlan
        wifi_info.sta_ssid       = wifi_unit.sta_ssid
        wifi_info.sta_rxframe    = wifi_unit.sta_rxframe
        wifi_info.sta_txframe    = wifi_unit.sta_txframe
        wifi_info.sta_dropframe  = wifi_unit.sta_dropframe
        wifi_info.sta_rxbytes    = wifi_unit.sta_rxbytes
        wifi_info.sta_txbytes    = wifi_unit.sta_txbytes
        wifi_info.sta_dropbytes  = wifi_unit.sta_dropbytes
        wifi_info.sta_noise      = wifi_unit.sta_noise
        wifi_info.sta_noise_rate = wifi_unit.sta_noise_rate

        wifi_infos << wifi_info
      end

      WlanWifiUnits.transaction do
        wifi_infos.each do |wifi_info|
          p "importing: #{wifi_info.ap_dn}"
          wifi_info.save
        end
      end

    Report.deal_wifi_perf(now)
    p "import wifi_units infos over!"
  end




方法二:
在需要大量数据同步的情况下采用了以下方法技术

  一:在mysql库中读取数据写入到ctl文件中
  二:如果mysql和oracle不在同一台服务器,需要配置解决夸服务器复制文件的问题
  三:将ctl文件拿过来用sqlldr工具写入到对应oracle数据库中。

首先可以定义一个ctl文件头:
例如:
OPTIONS(ERRORS=100000)
Load DATA
INFILE *
TRUNCATE INTO TABLE MIT_SSIDS
Fields terminated by '|'
TRAILING NULLCOLS
(id,cn,dn,ap_id,ssidIndex,objectclass,text,radio_no,ssidEnabled,ssidHidden,
staIsolate,dot11Auth,security,authenMode,securityCiphers,vlanId,maxSimultUsers)
BEGINDATA



#往sql文件里写数据select..into outfile
def self.build_wifi_into_outfile(src_file)
    connection.execute("select now() sampletime,ap_dn,mac,first_seen,last_seen,duration,
      sta_mac,sta_ip,sta_power,sta_rssi,sta_channel,sta_vlan,sta_ssid,sta_rxframe,
      sta_txframe,sta_dropframe,sta_rxbytes,sta_txbytes,sta_dropbytes,sta_noise,
      sta_noise_rate from wifi_mobile_units into outfile '#{src_file}'
      fields escaped by '' terminated by '|' lines terminated by '%^&'")
  end



desc 'report to load wifi_units data.'
namespace :wifi_units do
  task :import => :environment do
    puts "usage: rake wifi_units:import is_local=0 src_path='/var/lib/mysql/' imp_path='/opt/mobile/webport/tmp/hourly_import'"
    is_local = ENV['is_local']
    is_local ||= 0
    src_path = ENV['src_path']
    src_path ||= "/var/lib/mysql/"
    imp_path = ENV['imp_path']
    imp_path ||= "/opt/mobile/webport/tmp/hourly_import"
    start_time = Time.now
    puts "===================================="
    puts "start_time:  #{start_time}          "
    puts "===================================="
      now = Time.now
      now1 = Time.now
      puts "(#{now1}):begin to import wifi_units data..."
      load_wifi_units_data2(is_local,src_path,imp_path,now)
      puts "import wifi_units data successfully."
    end_time = Time.now
    puts "===================================="
    puts "end_time:  #{end_time}            "
    puts "total_time :  #{end_time - start_time}"
    puts "===================================="
  end

 
  #load wifi_units data2
  def load_wifi_units_data2(is_local,src_path,imp_path,now)
  time_start = Time.now
  src_file = src_path+"/wifi_data_import_#{now.strftime("%H")}.sql" 
  p "starting output file #{src_file}..."
  src_config = Rails.configuration.database_configuration["development"]
  src_ip = src_config["host"]
  rm_com = "rm -rf #{imp_path}/wifi_data_import_#{now.strftime("%H")}.sql"
  p rm_com
  system rm_com#生成一个空SQL文件
  if is_local == '0'   #两服务器不在一起(采用scp)
    remove_com = "ssh root@#{src_ip}  \"rm #{src_file}\""
    p remove_com
    system remove_com #将文件拷贝到相关目录下
    Wifi::MobileUnit.build_wifi_into_outfile(src_file)
    copy_com = "scp root@#{src_ip}:#{src_file} #{imp_path}/wifi_data_import_#{now.strftime("%H")}.sql"
    p copy_com
    system copy_com
  else   #两服务器在一起(采用cp)
    remove_com = "rm -rf #{src_file}"
    p remove_com
    system remove_com
    Wifi::MobileUnit.build_wifi_into_outfile(src_file)
    copy_com = "cp #{src_file} #{imp_path}/wifi_data_import_#{now.strftime("%H")}.sql"
    p copy_com
    system copy_com  #将文件拷贝到相关目录下
  end
  head_file = "#{RAILS_ROOT}/config/wifi_data_head.ctl" #获取定义好的文件头
  data_file = "#{imp_path}/wifi_data_import_#{now.strftime("%H")}.sql" #获取拷贝过来的数据文件
  format_com = "sed -i ':a;N;$ s/\\\n//g;ba' #{data_file}"
  p format_com
  system format_com
  format_com2 = "sed -i -e 's/NULL//g' -e 's/\\\\//g' -e 's/%^&/\\\n/g' #{data_file}"
  p format_com2
  system format_com2  #对数据文件过滤
  sqlldr_file = "#{imp_path}/wifi_data_import_#{now.strftime("%H")}.ctl" #生成一个新文件
  cat_com = "cat #{head_file} #{data_file} > #{sqlldr_file}"  #组装文件
  p cat_com
  system cat_com   #组装文件运行
  time_end = Time.now
  puts "total_time for build file & copy to ./tmp/hourly_import :#{time_end - time_start}"

  time_start = Time.now
  oracle_config = Rails.configuration.database_configuration["wifi_rms"]
  username = oracle_config["username"]
  password = oracle_config["password"]
  service = oracle_config["service"]
  sqlldr_com = "sqlldr userid=#{username}/#{password}@#{service},control=#{sqlldr_file},log=#{RAILS_ROOT}/log/wifi_data_import#{now.strftime("%H")}.log"
  p sqlldr_com
  system sqlldr_com #sqlldr读取导入ORACLE数据库
  time_end = Time.now
  puts "total_time for sqlldr import wifi infos :#{time_end - time_start}"

  if now.min >=0 and now.min < 59
    p "calling deal_wifi procedure"
    time_start = Time.now
    Report.deal_wifi_perf(now)
    p "import wifi_units infos over!"
    time_end = Time.now
    puts "total_time for deal wifi infos :#{time_end - time_start}"
  end
end


end



方法三:
采用ETL工具很好用。
分享到:
评论

相关推荐

    11种连接数据库的方法

    .NET Framework中的ADO.NET提供了连接、命令、数据适配器和数据集等组件,用于与SQL Server、Oracle等数据库通信。使用`SqlConnection`类创建连接,`SqlCommand`执行SQL,`SqlDataAdapter`填充DataSet。 3. **...

    ruby命令集合(一些有用的命令)

    - `rake db:schema:dump`: 将当前数据库模式导出到`db/schema.rb`文件中,方便备份或同步。 - `rake db:schema:load`: 从`db/schema.rb`文件加载数据库模式。 - `rake db:structure:dump`: 将数据库结构导出为SQL...

    JAVA上百实例源码以及开源项目源代码

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    Erlang开发电信网管项目实践.ppt

    在系统架构上,网管项目被划分为多个层次:前端呈现层使用AJAX和Rails技术,数据中心层包含MySQL、Oracle、RRDB和LDAP,业务层有DMIT(分布式管理接口工具)和Evabus,以及数据收集层的探针、监控器和中介器。...

    大学成绩查询系统_学校班级网站源码.rar

    成绩查询系统需要存储大量学生、课程和成绩信息,因此数据库管理系统(如MySQL、PostgreSQL、Oracle或MongoDB)是必不可少的。开发者可能使用SQL语句来设计数据库结构,包括学生表、课程表、成绩表等,确保数据的...

    计算机精品学习资料大放送

    数据库管理系统(DBMS)精品学习资源汇总:MySQL篇 | SQL Server篇 | Oracle篇 ActionScript、Flex、AIR等RIA技术相关资料下载汇总 最强HTML/xHTML、CSS精品学习资料下载汇总 最新JavaScript、Ajax典藏级学习资料...

    深入理解计算机系统 第2版

    数据库是现代信息系统的重要组成部分,这部分内容覆盖了MySQL、SQL Server、Oracle等主流关系型数据库管理系统的学习资料。这些资料不仅有助于理解数据库的基本概念,还能帮助学习者掌握数据库的设计、管理和优化...

    数据结构(严蔚敏版)

    包括MySQL、SQL Server和Oracle三大主流数据库系统的精品学习资源,适合数据库管理、设计和开发的学习。 #### 平面设计与多媒体 提供了平面设计、Flash和3D动画的学习资源,适合创意设计和多媒体制作的学习者。 ##...

Global site tag (gtag.js) - Google Analytics