ROR中如何备份和恢复MYSQL数据库?

初学ROR,现有一难题请教各位,

就是在netbeans新建个项目后,如何在项目中实现对mysql的备份和恢复功能?

新手,还望回答仔细些,谢谢了。
[b]问题补充:[/b]
谢谢 mccxj 和 hanhg 的热心回答, 不过 由于水平低, mccxj 的回答我还有些消化不了。
另外问题可能没有说清,我希望是在netbeans中的项目中实现mysql数据库的备份和恢复功能,比如在控制器中写什么代码,在模型中写什么代码,在试图中写什么等,然后在web中操作就能达到备份和恢复的目的。
[b]问题补充:[/b]
谢谢 mccxj ,不过我还是不能从回答中知道如何做。

这样说吧,要求:一个页面上两个链接,一个是备份,一个是恢复。
单击“备份”链接,就会备份,名字可以是事先设定好的,比如" mybak.sql"。
单击"恢复“链接,就会从mybak.sql中自动恢复到mysql中。

可以使用mysqldump等 ,现在需要先实现功能。

因为水平有限,所以我希望能直接给出详细的代码,比如“控制器中如何写,模型中如何写,视图中如何写”等。

再次感谢了。

7个回答

先说一下在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"]

Dbc#index

<%= 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分层!

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问