// Серевер предприятия 101s04
// Старый сервер SQL с которого переезжают базы 101s08
// Новыый сервер SQL на который переезжают базы 101s11
Процедура ПеренестиБазы(Команда)
ПеренестиБазуНаДругойSQL("ИмяВашегоСервера"); /// У нас "101s04"
КонецПроцедуры
Процедура ПеренестиБазуНаДругойSQL(ИмяСервера)
//Подключение к SQL-серверам
Соединение08 = Новый COMОбъект("ADODB.Connection");
Команда08 = Новый COMОбъект("ADODB.Command");
ЗаписиSQL08 = Новый COMОбъект("ADODB.RecordSet");
Соединение08.ConnectionString =
"driver={SQL Server};" +
"server=101s08;"+
"uid=sa;"+
"pwd=""*********"";"+ // пароль SA от SQL сервера
"database=master;";
Соединение08.ConnectionTimeout = 30;
Соединение08.CommandTimeout = 600;
Соединение08.Open();
Команда08.ActiveConnection = Соединение08;
Команда08.CommandType = 1;
//------------------------------------------------------
Соединение11 = Новый COMОбъект("ADODB.Connection");
Команда11 = Новый COMОбъект("ADODB.Command");
ЗаписиSQL11 = Новый COMОбъект("ADODB.RecordSet");
Соединение11.ConnectionString =
"driver={SQL Server};" +
"server=101s11;"+
"uid=sa;"+
"pwd=""**********"";"+ // пароль SA от SQL сервера
"database=master;";
Соединение11.ConnectionTimeout = 30;
Соединение11.CommandTimeout = 600;
Соединение11.Open();
Команда11.ActiveConnection = Соединение11;
Команда11.CommandType = 1;
Соединитель = Новый COMОбъект("V83.COMConnector");
СоединениеСАгентом = Соединитель.ConnectAgent(ИмяСервера);
Кластеры = СоединениеСАгентом.GetClusters();
Кластер = Кластеры.GetValue(Кластеры.GetLowerBound()); // первый кластер
// Логин и пароль админа кластера у нас хранится в обслуживающей базе, У кого нет просто указываем ниже в явном виде, а тут все комментим
СпрКлатсер = Справочники.Кластер.НайтиПоНаименованию(Кластер.HostName, Истина);
Если СпрКлатсер.Пустая() Тогда
Возврат;
Иначе
АдминКластер = СпрКлатсер.Администратор;
ПарольКластер = СпрКлатсер.Пароль;
КонецЕсли;
СоединениеСАгентом.Authenticate(Кластер, АдминКластер, ПарольКластер);
РабочиеПроцессы = СоединениеСАгентом.GetWorkingProcesses(Кластер);
РабочийПроцесс = РабочиеПроцессы.GetValue(РабочиеПроцессы.GetLowerBound()); // первый рабочий процесс
АдресРабочегоПроцесса = "tcp://" + РабочийПроцесс.HostName + ":" + XMLСтрока(РабочийПроцесс.MainPort);
СоединениеСРабочимПроцессом = Соединитель.ConnectWorkingProcess(АдресРабочегоПроцесса);
Сообщить("Соединение с рабочим процессом " + АдресРабочегоПроцесса + " установлено ---------------------");
//получаем все информационные базы
СоединениеСРабочимПроцессом.AddAuthentication("Администратор", "****"); // Логин и пароль Администратора БАЗЫ !
ИнформационныеБазы = СоединениеСРабочимПроцессом.GetInfoBases();
Для каждого База из ИнформационныеБазы Цикл
Если База.dbName = "" Тогда
Сообщить("!!!! Для базы " + База.Name + " не смогли получить свойства регистрации в кластере, проверьте пароль Администратора базы");
Продолжить;
Иначе
Если ВРЕГ(База.dbServerName) <> "101S08" Тогда
Продолжить;
Иначе
Сообщить("Переносим " + База.Name + " Сервер " + База.dbServerName + " имя на сервере " + База.dbName);
Попытка
// Обновим информацию в кластере о сервере на котором будет лежать база и закроем все соединения с ней.
База.dbServerName = "101s11";
СоединениеСРабочимПроцессом.UpdateInfoBase(База);
СоединенияБазы = СоединениеСРабочимПроцессом.GetInfoBaseConnections(База);
Для Каждого Соединение Из СоединенияБазы Цикл
СоединениеСРабочимПроцессом.Disconnect(Соединение);
КонецЦикла;
// Отвяжем базу от старого SQL сервера
ТекстЗапроса08= СформироватьСкриптSQL_ОтключитьБазу(База.dbName);
Команда08.CommandText = ТекстЗапроса08;
ЗаписиSQL08 = Команда08.Execute();
КопироватьФайл("\\101s08\d$\SQL_Base\"+База.dbName+".mdf", "\\101s11\d$\SQL_Base\"+База.dbName+".mdf");
КопироватьФайл("\\101s08\d$\SQL_Base\"+База.dbName+"_log.ldf", "\\101s11\d$\SQL_Base\"+База.dbName+"_log.ldf");
// Привяжем базу от к новому SQL серверу
ТекстЗапроса11= СформироватьСкриптSQL_ПодключитьБазу(База.dbName);
Команда11.CommandText = ТекстЗапроса11;
ЗаписиSQL11 = Команда11.Execute();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Соединение08.Close();
Соединение11.Close();
КонецПроцедуры
Функция СформироватьСкриптSQL_ОтключитьБазу(ИмяБазы)
ТекстЗапроса =
"use [ИмяБазыПодмена]
| USE [master]
| ALTER DATABASE [ИмяБазыПодмена] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
| USE [master]
| EXEC master.dbo.sp_detach_db @dbname = N'ИмяБазыПодмена' ";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИмяБазыПодмена", ИмяБазы);
Возврат ТекстЗапроса;
КонецФункции
Функция СформироватьСкриптSQL_ПодключитьБазу(ИмяБазы)
ТекстЗапроса =
"USE [master]
|CREATE DATABASE [ИмяБазыПодмена] ON
|( FILENAME = N'D:\SQL_Base\ИмяБазыПодмена.mdf' ),
|( FILENAME = N'D:\SQL_Base\ИмяБазыПодмена_log.ldf' )
| FOR ATTACH";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИмяБазыПодмена", ИмяБазы);
Возврат ТекстЗапроса;
КонецФункции