`
lnj
  • 浏览: 52676 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一键还原数据库ruby脚本

阅读更多
生产环境每小时自动备份数据库,压缩后上传到公司ftp服务器上,ftp服务器部署在公司内网。所以我每次使用生成环境数据库做开发时,都需要访问ftp服务器共享文件夹,找到最新的备份文件,然后用7z打开,找到所需的数据库备份文件,然后再使用SQL Server企业管理器还原数据库。
经历了几十次这样的操作后,我决定要写个程序来帮我做这些事。最初打算用bat脚本,在查找最新创建文件时遇到困难,而后使用c#,在使用Process.Start方法传参时遇到困难(参数值中带有空格,需要用双引号包裹),最后终于用ruby实现了,整个思考、实践的过程耗时一天半。

代码如下:
# 一键恢复saas0数据库,从10服务器上获取最新备份压缩文件,解压缩后找到saas0数据库备份文件,然后还原数据库
# 在执行过程中会建立临时文件夹c:/~one-click-resotre-temp
require 'find'
require 'FileUtils'

# 建立访问授权
`net use \\\\192.168.99.10\\ipc$ "密码" /user:"administrator"`

# 找到最后修改的文件
latestFile = nil
Find.find('\\\\192.168.99.10\\d$\\FTP') {|file| latestFile = file if file =~ /all_.*\.7z/ && (latestFile.nil? || File.mtime(latestFile) < File.mtime(file))}

# 建立本地临时文件夹
tempDir = "c:/~one-click-resotre-temp"
Dir.mkdir(tempDir) unless File.exists?(tempDir)

#  解压缩到本地
system "7z x \"#{latestFile}\" -o#{tempDir}"

# 重启sql server服务
`net stop mssqlserver`
`net start mssqlserver`

# 还原saas0数据库
dbname = "saas0"
bakfile = Dir.glob(File.join(tempDir, 'saas*.bak')).first.to_s
system "isql /localhost /U sa /P /Q \"restore database #{dbname} from disk = '#{bakfile}' WITH MOVE '#{dbname}_Data' TO 'D:\\Data\\SQL Server\\#{dbname}_Data.mdf',MOVE '#{dbname}_Log' TO 'D:\\Data\\SQL Server\\#{dbname}_Log.ldf', REPLACE\""
# 清空密码
system "isql /localhost /U sa /P /Q \"update #{dbname}..MEM_User set HashedPassword = null\""

# 清理临时文件夹
FileUtils.rmtree(tempDir) if File.exists?(tempDir)
puts "\r\ndone."


将上述代码保存为one-click-resotre.rb,再写一个bat完事。
ruby one-click-resotre.rb
pause

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics