Как переместить таблицы из одной базы данных сервера sql в другую? - PullRequest
12 голосов
/ 26 августа 2010

У нас есть база данных, которая выросла до 50 ГБ, и мы хотим извлечь определенный набор таблиц (около 20 из них) из этой базы данных и переместить их в новую базу данных. Все это будет на одном сервере SQL. Размеры таблиц, которые мы хотим извлечь, составляют около 12 ГБ (данные 6 ГБ, индексы 6 ГБ).

Как мы можем переместить таблицы из одной базы данных во вторую, но убедиться, что таблицы, созданные в новой базе данных, являются точной копией оригиналов (индексов, ключей и т. Д.)? В идеале я хочу, чтобы копирование / вставка выполнялась в среде SQL Server Management Studio, но я знаю, что этого не существует, так какие у меня варианты?

Ответы [ 7 ]

27 голосов
/ 15 июля 2013

Чтобы сделать это действительно легко с SQL Server 2008 Management Studio:

1.) Щелкните правой кнопкой мыши базу данных (не таблицу) и выберите Задачи -> Создать сценарии

location of tool

2.) Нажмите Далее на первой странице

3.) Если вы хотите скопировать всю базу данных, просто нажмите Далее.Если вы хотите скопировать определенные таблицы, нажмите «Выбрать конкретные объекты базы данных», выберите нужные таблицы и нажмите «Далее».

4.) Выберите «Сохранить в буфер» или «Сохранить в файл». ВАЖНО : нажмите кнопку «Дополнительно» рядом с «Сохранить в файл», найдите «Типы данных в сценарии» и измените «Только схема» на «Схема и данные» (если вы хотите создать таблицу)или «Только данные» (если вы копируете данные в существующую таблицу).Здесь вы также можете установить другие параметры, например, какие именно ключи копировать и т. Д.

adding data to the script

5.) Пролистайте все остальное, и все готово!

7 голосов
/ 26 августа 2010

Если вы перемещаете таблицы в совершенно новую базу данных только из-за роста, вам лучше использовать filegroups в вашей существующей базе данных. В будущем будет гораздо меньше головной боли, чем при работе с двумя отдельными базами данных.

EDIT

Как я уже упоминал в моих комментариях ниже, если вам действительно нужна новая база данных, в зависимости от общего числа задействованных таблиц, может быть проще восстановить резервную копию базы данных под новым именем и удалить таблицы, которые вы не указали не хочу.

2 голосов
/ 27 августа 2010

Я также нашел это потенциальное решение с помощью SQL Server Management Studio. Вы можете создать сценарии для перемещения отдельных таблиц, а затем экспортировать данные с помощью мастера создания сценариев и мастера импорта / экспорта в SQL Server Management Studio. Затем в новой базе данных вы запускаете сценарии для создания всех объектов, а затем импортируете данные. Вероятно, мы собираемся использовать метод резервного копирования / восстановления, описанный в ответе @Joe Stefanelli, но я нашел этот метод и хотел опубликовать его, чтобы другие могли его увидеть.

Чтобы создать сценарий sql для объектов:

  • SQL Server Management Studio> Базы данных> База данных1> Задачи> Создать сценарии ...
  • Запустится мастер сценариев SQL Server, и вы сможете выбрать объекты и параметры для экспорта в сценарии.
    • По умолчанию сценарии индексов и триггеров не включены, поэтому обязательно включите их (и любые другие, которые вас интересуют).

Чтобы экспортировать данные из таблиц:

  • SQL Server Management Studio> Базы данных> База данных1> Задачи> Экспорт данных ...
  • Выберите исходную и целевую базы данных
  • Выберите таблицы для экспорта
    • Обязательно установите флажок «Идентификационная вставка» для каждой таблицы, чтобы новые идентификаторы не создавались.

Затем создайте новую базу данных, запустите сценарии для создания всех объектов и затем импортируйте данные.

1 голос
/ 10 сентября 2016

Ленивый, эффективный способ сделать это в T-SQL:

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

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

Поэтому я пошел с INSERT INTO / SELECT FROM идля создания кода использовали information_schema и т. д.

Шаг 1: создайте таблицы в новой БД

Для каждой таблицы, которую вы хотите перенести в новую базу данных, создайте эту таблицу в новой базе данных.

Либо составьте сценарий из таблиц, либо используйте SQL Compare, динамический sql из information_schema - множество способов сделать это.Ответ Даллина показывает один из способов использования SSMS (но обязательно выбирайте только схему).

Шаг 2: создать UDF на целевой БД для создания списка столбцов

Это просто вспомогательная функция, используемая при генерации кода.

USE [staging_edw]
GO

CREATE FUNCTION dbo.udf_get_column_list
    (
        @table_name varchar(8000)
    )
RETURNS VARCHAR(8000)
AS
BEGIN

    DECLARE @var VARCHAR(8000)
    SELECT 
        @var = COALESCE(@var + ',', '', '') + c.COLUMN_NAME
    FROM INFORMATION_SCHEMA.columns c 
    WHERE c.TABLE_SCHEMA + '.' + c.TABLE_NAME = @table_name
    AND c.COLUMN_NAME NOT LIKE '%hash%'

    RETURN @var
END

Шаг 3: создать журналтаблица

Сгенерированный код будет регистрировать прогресс в этой таблице, чтобы вы могли отслеживать.Но сначала нужно создать эту таблицу журнала.

USE staging_edw
GO

IF OBJECT_ID('dbo.tmp_sedw_migration_log') IS NULL 
CREATE TABLE dbo.tmp_sedw_migration_log 
    (
        step_number INT IDENTITY, 
        step VARCHAR(100),
        start_time DATETIME
    )

Шаг 4: сгенерировать сценарий миграции

Здесь вы создадите T-SQL, который будет переносить данные для вас.Он просто генерирует операторы INSERT INTO / SELECT FROM для каждой таблицы и записывает ход выполнения.

Этот сценарий фактически ничего не меняет.Он просто выводит некоторый код, который вы можете проверить перед выполнением.

USE staging_edw
GO

-- newline characters for formatting of generated code
DECLARE @n VARCHAR(100) = CHAR(13)+CHAR(10)
DECLARE @t VARCHAR(100) = CHAR(9)
DECLARE @2n VARCHAR(100) = @n + @n
DECLARE @2nt VARCHAR(100) = @n + @n + @t
DECLARE @nt VARCHAR(100) = @n + @t
DECLARE @n2t VARCHAR(100) = @n + @t + @t
DECLARE @2n2t VARCHAR(100) = @n + @n + @t + @t
DECLARE @3n VARCHAR(100) = @n + @n + @n

-- identify tables with identity columns
IF OBJECT_ID('tempdb..#identities') IS NOT NULL 
DROP TABLE #identities;
SELECT 
    table_schema = s.name,
    table_name = o.name
INTO #identities
FROM sys.objects o 
JOIN sys.columns c on o.object_id = c.object_id
JOIN sys.schemas s ON s.schema_id = o.schema_id
WHERE 1=1
AND c.is_identity = 1

-- generate the code
SELECT 
    @3n + '-- ' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME,
    @n + 'BEGIN TRY',
    @2nt + IIF(i.table_schema IS NOT NULL, 'SET IDENTITY_INSERT staging_edw.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + ' ON ', ''),
    @2nt + 'TRUNCATE TABLE staging_edw.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME,
    @2nt + 'INSERT INTO staging_edw.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + ' WITH (TABLOCKX) ( ' + f.f + '  ) ',
    @2nt + 'SELECT ' + f.f + + @nt + 'FROM staging.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME,
    @2nt + IIF(i.table_schema IS NOT NULL, 'SET IDENTITY_INSERT staging_edw.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + ' OFF ', ''),
    @2nt + 'INSERT INTO dbo.tmp_sedw_migration_log ( step, start_time ) VALUES  ( ''' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + ' inserted successfully'', GETDATE() );' ,
    @2n + 'END TRY',
    @2n + 'BEGIN CATCH',
    @2nt + 'INSERT INTO dbo.tmp_sedw_migration_log ( step, start_time ) VALUES  ( ''' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + ' FAILED'', GETDATE() );' ,
    @2n + 'END CATCH'
FROM INFORMATION_SCHEMA.tables t
OUTER APPLY (SELECT f = staging_edw.dbo.udf_get_column_list(t.TABLE_SCHEMA + '.' + t.TABLE_NAME)) f
LEFT JOIN #identities i ON i.table_name = t.TABLE_NAME 
    AND i.table_schema = t.TABLE_SCHEMA
WHERE t.TABLE_TYPE = 'base table'

Шаг 5: запустите код

Теперь вы просто копируете вывод из шага 4, вставляете в новое окно запроса,и беги.

Примечания

  • На шаге 1 я исключаю хеш-столбцы из списка столбцов (в UDF), поскольку в моей ситуации это вычисляемые столбцы
1 голос
/ 26 августа 2010

Если вам нравится / у вас есть SSIS, вы можете использовать для этого компонент «Копировать объекты SQL».

0 голосов
/ 06 сентября 2010

Попробуйте DBSourceTools.http://dbsourcetools.codeplex.com.
Этот набор инструментов использует SMO для сценариев таблиц и данных на диск, а также позволяет выбирать, какие таблицы / представления / хранимые процедуры включать.При использовании «цели развертывания» она также автоматически обрабатывает зависимости.Я неоднократно использовал его именно для этого типа проблемы, и это очень просто и быстро.

0 голосов
/ 27 августа 2010
SELECT *
INTO new_table_name [IN new database]
FROM old_tablename
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...