新手问题 批量执行 SQL 语句脚本 求指教

LinuxGit · 2014年09月22日 · 最后由 CharlesZCB 回复于 2018年09月22日 · 3201 次阅读

我目前是一个 Linux SA. 平常都是用 bash Shell 脚本,一直没用 ruby 写过。求指教。下面是动手写的脚本,应该问题重重。

脚本目标: 根据 IP 自动并发到不同的网关服务器对应库上执行同样的 SQL 文件。 日志记录执行的 SQL 语句及结果集、错误 SQL 及异常。

我的思路是 从一个 job.sql 文件中读取 sql 语句,使用 mysql2 连接执行。 问题

  1. 目前结果集记录格式不清楚。
INFO  2014-09-22 15:07:27 +0800:    select * from company where name='Google';

INFO  2014-09-22 15:07:27 +0800:    ["id", "name"]
INFO  2014-09-22 15:07:27 +0800:    [2, "Google"]

结果我不想输出执行时间,想和 Linux mysql 终端上的显示差不多,还不知道如何实现。

  1. 并发执行还未实现,可能用到 Thread class

3.异常处理还不怎么会捕捉。

4.如果用 Rails,写一个 Web 平台来操作,还没有思路。

我写的脚本如下:

require 'mysql2'
require 'logger'

servers = ['192.168.5.99', '192.168.5.36', '192.168.6.226']

ruby_1_servers = ['192.168.6.226', '192.168.5.36']
ruby_2_servers = []

file = File.open('logfile.log', File::WRONLY | File::CREAT)
logger = Logger.new(file)
logger.datetime_format = '%Y-%m-%d %H:%M:%S'
logger.formatter = proc do |severity, datetime, progname, msg|
  "#{severity}  #{datetime}:    #{msg}\n"
end

servers.each do |server|

  if ruby_1_servers.include?(server)
    dbname = "ruby_1"
  elsif ruby_2_servers.include?(server)
    dbname = "ruby_2"
  else
    logger.error "IP: #{server} is illegal."
    next
  end

  client  = Mysql2::Client.new(
    host: "#{server}",
    username: 'test',
    password: 'test',
    database: "#{dbname}"
  )

  logger.info "========================= #{server}  #{dbname} =============================="

  File.open('job.sql', 'r') do |f1|
    while line = f1.gets
      next if line =~ /^$|^#/
      begin
        logger.info { line }
         results = client.query(line)
         headers = results.fields
         unless results.nil?
           logger.info { headers }
           results.each(:as => :array) do |row|
             logger.info { row }
           end
         end
      rescue Exception => e
        logger.error  { e }
      end
    end
  end

  client.close
end

logger.close

@Rei @lgn21st @happypeter 有时间帮忙看一下,求优化建议,如打扰请见谅。

请问
user = Delta::User.new user.username = "tom" user.sex = 1 user.save

这个咋在 RM 中执行并且添加到数据库??

需要 登录 后方可回复, 如果你还没有账号请 注册新账号