2013-04-09 39 views

回答

1

如果你只是處理普通數據,你可以嘗試三種方法之一。

導出/導入CSV

純數據庫的方法是從你的各種表中選擇到你可以用它來以後重新加載在另一端導出文件。

例如:

SELECT ... FROM ... INTO OUTFILE 'export.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' 

這在其他系統上的CSV格式的導出文件以後可以重新加載:

LOAD DATA INFILE 'export.csv' INTO TABLE ... FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' 

這需要你的MySQL服務器直接訪問,但如果成功,速度非常快。 BINARYBLOB類型字段不能與CSV一起使用,因爲它們與分隔符發生衝突。

導出/導入YAML

每一個模型能夠輸出本身系列化YAML的。基本上可以將所有需要的對象轉儲到一端,然後重新加載另一端。

File.open('dump.yml', 'w') do |f| 
    f.write(Object.where(:attribute => 'condition').all.to_yaml) 
end 

您可以在另一端重新加載這些:

File.open('dump.yml') do |f| 
    Object.transaction do 
    YAML.load(f).each do |attributes| 
     Object.create!(attributes) 
    end 
    end 
end 

Object.transaction部分意味着要麼被添加的所有記錄或沒有做的,所以如果有錯誤你可以糾正它並運行腳本再次沒有衝突。

SQL備份/恢復

mysqldump命令採用--where的論點,即可以用來篩選記錄:

mysqldump database table --no-create-db --no-create-info --where `attribute='condition'` > table.sql 

這應該剛剛INSERT語句,但檢查以確保萬無一失。

1

您可以將備份數據庫添加到您的database.yml,從中讀取對象,切換回主數據庫並重新創建缺失的對象。例如:

ActiveRecord::Base.establish_connection(:backup_database) 

objects = Object.where(attribute: 'condition') 

ActiveRecord::Base.establish_connection(:master_database) 

objects.each { |object| Object.create! object.attributes } 
+0

如何將一個數據庫指向另一個數據庫? – Trip 2013-04-09 16:17:51

+0

'backup_database'和'master_database'是'database.yml'中定義的數據庫,就像'development'或'production'一樣。 – Stefan 2013-04-09 16:21:03

+0

好吧,但是從控制檯,我如何從其中一個數據庫中選擇對象,而在另一個對象中選擇Object.where ..時呢? – Trip 2013-04-09 16:47:17

相關問題