Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Копирование элементов базы данных из одной БД в другую  [new]
artsb
Member

Откуда:
Сообщений: 19
Всем привет!

MS SQL 2000/2005

База сильно выросла, и теперь нужно её облегчить. Для этого нужно из таблиц удалить записи старее полугода.
Основную БД "портить" нельзя.

Сейчас делаю так:
- создаю новую БД
- копирую таблицы, с учётом указанного выше условия

Всё отлично отрабатывает. Осталось скопировать всё остальное :) А именно: роли, хранимые процедуры, пользователей, логины и т.п.
В MS SQL я не особо силен, а поиск особо не помог, т.к. в основном, народ спрашивает про полное копирование БД.

По сути, должна получиться точно такая же БД как и исходная, с тем лишь отличием, что данные в таблицах останутся за последние полгода.

Подскажите, пожалуйста, как это можно сделать.
Спасибо.
27 июл 11, 22:51    [11036770]     Ответить | Цитировать Сообщить модератору
 Re: Копирование элементов базы данных из одной БД в другую  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
artsb
По сути, должна получиться точно такая же БД как и исходная, с тем лишь отличием, что данные в таблицах останутся за последние полгода.

Подскажите, пожалуйста, как это можно сделать.
Сделать бакап, восстановить в новую базу, удалить старые данные.
27 июл 11, 22:52    [11036772]     Ответить | Цитировать Сообщить модератору
 Re: Копирование элементов базы данных из одной БД в другую  [new]
artsb
Member

Откуда:
Сообщений: 19
alexeyvg, спасибо за совет. Я, в принципе, об этом тоже думал. Но тут есть одна загвоздка - для некоторых таблиц хочется сбросить счётчик не потеряв данные. А это, ИМХО, просто так не сделаешь. Т.е. нужно будет делать какую-нибудь временную таблицу. В неё сохранять данные и потом их восстанавливать.

Плюс. База очень огромная. Если делать полный бэкап, то это займёт очень много времени и места на жёстком диске, чего хотелось бы избежать.
Я сейчас подумал. В принципе, мне бы хватило скопировать только пользователей и их права. А всё остальное я просто создам заново.
27 июл 11, 23:00    [11036788]     Ответить | Цитировать Сообщить модератору
 Re: Копирование элементов базы данных из одной БД в другую  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
artsb
alexeyvg, спасибо за совет. Я, в принципе, об этом тоже думал. Но тут есть одна загвоздка - для некоторых таблиц хочется сбросить счётчик не потеряв данные. А это, ИМХО, просто так не сделаешь. Т.е. нужно будет делать какую-нибудь временную таблицу. В неё сохранять данные и потом их восстанавливать.
А что такое "сбросить счётчик"? Может быть, что нибуть можно придумать?
27 июл 11, 23:22    [11036862]     Ответить | Цитировать Сообщить модератору
 Re: Копирование элементов базы данных из одной БД в другую  [new]
artsb
Member

Откуда:
Сообщений: 19
alexeyvg, под счётчиком я подразумевал поле с типом autoincrement :)
28 июл 11, 00:28    [11037139]     Ответить | Цитировать Сообщить модератору
 Re: Копирование элементов базы данных из одной БД в другую  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
artsb
alexeyvg, под счётчиком я подразумевал поле с типом autoincrement :)
А autoincrement - это ЧТО ТАКОЕ??? Это из аксесса???


1. делать БД Read Only. Чтобы никто ничо в процессе не поменял.
2. делать полный бэкап.
3. ресторить в новую бд.
4. Удалить из базы ненужное. В порядке - обратном ссылочной целостности.
5. НЕ париться с identity, ибо более свежие записи - всегда с большими номерами. И новый счетчик начнется со следующего от максимального по любому. Не хватает 2 млрд - сделайте поле bigint. Если шибко нужно перенумеровать все Identity поля, то тут уж ничо не поделать... Делайте, разрешаю. Но секса с компом там будет - преизрядно...
6. убить старую, новую обозвать старым именем, сделать доступной по записи.

P.S. А "очень огромная" база - это сколько гиг, или сколько записей?

P.P.S. "Создавать всё заново" зачастую будет дороже, чем подымать бэкап, и удалять. Попробуйте уронить все индексы и статистики и пересоздать на копии базы, получите примерное время отработки.


