Advertisement
Guest User

Untitled

a guest
Oct 27th, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.08 KB | None | 0 0
  1. #!/usr/local/bin/ruby
  2.  
  3. require 'mysql'
  4. require 'fileutils'
  5. require 'shellwords'
  6. require 'mail'
  7. require 'socket'
  8.  
  9. GZIP_CMD = '/usr/bin/gzip'
  10. MYSQLDUMP_CMD = '/usr/local/bin/mysqldump'
  11. DEST_DIR = '/var/backups/db/'
  12. DB_HOST = 'localhost'
  13. DB_USER = 'root'
  14. DB_PASSWD = ''
  15. DAYS = 3
  16. EXCLUDE_DATABASES = [
  17. 'mysql',
  18. 'test',
  19. 'information_schema',
  20. 'performance_schema',
  21. 'nagios',
  22. ]
  23. MAIL_FROM = ''
  24. MAIL_TO = ''
  25.  
  26. puts nil
  27. puts "MySQLサーバ #{DB_HOST} のバックアップ:"
  28. errors = []
  29. db = Mysql.new(DB_HOST, DB_USER, DB_PASSWD)
  30. db.query('SHOW DATABASES').each do |row_db|
  31. name_db = row_db[0]
  32. next if EXCLUDE_DATABASES.member?(name_db)
  33. db.query("USE `#{name_db}`")
  34.  
  35. puts "== #{name_db}をチェック"
  36. db.query('SHOW TABLES').each do |row_table|
  37. name_table = row_table[0]
  38. row = db.query("CHECK TABLE `#{name_table}`").fetch_row
  39. puts row.join(' | ')
  40. unless row[3] == 'OK'
  41. errors.push(row.join(' | '))
  42. row = db.query("REPAIR TABLE `#{name_table}`").fetch_row
  43. puts row.join(' | ')
  44. errors.push(row.join(' | '))
  45. end
  46. end
  47.  
  48. puts "== #{name_db}をダンプ"
  49. unless Dir.exist?(DEST_DIR + name_db)
  50. FileUtils.mkdir_p(DEST_DIR + name_db)
  51. end
  52. path_dump = "#{DEST_DIR}#{name_db}/#{name_db}_#{Time.now.strftime('%Y-%m-%d')}.sql"
  53.  
  54. cmd = [
  55. 'MYSQL_PWD=' + DB_PASSWD,
  56. MYSQLDUMP_CMD,
  57. '-h' + DB_HOST,
  58. '-u' + DB_USER,
  59. name_db,
  60. '>' + Shellwords.escape(path_dump),
  61. ]
  62. system(cmd.join(' '))
  63.  
  64. system(GZIP_CMD, '-f', path_dump)
  65. path_dump = path_dump + '.gz'
  66. puts path_dump
  67. File.chmod(0600, path_dump)
  68. end
  69. db.close
  70.  
  71. puts "== #{DAYS}日経過したダンプを削除"
  72. expires_on = Time.now - (60 * 60 * 24 * DAYS)
  73. Dir.glob("#{DEST_DIR}*/*.sql.gz").each do |f|
  74. if File.new(f).ctime < expires_on
  75. puts f
  76. File.unlink(f)
  77. end
  78. end
  79.  
  80. unless errors.empty?
  81. mail = Mail.new(charset: 'UTF-8')
  82. mail.from = MAIL_FROM
  83. mail.to = MAIL_TO
  84. mail.subject = "#{Socket.gethostname}で管理しているデータベースに関するレポート"
  85. mail.body = errors.join("\n")
  86. mail['X-Priority'] = 1
  87. mail.delivery_method(:sendmail)
  88. mail.deliver!
  89. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement