我目前是一个 Linux SA. 平常都是用 bash Shell 脚本,一直没用 ruby 写过。求指教。下面是动手写的脚本,应该问题重重。
脚本目标: 根据 IP 自动并发到不同的网关服务器对应库上执行同样的 SQL 文件。 日志记录执行的 SQL 语句及结果集、错误 SQL 及异常。
我的思路是 从一个 job.sql 文件中读取 sql 语句,使用 mysql2 连接执行。 问题:
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 终端上的显示差不多,还不知道如何实现。
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