PDA

Показать полную графическую версию : Выгрузка базы в текстовый файл и загрузка обратно


xoxmodav
15-11-2010, 11:59
Необходимо сделать выгрузку базы MS SQL (11 Gb) в текстовый файл, после чего осуществить его загрузку обратно в базу. Возможно ли это и как реализуется на практике?

Delirium
15-11-2010, 17:19
Жень да ты обалдел, 11 гигов в текстовик :)
А если серьезно, то опиши что ты хочешь получить? В текст можно перегнать только отдельные таблицы, т.к. база - это и система безопасности, и запросы, и триггеры, и планировщики и еще много чего другого.

kim-aa
15-11-2010, 18:20
Необходимо сделать выгрузку базы MS SQL (11 Gb) в текстовый файл, после чего осуществить его загрузку обратно в базу. Возможно ли это и как реализуется на практике? »

А пример выгрузки можно привести? Поля, например.

2) Сразу говорю, что работать такая штука будет долго. Так, что имеет смысл подумать о многоступенчатой выгрузке:
- промежуточное формирование таблицы-выгрузки в MS SQL
- выгрузка в файлы.

В один файл, я бы выгружать не рискнул. Лучше использовать наборы файлов.
Реально, больше чем 100 МБ текстовый файл я не обрабатывал.

Размер лучше подобрать эмпирическим путем, ну скажем по 100 000 строк.
Результаты работы лучше журналировать в отдельном файле.

3) Я бы пробовал реализовать такое на PERL при помощи DBI, DBD

4) А какие-либо средства импорта использовать можно?
Или хоть убейся, но нужен txt?

xoxmodav
16-11-2010, 15:17
1. Не получится - коммерческая тайна и всё такое. :(
2. Как это реализовать?
3. Не владеем - сможешь помочь?
4. Наверняка можно, но вот вот вопрос - какие средства, кроме стандартных, имеются для этого?

Опишу чуть подробней ситуацию, может будет проще решить проблему:

Есть старая 11 ГБ база данных MS SQL 2000 "1С: Предприятие 7" (~500 таблиц), в которой ковырялось не одно поколение программистов. Поставили задачу попробовать осуществить выгрузку данных из базы с последующей загрузкой этих данных в другую базу.

Сотрудник, занимающийся этой проблемой накидал программку в C#, которая позволяет автоматизировать процесс выгрузки таблиц из базы в плоские файлы:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;

namespace выгрузка_1С
{
public partial class Form1 : Form
{
public string s;
public Form1()
{
InitializeComponent();
}


private void Out_Click(object sender, EventArgs e)
{
Application.Exit();
}

private void Start_Click(object sender, EventArgs e)
{
// string IP = Ip.Text;
string IP = "10.10.10.105";
// string newbase = BaseName.Text;
string newbase = "proizvod";
//string UserName = NameUser.Text;
string UserName = "sa";
//string Pass = Pas.Text;
string Pass = "1";
string con = @"Network address =" + IP + ";" +
"user id= " + UserName + ";" +
"Pwd= " + Pass;
SqlConnection cn = new SqlConnection(con);
string str = "use " + newbase + " SELECT QUOTENAME(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE=N'BASE TABLE';";
cn.Open();
SqlCommand Com = new SqlCommand(str, cn);
SqlDataReader readerCom = Com.ExecuteReader();
int i = 0;
//string s = "";
while (readerCom.Read())
{
string a = readerCom[0].ToString();
SqlConnection cn1 = new SqlConnection(con);
cn1.Open();
string file = @"d:\11\" + a + ".txt";
string str1 = "exec master..xp_cmdshell 'bcp " + newbase + ".dbo." + a + " out " + file + " -c -C RAW -U sa -P 1'";
SqlCommand Com1 = new SqlCommand(str1, cn1);
Com1.CommandTimeout = 50000;
Com1.ExecuteNonQuery();
cn1.Close();
}
MessageBox.Show("111");
cn.Close();
}
}
}

Однако на части таблиц при попытке импорта (как в существующую, так и в созданную с нуля базу) выдаёт ошибку в момент выполнения:

- Выполнение (Ошибка)
Сообщения
• Ошибка 0xc02020a1: Задача потока данных 1: Ошибка преобразования данных. При преобразовании данных для столбца "Столбец 23" возращено значение состояния 4 и текст состояния "Текст был усечен, или один и более символов не имеют соответствия в целевой кодовой странице.".
(Мастер импорта и экспорта SQL Server)

• Ошибка 0xc020902a: Задача потока данных 1: Сбой выходной столбец "Столбец 23" (102) из-за возникшего усечения, и стратегия обработки усечения строк в "выходной столбец "Столбец 23" (102)" определяет сбой по причине усечения. Ошибка усечения возникла в указанном объекте указанного компонента.
(Мастер импорта и экспорта SQL Server)

• Ошибка 0xc0202092: Задача потока данных 1: Ошибка при обработке строки 0 в файле "D:\11\111.txt".
(Мастер импорта и экспорта SQL Server)

Ошибка 0xc0047038: Задача потока данных 1: Код ошибки служб SSIS: DTS_E_PRIMEOUTPUTFAILED. Метод PrimeOutput для компонента компонент "Источник - 111_txt" (1) завершился сбоем с кодом ошибки 0xC0202092. Компонент вернул код ошибки при вызове метода PrimeOutput() из обработчика конвейера. Значение кода ошибки определяется компонентом, но ошибка является неустранимой, и выполнение конвейера остановлено. Возможно, до этого были опубликованы сообщения об ошибках, в которых содержатся более подробные сведения о причине сбоя.
(Мастер импорта и экспорта SQL Server)

Пробовали экспорт этих таблиц делать вручную через мастер - при импорте вываливается аналогичная ошибка.

P.S. Ошибка вываливается как на SQL 2005 SP3 (RUS), так и на SQL 2008 SP2.

P.P.S. Сейчас будем проверять работу импорта на SQL 2005 SP4 ENG.

Delirium
17-11-2010, 01:11
Проблема не в версиях MS SQL, а в выгруженных файлах. Встречный вопрос - а зачем придумывать велосипед то? Не проще мастером импорта-экспорта из SQL 2000 выгрузить данные таблиц, а потом сделать импорт? Или же прямо в 2005 SQL сделать импорт-экспорт с базы 2000 сиквела?




© OSzone.net 2001-2012