Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Выгрузка базы в текстовый файл и загрузка обратно (http://forum.oszone.net/showthread.php?t=191257)

xoxmodav 15-11-2010 11:59 1543041

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

Delirium 15-11-2010 17:19 1543256

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

kim-aa 15-11-2010 18:20 1543304

Цитата:

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

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

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

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

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

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

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

xoxmodav 16-11-2010 15:17 1543993

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 1544441

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


Время: 05:31.

Время: 05:31.
© OSzone.net 2001-