Skip to content

Instantly share code, notes, and snippets.

@samflores
Last active April 23, 2020 21:51
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save samflores/88af7e4f5fdc46cfeb195d481a5f9886 to your computer and use it in GitHub Desktop.
Save samflores/88af7e4f5fdc46cfeb195d481a5f9886 to your computer and use it in GitHub Desktop.
db = ActiveRecord::Base.connection
puts '#!/bin/bash'
puts ""
puts "COMMAND='dry-run'"
puts ""
db_conversion = "CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
puts "pt-online-schema-change -uroot --alter '#{db_conversion}' D=#{db.current_database} --chunk-size=10k --critical-load Threads_running=200 --set-vars innodb_lock_wait_timeout=2 --alter-foreign-keys-method=auto --$COMMAND"
db.tables.each do |table|
column_conversions = db.columns(table).map do |column|
case column.sql_type
when /([a-z])*text/i, /varchar\(([0-9]+)\)/i
sql_type = column.sql_type.upcase
default = (column.default.nil?) ? '' : "DEFAULT \"#{column.default}\""
null = (column.null) ? '' : 'NOT NULL'
"MODIFY \`#{column.name}\` #{sql_type} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci #{default} #{null}".strip
end
end.compact
puts "# #{table}"
if column_conversions.empty?
puts "# NO CONVERSIONS NECESSARY FOR #{table}"
else
table_conversion = "ROW_FORMAT=DYNAMIC CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
puts "pt-online-schema-change -uroot --alter '#{table_conversion}' D=#{db.current_database},t=#{table} --chunk-size=10k --critical-load Threads_running=200 --set-vars innodb_lock_wait_timeout=2 --alter-foreign-keys-method=auto --$COMMAND"
puts "pt-online-schema-change -uroot --alter '#{column_conversions.join(", ")}' D=#{db.current_database},t=#{table} --chunk-size=10k --critical-load Threads_running=200 --set-vars innodb_lock_wait_timeout=2 --alter-foreign-keys-method=auto --$COMMAND"
end
puts ""
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment