Advertisement
Guest User

Untitled

a guest
Mar 1st, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.80 KB | None | 0 0
  1. #!/usr/bin/env ruby
  2. require 'mysql2'
  3. require 'securerandom'
  4. require 'date'
  5.  
  6. @mysql_username = 'root'
  7. @mysql_password = 'root'
  8. @mysql_port = 3306
  9. @mysql_host = '1.1.1.1'
  10. @database_name = 'foo_database'
  11. @number_of_transactions = 1000
  12. @number_of_transactions_for_extra = 5000000
  13. @tables_for_extra_data=%w(foo_table1 foo_table2)
  14. @exclude_tables=%w(foo_excluded_table1 foo_excluded_table2)
  15. @batches = 500
  16.  
  17. def main
  18. con = Mysql2::Client.new(
  19. host: @mysql_host,
  20. username: @mysql_username,
  21. password: @mysql_password,
  22. port: @mysql_port
  23. )
  24.  
  25. tables = con.query "SELECT table_name FROM information_schema.tables WHERE table_schema=\'#{@database_name}\'"
  26.  
  27. tables.each do |r|
  28. table = r['table_name']
  29. p table
  30. next if @exclude_tables.include?(table)
  31. number_of_transactions = @number_of_transactions
  32. number_of_transactions = @number_of_transactions_for_extra if @tables_for_extra_data.include?(table)
  33. table_fields = con.query("DESCRIBE #{@database_name}.#{table}")
  34. table_sql = "INSERT INTO #{@database_name}.#{table} ("
  35. for i in 1..(number_of_transactions/@batches)
  36. sql = ''
  37. for j in 1..@batches
  38. field_list = value_list = ''
  39. table_fields.each do |field|
  40. next unless valid_field?(field)
  41. field_list += "`#{field['Field']}`,"
  42. value_list += "#{value_to_insert(field)},"
  43. end
  44. field_list.chop!
  45. value_list.chop!
  46. if j==1
  47. sql = table_sql + "#{field_list}) VALUES (#{value_list}) "
  48. break if number_of_transactions < @batches
  49. else
  50. sql += ", (#{value_list})"
  51. end
  52. end
  53. con.query(sql)
  54. p i*@batches
  55. cool_off(100000, 10) if (i*@batches)%100000 == 0
  56. cool_off(500000, 45) if (i*@batches)%500000 == 0
  57. end
  58. end
  59. rescue StandardError => e
  60. puts e
  61. ensure
  62. con.close if con
  63. end
  64.  
  65. def cool_off(cycles, sleep_time = 30)
  66. p "Cool off for #{sleep_time} sec every #{cycles} cycles"
  67. sleep(sleep_time)
  68. end
  69.  
  70. def valid_field?(field)
  71. field['Extra'] != 'auto_increment'
  72. end
  73.  
  74. def value_to_insert(field)
  75. field_type = field['Type']
  76. if field_type.include?('tinyint')
  77. random_boolean
  78. elsif field_type.include?('decimal') || field_type.include?('int') || field_type.include?('float')
  79. precision = field_type.scan(/\(\d*/).join('')
  80. precision[0] = ''
  81. random_int(2**(precision.to_i - 1))
  82. elsif field_type.include?('date')
  83. random_date
  84. elsif field_type.include?('binary') || field_type.include?('char')
  85. random_string(field_type.scan(/\d/).join('').to_i)
  86. elsif field_type.include?('json')
  87. "'{\"foo\": \"bar\"}'"
  88. else
  89. random_string
  90. end
  91. end
  92.  
  93. def random_int(max = 100_000_000)
  94. SecureRandom.random_number(max)
  95. end
  96.  
  97. def random_boolean
  98. random_int(2)
  99. end
  100.  
  101. def random_string(limit = 50)
  102. "'#{SecureRandom.hex.slice(0, limit)}'"
  103. end
  104.  
  105. def random_date
  106. "'#{Time.at(Time.now.to_i - SecureRandom.random_number(1_000_000_000))
  107. .to_date}'"
  108. end
  109.  
  110. main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement