Подтвердить что ты не робот

Копирование данных между двумя экземплярами сервера

Мне нужно что-то вроде:

insert into server2.database1.table1 select * from server1.database1.table1

обе таблицы одинаковы.

Как я могу Скопировать данные между двумя экземплярами сервера?

4b9b3361

Ответ 1

SQL-Linked Server

Если оба сервера являются SQL Server, вы можете настроить Связанные серверы - я бы предложил использовать учетную запись SQL для обеспечения безопасности.

Затем вы можете просто выполнить

insert into server2.database1.dbo.table1 
select * from server1.database1.dbo.table1 where col1 = 'X'

Если вы запустите запрос в студии управления SQL, подключенной к серверу 1, а текущая база данных установлена ​​в базу данных1, вам не понадобится префикс

server1.database1.dbo.

Кроме того, связанный сервер будет настроен на сервере1, чтобы подключиться к серверу2 (а не наоборот).

Если у вас есть правильные драйверы OLE DB, этот метод также может работать между различными типами РСУБД (то есть с не-SQL Server).

Открыть запрос

Примечание. Остерегайтесь не полагаться на связанные серверы слишком сильно, особенно для фильтрации, и для присоединения к серверам, поскольку они требуют полного считывания данных в исходную СУБД до того, как будут применены какие-либо условия. Многие связанные осложнения могут возникать из связанных серверов, поэтому читайте перед тем, как приступить к работе, так как даже различия в версии могут вызвать головные боли.

Я рекомендую вам использовать команду OPENQUERY для SQL-серверов, чтобы обойти эти ограничения. Вот пример, но вы должны найти помощь, специфичную для ваших потребностей, путем дальнейшего исследования:

insert into server2.database1.dbo.table1 
select * from OPENQUERY(server1, 'select * from database1.dbo.table1 where col1 = ''X''');

Вышеприведенный код более эффективен, фильтруя данные на исходном сервере (и используя доступные индексы), прежде чем накачать данные, сохраняя пропускную способность/время/ресурсы как исходного, так и целевого серверов.

(Также обратите внимание на двойную кавычку '', - это escape-последовательность для создания одиночной кавычки.)

SQL - временно на том же сервере

Включить (обратите внимание на подчеркивание):

insert into server2_database1.dbo.table1 
select * from database1.dbo.table1

Все еще в домене запросов SQL. Если вы можете временно переместить базу данных на server2 на server1, вам не понадобится связанный сервер. Переименование базы данных, по-видимому, потребуется при совместном размещении на сервере1. Достижение такого совместного размещения может использовать различные методы, я предлагаю сократить файлы базы данных, прежде чем продолжить:

  • Резервное копирование/восстановление. Резервное копирование на сервере2, восстановление на сервере1 (с другим именем) - выполнить вставку, как описано выше, но без префиксов server1 или server2. Затем обратное - резервное копирование на сервере1, восстановление на сервере2/
  • Отсоединить/Прикрепить - переименовать базу данных, отсоединить на сервере2 (сжать), скопировать файлы на сервер 1 (распаковать), прикрепить на сервере1, выполнить вставку. Затем измените...

В любом случае версия SQL Server может быть барьером. Если server1 имеет более низкую версию SQL, то, скорее всего, будут выполняться как методы резервного копирования, так и отсоединения/подключения. Это можно обойти, перемещая базу данных server1 на server2, что может быть или не быть более подходящим.

Другие методы

Может быть подходящим, не-SQL/TSQL-метод, не позволяющий использовать благоприятные экологические факторы для ранее упомянутых методов. И если у вас есть правильный доступ (OLE DB Drivers и т.д.), Этот метод также может работать между различными типами RDBMS (то есть с не-SQL Server) и источниками данных (такими как XML, flatfiles, Excel Spreadsheets...)

  • SSIS Явно с помощью Business Development Management Studio - прямой datapump или с использованием ограниченного промежуточного файла.
  • SSIS Неявно через SQL Management Studio, щелкнув правой кнопкой мыши базу данных1 на сервере1 > Задачи > Экспорт, а затем завершите работу мастера. Может работать непосредственно с сервером2 или с использованием файлового посредника.
  • .Net-программирование с SqlBulkInsert (я считаю, что в качестве источника данных SSIS используется такой объект), я могу подробнее рассказать об этом, если он вас интересует.

Eg. SQLBulkInsert (код psedo-С#)

SqlConnection c = new SqlConnection("connectionStringForServer1Database1Here");
SqlConnection c2 = new SqlConnection("connectionStringForServer2Database1Here");
c.Open();
SqlCommand cm = new SqlCommand(c);
cm.CommandText = "select * from table1;";
using (SqlDataReader reader = cm.ExecuteReader())
{
    using (SqlBulkInsert bc = new SqlBulkInsert(c))
    {
         c2.Open();
         bc.DestinationTable = "table1";
         bc.WriteToServer(reader);
    }
}

Довольно круто, да? Если значение скорости/эффективности является проблемой, то лучше всего использовать подходы SqlBulkInsert (такие как SSIS).

Обновление - изменение таблицы адресатов

Если вам нужно обновить таблицу назначения, я рекомендую вам:

  • Напишите в промежуточную таблицу в базе данных назначения (временную таблицу или соответствующую таблицу, которую вы усекаете до и после процесса), последнее предпочтительнее. Первый может быть вашим единственным выбором, если у вас нет прав CREATE TABLE. Вы можете выполнить передачу, используя любую из указанных выше опций.
  • Запустите команду MERGE INTO в соответствии с вашими требованиями из промежуточной таблицы в таблицу назначения. Это может вставлять, обновлять и удалять по мере необходимости очень эффективно.

Такой целый процесс может быть расширен с помощью скользящего окна (изменяется с момента последнего проверки), только принимая недавно измененные строки в источнике, применяя к месту назначения, это усложняет процесс, поэтому вы должны, по крайней мере, выполнить более простой первый, После завершения версии скользящего окна вы можете периодически запускать полное обновление, чтобы убедиться, что в скользящем окне нет ошибок.

Ответ 3

Аналогично Todd С# SqlBulkCopy

Как правило, это проще, чем создание связанных серверов.

Создайте unit test и запустите ниже, если у вас есть триггеры, будьте осторожны, и вам понадобятся разрешения ALTER.

    [Test]
    public void BulkCopy()
    {
        var fromConnectionString = @"fromConnectionString";
        var destinationConnectionString = @"destConnectionString2";

        using (var testConnection = new SqlConnection(fromConnectionString))
        {
            testConnection.Open();
            var command = new SqlCommand("select * from MyTable;", testConnection);
            using (var reader = command.ExecuteReader())
            {
                using (var destinationConnection = new SqlConnection(destinationConnectionString))
                {
                    using (var bc = new SqlBulkCopy(destinationConnection))
                    {
                        destinationConnection.Open();
                        bc.DestinationTableName = "dbo.MyTable";
                        bc.WriteToServer(reader);
                    }
                }
            }
        }
    }
}

Ответ 4

Лучший способ сделать это - создать "связанный сервер". И затем вы можете использовать инструкцию ниже в свой оператор insert, чтобы определить вашу таблицу

 [linkedserver].databasename.dbo.tablename

Ответ 6

Сначала вам нужно добавить сервер Например. Сервер 1 и Сервер 2

sp_addlinkedserver 'Server-2'

затем скопируйте свои данные с этого сервера на ваш сервер, используя следующий запрос

В Server-1 Write

select *   INTO  Employee_Master_bkp
FROM [Server-2].[DB_Live].[dbo].[Employee_Master]