2015-03-26 3 views
1

Иногда мы делаем копию нашей производственной базы данных в нашу базу данных качества. Когда это произойдет, я просто создаю новую базу данных и свяжу ее в приложении Rails.Перезаписать базу данных postgresql

Вопрос: Вы можете очистить всю базу данных postgresql, включая отношения и импортировать новую БД?

Проблема: При импорте базы данных не перезаписать текущие данные/структура/отношения ...

Информация:

Я экспортировать базу данных производства, как это:

## Dump without user privileges 
pg_dump -x -U database1 -h localhost -O database1 > database1.sql 

И обычно я импортирую базу данных экспорта:

## Import 
psql -U database2 database2 < database1.sql 
+1

Прежде всего, необходимо drop и создать пустую базу данных. –

+2

Используйте pg_dump с опцией '--clean' –

ответ

2

Я использовал следующую рейк-задачу в течение нескольких лет, и это сработало хорошо для меня. Зависимость local:db:abort_if_active_connections не является строго необходимой, но это хорошо, поскольку в противном случае резервное копирование завершится неудачно, так как вы не можете удалить базу данных, которая в настоящее время используется.

Вы хотите настроить системные команды задачи на все, что вам нужно, чтобы получить копию базы данных. Тогда вы можете просто запустить:

bin/rake local:backup:production 

Библиотека/Задачи/местные/backup.rake

namespace :local do 

    namespace :backup do 

    desc 'Backup production and restore to development' 
    task :production => ['production:db'] 

    namespace :production do 
     desc 'Backup production database and restore to development' 
     task :db => ['local:db:abort_if_active_connections', 'db:drop', 'db:create'] do 
     config = ActiveRecord::Base.configurations[Rails.env] 
     gz_file = "#{ActiveRecord::Base.configurations['production']['database']}.gz" 
     puts "Copying production database to temporary file on this machine..." 
     system "scp [email protected]:/tmp/#{gz_file} /tmp/#{gz_file}" 
     puts "Recreating local database..." 
     system "gunzip -c /tmp/#{gz_file} | psql #{config['database']}" 
     puts "Removing temporary file..." 
     File.unlink "/tmp/#{gz_file}" 
     end 
    end 

    end 

end 

Библиотека/Задачи/local.rake

namespace :local do 

    namespace :db do 
    task :abort_if_active_connections => ['db:load_config'] do 

     config = ActiveRecord::Base.configurations[Rails.env] 
     ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public')) 

     version = ActiveRecord::Base.connection.send(:postgresql_version) 
     if version >= 90200 
     pid = 'pid' 
     else 
     pid = 'procpid' 
     end 

     connections = ActiveRecord::Base.connection.select_all("SELECT * FROM pg_stat_activity WHERE pg_stat_activity.datname = '#{config['database']}' AND #{pid} <> #{$$}") 

     unless connections.empty? 
     puts 
     puts "There are active connections to the database '#{config['database']}':" 
     puts 
     puts "%-7s %-20s %-16s %-20s %s" % %w[pid usename client_addr application_name backend_start] 
     connections.each do |c| 
      puts "%-7s %-20s %-16s %-20s %s" % [c[pid], c['usename'], c['client_addr'], c['application_name'], c['backend_start']] 
     end 
     puts 
     exit 1 
     end 

     ActiveRecord::Base.clear_all_connections! 
    end 
    end 

end 
Смежные вопросы