А вообще, требование "Основную БД "портить" нельзя." - очень смешное
Ну оберните весь процесс в транзакцию.
Если испортится, то откатится.
28 июл 11, 03:58    [11037371]     Ответить | Цитировать Сообщить модератору
 Re: Копирование элементов базы данных из одной БД в другую  [new]
artsb
Member

Откуда:
Сообщений: 19
Makar4ik, спасибо за советы :)

Makar4ik
А autoincrement - это ЧТО ТАКОЕ??? Это из аксесса???

Вспомнил. Речь про identity. А autoincrement я видать запомнил из Access'а :)

Makar4ik
5. НЕ париться с identity, ибо более свежие записи - всегда с большими номерами. И новый счетчик начнется со следующего от максимального по любому. Не хватает 2 млрд - сделайте поле bigint. Если шибко нужно перенумеровать все Identity поля, то тут уж ничо не поделать... Делайте, разрешаю. Но секса с компом там будет - преизрядно...

Это всё понятно. Но есть такие таблицы (типо "лог событий"), которые очень быстро заполняются и для которых не обязательно сохранять старую последовательность идентификаторов. Поэтому, хотелось бы "сбросить" счётчик для таких таблиц.

Makar4ik
P.S. А "очень огромная" база - это сколько гиг, или сколько записей?

> 100 Гб

Makar4ik
А вообще, требование "Основную БД "портить" нельзя." - очень смешное

Почему же смешное? Если в БД хранится важная и нужная информация, которая рано или поздно может понадобиться.
28 июл 11, 08:55    [11037604]     Ответить | Цитировать Сообщить модератору
 Re: Копирование элементов базы данных из одной БД в другую  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
artsb
alexeyvg, под счётчиком я подразумевал поле с типом autoincrement :)
А дальше что?

Что бы хотите с этим счётчиком сделать, при этом не потеряв данные?
Если в таблице были значения
1, 2, 50, 121
то что должно остаться после переноса таблицы в новую базу?
28 июл 11, 09:06    [11037627]     Ответить | Цитировать Сообщить модератору
 Re: Копирование элементов базы данных из одной БД в другую  [new]
ПалЪ СанычЪ
Member

Откуда:
Сообщений: 37
artsb , если правильно понял -то поможет

USE MYbase;
GO
DBCC CHECKIDENT (MyTable, RESEED, 1);
GO
28 июл 11, 10:18    [11037966]     Ответить | Цитировать Сообщить модератору
 Re: Копирование элементов базы данных из одной БД в другую  [new]
artsb
Member

Откуда:
Сообщений: 19
alexeyvg
Что бы хотите с этим счётчиком сделать, при этом не потеряв данные?
Если в таблице были значения
1, 2, 50, 121
то что должно остаться после переноса таблицы в новую базу?

Я хочу переиндексировать записи. Т.е. в результате должно получиться: 1, 2, 3, 4
Сейчас я создаю в новой БД пустую таблицу, а уже затем копирую в неё данные из основной базы. Естественно, в новой таблице счёт идёт с 1.

ПалЪ СанычЪ
artsb , если правильно понял -то поможет

USE MYbase;
GO
DBCC CHECKIDENT (MyTable, RESEED, 1);
GO

Это почти то что нужно :) Счётчик сбрасывается, но не происходит переиндексация. И ещё я проверил, что когда счётчик дойдёт до значений, которые были изначально, то он не проверяет уникальность, а просто создаёт запись с таким же идентификатором.
28 июл 11, 12:31    [11038902]     Ответить | Цитировать Сообщить модератору
 Re: Копирование элементов базы данных из одной БД в другую  [new]
artsb
Member

Откуда:
Сообщений: 19
Сейчас у меня такой вопрос:
Как скопировать: пользователей, их схемы и права, логины?
28 июл 11, 12:38    [11038960]     Ответить | Цитировать Сообщить модератору
 Re: Копирование элементов базы данных из одной БД в другую  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
artsb
Я хочу переиндексировать записи. Т.е. в результате должно получиться: 1, 2, 3, 4
Сейчас я создаю в новой БД пустую таблицу, а уже затем копирую в неё данные из основной базы. Естественно, в новой таблице счёт идёт с 1.
Да, тогда только так.

Однако неделю работать ради такой бессмысленной операции....
artsb
И ещё я проверил, что когда счётчик дойдёт до значений, которые были изначально, то он не проверяет уникальность, а просто создаёт запись с таким же идентификатором.
Счётчик и не может ничего проверять, он только считает :-)

Для проверки придуманы уникальные и ПК констрейны, в крайнем случае триггеры и уникальные индексы.
28 июл 11, 12:41    [11038983]     Ответить | Цитировать Сообщить модератору
 Re: Копирование элементов базы данных из одной БД в другую  [new]
Glory
Member

Откуда:
Сообщений: 104751
artsb
Сейчас у меня такой вопрос:
Как скопировать: пользователей, их схемы и права, логины?

Не проще ли сделать так, как предлагали ?
"Сделать бакап, восстановить в новую базу, удалить старые данные. "
28 июл 11, 12:41    [11038985]     Ответить | Цитировать Сообщить модератору
 Re: Копирование элементов базы данных из одной БД в другую  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
artsb
Сейчас у меня такой вопрос:
Как скопировать: пользователей, их схемы и права, логины?
Изучать системные таблицы и писать скрипты.

Ещё можно попробовать использовать SSIS - там есть некоторые средства.
alexeyvg
Однако неделю работать ради такой бессмысленной операции....
Да, скорее месяц, а не неделю.
28 июл 11, 12:44    [11039014]     Ответить | Цитировать Сообщить модератору
 Re: Копирование элементов базы данных из одной БД в другую  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
artsb
Makar4ik
А вообще, требование "Основную БД "портить" нельзя." - очень смешное
Почему же смешное? Если в БД хранится важная и нужная информация, которая рано или поздно может понадобиться.
А не проще ли тогда делать что-то типа:
delete from MainDB.dbo.table1
output deleted.* into BackupDB.dbo.table1
where MainDB.dbo.table1.ID < 1000
И данные лежат "где-то рядом", и боевую базу почистили.
Ведь если архивные данные могут понадобиться лишь "рано или поздно", то возможно, стоит их просто подальше положить?
28 июл 11, 18:22    [11041390]     Ответить | Цитировать Сообщить модератору
 Re: Копирование элементов базы данных из одной БД в другую  [new]
artsb
Member

Откуда:
Сообщений: 19
alexeyvg
Счётчик и не может ничего проверять, он только считает :-)

Странно, я думал, что скул гарантирует уникальность... Буду знать

Glory
Не проще ли сделать так, как предлагали ?
"Сделать бакап, восстановить в новую базу, удалить старые данные. "

По идее, так проще. Но как я уже говорил, это займёт больше времени и места на жёстком диске.

alexeyvg
Изучать системные таблицы и писать скрипты.

Ещё можно попробовать использовать SSIS - там есть некоторые средства.

Ясно. Что-то нет желания во всём этом разбираться. Сейчас смотрю в сторону генерации скрипта для создания пользователей, ролей и прав.
Но тут возникла трудность. У меня 2005-тый сервер. Использую Enterprise Manager Express для соответствующей версии. Но там при формировании скрипта для роли, или таблицы, или юзера не формируется скрипт для назначения разрешений (grant). В 2000-ом при создании полного скрипта, такие разрешения назначались.

Makar4ik
А не проще ли тогда делать что-то типа:

Нельзя вытворять такое с БД :) Я делаю как начальство сказало. А оно говорит оставить исходную БД в неприкосновенности :) Но метод интересный. Постараюсь запомнить. Когда-нибудь да пригодится.
28 июл 11, 22:38    [11042178]     Ответить | Цитировать Сообщить модератору
 Re: Копирование элементов базы данных из одной БД в другую  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
artsb
alexeyvg
Счётчик и не может ничего проверять, он только считает :-)

Странно, я думал, что скул гарантирует уникальность... Буду знать
Нет, скуль делает только то, о чём его просят.

artsb
По идее, так проще. Но как я уже говорил, это займёт больше времени и места на жёстком диске.
Зато меньше времени на разработку.

А если у вас версия 2008R2 Std или 2008 Ent, то можно использовать сжатые бакапы - они меньше места занимают.

Ещё вариант - снизить требования к идентичности баз. Например, не копировать пользователей, права и т.п.
И конечно отказаться от перенумерации идентификаторов.
28 июл 11, 22:57    [11042278]     Ответить | Цитировать Сообщить модератору
 Re: Копирование элементов базы данных из одной БД в другую  [new]
artsb
Member

Откуда:
Сообщений: 19
alexeyvg, спасибо за совет. Но у меня уже практически всё готово. Осталось создать роли, пользователей и их разрешения.
Речь уже не идёт о копировании из БД в БД. Сейчас вопрос в том, как сгенерировать скрипт на основе существующей БД.
28 июл 11, 23:04    [11042300]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить