初学ROR,现有一难题请教各位,
就是在netbeans新建个项目后,如何在项目中实现对mysql的备份和恢复功能?
新手,还望回答仔细些,谢谢了。
[b]问题补充:[/b]
谢谢 mccxj 和 hanhg 的热心回答, 不过 由于水平低, mccxj 的回答我还有些消化不了。
另外问题可能没有说清,我希望是在netbeans中的项目中实现mysql数据库的备份和恢复功能,比如在控制器中写什么代码,在模型中写什么代码,在试图中写什么等,然后在web中操作就能达到备份和恢复的目的。
[b]问题补充:[/b]
谢谢 mccxj ,不过我还是不能从回答中知道如何做。
这样说吧,要求:一个页面上两个链接,一个是备份,一个是恢复。
单击“备份”链接,就会备份,名字可以是事先设定好的,比如" mybak.sql"。
单击"恢复“链接,就会从mybak.sql中自动恢复到mysql中。
可以使用mysqldump等 ,现在需要先实现功能。
因为水平有限,所以我希望能直接给出详细的代码,比如“控制器中如何写,模型中如何写,视图中如何写”等。
再次感谢了。
先说一下在Netbeans中Rails开发时如何备份和恢复MySQL数据库。
mccxj 给的的方法不错,在开发的时候整理数据库还不错,如果数据库比较复杂,或者不习惯写夹具的话。
在#{RAILS_ROOT}/lib/tasks下建立db.rake,把mccxj给的代码拷贝进去,然后按Alt+Shift+R调出运行Rake任务的对话框,点“刷新任务”按钮,列表中会出来“db:backup:create”/“db:backup:destroy”/“db:backup:rebuild”三个任务,单击相应的任务就可以备份和恢复数据库。
下面示例说明如何在RAILS应用网页中备份和恢复MySQL数据库。
(1)建立控制器
[code="ruby"]ruby script/generate controller dbctl index backup restore/code编写Dbctl控制器代码
[code="ruby"]class DbctlController < ApplicationController
def index
@dt = Time.now
end
def backup
%x{rake db:backup:create}
redirect_to :action => :index
end
def restore
%x{rake db:backup:rebuild}
redirect_to :action => :index
end
end/code编写views/Dbctl/index.html.erb页面代码
[code="ruby"]
<%= link_to 'backup', {:action=> 'backup'} %>
<%= link_to 'restore', {:action=> 'restore'} %>[/code]
运行你的应用程序就可以了。
说明几点:
Rails中可以用%x{SYSTEM COMMAND}命令运行系统命令,借助刚才建立的db.rake,可以使用rake db:backup:create创建数据库备份,使用rake db:backup:rebuild恢复数据库。
如果你没有建立db.rake,那么控制器代码就这么写
[code="ruby"]class DbcController < ApplicationController
def index
@dt = Time.now
end
def backup
backup_folder = File.join(ENV["DIR"] || "db", 'backup')
FileUtils.mkdir_p(backup_folder)
magic_date = (Date.parse(ENV["DATE"]) if ENV["DATE"]) || Time.now
backup_file = File.join(backup_folder, "#{RAILS_ENV}#{magic_date.strftime("%Y%m%d%H%M%S")}.sql")
db_config = ActiveRecord::Base.configurations[RAILS_ENV]
system "mysqldump -u #{db_config['username']} #{'-p' if db_config['password']}#{db_config['password']} --opt #{db_config['database']} > #{backup_file}"
redirect_to :action => :index
end
def restore
backup_folder = File.join(ENV["DIR"] || "db", 'backup')
FileUtils.mkdir_p(backup_folder)
db_config = ActiveRecord::Base.configurations[RAILS_ENV]
db_config = ActiveRecord::Base.configurations[RAILS_ENV]
bakfile = ENV'FILE'.entries - ['.', '..']).sort.reverse.each do |backup|
(bakfile = backup and break) if backup.starts_with?(RAILS_ENV)
end unless bakfile
raise 'could not find the backup file!' unless bakfile
ActiveRecord::Base.establish_connection(RAILS_ENV)
ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0')
puts "rebuild database #{db_config['database']} from #{bakfile}"
system "mysql -u #{db_config['username']} #{'-p' if db_config['password']}#{db_config['password']} #{db_config['database']} < #{backup_folder}/#{bakfile}"
redirect_to :action => :index
end
end[/code]
这只是能实现你说的需求而已,但是实用性不高。
一般都是写SQL语句啊!
请参考:
1、备份
备份一个数据库
[code="java"]mysqldump -uxxxx -pxxxx --opt dbname > filename.sql[/code]
备份整个数据库
[code="java"]mysqldump -uxxxx -pxxxx --opt --all_database > filename.sql[/code]
2、恢复
恢复一个数据库
[code="java"]mysql -uxxxx -pxxxx dbname < filename.sql[/code]
恢复整个数据库
[code="java"]mysql -uxxxx -pxxxx < filename.sql[/code]
我是写rake脚本来执行的。。。
require 'find'
[code="ruby"]namespace :db do
namespace :backup do
def makeup_backup_folder
backup_folder = File.join(ENV["DIR"] || "db", 'backup')
FileUtils.mkdir_p(backup_folder)
backup_folder
end
def makeup_backup_filename(magic_date)
"#{RAILS_ENV}#{magic_date.strftime("%Y%m%d%H%M%S")}.sql"
end
desc "Backup the database to a file. Options: DIR=base_dir RAILS_ENV=production DATE=2008-10-11"
task :create => [:environment] do
magic_date = (Date.parse(ENV["DATE"]) if ENV["DATE"]) || Time.now
backup_folder = makeup_backup_folder
backup_file = File.join(backup_folder, makeup_backup_filename(magic_date))
db_config = ActiveRecord::Base.configurations[RAILS_ENV]
system "mysqldump -u #{db_config['username']} #{'-p' if db_config['password']}#{db_config['password']} --opt #{db_config['database']} > #{backup_file}"
file_counter = Dir.glob("#{backup_folder}/*.sql").size
puts "Created backup: #{backup_file}"
puts "#{file_counter} backups available"
end
desc "Remove all the batabase backup files which had been created before a certain date, default is today. Options: DIR=base_dir RAILS_ENV=production DATE=2008-10-11"
task :destroy => [:environment] do
magic_date = (Date.parse(ENV["DATE"]) if ENV["DATE"]) || Time.now.to_date
backup_folder = makeup_backup_folder
magic_name = makeup_backup_filename(magic_date)
dir = Dir.new(backup_folder)
(dir.entries - ['.', '..']).each do |backup|
if backup.starts_with?(RAILS_ENV) && backup < magic_name
backup_file = File.join(backup_folder, backup)
FileUtils.rm_rf(backup_file)
puts "Removed backup: #{backup_file}"
end
end
end
desc "Rebuild the database with a certain back file. Options: DIR=basedir RAILS_ENV=production"
task :rebuild => [:environment] do
raise 'only for development or test environment' unless ["development", "test"].include? RAILS_ENV
backup_folder = makeup_backup_folder
db_config = ActiveRecord::Base.configurations[RAILS_ENV]
Rake::Task["db:drop"].invoke
Rake::Task["db:create"].invoke
bakfile = ENV['FILE']
(Dir.new(backup_folder).entries - ['.', '..']).sort.reverse.each do |backup|
(bakfile = backup and break) if backup.starts_with?(RAILS_ENV)
end unless bakfile
raise 'could not find the backup file!' unless bakfile
ActiveRecord::Base.establish_connection(RAILS_ENV)
ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0')
puts "rebuild database #{db_config['database']} from #{bakfile}"
system "mysql -u #{db_config['username']} #{'-p' if db_config['password']}#{db_config['password']} #{db_config['database']} < #{makeup_backup_folder}/#{bakfile}"
end
end
end[/code]
这是我的脚本,你想研究研究,照着用就可以了。
用的时候很方便的。
rake db:backup:create 根据database.yml的信息备份数据库
rake db:backup:destroy 默认删除一天前的备份数据
rake db:backup:rebuild 默认恢复最新的备份数据
注意:这里设置的备份目录是db的backup目录,你可以修改
而且这些命令都带参数的,可以参考参考。
写sql也可以,如楼上所示。
如果你学ror,必然少不了ruby和rake,一些常用的功能可以自己写rake,也是提高的办法
[quote]我希望是在netbeans中的项目中实现mysql数据库的备份和恢复功能,比如在控制器中写什么代码,在模型中写什么代码,在试图中写什么等,然后在web中操作就能达到备份和恢复的目的。[/quote]
要看你想怎么做罗。。可以举个简单的例子。加上界面有个按钮,是用来备份的,点击的时候会发送一个请求到控制器中。
[code="java"]system "mysqldump -u #{db_config['username']} #{'-p' if db_config['password']}#{db_config['password']} --opt #{db_config['database']} > #{backup_file}" [/code]
在控制器里边执行这样的操作也可以。。具体代码可以详细看什么的。
不过这个需要调用到系统的命令mysqldump,这是最方便的办法了。不过说实话,这样的实用性并不高。
建议你把mccxj的代码研究一下,先可以直接在视图下面写,调试通过,在MVC分层!