Anmelden Registrieren

Badges

Follow Peter Bouda on Google Plus

Feeds

Neueste BlogeinträgeBlog

DB-Migration einer Ruby on Rails Anwendung

Bearbeitet am Mittwoch, 16. März 2011, 11:22 Uhr von pbouda

Ich hatte vor kurzem das zweifelhafte Vergnügen, eine Ruby on Rails-Anwendung von einem MySQL-Server auf einen PostgreSQL-Server umzuziehen. Die Erstellung der Tabellen waren dank rake db:migrate kein Problem, einfach den neuen Server in database.yml eintragen und migrieren. Probleme hatte ich zunächst, als ich die Daten migrieren wollte; man findet viele ellenlange Anleitungen für solche Migrationen (von MySQL nach PostgreSQL) im Internet, in denen man zwischendrin wild an den SQL-Dumps herumdoktort. Diese Anleitung war dann meine Rettung, hier eine deutsche Übersetzung davon:

1) Zuerst folgendes rake-Skript in den lib/tasks/ Ordner der Rails-Anwendungen ablegen, unter dem Namen “backup.task”:


namespace :db do
namespace :backup do

def interesting_tables
ActiveRecord::Base.connection.tables.sort.reject! do |tbl|
[‘schema_info’, ‘sessions’, ‘public_exceptions’].include?(tbl)
end
end

desc “Dump entire db.”
task :write => :environment do

dir = RAILS_ROOT + ‘/db/backup’
FileUtils.mkdir_p(dir)
FileUtils.chdir(dir)

interesting_tables.each do |tbl|

klass = tbl.classify.constantize
puts “Writing #{tbl}…”
File.open(“#{tbl}.yml”, ‘w+’) { |f| YAML.dump klass.find(:all).collect(&:attributes), f }
end

end

task :read => [:environment, ‘db:schema:load’] do

dir = RAILS_ROOT + ‘/db/backup’
FileUtils.mkdir_p(dir)
FileUtils.chdir(dir)

interesting_tables.each do |tbl|

klass = tbl.classify.constantize
ActiveRecord::Base.transaction do

puts “Loading #{tbl}…”
YAML.load_file(“#{tbl}.yml”).each do |fixture|
ActiveRecord::Base.connection.execute “INSERT INTO #{tbl} (#{fixture.keys.join(”,“)}) VALUES (#{fixture.values.collect { |value| ActiveRecord::Base.connection.quote(value) }.join(”,“)})”, ‘Fixture Insert’
end
end
end

end

end
end

2) Dann in der “alten” Rails-Anwendung das rake-Backup starten:


rake db:backup:write

Dieses Skript legt euch für jede Tabelle eine .yml-Datei in den Ordner db/backup/. Diese .yml-Dateien müsst ihr nun in einen Ordner db/backup/ der neuen Rails-Anwendung kopieren. Wenn ihr die gleich Rails-Anwendung haben wollt und nur den Datenbankserver ändern wollt, dann editiert an dieser Stelle einfach die database.yml, damit sie jetzt auf den neuen Server verweist.

3) In der “neuen” Rails-Anwendung dann die Tabellen wiederherstellen:


rake db:backup:read

Das Skript liest die .yml aus dem Ordner db/backup/ und fügt die Daten in die entsprechenden Tabellen der neuen Rails-Anwendung ein.