94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
# File 'lib/sql_cmd/database.rb', line 94
def migrate(start_time, source_connection_string, database_name, destination_connection_string, backup_folder: nil, backup_url: nil, backup_basename: nil, permissions_only: false, force_restore: false, full_backup_method: nil, options: {})
EasyIO.logger. 'Database Migration'
start_time = SqlCmd.unify_start_time(start_time)
source_connection_string = SqlCmd.remove_connection_string_part(source_connection_string, :database)
database_info = SqlCmd::Database.info(source_connection_string, database_name)
destination_database_info = SqlCmd::Database.info(destination_connection_string, database_name)
destination_server_name = SqlCmd.connection_string_part(destination_connection_string, :server)
source_server_name = SqlCmd.get_sql_server_settings(source_connection_string)[destination_server_name.include?(',') ? 'DataSource' : 'ServerName']
source_sql_version = SqlCmd.get_sql_server_settings(source_connection_string)['SQLVersion']
destination_sql_version = SqlCmd.get_sql_server_settings(destination_connection_string)['SQLVersion']
validate_restorability(source_sql_version, destination_sql_version, source_type: :database) unless permissions_only
raise "Failed to migrate database! Destination and source servers are the same! (#{source_server_name})" if source_server_name =~ /#{Regexp.escape(destination_server_name)}/i
if database_info['DatabaseNotFound'] && (destination_database_info['DatabaseNotFound'] || destination_database_info['DatabaseRestoring'] || destination_database_info['LastRestoreDate'] < start_time)
raise "Failed to migrate database. Database [#{database_name}] does not exist on [#{source_server_name}]!"
end
SqlCmd::Database.duplicate(start_time, source_connection_string, database_name, destination_connection_string, database_name, backup_folder: backup_folder, backup_url: backup_url, backup_basename: backup_basename, force_restore: force_restore, full_backup_method: full_backup_method, options: options) unless permissions_only
SqlCmd.migrate_logins(start_time, source_connection_string, destination_connection_string, database_name)
replication_active = SqlCmd::Database.info(source_connection_string, database_name)['ReplicationActive']
if replication_active
return if options['return_at_replication_active']
raise "Replication must now be dropped from [#{source_server_name}] in order to proceed. Before dropping replication from the source server, script out replication and script it into the migrated database on [#{destination_server_name}] if you wish to preserve replication. Then rerun the migration."
end
SqlCmd::AlwaysOn.remove_from_availability_group(source_connection_string, database_name)
SqlCmd::Database.drop(source_connection_string, database_name)
end
|